Construction Waste API Integration: A Developer's Quickstart Guide
Adding construction waste estimation to your platform doesn't require building and maintaining your own dataset of EPA generation rates, county tipping fee schedules, and material density tables. A waste estimation API encapsulates all of that domain knowledge behind a single REST endpoint. This tutorial walks through the integration pattern from authentication through response parsing - using the WasteCalc API as the reference implementation.
This guide is written for developers building construction PM tools, dumpster rental platforms, waste hauler dispatch software, or LEED certification tools who need programmatic access to waste estimation data. You'll need basic familiarity with REST APIs and JSON.
What the API Returns
A single POST to the estimation endpoint with your project parameters returns:
- waste_by_category: Weight in lbs and tons for drywall, wood, concrete, metal, and mixed C&D, plus total tonnage
- dumpster_recommendation: Recommended container size (yards) and count based on material density and project type
- tipping_fees: Per-ton and estimated total disposal cost based on the project's zip code, sourced from county tipping fee schedules
- recycling: Diversion rate percentage and which materials qualify for recycling in the project's region
- epa_reporting: Applicable federal and state regulations, reporting threshold, and whether reporting is required for this project
Authentication
The API uses API key authentication via the Authorization header. Your key is issued when you create an account and should be treated as a secret - store it in environment variables, not in client-side code or source control.
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json
For server-side integrations, inject the key from an environment variable. In Node.js:
const API_KEY = process.env.WASTECALC_API_KEY;
if (!API_KEY) {
throw new Error('WASTECALC_API_KEY environment variable not set');
}
The Estimation Endpoint
All waste estimates are generated via POST to /v1/estimate. The request body accepts:
| Parameter | Type | Required | Description |
|---|---|---|---|
| project_type | string | Yes | "new_construction", "renovation", "demolition", "interior_demo" |
| square_footage | integer | Yes | Gross floor area of project scope in sq ft |
| zip_code | string | Yes | 5-digit ZIP for tipping fee and regulation lookup |
| materials | array | No | Specify dominant materials: ["drywall", "wood", "concrete", "metal", "roofing"] |
| construction_year | integer | No | Year built - enables age multiplier adjustment |
| scope_level | string | No | "cosmetic", "partial_gut", "full_gut", "structural" - defaults to "full_gut" |
Making Your First Request
curl -X POST https://api.wastecalcapi.com/v1/estimate \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"project_type": "renovation",
"square_footage": 2400,
"zip_code": "30301",
"materials": ["drywall", "wood", "concrete"],
"construction_year": 1975,
"scope_level": "full_gut"
}'
async function estimateWaste(projectParams) {
const response = await fetch('https://api.wastecalcapi.com/v1/estimate', {
method: 'POST',
headers: {
'Authorization': `Bearer ${API_KEY}`,
'Content-Type': 'application/json'
},
body: JSON.stringify(projectParams)
});
if (!response.ok) {
const error = await response.json();
throw new Error(`API error ${response.status}: ${error.message}`);
}
return response.json();
}
// Usage
const estimate = await estimateWaste({
project_type: 'renovation',
square_footage: 2400,
zip_code: '30301',
materials: ['drywall', 'wood', 'concrete'],
construction_year: 1975,
scope_level: 'full_gut'
});
Parsing the Response
The response is a JSON object. Here's the full structure for a renovation request:
{
"request_id": "req_01h8k2m3p4q5",
"waste_by_category": {
"drywall_lbs": 2160,
"wood_lbs": 3240,
"concrete_lbs": 4080,
"metal_lbs": 720,
"mixed_cd_lbs": 2640,
"total_lbs": 12840,
"total_tons": 6.42
},
"dumpster_recommendation": {
"size_yards": 20,
"count": 2,
"type": "roll-off",
"notes": "Two 20-yard pulls recommended. Stage first pull after demo phase, second after finish phase."
},
"tipping_fees": {
"per_ton_usd": 52,
"estimated_total_usd": 334,
"zip_code": "30301",
"county": "Fulton County, GA",
"data_as_of": "2025-Q1"
},
"recycling": {
"diversion_rate_pct": 62,
"recyclable_materials": ["metal", "concrete", "wood"],
"regional_facilities_available": true
},
"epa_reporting": {
"regulation": "40 CFR Part 261",
"reporting_required": false,
"threshold_tons": 10,
"state_regulations": ["GA EPD Rule 391-3-4"]
}
}
Displaying Results in Your UI
For dumpster rental platforms, the most valuable fields to surface at the point of booking are the dumpster recommendation and tipping fee estimate. A simple display pattern in JavaScript:
function displayWasteEstimate(estimate) {
const { dumpster_recommendation, tipping_fees, waste_by_category } = estimate;
return {
headline: `Recommended: ${dumpster_recommendation.count}x ${dumpster_recommendation.size_yards}-yard dumpster`,
detail: `Estimated ${waste_by_category.total_tons} tons of debris`,
cost: `Tipping fees: ~$${tipping_fees.estimated_total_usd} in ${tipping_fees.county}`,
notes: dumpster_recommendation.notes
};
}
// Example output at checkout:
// Recommended: 2x 20-yard dumpster
// Estimated 6.42 tons of debris
// Tipping fees: ~$334 in Fulton County, GA
Error Handling
The API returns standard HTTP status codes with JSON error bodies. The most common errors you need to handle:
| Status | Error Code | Meaning | Action |
|---|---|---|---|
| 400 | invalid_request | Missing required field or invalid value | Log field-level error, show user feedback |
| 401 | unauthorized | Invalid or missing API key | Check key configuration, don't retry |
| 404 | zip_not_found | ZIP code not in tipping fee database | Return estimate without tipping fees, flag to user |
| 429 | rate_limited | Request rate exceeded for plan | Retry with exponential backoff |
| 500 | internal_error | Server error | Retry once, then surface error to user |
async function estimateWithRetry(params, maxRetries = 2) {
for (let attempt = 0; attempt < maxRetries; attempt++) {
try {
const response = await fetch('https://api.wastecalcapi.com/v1/estimate', {
method: 'POST',
headers: { 'Authorization': `Bearer ${API_KEY}`, 'Content-Type': 'application/json' },
body: JSON.stringify(params)
});
const data = await response.json();
if (response.status === 429) {
const delay = Math.pow(2, attempt) * 1000;
await new Promise(resolve => setTimeout(resolve, delay));
continue;
}
if (response.status === 404 && data.error_code === 'zip_not_found') {
// Return partial result without tipping fees
return { ...data, tipping_fees: null, _partial: true };
}
if (!response.ok) {
throw new Error(data.message || 'Estimation failed');
}
return data;
} catch (err) {
if (attempt === maxRetries - 1) throw err;
}
}
}
Integration Patterns by Platform Type
Dumpster Rental Checkout Integration
The ideal trigger for a waste estimation API call in a dumpster rental flow is when the customer provides their project type and address. Use this data to call the API and pre-populate a container recommendation. Display the recommendation before they reach container selection - not after. The recommendation should inform the selection, not be hidden beneath it.
For implementation guidance specific to dumpster rental platforms, read our detailed tutorial on integrating waste estimation API into a dumpster rental platform.
Construction PM Software Integration
In project management tools, call the API when a project is created or when scope information is entered. Store the estimate in the project record and use it to populate waste management plan templates, CWMP documentation, and project cost budgets. The estimate becomes a baseline against which actual haul tickets are tracked throughout the project. See our guide on adding waste tracking to construction PM software for the full integration pattern.
Batch Estimation for Portfolio Management
Property managers and national GCs with large project portfolios can use the batch endpoint (POST /v1/estimate/batch) to estimate waste for multiple projects in a single request. The batch endpoint accepts up to 50 projects per call and returns an array of estimate objects in the same format as the single estimate endpoint. Rate limits apply to batch calls based on the number of projects in the batch.
Webhook Integration for Real-Time Updates
For platforms that need tipping fee data to stay current, the API supports webhook notifications when county tipping fee schedules are updated. Register a webhook endpoint to receive update events:
{
"url": "https://yourplatform.com/webhooks/wastecalc",
"events": ["tipping_fee.updated", "regulation.updated"],
"counties": ["GA-121", "CA-075", "WA-033"]
}
Webhook events include the county identifier, old rate, new rate, and effective date. Use this to invalidate cached estimates and notify users whose projects are affected by rate changes.
For the full API reference including all endpoints, parameters, and authentication flows, see the WasteCalc API documentation. For real-world integration case studies, read our guides on dumpster rental platform integration and construction PM software integration.
Start Building with WasteCalc API
Join the early access waitlist to get API credentials and start integrating. Starter plan includes 500 calls/month for development and testing. Full documentation, code samples in Node.js and Python, and priority support for platform integrations.
Join the Waitlist - Get API Access