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.
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.
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"}}'
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.
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):
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.
curl "http://localhost:8080/api/v1/chemicals?category=DYES&complianceStatus=non_compliant&size=50"curl "http://localhost:8080/api/v1/chemicals?pfasContent=true"
import requestschemicals = 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.
curl -X PATCH http://localhost:8080/api/v1/chemicals/1 \-H "Content-Type: application/json" \-d '{"compliance": {"zdhc_level": "LEVEL_3"}}'
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.
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):
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_numbersis populated — chemicals without a CAS number cannot be cross-referenced against ZDHC MRSL - [ ]
zdhc_levelis notNOT_LISTEDfor any chemical used in dyeing or finishing - [ ]
svhc_substance: truechemicals have compliance documentation - [ ]
reach_compliant: falsechemicals 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: trueandreach_compliantflags set