Understanding Scope 3 Category 5
Waste generated in operations covers emissions from third-party disposal and treatment of waste generated in your organization’s owned or controlled operations. According to the GHG Protocol Scope 3 Standard , Category 5 includes:
Landfill disposal : Emissions from decomposition of waste in landfills
Incineration : Emissions from burning waste (with or without energy recovery)
Recycling : Emissions from processing waste for material recovery
Composting : Emissions from biological treatment of organic waste
Waste transport : Emissions from transporting waste to treatment facilities
┌─────────────────────────────────────────────────────────────────────────────┐
│ SCOPE 3 CATEGORY 5: Waste Generated in Operations │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ YOUR FACILITIES WASTE TREATMENT │
│ ────────────────── ───────────────── │
│ │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ Office │──┐ ┌───►│ Landfill │ │
│ │ │ │ │ │ (D01) │───┐ │
│ └──────────────┘ │ │ └──────────────┘ | │
│ │ ┌──────────┐ │ | │
│ ┌──────────────┐ │ │ Waste │ │ ┌──────────────┐ | │
│ │ Warehouse │──┼───►│ Collect │────┼───►│ Incineration │ | │
│ │ │ │ │ │ │ │ (D10) │───┼ │
│ └──────────────┘ │ └──────────┘ │ └──────────────┘ | │
│ │ │ │ | │
│ ┌──────────────┐ │ │ │ ┌──────────────┐ | │
│ │ Factory │──┘ │ └───►│ Recycling │ | │
│ │ │ │ │ (R03) │───┼ │
│ └──────────────┘ │ └──────────────┘ | │
│ │ | │
│ ┌─────────▼─────────┐ | │
│ │ CATEGORY 5 │ | │
│ │ Emissions from │ | │
│ │ waste treatment + │<───────────────────────┘ │
│ │ transport │ │
│ └───────────────────┘ │
│ │
│ EXAMPLE WASTE TYPES: EXMAPLE TREATMENT METHODS: │
│ • Paper/cardboard (150101) • R01-R13: Recovery operations │
│ • Plastics (150102) • D01-D15: Disposal operations │
│ • Mixed packaging (150106) • R03: Recycling │
│ • Organic waste (200108) • R01: Energy recovery │
│ • Electronic waste (160214) • D01: Landfill │
│ • Hazardous waste (various) • D10: Incineration │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
Category 5 vs Other Waste-Related Emissions
Category 5 : Waste generated in your operations, treated by third parties
Category 12 : End-of-life treatment of products you sell (downstream)
Scope 1 : Waste treatment at facilities you own/control (e.g., on-site incineration)
Prerequisites
Before starting, ensure you have:
Dcycle API credentials (get them here )
Completed Step 1: Company Structure
At least one facility created
Waste manifests or invoices from your waste management provider
Basic knowledge of Python or JavaScript
Using the Dcycle App? You can track waste through our web interface:
Data Map: Category 5 Requirements Overview
┌────────────────────────────────────────────────────────────────────────────────────────┐
│ CATEGORY 5 DATA REQUIREMENTS OVERVIEW │
├────────────────────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────────────────────────────┐ │
│ │ WASTE RECORD (Per waste entry) │ │
│ ├─────────────────────────────────────────────────────────────────────────────────┤ │
│ │ │ │
│ │ Required Fields Optional Fields │ │
│ │ ────────────────── ────────────────── │ │
│ │ • facility_id • rd_code (treatment code) │ │
│ │ • ler_code (LER/LoW code) • identification_name │ │
│ │ • quantity (kg) • description │ │
│ │ • start_date • destination │ │
│ │ • end_date • total_km_to_waste_center │ │
│ │ • file_url (supporting doc) │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────────────────────────────┐ │
│ │ CALCULATION FLOW │ │
│ ├─────────────────────────────────────────────────────────────────────────────────┤ │
│ │ │ │
│ │ LER Code + RD Code ──► Waste Emission Factor (kg CO₂e/kg) │ │
│ │ │ │ │
│ │ Quantity (kg) ─────────────────┼──► Treatment Emissions │ │
│ │ │ │ │
│ │ Distance (km) ─────────────────┼──► Transport Emissions │ │
│ │ │ │ │
│ │ Total CO₂e = (Quantity × Waste EF) + (ton-km × Transport EF) │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────────────────┘
Understanding Waste Codes
LER Codes (European List of Waste)
The LER code (also called LoW code) is a 6-digit code that identifies the type of waste according to the European List of Waste. Common examples:
LER Code Description Category 150101Paper and cardboard packaging Non-hazardous 150102Plastic packaging Non-hazardous 150103Wooden packaging Non-hazardous 150106Mixed packaging Non-hazardous 200108Biodegradable kitchen waste Non-hazardous 200301Mixed municipal waste Non-hazardous 160214Electronic equipment Non-hazardous 150110*Packaging with hazardous residues Hazardous 160601*Lead batteries Hazardous
Hazardous Waste LER codes ending with an asterisk (*) indicate hazardous waste. These typically have different emission factors and require special handling documentation.
RD Codes (Treatment Methods)
The RD code identifies the treatment or disposal method. It consists of R (Recovery) or D (Disposal) followed by a 2-digit number:
Recovery Operations (R codes):
Code Description Typical Impact R01Energy recovery (incineration with energy) Medium R02Solvent reclamation Low R03Recycling/reclamation of organic substances Low R04Recycling/reclamation of metals Low R05Recycling/reclamation of other inorganics Low R10Land treatment (composting) Low R12Exchange of waste for recovery Variable R13Storage pending recovery N/A
Disposal Operations (D codes):
Code Description Typical Impact D01Deposit into or onto land (landfill) High D02Land treatment (not composting) Medium D09Physico-chemical treatment Medium D10Incineration on land (without energy recovery) High D14Repackaging prior to disposal N/A D15Storage pending disposal N/A
When RD Code is Unknown A single LoW/LER code can be associated with multiple treatment methods (RD codes), each with different emission factors. If the RD code is not provided, Dcycle automatically uses the average emission factor across all possible treatment methods for that waste type. For more accurate emissions calculations, provide the RD code when known from your waste management documentation.
Emission Factor Sources
Dcycle uses waste emission factors derived from the IPCC Guidelines for National Greenhouse Gas Inventories :
Intergovernmental Panel on Climate Change (IPCC)
Default emission factors for solid waste disposal sites (landfill)
Methane (CH₄) emissions from anaerobic decomposition
Waste incineration factors for CO₂ and N₂O
Covers all standard waste categories and treatment methods
Treatment-Specific Factors
By disposal/recovery method:
Landfill (D01) : CH₄ from organic decomposition, based on IPCC default methane correction factors
Incineration (D10/R01) : CO₂ from fossil carbon content + N₂O from combustion
Recycling (R03-R05) : Processing emissions, often offset by avoided virgin material
Composting (R10) : CH₄ and N₂O from biological treatment
Waste transport to treatment facility:
Based on average truck emissions (Ecoinvent)
Calculated using: (quantity_kg / 1000) × distance_km × transport_ef
Default transport EF: ~0.1 kg CO₂e per ton-km
Step 1: Create Waste Records
📋 Data Map: Single Waste Record
Field Type Required Description Example facility_idUUID ✅ Facility generating waste "facility-uuid"ler_codestring ✅ 6-digit LER/LoW code "150101"quantitynumber ✅ Waste quantity (kg) 500start_datedate ✅ Period start "2024-01-01"end_datedate ✅ Period end "2024-03-31"rd_codestring ❌ Treatment method code "R03"identification_namestring ❌ Reference (invoice #) "WM-2024-001"descriptionstring ❌ Waste description "Office paper waste"destinationstring ❌ Treatment facility name "Green Recycling Ltd"total_km_to_waste_centernumber ❌ Distance to treatment 25
Where to get this data:
LER code : Waste manifest or transfer note from waste collector
RD code : Waste management invoice or certificate
Quantity : Weighbridge ticket or estimated from container size
Distance : Address of treatment facility (or ask waste provider)
Track individual waste disposal from your facilities:
import requests
import os
headers = {
"Authorization" : f "Bearer { os.getenv( 'DCYCLE_API_KEY' ) } " ,
"Content-Type" : "application/json" ,
"x-organization-id" : os.getenv( "DCYCLE_ORG_ID" ),
"x-user-id" : os.getenv( "DCYCLE_USER_ID" ),
}
# Get your facility ID
facilities = requests.get(
"https://api.dcycle.io/api/v1/facilities" ,
headers = headers,
params = { "page" : 1 , "size" : 100 }
).json()
facility_id = facilities[ 'items' ][ 0 ][ 'id' ]
# Example: Office paper recycling
waste_data = {
"facility_id" : facility_id,
"ler_code" : "150101" , # Paper and cardboard packaging
"rd_code" : "R03" , # Recycling
"quantity" : 500 , # 500 kg
"start_date" : "2024-01-01" ,
"end_date" : "2024-03-31" ,
"identification_name" : "WM-2024-Q1-001" ,
"description" : "Office paper and cardboard waste - Q1 2024" ,
"destination" : "Green Recycling Ltd" ,
"total_km_to_waste_center" : 25 , # Distance to recycling facility
}
response = requests.post(
f "https://api.dcycle.io/api/v1/facilities/ { facility_id } /wastes" ,
headers = headers,
json = waste_data
).json()
print ( f "✅ Waste record created" )
print ( f " ID: { response[ 'id' ] } " )
print ( f " LER Code: { waste_data[ 'ler_code' ] } " )
print ( f " Treatment: { waste_data[ 'rd_code' ] } " )
print ( f " Quantity: { waste_data[ 'quantity' ] } kg" )
print ( f " CO₂e: { response.get( 'co2e' , 'Calculating...' ) } kg" )
Common Waste Types Example
Track multiple waste streams from your facility:
# Track all Q1 2024 waste from a facility
waste_records = [
{
"ler_code" : "150101" , # Paper/cardboard
"rd_code" : "R03" , # Recycling
"quantity" : 500 ,
"description" : "Office paper and cardboard" ,
},
{
"ler_code" : "150102" , # Plastic
"rd_code" : "R03" , # Recycling
"quantity" : 150 ,
"description" : "Plastic packaging" ,
},
{
"ler_code" : "200301" , # Mixed municipal
"rd_code" : "D01" , # Landfill
"quantity" : 200 ,
"description" : "General office waste (non-recyclable)" ,
},
{
"ler_code" : "200108" , # Organic
"rd_code" : "R10" , # Composting
"quantity" : 100 ,
"description" : "Canteen food waste" ,
},
{
"ler_code" : "160214" , # Electronics
"rd_code" : "R04" , # Metal recovery
"quantity" : 25 ,
"description" : "End-of-life IT equipment" ,
},
]
created_records = []
for waste in waste_records:
waste_data = {
"facility_id" : facility_id,
"ler_code" : waste[ "ler_code" ],
"rd_code" : waste[ "rd_code" ],
"quantity" : waste[ "quantity" ],
"start_date" : "2024-01-01" ,
"end_date" : "2024-03-31" ,
"description" : waste[ "description" ],
"total_km_to_waste_center" : 25 ,
}
response = requests.post(
f "https://api.dcycle.io/api/v1/facilities/ { facility_id } /wastes" ,
headers = headers,
json = waste_data
).json()
created_records.append(response)
print ( f " { waste[ 'description' ] } : { waste[ 'quantity' ] } kg → { waste[ 'rd_code' ] } " )
print ( f " \n ✅ Created {len (created_records) } waste records" )
total_waste = sum (w[ 'quantity' ] for w in waste_records)
print ( f " Total waste: { total_waste } kg" )
Step 2: Upload Waste Documents (PDF)
Dcycle can automatically extract waste data from PDF invoices:
import requests
import os
import base64
headers = {
"Authorization" : f "Bearer { os.getenv( 'DCYCLE_API_KEY' ) } " ,
"x-organization-id" : os.getenv( "DCYCLE_ORG_ID" ),
"x-user-id" : os.getenv( "DCYCLE_USER_ID" ),
}
# Read and encode the PDF file
with open ( "waste_invoice.pdf" , "rb" ) as f:
file_content = f.read()
# Upload the waste invoice
files = {
"file" : ( "waste_invoice.pdf" , file_content, "application/pdf" ),
}
data = {
"supplier" : "generic" , # Or specific waste provider if supported
"kms_to_waste_center" : 25 , # Optional: distance to treatment facility
}
response = requests.post(
f "https://api.dcycle.io/api/v1/facilities/ { facility_id } /wastes/upload" ,
headers = headers,
files = files,
data = data
)
if response.status_code == 200 :
result = response.json()
print ( f "✅ Waste invoice processed" )
for waste in result:
print ( f " LER: { waste.get( 'ler_code' ) } | Treatment: { waste.get( 'rd_code' ) } " )
print ( f " Quantity: { waste.get( 'quantity' ) } kg" )
print ( f " CO₂e: { waste.get( 'co2e' , 'Calculating...' ) } kg" )
else :
print ( f "❌ Upload failed: { response.text } " )
Supported Waste Invoice Formats Dcycle’s OCR can extract data from standard waste transfer notes and invoices, including:
Spanish DI (Documento de Identificación)
Standard European waste manifests
Various waste management company formats
The system extracts: LER code, quantity, date, and description automatically.
Step 3: Bulk Upload Waste Records
For organizations with many waste streams, use CSV upload:
facility_id, ler_code, rd_code, quantity, start_date, end_date, description, destination, kms_to_waste_center
"facility-uuid-1", "150101", "R03", 500, "2024-01-01", "2024-03-31", "Paper recycling", "Green Recycling", 25
"facility-uuid-1", "150102", "R03", 150, "2024-01-01", "2024-03-31", "Plastic recycling", "Green Recycling", 25
"facility-uuid-1", "200301", "D01", 200, "2024-01-01", "2024-03-31", "General waste", "City Landfill", 40
"facility-uuid-2", "150101", "R03", 300, "2024-01-01", "2024-03-31", "Paper recycling", "EcoWaste Ltd", 15
"facility-uuid-2", "200108", "R10", 75, "2024-01-01", "2024-03-31", "Food waste", "CompostCo", 20
CSV Notes:
quantity is always in kilograms (kg)
kms_to_waste_center is optional but recommended for accurate transport emissions
Use the correct facility_id for each waste record
Step 4: Query Category 5 Emissions
Get Waste Totals by Facility
import requests
import os
headers = {
"Authorization" : f "Bearer { os.getenv( 'DCYCLE_API_KEY' ) } " ,
"Content-Type" : "application/json" ,
"x-organization-id" : os.getenv( "DCYCLE_ORG_ID" ),
"x-user-id" : os.getenv( "DCYCLE_USER_ID" ),
}
# Get all waste records for a facility
response = requests.get(
f "https://api.dcycle.io/api/v1/facilities/ { facility_id } /wastes" ,
headers = headers,
params = {
"start_date" : "2024-01-01" ,
"end_date" : "2024-12-31" ,
}
).json()
print ( f "📊 Scope 3 Category 5: Waste Generated in Operations (2024)" )
print ( "=" * 60 )
total_quantity = 0
total_co2e = 0
for waste in response.get( 'items' , []):
total_quantity += waste[ 'quantity' ]
total_co2e += waste.get( 'co2e' , 0 )
print ( f " { waste[ 'description' ][: 30 ] } : { waste[ 'quantity' ] } kg → { waste.get( 'co2e' , 0 ) :.1f } kg CO₂e" )
print ( "-" * 60 )
print ( f " Total waste: { total_quantity :,.0f } kg" )
print ( f " Total CO₂e: { total_co2e :,.1f } kg ( { total_co2e / 1000 :.2f } tonnes)" )
Analyze by Treatment Method
# Group waste by treatment method
from collections import defaultdict
treatment_summary = defaultdict( lambda : { "quantity" : 0 , "co2e" : 0 , "records" : 0 })
for waste in response.get( 'items' , []):
rd_code = waste.get( 'rd_code' , 'Unknown' )
treatment_summary[rd_code][ "quantity" ] += waste[ 'quantity' ]
treatment_summary[rd_code][ "co2e" ] += waste.get( 'co2e' , 0 )
treatment_summary[rd_code][ "records" ] += 1
print ( " \n 📊 Category 5 by Treatment Method:" )
print ( "-" * 50 )
treatment_names = {
"R01" : "Energy recovery" ,
"R03" : "Recycling" ,
"R04" : "Metal recovery" ,
"R10" : "Composting" ,
"D01" : "Landfill" ,
"D10" : "Incineration" ,
}
for rd_code, data in sorted (treatment_summary.items()):
name = treatment_names.get(rd_code, rd_code)
print ( f " { rd_code } ( { name } ):" )
print ( f " Quantity: { data[ 'quantity' ] :,.0f } kg" )
print ( f " CO₂e: { data[ 'co2e' ] :,.1f } kg" )
print ( f " Records: { data[ 'records' ] } " )
print ()
Compare to Total Scope 3
# Get total Scope 3 for context
scope3_response = requests.get(
"https://api.dcycle.io/api/v1/total_impacts" ,
headers = headers,
params = {
"start_date" : "2024-01-01" ,
"end_date" : "2024-12-31" ,
"categories" : "wastes"
}
).json()
cat5_total = sum (i.get( "co2e" , 0 ) for i in scope3_response.get( "items" , []))
# Get all Scope 3
all_scope3 = requests.get(
"https://api.dcycle.io/api/v1/total_impacts" ,
headers = headers,
params = {
"start_date" : "2024-01-01" ,
"end_date" : "2024-12-31" ,
"scopes" : "scope_3"
}
).json()
scope3_total = sum (i.get( "co2e" , 0 ) for i in all_scope3.get( "items" , []))
print ( f " \n 📊 Category 5 Context:" )
print ( f " Category 5: { cat5_total :,.0f } kg CO₂e" )
print ( f " Total Scope 3: { scope3_total :,.0f } kg CO₂e" )
if scope3_total > 0 :
print ( f " Category 5 as % of Scope 3: { cat5_total / scope3_total * 100 :.1f } %" )
Best Practices
1. Track All Waste Streams
# Ensure comprehensive coverage
required_waste_streams = [
{ "category" : "Paper/Cardboard" , "ler_codes" : [ "150101" , "200101" ]},
{ "category" : "Plastics" , "ler_codes" : [ "150102" , "200139" ]},
{ "category" : "Glass" , "ler_codes" : [ "150107" , "200102" ]},
{ "category" : "Metals" , "ler_codes" : [ "150104" , "200140" ]},
{ "category" : "Organic" , "ler_codes" : [ "200108" , "200201" ]},
{ "category" : "General/Mixed" , "ler_codes" : [ "200301" , "150106" ]},
{ "category" : "Electronics" , "ler_codes" : [ "160214" , "200135*" ]},
]
# Check coverage
tracked_ler_codes = set (w.get( 'ler_code' ) for w in response.get( 'items' , []))
print ( "📋 Waste Stream Coverage:" )
for stream in required_waste_streams:
covered = any (ler in tracked_ler_codes for ler in stream[ 'ler_codes' ])
status = "✅" if covered else "❌"
print ( f " { status } { stream[ 'category' ] } " )
2. Prioritize High-Impact Waste
# Identify waste types with highest emissions
waste_by_impact = sorted (
response.get( 'items' , []),
key =lambda w: w.get( 'co2e' , 0 ),
reverse = True
)
print ( " \n 🎯 Top 5 Highest Impact Waste:" )
for i, waste in enumerate (waste_by_impact[: 5 ], 1 ):
print ( f " { i } . { waste[ 'description' ][: 35 ] } " )
print ( f " LER: { waste[ 'ler_code' ] } | Treatment: { waste[ 'rd_code' ] } " )
print ( f " CO₂e: { waste.get( 'co2e' , 0 ) :,.1f } kg" )
# Suggest improvement if using disposal
if waste.get( 'rd_code' , '' ).startswith( 'D' ):
print ( f " 💡 Consider recycling (R03) to reduce emissions" )
print ()
3. Track Diversion Rate
# Calculate waste diversion from landfill
def calculate_diversion_rate (wastes):
"""Calculate percentage of waste diverted from landfill"""
total_quantity = 0
diverted_quantity = 0
for waste in wastes:
quantity = waste.get( 'quantity' , 0 )
rd_code = waste.get( 'rd_code' , '' )
total_quantity += quantity
# R codes (except R13) and some D codes are considered diversion
if rd_code.startswith( 'R' ) and rd_code != 'R13' :
diverted_quantity += quantity
elif rd_code in [ 'D09' , 'D14' ]: # Treatment/processing
diverted_quantity += quantity
if total_quantity > 0 :
return (diverted_quantity / total_quantity) * 100
return 0
diversion_rate = calculate_diversion_rate(response.get( 'items' , []))
print ( f " \n ♻️ Waste Diversion Rate: { diversion_rate :.1f } %" )
if diversion_rate < 50 :
print ( " ⚠️ Below 50 % - s ignificant improvement opportunity" )
elif diversion_rate < 75 :
print ( " 📈 Good progress - target 75%+" )
else :
print ( " ✅ Excellent diversion rate!" )
Reduction Strategies for Category 5
Reduce waste generation : Source reduction is the most effective strategy
Increase recycling : Switch from D01 (landfill) to R03 (recycling) where possible
Composting : Divert organic waste from landfill to R10
Energy recovery : If recycling isn’t possible, R01 beats D01
Local treatment : Reduce transport emissions with nearby facilities
Supplier engagement : Work with waste providers on lower-carbon options
Troubleshooting
Issue: LER Code Not Found
# Get available LER codes
ler_codes = requests.get(
"https://api.dcycle.io/api/v1/waste_efs/ler_codes" ,
headers = headers
).json()
print ( "Available LER codes:" )
for code in ler_codes[: 10 ]:
print ( f " { code[ 'low_code' ] } : { code[ 'low_description' ] } " )
# If your code isn't found, try the generic version
# e.g., "150101" → check if "1501*" or "15*" exists
Issue: Unknown Treatment Method
# Get available RD codes
rd_codes = requests.get(
"https://api.dcycle.io/api/v1/waste_efs/rd_codes" ,
headers = headers
).json()
print ( "Available treatment codes:" )
for code in rd_codes:
print ( f " { code[ 'rd_code' ] } : { code[ 'rd_description' ] } " )
Issue: Category 5 Seems Too Low
# Common reasons for underreported waste emissions:
checks = {
"Missing waste streams" : "Check all facilities are tracked" ,
"Incomplete periods" : "Ensure full year coverage" ,
"Missing transport" : "Add kms_to_waste_center where known" ,
"Contractor waste" : "Include waste from on-site contractors" ,
"Construction waste" : "Don't forget renovation/construction debris" ,
}
print ( "🔍 Checklist for Category 5 completeness:" )
for issue, action in checks.items():
print ( f " ☐ { issue } " )
print ( f " → { action } " )
Next Steps