Submit test results
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.
{
"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 testedvalue: the test result, as a string, e.g."1.02"lod: limit of detectionloq: limit of quantitationlimit: value above which this test failsmax: upper limit of quantitationspike: spike recovery for the analytestdev: standard deviation of the sample replicate resultsregulatornotes: notes posted to state traceability systems such as METRC or BioTrackqualifiers: testing qualifiers, where the regulator defines themrsd: relative standard deviation of the analyte valuesrpd: relative percent difference of the analyte valueslimitrangehigh: upper limit when restricting value to a rangelimitrangelow: lower limit when restricting value to a rangepurity_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, not0.231. - Statuses are integer IDs:
1passed,2failed,3completed. Completed means the assay could neither pass nor fail. input_unitsandreport_unitsare required ininfo_fieldsfor every category exceptgeneral, and must come from that category's allowed units.unit_weightis required whenever a unit field for the category ismg/unit, andml_weightwhenever one ismg/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.footnotecarries 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 areYYYY-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-digitsmust be between 1 and 8 whendigits_methodissignificant.invalid_data- any other validation failure;error_fieldanderror_categorymay 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 samplesanalytical_batch_id_2: optional second analytical batch ID for QC samplesdate_prepared: date the sample was prepared for this assaydate_tested: date the sample was tested for this assaydigits: number of digits to display on the certificate of analysis; see digits_methoddigits_method: round rounds to digits decimal places, significant rounds to digits significant figuresdry_weight: weight of aliquot after dryingfootnote: footnote to accompany this assayinput_units: units the data is being submitted in, from the category's allowed unitsml_weight: the weight in grams of 1ml of sample when any unit fields are 'mg/ml'notes,notes_2throughnotes_10: optional testing notes for this assayqc_blank_dup_id: optional sample ID for QC Blank duplicateqc_blank_id: optional sample ID for QC Blankqc_blank_trip_id: optional sample ID for QC Blank triplicateqc_control_study_id: optional sample ID for Control Studyqc_lcs_dup_id: optional sample ID for QC Lab Control Sample duplicateqc_lcs_id: optional sample ID for QC Lab Control Sampleqc_lcs_trip_id: optional sample ID for QC Lab Control Sample triplicateqc_sample_dup_id: optional sample ID for QC sample duplicateqc_sample_id: optional sample ID for QC sampleqc_sample_trip_id: optional sample ID for QC sample triplicateqc_spike_dup_id: optional sample ID for QC Spike duplicateqc_spike_id: optional sample ID for QC Spikeqc_spike_trip_id: optional sample ID for QC Spike triplicatereport_units: the primary units displayed on the certificate of analysissecondary_report_units: the secondary units displayed on the certificate of analysisservings_per_container: Number of servings per containersignatory_name: name of lab employee to appear on certificate of analysissignatory_title: title of lab employee to appear on certificate of analysissignature: URL of the signature image for the reportstatus: pass or fail integer ID from the status enumunit_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 servingwet_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 samplesanalytical_batch_id_2: optional second analytical batch ID for QC samplesdate_prepared: date the sample was prepared for this assaydate_tested: date the sample was tested for this assaydigits: number of digits to display on the certificate of analysis; see digits_methoddigits_method: round rounds to digits decimal places, significant rounds to digits significant figuresdry_weight: weight of aliquot after dryingfootnote: footnote to accompany this assayinput_units: units the data is being submitted in, from the category's allowed unitsml_weight: the weight in grams of 1ml of sample when any unit fields are 'mg/ml'notes,notes_2throughnotes_10: optional testing notes for this assayqc_blank_dup_id: optional sample ID for QC Blank duplicateqc_blank_id: optional sample ID for QC Blankqc_blank_trip_id: optional sample ID for QC Blank triplicateqc_control_study_id: optional sample ID for Control Studyqc_lcs_dup_id: optional sample ID for QC Lab Control Sample duplicateqc_lcs_id: optional sample ID for QC Lab Control Sampleqc_lcs_trip_id: optional sample ID for QC Lab Control Sample triplicateqc_sample_dup_id: optional sample ID for QC sample duplicateqc_sample_id: optional sample ID for QC sampleqc_sample_trip_id: optional sample ID for QC sample triplicateqc_spike_dup_id: optional sample ID for QC Spike duplicateqc_spike_id: optional sample ID for QC Spikeqc_spike_trip_id: optional sample ID for QC Spike triplicatereport_units: the primary units displayed on the certificate of analysisservings_per_container: Number of servings per containersignatory_name: name of lab employee to appear on certificate of analysissignatory_title: title of lab employee to appear on certificate of analysissignature: URL of the signature image for the reportstatus: pass or fail integer ID from the status enumunit_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 servingwet_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 samplesanalytical_batch_id_2: optional second analytical batch ID for QC samplescontainer_description: Description of container (eg. bottle, box, tin)date_prepared: date the sample was prepared for this assaydate_tested: date the sample was tested for this assaydigits: number of digits to display on the certificate of analysis; see digits_methoddigits_method: round rounds to digits decimal places, significant rounds to digits significant figuresdry_weight: weight of aliquot after dryingfootnote: footnote to accompany this assayinput_units: units the data is being submitted in, from the category's allowed unitsmethod: testing method - eg, GC-FID, HPLC, etcmetrc_co_d9_thc_status: pass or fail integer ID from the status enummetrc_me_total_thc_mg_package_status: pass or fail integer ID from the status enummetrc_me_total_thc_mg_serving_status: pass or fail integer ID from the status enummetrc_mi_potency_regulatornotes: notes posted to state traceability systems such as METRC or BioTrackmetrc_mi_potency_status: pass or fail integer ID from the status enummetrc_mi_potency_value: optional value for the 'Potency' field in Metrcmetrc_mi_total_cbd_regulatornotes: notes posted to state traceability systems such as METRC or BioTrackmetrc_mi_total_thc_regulatornotes: notes posted to state traceability systems such as METRC or BioTrackmetrc_mi_total_thc_status: DEPRECATEDmetrc_mi_total_thc_value: DEPRECATEDmetrc_mn_other_adc_regulatornotes: notes posted to state traceability systems such as METRC or BioTrackmetrc_mn_other_adc_status: pass or fail integer ID from the status enummetrc_mn_other_adc_value: value for the 'Other ADC (mg/g) Full Panel ' field in Metrc. value should be in mg/servingmetrc_mn_thc_purity_regulatornotes: notes posted to state traceability systems such as METRC or BioTrackmetrc_mn_thc_purity_status: pass or fail integer ID from the status enummetrc_mn_thc_purity_value: value for the 'THC Purity (% or mg/g)' field in Metrcmetrc_mn_total_cannabinoids_regulatornotes: notes posted to state traceability systems such as METRC or BioTrackmetrc_mn_total_cannabinoids_status: pass or fail integer ID from the status enummetrc_mn_total_cbd_regulatornotes: notes posted to state traceability systems such as METRC or BioTrackmetrc_mn_total_cbd_status: pass or fail integer ID from the status enummetrc_mn_total_thc_regulatornotes: notes posted to state traceability systems such as METRC or BioTrackmetrc_mn_total_thc_status: pass or fail integer ID from the status enummetrc_mt_total_cbd_regulatornotes: notes posted to state traceability systems such as METRC or BioTrackmetrc_mt_total_cbd_status: pass or fail integer ID from the status enummetrc_mt_total_thc_regulatornotes: notes posted to state traceability systems such as METRC or BioTrackmetrc_mt_total_thc_status: pass or fail integer ID from the status enummetrc_oh_total_cbd_regulatornotes: notes posted to state traceability systems such as METRC or BioTrackmetrc_oh_total_cbd_status: pass or fail integer ID from the status enummetrc_oh_total_thc_regulatornotes: notes posted to state traceability systems such as METRC or BioTrackmetrc_oh_total_thc_status: pass or fail integer ID from the status enummetrc_or_cbd_pct_rsd_regulatornotes: notes posted to state traceability systems such as METRC or BioTrackmetrc_or_cbd_pct_rsd_status: pass or fail integer ID from the status enummetrc_or_cbd_pct_rsd_value: Percent Relative Standard Deviation value for state traceability systemmetrc_or_cbd_rpd_regulatornotes: notes posted to state traceability systems such as METRC or BioTrackmetrc_or_cbd_rpd_status: pass or fail integer ID from the status enummetrc_or_cbd_rpd_value: Relative Percent Difference value for state traceability systemmetrc_or_d8_thc_pct_rsd_regulatornotes: notes posted to state traceability systems such as METRC or BioTrackmetrc_or_d8_thc_pct_rsd_status: pass or fail integer ID from the status enummetrc_or_d8_thc_pct_rsd_value: Percent Relative Standard Deviation value for state traceability systemmetrc_or_d8_thc_rpd_regulatornotes: notes posted to state traceability systems such as METRC or BioTrackmetrc_or_d8_thc_rpd_status: pass or fail integer ID from the status enummetrc_or_d8_thc_rpd_value: Relative Percent Difference value for state traceability systemmetrc_or_potency_control_study_regulatornotes: notes posted to state traceability systems such as METRC or BioTrackmetrc_or_potency_control_study_status: pass or fail integer ID from the status enummetrc_or_potency_process_validation_regulatornotes: notes posted to state traceability systems such as METRC or BioTrackmetrc_or_potency_process_validation_status: pass or fail integer ID from the status enummetrc_or_potency_regulatornotes: notes posted to state traceability systems such as METRC or BioTrackmetrc_or_potency_status: pass or fail integer ID from the status enummetrc_or_thc_pct_rsd_regulatornotes: notes posted to state traceability systems such as METRC or BioTrackmetrc_or_thc_pct_rsd_status: pass or fail integer ID from the status enummetrc_or_thc_pct_rsd_value: Percent Relative Standard Deviation value for state traceability systemmetrc_or_thc_rpd_regulatornotes: notes posted to state traceability systems such as METRC or BioTrackmetrc_or_thc_rpd_status: pass or fail integer ID from the status enummetrc_or_thc_rpd_value: Relative Percent Difference value for state traceability systemmetrc_or_total_cbd_regulatornotes: notes posted to state traceability systems such as METRC or BioTrackmetrc_or_total_thc_regulatornotes: notes posted to state traceability systems such as METRC or BioTrackmetrc_or_total_thc_status: pass or fail integer ID from the status enumml_weight: the weight in grams of 1ml of sample when any unit fields are 'mg/ml'notes,notes_2throughnotes_10: optional testing notes for this assayqc_blank_dup_id: optional sample ID for QC Blank duplicateqc_blank_id: optional sample ID for QC Blankqc_blank_trip_id: optional sample ID for QC Blank triplicateqc_control_study_id: optional sample ID for Control Studyqc_lcs_dup_id: optional sample ID for QC Lab Control Sample duplicateqc_lcs_id: optional sample ID for QC Lab Control Sampleqc_lcs_trip_id: optional sample ID for QC Lab Control Sample triplicateqc_sample_dup_id: optional sample ID for QC sample duplicateqc_sample_id: optional sample ID for QC sampleqc_sample_trip_id: optional sample ID for QC sample triplicateqc_spike_dup_id: optional sample ID for QC Spike duplicateqc_spike_id: optional sample ID for QC Spikeqc_spike_trip_id: optional sample ID for QC Spike triplicatereport_units: the primary units displayed on the certificate of analysisreported_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 analysisservings_per_container: Number of servings per containersignatory_name: name of lab employee to appear on certificate of analysissignatory_title: title of lab employee to appear on certificate of analysissignature: URL of the signature image for the reportstatus: pass or fail integer ID from the status enumtotalcbd_outsidelimitrangetotalthc_outsidelimitrangeunit_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 servingwet_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 samplesanalytical_batch_id_2: optional second analytical batch ID for QC samplesdate_prepared: date the sample was prepared for this assaydate_tested: date the sample was tested for this assaydigits: number of digits to display on the certificate of analysis; see digits_methoddigits_method: round rounds to digits decimal places, significant rounds to digits significant figuresdry_weight: weight of aliquot after dryingfootnote: footnote to accompany this assayinput_units: units the data is being submitted in, from the category's allowed unitsml_weight: the weight in grams of 1ml of sample when any unit fields are 'mg/ml'notes,notes_2throughnotes_10: optional testing notes for this assayqc_blank_dup_id: optional sample ID for QC Blank duplicateqc_blank_id: optional sample ID for QC Blankqc_blank_trip_id: optional sample ID for QC Blank triplicateqc_control_study_id: optional sample ID for Control Studyqc_lcs_dup_id: optional sample ID for QC Lab Control Sample duplicateqc_lcs_id: optional sample ID for QC Lab Control Sampleqc_lcs_trip_id: optional sample ID for QC Lab Control Sample triplicateqc_sample_dup_id: optional sample ID for QC sample duplicateqc_sample_id: optional sample ID for QC sampleqc_sample_trip_id: optional sample ID for QC sample triplicateqc_spike_dup_id: optional sample ID for QC Spike duplicateqc_spike_id: optional sample ID for QC Spikeqc_spike_trip_id: optional sample ID for QC Spike triplicatereport_units: the primary units displayed on the certificate of analysisservings_per_container: Number of servings per containersignatory_name: name of lab employee to appear on certificate of analysissignatory_title: title of lab employee to appear on certificate of analysissignature: URL of the signature image for the reportstatus: pass or fail integer ID from the status enumunit_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 servingwet_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 assaydate_tested: date the sample was tested for this assaydigits: number of digits to display on the certificate of analysis; see digits_methoddigits_method: round rounds to digits decimal places, significant rounds to digits significant figuresdry_weight: weight of aliquot after dryingfootnote: footnote to accompany this assayinput_units: units the data is being submitted in, from the category's allowed unitsml_weight: the weight in grams of 1ml of sample when any unit fields are 'mg/ml'notes,notes_2throughnotes_10: optional testing notes for this assayqc_blank_dup_id: optional sample ID for QC Blank duplicateqc_blank_id: optional sample ID for QC Blankqc_blank_trip_id: optional sample ID for QC Blank triplicateqc_control_study_id: optional sample ID for Control Studyqc_lcs_dup_id: optional sample ID for QC Lab Control Sample duplicateqc_lcs_id: optional sample ID for QC Lab Control Sampleqc_lcs_trip_id: optional sample ID for QC Lab Control Sample triplicateqc_sample_dup_id: optional sample ID for QC sample duplicateqc_sample_id: optional sample ID for QC sampleqc_sample_trip_id: optional sample ID for QC sample triplicateqc_spike_dup_id: optional sample ID for QC Spike duplicateqc_spike_id: optional sample ID for QC Spikeqc_spike_trip_id: optional sample ID for QC Spike triplicatereport_units: the primary units displayed on the certificate of analysissignatory_name: name of lab employee to appear on certificate of analysissignatory_title: title of lab employee to appear on certificate of analysissignature: URL of the signature image for the reportstatus: pass or fail integer ID from the status enumunit_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 samplesanalytical_batch_id_2: optional second analytical batch ID for QC samplesdate_prepared: date the sample was prepared for this assaydate_tested: date the sample was tested for this assaydigits: number of digits to display on the certificate of analysis; see digits_methoddigits_method: round rounds to digits decimal places, significant rounds to digits significant figuresfootnote: footnote to accompany this assayinput_units: units the data is being submitted in, from the category's allowed unitsmetrc_mi_foreign_organic_matter_regulatornotes: notes posted to state traceability systems such as METRC or BioTrackmetrc_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 BioTracknotes,notes_2throughnotes_10: optional testing notes for this assayqc_blank_dup_id: optional sample ID for QC Blank duplicateqc_blank_id: optional sample ID for QC Blankqc_blank_trip_id: optional sample ID for QC Blank triplicateqc_control_study_id: optional sample ID for Control Studyqc_lcs_dup_id: optional sample ID for QC Lab Control Sample duplicateqc_lcs_id: optional sample ID for QC Lab Control Sampleqc_lcs_trip_id: optional sample ID for QC Lab Control Sample triplicateqc_sample_dup_id: optional sample ID for QC sample duplicateqc_sample_id: optional sample ID for QC sampleqc_sample_trip_id: optional sample ID for QC sample triplicateqc_spike_dup_id: optional sample ID for QC Spike duplicateqc_spike_id: optional sample ID for QC Spikeqc_spike_trip_id: optional sample ID for QC Spike triplicatereport_units: the primary units displayed on the certificate of analysisreported_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 analysissignatory_name: name of lab employee to appear on certificate of analysissignatory_title: title of lab employee to appear on certificate of analysissignature: URL of the signature image for the reportstatus: 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 samplesanalytical_batch_id_2: optional second analytical batch ID for QC samplesdate_prepared: date the sample was prepared for this assaydate_tested: date the sample was tested for this assaydigits: number of digits to display on the certificate of analysis; see digits_methoddigits_method: round rounds to digits decimal places, significant rounds to digits significant figuresfootnote: footnote to accompany this assayinput_units: units the data is being submitted in, from the category's allowed unitsnotes,notes_2throughnotes_10: optional testing notes for this assayqc_blank_dup_id: optional sample ID for QC Blank duplicateqc_blank_id: optional sample ID for QC Blankqc_blank_trip_id: optional sample ID for QC Blank triplicateqc_control_study_id: optional sample ID for Control Studyqc_lcs_dup_id: optional sample ID for QC Lab Control Sample duplicateqc_lcs_id: optional sample ID for QC Lab Control Sampleqc_lcs_trip_id: optional sample ID for QC Lab Control Sample triplicateqc_sample_dup_id: optional sample ID for QC sample duplicateqc_sample_id: optional sample ID for QC sampleqc_sample_trip_id: optional sample ID for QC sample triplicateqc_spike_dup_id: optional sample ID for QC Spike duplicateqc_spike_id: optional sample ID for QC Spikeqc_spike_trip_id: optional sample ID for QC Spike triplicatereport_units: the primary units displayed on the certificate of analysisreported_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 analysissignatory_name: name of lab employee to appear on certificate of analysissignatory_title: title of lab employee to appear on certificate of analysissignature: URL of the signature image for the reportstatus: pass or fail integer ID from the status enumunit_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 samplesanalytical_batch_id_2: optional second analytical batch ID for QC samplesdate_prepared: date the sample was prepared for this assaydate_tested: date the sample was tested for this assaydigits: number of digits to display on the certificate of analysis; see digits_methoddigits_method: round rounds to digits decimal places, significant rounds to digits significant figuresfootnote: footnote to accompany this assayinput_units: units the data is being submitted in, from the category's allowed unitsmetrc_mi_metals_regulatornotes: notes posted to state traceability systems such as METRC or BioTrackmetrc_mi_metals_status: pass or fail integer ID from the status enummetrc_mi_metals_value: optional value for the 'Metals' field in Metrcmetrc_or_metals_regulatornotes: notes posted to state traceability systems such as METRC or BioTrackmetrc_or_metals_status: pass or fail integer ID from the status enumnotes,notes_2throughnotes_10: optional testing notes for this assayqc_blank_dup_id: optional sample ID for QC Blank duplicateqc_blank_id: optional sample ID for QC Blankqc_blank_trip_id: optional sample ID for QC Blank triplicateqc_control_study_id: optional sample ID for Control Studyqc_lcs_dup_id: optional sample ID for QC Lab Control Sample duplicateqc_lcs_id: optional sample ID for QC Lab Control Sampleqc_lcs_trip_id: optional sample ID for QC Lab Control Sample triplicateqc_sample_dup_id: optional sample ID for QC sample duplicateqc_sample_id: optional sample ID for QC sampleqc_sample_trip_id: optional sample ID for QC sample triplicateqc_spike_dup_id: optional sample ID for QC Spike duplicateqc_spike_id: optional sample ID for QC Spikeqc_spike_trip_id: optional sample ID for QC Spike triplicatereport_units: the primary units displayed on the certificate of analysisreported_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 analysissignatory_name: name of lab employee to appear on certificate of analysissignatory_title: title of lab employee to appear on certificate of analysissignature: URL of the signature image for the reportstatus: 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 samplesanalytical_batch_id_2: optional second analytical batch ID for QC samplesdate_prepared: date the sample was prepared for this assaydate_tested: date the sample was tested for this assaydigits: number of digits to display on the certificate of analysis; see digits_methoddigits_method: round rounds to digits decimal places, significant rounds to digits significant figuresdry_weight: weight of aliquot after dryingfootnote: footnote to accompany this assayinput_units: units the data is being submitted in, from the category's allowed unitsmetrc_co_microbials_regulatornotes: notes posted to state traceability systems such as METRC or BioTrackmetrc_co_microbials_status: pass or fail integer ID from the status enummetrc_co_microbials_value: optional value for the 'Microbials' field in Metrcmetrc_mi_microbials_infused_bool: boolean true/false flag (0=false/1=true) to denote if the sample is an infused productmetrc_mi_microbials_regulatornotes: notes posted to state traceability systems such as METRC or BioTrackmetrc_mi_microbials_status: pass or fail integer ID from the status enummetrc_mi_microbials_value: optional value for the 'Microbials' field in Metrcmetrc_nv_microbials_regulatornotes: notes posted to state traceability systems such as METRC or BioTrackmetrc_nv_microbials_status: pass or fail integer ID from the status enummetrc_nv_microbials_value: value for the 'Microbials' field in Metrcmetrc_or_microbials_regulatornotes: notes posted to state traceability systems such as METRC or BioTrackmetrc_or_microbials_status: pass or fail integer ID from the status enummetrc_or_microbiological_process_validation_regulatornotes: notes posted to state traceability systems such as METRC or BioTrackmetrc_or_microbiological_process_validation_status: pass or fail integer ID from the status enumml_weight: the weight in grams of 1ml of sample when any unit fields are 'mg/ml'notes,notes_2throughnotes_10: optional testing notes for this assayqc_blank_dup_id: optional sample ID for QC Blank duplicateqc_blank_id: optional sample ID for QC Blankqc_blank_trip_id: optional sample ID for QC Blank triplicateqc_control_study_id: optional sample ID for Control Studyqc_lcs_dup_id: optional sample ID for QC Lab Control Sample duplicateqc_lcs_id: optional sample ID for QC Lab Control Sampleqc_lcs_trip_id: optional sample ID for QC Lab Control Sample triplicateqc_sample_dup_id: optional sample ID for QC sample duplicateqc_sample_id: optional sample ID for QC sampleqc_sample_trip_id: optional sample ID for QC sample triplicateqc_spike_dup_id: optional sample ID for QC Spike duplicateqc_spike_id: optional sample ID for QC Spikeqc_spike_trip_id: optional sample ID for QC Spike triplicatereport_units: the primary units displayed on the certificate of analysisreported_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 analysissignatory_name: name of lab employee to appear on certificate of analysissignatory_title: title of lab employee to appear on certificate of analysissignature: URL of the signature image for the reportstatus: pass or fail integer ID from the status enumunit_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 samplesanalytical_batch_id_2: optional second analytical batch ID for QC samplesdate_prepared: date the sample was prepared for this assaydate_tested: date the sample was tested for this assaydigits: number of digits to display on the certificate of analysis; see digits_methoddigits_method: round rounds to digits decimal places, significant rounds to digits significant figuresdry_weight: weight of aliquot after dryingfootnote: footnote to accompany this assayinput_units: units the data is being submitted in, from the category's allowed unitsnotes,notes_2throughnotes_10: optional testing notes for this assayqc_blank_dup_id: optional sample ID for QC Blank duplicateqc_blank_id: optional sample ID for QC Blankqc_blank_trip_id: optional sample ID for QC Blank triplicateqc_control_study_id: optional sample ID for Control Studyqc_lcs_dup_id: optional sample ID for QC Lab Control Sample duplicateqc_lcs_id: optional sample ID for QC Lab Control Sampleqc_lcs_trip_id: optional sample ID for QC Lab Control Sample triplicateqc_sample_dup_id: optional sample ID for QC sample duplicateqc_sample_id: optional sample ID for QC sampleqc_sample_trip_id: optional sample ID for QC sample triplicateqc_spike_dup_id: optional sample ID for QC Spike duplicateqc_spike_id: optional sample ID for QC Spikeqc_spike_trip_id: optional sample ID for QC Spike triplicatereport_units: the primary units displayed on the certificate of analysisreported_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 analysissignatory_name: name of lab employee to appear on certificate of analysissignatory_title: title of lab employee to appear on certificate of analysissignature: URL of the signature image for the reportstatus: pass or fail integer ID from the status enumwet_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 samplesanalytical_batch_id_2: optional second analytical batch ID for QC samplesdate_prepared: date the sample was prepared for this assaydate_tested: date the sample was tested for this assaydigits: number of digits to display on the certificate of analysis; see digits_methoddigits_method: round rounds to digits decimal places, significant rounds to digits significant figuresfootnote: footnote to accompany this assayinput_units: units the data is being submitted in, from the category's allowed unitsmetrc_mi_mycotoxins_regulatornotes: notes posted to state traceability systems such as METRC or BioTrackmetrc_mi_mycotoxins_status: pass or fail integer ID from the status enummetrc_mi_mycotoxins_value: optional value for the 'Mycotoxins' field in Metrcmetrc_or_mycotoxins_regulatornotes: notes posted to state traceability systems such as METRC or BioTrackmetrc_or_mycotoxins_status: pass or fail integer ID from the status enumnotes,notes_2throughnotes_10: optional testing notes for this assayqc_blank_dup_id: optional sample ID for QC Blank duplicateqc_blank_id: optional sample ID for QC Blankqc_blank_trip_id: optional sample ID for QC Blank triplicateqc_control_study_id: optional sample ID for Control Studyqc_lcs_dup_id: optional sample ID for QC Lab Control Sample duplicateqc_lcs_id: optional sample ID for QC Lab Control Sampleqc_lcs_trip_id: optional sample ID for QC Lab Control Sample triplicateqc_sample_dup_id: optional sample ID for QC sample duplicateqc_sample_id: optional sample ID for QC sampleqc_sample_trip_id: optional sample ID for QC sample triplicateqc_spike_dup_id: optional sample ID for QC Spike duplicateqc_spike_id: optional sample ID for QC Spikeqc_spike_trip_id: optional sample ID for QC Spike triplicatereport_units: the primary units displayed on the certificate of analysisreported_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 analysissignatory_name: name of lab employee to appear on certificate of analysissignatory_title: title of lab employee to appear on certificate of analysissignature: URL of the signature image for the reportstatus: 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 samplesanalytical_batch_id_2: optional second analytical batch ID for QC samplesdate_prepared: date the sample was prepared for this assaydate_tested: date the sample was tested for this assaydigits: number of digits to display on the certificate of analysis; see digits_methoddigits_method: round rounds to digits decimal places, significant rounds to digits significant figuresdry_weight: weight of aliquot after dryingfootnote: footnote to accompany this assayinput_units: units the data is being submitted in, from the category's allowed unitsml_weight: the weight in grams of 1ml of sample when any unit fields are 'mg/ml'notes,notes_2throughnotes_10: optional testing notes for this assayreport_units: the primary units displayed on the certificate of analysissecondary_report_units: the secondary units displayed on the certificate of analysisservings_per_container: Number of servings per containersignatory_name: name of lab employee to appear on certificate of analysissignatory_title: title of lab employee to appear on certificate of analysissignature: URL of the signature image for the reportstatus: pass or fail integer ID from the status enumunit_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 servingwet_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 samplesanalytical_batch_id_2: optional second analytical batch ID for QC samplesdate_prepared: date the sample was prepared for this assaydate_tested: date the sample was tested for this assaydigits: number of digits to display on the certificate of analysis; see digits_methoddigits_method: round rounds to digits decimal places, significant rounds to digits significant figuresdry_weight: weight of aliquot after dryingfootnote: footnote to accompany this assayinput_units: units the data is being submitted in, from the category's allowed unitsml_weight: the weight in grams of 1ml of sample when any unit fields are 'mg/ml'notes,notes_2throughnotes_10: optional testing notes for this assayqc_blank_dup_id: optional sample ID for QC Blank duplicateqc_blank_id: optional sample ID for QC Blankqc_blank_trip_id: optional sample ID for QC Blank triplicateqc_control_study_id: optional sample ID for Control Studyqc_lcs_dup_id: optional sample ID for QC Lab Control Sample duplicateqc_lcs_id: optional sample ID for QC Lab Control Sampleqc_lcs_trip_id: optional sample ID for QC Lab Control Sample triplicateqc_sample_dup_id: optional sample ID for QC sample duplicateqc_sample_id: optional sample ID for QC sampleqc_sample_trip_id: optional sample ID for QC sample triplicateqc_spike_dup_id: optional sample ID for QC Spike duplicateqc_spike_id: optional sample ID for QC Spikeqc_spike_trip_id: optional sample ID for QC Spike triplicatereport_units: the primary units displayed on the certificate of analysisservings_per_container: Number of servings per containersignatory_name: name of lab employee to appear on certificate of analysissignatory_title: title of lab employee to appear on certificate of analysissignature: URL of the signature image for the reportstatus: pass or fail integer ID from the status enumunit_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 servingwet_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 samplesanalytical_batch_id_2: optional second analytical batch ID for QC samplesdate_prepared: date the sample was prepared for this assaydate_tested: date the sample was tested for this assaydigits: number of digits to display on the certificate of analysis; see digits_methoddigits_method: round rounds to digits decimal places, significant rounds to digits significant figuresdry_weight: weight of aliquot after dryingfootnote: footnote to accompany this assayinput_units: units the data is being submitted in, from the category's allowed unitsmetrc_co_other_pesticide_regulatornotes: notes posted to state traceability systems such as METRC or BioTrackmetrc_co_other_pesticide_status: pass or fail integer ID from the status enummetrc_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 Tebuconazolemetrc_co_pesticide_regulatornotes: notes posted to state traceability systems such as METRC or BioTrackmetrc_co_pesticide_status: pass or fail integer ID from the status enummetrc_co_pesticide_value: the total sum of all pesticides detected in ppmmetrc_mi_pesticides_chemical_residue_regulatornotes: notes posted to state traceability systems such as METRC or BioTrackmetrc_mi_pesticides_chemical_residue_status: pass or fail integer ID from the status enummetrc_mi_pesticides_chemical_residue_value: optional value for the 'Chemical Residue' field in Metrcmetrc_or_limited_batch_pesticide_testing_regulatornotes: DEPRECATED: notes posted to state traceability systems such as METRC or BioTrackmetrc_or_pesticides_control_study_regulatornotes: notes posted to state traceability systems such as METRC or BioTrackmetrc_or_pesticides_control_study_status: pass or fail integer ID from the status enummetrc_or_pesticides_process_validation_regulatornotes: notes posted to state traceability systems such as METRC or BioTrackmetrc_or_pesticides_process_validation_status: pass or fail integer ID from the status enummetrc_or_pesticides_regulatornotes: notes posted to state traceability systems such as METRC or BioTrackmetrc_or_pesticides_status: pass or fail integer ID from the status enumnotes,notes_2throughnotes_10: optional testing notes for this assayqc_blank_dup_id: optional sample ID for QC Blank duplicateqc_blank_id: optional sample ID for QC Blankqc_blank_trip_id: optional sample ID for QC Blank triplicateqc_control_study_id: optional sample ID for Control Studyqc_lcs_dup_id: optional sample ID for QC Lab Control Sample duplicateqc_lcs_id: optional sample ID for QC Lab Control Sampleqc_lcs_trip_id: optional sample ID for QC Lab Control Sample triplicateqc_sample_dup_id: optional sample ID for QC sample duplicateqc_sample_id: optional sample ID for QC sampleqc_sample_trip_id: optional sample ID for QC sample triplicateqc_spike_dup_id: optional sample ID for QC Spike duplicateqc_spike_id: optional sample ID for QC Spikeqc_spike_trip_id: optional sample ID for QC Spike triplicatereport_units: the primary units displayed on the certificate of analysisreported_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 analysissignatory_name: name of lab employee to appear on certificate of analysissignatory_title: title of lab employee to appear on certificate of analysissignature: URL of the signature image for the reportstatus: pass or fail integer ID from the status enumvolume: volume of the aliquot in the solutionwet_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 samplesanalytical_batch_id_2: optional second analytical batch ID for QC samplesdate_prepared: date the sample was prepared for this assaydate_tested: date the sample was tested for this assaydigits: number of digits to display on the certificate of analysis; see digits_methoddigits_method: round rounds to digits decimal places, significant rounds to digits significant figuresdry_weight: weight of aliquot after dryingfootnote: footnote to accompany this assayinput_units: units the data is being submitted in, from the category's allowed unitsmetrc_co_solvents_other_regulatornotes: notes posted to state traceability systems such as METRC or BioTrackmetrc_co_solvents_other_status: pass or fail integer ID from the status enummetrc_co_solvents_other_value: the sum of all residual solvent detections in ppm excluding Benzene, Butanes, Heptanes, Hexane, Toluene, and Total Xylenesmetrc_co_solvents_remediated_bool: boolean true/false flag (0=false/1=true) to denote if the sample is from a batch made from remediated productmetrc_co_solvents_residual_regulatornotes: DEPRECATED: notes posted to state traceability systems such as METRC or BioTrackmetrc_co_solvents_residual_status: DEPRECATED: pass or fail integer ID from the status enummetrc_mi_solvents_residual_regulatornotes: notes posted to state traceability systems such as METRC or BioTrackmetrc_mi_solvents_residual_status: pass or fail integer ID from the status enummetrc_mi_solvents_residual_value: optional value for the 'Residual Solvents' field in Metrcmetrc_or_solvents_control_study_regulatornotes: notes posted to state traceability systems such as METRC or BioTrackmetrc_or_solvents_control_study_status: pass or fail integer ID from the status enummetrc_or_solvents_pct_rsd_regulatornotes: notes posted to state traceability systems such as METRC or BioTrackmetrc_or_solvents_pct_rsd_status: pass or fail integer ID from the status enummetrc_or_solvents_pct_rsd_value: value for the 'Solvents (RPD)' field in Metrcmetrc_or_solvents_process_validation_regulatornotes: notes posted to state traceability systems such as METRC or BioTrackmetrc_or_solvents_process_validation_status: pass or fail integer ID from the status enummetrc_or_solvents_regulatornotes: notes posted to state traceability systems such as METRC or BioTrackmetrc_or_solvents_rpd_regulatornotes: notes posted to state traceability systems such as METRC or BioTrackmetrc_or_solvents_rpd_status: pass or fail integer ID from the status enummetrc_or_solvents_rpd_value: Relative Percent Difference value for state traceability systemmetrc_or_solvents_status: pass or fail integer ID from the status enumnotes,notes_2throughnotes_10: optional testing notes for this assayqc_blank_dup_id: optional sample ID for QC Blank duplicateqc_blank_id: optional sample ID for QC Blankqc_blank_trip_id: optional sample ID for QC Blank triplicateqc_control_study_id: optional sample ID for Control Studyqc_lcs_dup_id: optional sample ID for QC Lab Control Sample duplicateqc_lcs_id: optional sample ID for QC Lab Control Sampleqc_lcs_trip_id: optional sample ID for QC Lab Control Sample triplicateqc_sample_dup_id: optional sample ID for QC sample duplicateqc_sample_id: optional sample ID for QC sampleqc_sample_trip_id: optional sample ID for QC sample triplicateqc_spike_dup_id: optional sample ID for QC Spike duplicateqc_spike_id: optional sample ID for QC Spikeqc_spike_trip_id: optional sample ID for QC Spike triplicatereport_units: the primary units displayed on the certificate of analysisreported_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 analysissignatory_name: name of lab employee to appear on certificate of analysissignatory_title: title of lab employee to appear on certificate of analysissignature: URL of the signature image for the reportstatus: pass or fail integer ID from the status enumwet_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 samplesanalytical_batch_id_2: optional second analytical batch ID for QC samplescontainer_description: Description of container (eg. bottle, box, tin)date_prepared: date the sample was prepared for this assaydate_tested: date the sample was tested for this assaydigits: number of digits to display on the certificate of analysis; see digits_methoddigits_method: round rounds to digits decimal places, significant rounds to digits significant figuresdry_weight: weight of aliquot after dryingfootnote: footnote to accompany this assayinput_units: units the data is being submitted in, from the category's allowed unitsml_weight: the weight in grams of 1ml of sample when any unit fields are 'mg/ml'notes,notes_2throughnotes_10: optional testing notes for this assayqc_blank_dup_id: optional sample ID for QC Blank duplicateqc_blank_id: optional sample ID for QC Blankqc_blank_trip_id: optional sample ID for QC Blank triplicateqc_control_study_id: optional sample ID for Control Studyqc_lcs_dup_id: optional sample ID for QC Lab Control Sample duplicateqc_lcs_id: optional sample ID for QC Lab Control Sampleqc_lcs_trip_id: optional sample ID for QC Lab Control Sample triplicateqc_sample_dup_id: optional sample ID for QC sample duplicateqc_sample_id: optional sample ID for QC sampleqc_sample_trip_id: optional sample ID for QC sample triplicateqc_spike_dup_id: optional sample ID for QC Spike duplicateqc_spike_id: optional sample ID for QC Spikeqc_spike_trip_id: optional sample ID for QC Spike triplicatereport_units: the primary units displayed on the certificate of analysisreported_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 analysisservings_per_container: Number of servings per containersignatory_name: name of lab employee to appear on certificate of analysissignatory_title: title of lab employee to appear on certificate of analysissignature: URL of the signature image for the reportstatus: pass or fail integer ID from the status enumtotalterpenes_outsidelimitrangeunit_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 servingvolume: volume of the aliquot in the solutionwet_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 samplesanalytical_batch_id_2: optional second analytical batch ID for QC samplesdate_prepared: date the sample was prepared for this assaydate_tested: date the sample was tested for this assaydigits: number of digits to display on the certificate of analysis; see digits_methoddigits_method: round rounds to digits decimal places, significant rounds to digits significant figuresfootnote: footnote to accompany this assayinput_units: units the data is being submitted in, from the category's allowed unitsnotes,notes_2throughnotes_10: optional testing notes for this assayqc_blank_dup_id: optional sample ID for QC Blank duplicateqc_blank_id: optional sample ID for QC Blankqc_blank_trip_id: optional sample ID for QC Blank triplicateqc_control_study_id: optional sample ID for Control Studyqc_lcs_dup_id: optional sample ID for QC Lab Control Sample duplicateqc_lcs_id: optional sample ID for QC Lab Control Sampleqc_lcs_trip_id: optional sample ID for QC Lab Control Sample triplicateqc_sample_dup_id: optional sample ID for QC sample duplicateqc_sample_id: optional sample ID for QC sampleqc_sample_trip_id: optional sample ID for QC sample triplicateqc_spike_dup_id: optional sample ID for QC Spike duplicateqc_spike_id: optional sample ID for QC Spikeqc_spike_trip_id: optional sample ID for QC Spike triplicatereport_units: the primary units displayed on the certificate of analysisreported_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 analysissignatory_name: name of lab employee to appear on certificate of analysissignatory_title: title of lab employee to appear on certificate of analysissignature: URL of the signature image for the reportstatus: 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 amendedamended_notes: optional notes detailing the amendment to the lab datafootnote: footnote to accompany this assaymetrc_co_contaminants_regulatornotes: DEPRECATED: notes posted to state traceability systems such as METRC or BioTrackmetrc_co_contaminants_status: DEPRECATED: pass or fail integer ID from the status enummetrc_nv_subcontract_testing_value: DEPRECATEDmetrc_ok_retest_all_value: value for the 'Retest (All)' field in Metrcmetrc_ok_subcontract_all_value: DEPRECATEDmetrc_or_r_and_d_test_regulatornotes: notes posted to state traceability systems such as METRC or BioTrackmetrc_or_subcontracted_test_regulatornotes: notes posted to state traceability systems such as METRC or BioTrackmetrc_or_tic_regulatornotes: notes posted to state traceability systems such as METRC or BioTracknotes,notes_2throughnotes_10: optional testing notes for this assayretest_idretest_sample_idsignatory_name: name of lab employee to appear on certificate of analysissignatory_title: title of lab employee to appear on certificate of analysissignature: URL of the signature image for the report
Path parameters
Body parameters (application/x-www-form-urlencoded)
Publish the results, and any draft CoA and CoA additions, as soon as they are stored. Defaults to false, which leaves everything in draft.
Default: False
Publication date to record when publish_data is true. Defaults to the time of the request.
The results, as a JSON-encoded object. See the description above for its structure and for the fields each category accepts.
Try it
Log in to send test requests to this endpoint straight from the docs.
Responses
200 Success
No fields beyond the success envelope.
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.
# 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"
}
]
}
}
}'
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())
// 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());
{
"success": true
}