Chemical Compliance Audit

Register chemicals used in production, verify ZDHC levels, flag SVHC substances, and search by CAS number.

A step-by-step recipe for compliance officers who need to build and audit a chemical inventory — from registration to SVHC flagging and CAS-based lookup.

1. Register a REACH-compliant Dye

Register a dyestuff that is already on the ZDHC MRSL at Level 2 and REACH compliant.

Shell
curl -X POST http://localhost:8080/api/v1/chemicals \
-H "Content-Type: application/json" \
-d '{
"chemical_name": "Reactive Blue 19",
"commercial_name": "Remazol Brilliant Blue R",
"cas_numbers": ["2580-78-1"],
"chemical_category": "DYES",
"user_id": 1,
"company_id": 1,
"compliance": {
"reach_compliant": true,
"zdhc_level": "LEVEL_2",
"svhc_substance": false
},
"supplier": {
"supplier_name": "Huntsman Textile Effects",
"country": "DE"
}
}'

2. Register a Chemical Flagged as SVHC

Some finishing agents contain substances of very high concern (SVHC). Flag them explicitly so they are surfaced in compliance reports.

Shell
curl -X POST http://localhost:8080/api/v1/chemicals \
-H "Content-Type: application/json" \
-d '{
"chemical_name": "Dimethylformamide (DMF)",
"cas_numbers": ["68-12-2"],
"chemical_category": "SOLVENTS",
"compliance": {
"zdhc_level": "NOT_LISTED",
"reach_compliant": false,
"svhc_substance": true
},
"supplier": {
"supplier_name": "BASF SE",
"country": "DE"
}
}'
Warning

Any chemical with svhc_substance: true must be declared in your SCIP notification (EU REACH Article 9). Ensure these records are reviewed before exporting products to the EU.

3. Search by CAS Number

When you receive a new Safety Data Sheet from a supplier, check whether the chemical is already registered before creating a duplicate.

Shell
curl "http://localhost:8080/api/v1/chemicals/search?casNumber=2580-78-1"

An empty array [] means the CAS number is not yet in your registry — proceed to register it with POST /api/v1/chemicals.

For partial searches (e.g., when you only know part of the CAS number):

Shell
curl "http://localhost:8080/api/v1/chemicals/search?casNumber=2580&partial=true"

4. List All Chemicals with Filters

Retrieve the chemical inventory with optional filters for an audit export or dashboard.

Shell
curl "http://localhost:8080/api/v1/chemicals?category=DYES&complianceStatus=non_compliant&size=50"
curl "http://localhost:8080/api/v1/chemicals?pfasContent=true"
Python
import requests
chemicals = requests.get(
"http://localhost:8080/api/v1/chemicals?size=100"
).json()
print(f"Total chemicals: {len(chemicals.get('items', []))}")

5. Update a Chemical Record

When a supplier upgrades their formulation to a ZDHC Gold level, update the record in place.

Shell
curl -X PATCH http://localhost:8080/api/v1/chemicals/1 \
-H "Content-Type: application/json" \
-d '{
"compliance": {
"zdhc_level": "LEVEL_3"
}
}'
Note

PATCH /api/v1/chemicals/{id} partially updates the record. Only include the fields you want to change.

6. Record a Chemical Purchase

Track the procurement of chemicals with full cost and quality documentation.

Shell
curl -X POST "http://localhost:8080/api/v1/chemical-purchases?userId=1" \
-H "Content-Type: application/json" \
-d '{
"chemical_product_id": 1,
"supplier_id": 5,
"company_id": 1,
"purchase_date": "2025-09-15T09:00:00",
"quantity_kg": 100.0,
"cost_per_kg": 15.00,
"currency": "EUR",
"batch_number": "RB19-2025-09-A",
"msds_received": true,
"reach_compliant": true
}'

7. Archive a Chemical

When a chemical is no longer in use, archive it (soft delete):

Shell
curl -X DELETE http://localhost:8080/api/v1/chemicals/2

Quick Audit Checklist

Before submitting an ESG report, verify the following for each chemical in your registry:

  • [ ] cas_numbers is populated — chemicals without a CAS number cannot be cross-referenced against ZDHC MRSL
  • [ ] zdhc_level is not NOT_LISTED for any chemical used in dyeing or finishing
  • [ ] svhc_substance: true chemicals have compliance documentation
  • [ ] reach_compliant: false chemicals are either phased out or have an active REACH authorisation
  • [ ] No duplicate CAS numbers — use GET /api/v1/chemicals/search?casNumber= to check before every new registration
  • [ ] Chemical purchases have msds_received: true and reach_compliant flags set