SafetyDataSheetAPI is a product of Dscvry. Explore Dscvry →

Evidence

SDS Field Coverage Matrix: Sections 1-16

Which SDS section lands in which JSON key, what each section usually contains, and how to measure coverage on your own documents.

Last updated: 2026-10-24

What is fixed and what is not

The response carries one JSON object per SDS section under outputs.json. The 16 section keys below are part of the contract. Inside each section, the OpenAPI contract describes the content as an object and does not enumerate its fields, and the sub-fields shown here come from a sample response. Field names inside a section can vary with the document, so map defensively and validate against your own sample set.

Section to key matrix

SDS sectionNameKey in outputs.jsonTypically containsSub-fields in our sample response
1Identificationproduct_identificationProduct identifier, supplier details, emergency contact, recommended useproduct_name recommended_use supplier_name
2Hazard identificationhazards_identificationClassification, label elements (signal word, hazard and precautionary statements), other hazardsghs_classification signal_word h_statements p_statements
3Composition / information on ingredientscompositionSubstances and mixture components, CAS and EC numbers, concentration rangessubstance_name cas_number concentration_percent
4First-aid measuresfirst_aidMeasures by route of exposure, symptoms, need for medical attentioninhalation skin_contact eye_contact
5Firefighting measuresfire_fightingExtinguishing media, special hazards, advice for firefighterssuitable_extinguishing_media
6Accidental release measuresaccidental_releasePersonal precautions, environmental precautions, containment and cleanupspill_response
7Handling and storagehandling_storageSafe handling precautions, storage conditions, incompatibilitieshandling_precautions storage_conditions
8Exposure controls / personal protectionexposure_controls_ppeOccupational exposure limits, engineering controls, personal protective equipmentexposure_limits ppe
9Physical and chemical propertiesphysical_chemical_propertiesAppearance, odour, flash point, other measured propertiesappearance odor flash_point_c
10Stability and reactivitystability_reactivityReactivity, chemical stability, conditions and materials to avoidstability
11Toxicological informationtoxicological_informationAcute and chronic health effects, routes of exposureacute_toxicity
12Ecological informationecological_informationEcotoxicity, persistence, bioaccumulationaquatic_toxicity
13Disposal considerationsdisposal_considerationsWaste treatment and disposal methodsdisposal_method
14Transport informationtransport_informationUN number, proper shipping name, hazard class, packing groupun_number proper_shipping_name hazard_class packing_group
15Regulatory informationregulatory_informationSafety, health and environmental regulations specific to the producttsca
16Other informationrevision_metadataRevision date, version, other informationrevision_date version

What coverage does and does not mean

  • A section being present as a key does not mean the source document contained it. Information missing from the source is expected to come back as null, empty strings or empty arrays.
  • confidence_score and warnings describe the document as a whole. We do not publish per-field or per-section coverage percentages.
  • H and P statement codes, CAS numbers and UN numbers are standardized identifiers, so they are the easiest values to check against the source.
  • Language does not change the keys. See multilingual extraction for what we do and do not claim by language.

Measure coverage on your own documents

Run a representative folder of SDS PDFs through the API and count how often each section is filled. This uses the Python client:

import collections, glob, os
from safetydatasheetapi import Client

SECTIONS = [
    "product_identification", "hazards_identification", "composition", "first_aid", "fire_fighting",
    "accidental_release", "handling_storage", "exposure_controls_ppe", "physical_chemical_properties",
    "stability_reactivity", "toxicological_information", "ecological_information", "disposal_considerations",
    "transport_information", "regulatory_information", "revision_metadata",
]

client = Client(api_key=os.environ["SDS_API_KEY"])
filled, documents = collections.Counter(), 0
for path in glob.glob("sample-sds/*.pdf"):
    record = client.extract(path)["outputs"]["json"]
    documents += 1
    for section in SECTIONS:
        if record.get(section) not in (None, "", [], {}):
            filled[section] += 1

for section in SECTIONS:
    print(f"{section:32} {filled[section]}/{documents}")

Treat the result as a measurement of your document mix, not a product guarantee. Re-run it when your suppliers or languages change.

FAQ

Does the API always return all 16 sections?

The 16 section keys are the contract. Sections the source document does not contain are expected to come back empty.

Are the fields inside each section guaranteed?

The contract guarantees the section keys, not the field names inside them. Use the sample set approach above to see what your documents produce.

Can I get coverage numbers per section?

We do not publish them. The script above measures them on your own documents.

Related pages

Want to see it on your own document? Try a sample SDS or request an implementation plan.