Generate WTN
curl --request POST \
--url https://api.example.com/v1/generate-wtn \
--header 'Authorization: <authorization>' \
--header 'Content-Type: <content-type>' \
--data '
{
"producer": {},
"producer.name": "<string>",
"producer.address": "<string>",
"producer.sic_code": "<string>",
"producer.contact_name": "<string>",
"carrier": {},
"carrier.registration_number": "<string>",
"carrier.auto_verify": true,
"waste": {},
"waste.description": "<string>",
"waste.auto_classify": true,
"waste.ewc_code": "<string>",
"waste.quantity_kg": 123,
"waste.container_type": "<string>",
"destination": {},
"destination.name": "<string>",
"destination.address": "<string>",
"destination.permit_number": "<string>",
"transfer_date": "<string>"
}
'import requests
url = "https://api.example.com/v1/generate-wtn"
payload = {
"producer": {},
"producer.name": "<string>",
"producer.address": "<string>",
"producer.sic_code": "<string>",
"producer.contact_name": "<string>",
"carrier": {},
"carrier.registration_number": "<string>",
"carrier.auto_verify": True,
"waste": {},
"waste.description": "<string>",
"waste.auto_classify": True,
"waste.ewc_code": "<string>",
"waste.quantity_kg": 123,
"waste.container_type": "<string>",
"destination": {},
"destination.name": "<string>",
"destination.address": "<string>",
"destination.permit_number": "<string>",
"transfer_date": "<string>"
}
headers = {
"Authorization": "<authorization>",
"Content-Type": "<content-type>"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: '<authorization>', 'Content-Type': '<content-type>'},
body: JSON.stringify({
producer: {},
'producer.name': '<string>',
'producer.address': '<string>',
'producer.sic_code': '<string>',
'producer.contact_name': '<string>',
carrier: {},
'carrier.registration_number': '<string>',
'carrier.auto_verify': true,
waste: {},
'waste.description': '<string>',
'waste.auto_classify': true,
'waste.ewc_code': '<string>',
'waste.quantity_kg': 123,
'waste.container_type': '<string>',
destination: {},
'destination.name': '<string>',
'destination.address': '<string>',
'destination.permit_number': '<string>',
transfer_date: '<string>'
})
};
fetch('https://api.example.com/v1/generate-wtn', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.example.com/v1/generate-wtn",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'producer' => [
],
'producer.name' => '<string>',
'producer.address' => '<string>',
'producer.sic_code' => '<string>',
'producer.contact_name' => '<string>',
'carrier' => [
],
'carrier.registration_number' => '<string>',
'carrier.auto_verify' => true,
'waste' => [
],
'waste.description' => '<string>',
'waste.auto_classify' => true,
'waste.ewc_code' => '<string>',
'waste.quantity_kg' => 123,
'waste.container_type' => '<string>',
'destination' => [
],
'destination.name' => '<string>',
'destination.address' => '<string>',
'destination.permit_number' => '<string>',
'transfer_date' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: <authorization>",
"Content-Type: <content-type>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.example.com/v1/generate-wtn"
payload := strings.NewReader("{\n \"producer\": {},\n \"producer.name\": \"<string>\",\n \"producer.address\": \"<string>\",\n \"producer.sic_code\": \"<string>\",\n \"producer.contact_name\": \"<string>\",\n \"carrier\": {},\n \"carrier.registration_number\": \"<string>\",\n \"carrier.auto_verify\": true,\n \"waste\": {},\n \"waste.description\": \"<string>\",\n \"waste.auto_classify\": true,\n \"waste.ewc_code\": \"<string>\",\n \"waste.quantity_kg\": 123,\n \"waste.container_type\": \"<string>\",\n \"destination\": {},\n \"destination.name\": \"<string>\",\n \"destination.address\": \"<string>\",\n \"destination.permit_number\": \"<string>\",\n \"transfer_date\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "<authorization>")
req.Header.Add("Content-Type", "<content-type>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.example.com/v1/generate-wtn")
.header("Authorization", "<authorization>")
.header("Content-Type", "<content-type>")
.body("{\n \"producer\": {},\n \"producer.name\": \"<string>\",\n \"producer.address\": \"<string>\",\n \"producer.sic_code\": \"<string>\",\n \"producer.contact_name\": \"<string>\",\n \"carrier\": {},\n \"carrier.registration_number\": \"<string>\",\n \"carrier.auto_verify\": true,\n \"waste\": {},\n \"waste.description\": \"<string>\",\n \"waste.auto_classify\": true,\n \"waste.ewc_code\": \"<string>\",\n \"waste.quantity_kg\": 123,\n \"waste.container_type\": \"<string>\",\n \"destination\": {},\n \"destination.name\": \"<string>\",\n \"destination.address\": \"<string>\",\n \"destination.permit_number\": \"<string>\",\n \"transfer_date\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/v1/generate-wtn")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = '<authorization>'
request["Content-Type"] = '<content-type>'
request.body = "{\n \"producer\": {},\n \"producer.name\": \"<string>\",\n \"producer.address\": \"<string>\",\n \"producer.sic_code\": \"<string>\",\n \"producer.contact_name\": \"<string>\",\n \"carrier\": {},\n \"carrier.registration_number\": \"<string>\",\n \"carrier.auto_verify\": true,\n \"waste\": {},\n \"waste.description\": \"<string>\",\n \"waste.auto_classify\": true,\n \"waste.ewc_code\": \"<string>\",\n \"waste.quantity_kg\": 123,\n \"waste.container_type\": \"<string>\",\n \"destination\": {},\n \"destination.name\": \"<string>\",\n \"destination.address\": \"<string>\",\n \"destination.permit_number\": \"<string>\",\n \"transfer_date\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"reference": "<string>",
"duty_of_care": {},
"duty_of_care.all_checks_passed": true
}API Reference
Generate WTN
Generate a fully structured digital Waste Transfer Note
POST
/
v1
/
generate-wtn
Generate WTN
curl --request POST \
--url https://api.example.com/v1/generate-wtn \
--header 'Authorization: <authorization>' \
--header 'Content-Type: <content-type>' \
--data '
{
"producer": {},
"producer.name": "<string>",
"producer.address": "<string>",
"producer.sic_code": "<string>",
"producer.contact_name": "<string>",
"carrier": {},
"carrier.registration_number": "<string>",
"carrier.auto_verify": true,
"waste": {},
"waste.description": "<string>",
"waste.auto_classify": true,
"waste.ewc_code": "<string>",
"waste.quantity_kg": 123,
"waste.container_type": "<string>",
"destination": {},
"destination.name": "<string>",
"destination.address": "<string>",
"destination.permit_number": "<string>",
"transfer_date": "<string>"
}
'import requests
url = "https://api.example.com/v1/generate-wtn"
payload = {
"producer": {},
"producer.name": "<string>",
"producer.address": "<string>",
"producer.sic_code": "<string>",
"producer.contact_name": "<string>",
"carrier": {},
"carrier.registration_number": "<string>",
"carrier.auto_verify": True,
"waste": {},
"waste.description": "<string>",
"waste.auto_classify": True,
"waste.ewc_code": "<string>",
"waste.quantity_kg": 123,
"waste.container_type": "<string>",
"destination": {},
"destination.name": "<string>",
"destination.address": "<string>",
"destination.permit_number": "<string>",
"transfer_date": "<string>"
}
headers = {
"Authorization": "<authorization>",
"Content-Type": "<content-type>"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: '<authorization>', 'Content-Type': '<content-type>'},
body: JSON.stringify({
producer: {},
'producer.name': '<string>',
'producer.address': '<string>',
'producer.sic_code': '<string>',
'producer.contact_name': '<string>',
carrier: {},
'carrier.registration_number': '<string>',
'carrier.auto_verify': true,
waste: {},
'waste.description': '<string>',
'waste.auto_classify': true,
'waste.ewc_code': '<string>',
'waste.quantity_kg': 123,
'waste.container_type': '<string>',
destination: {},
'destination.name': '<string>',
'destination.address': '<string>',
'destination.permit_number': '<string>',
transfer_date: '<string>'
})
};
fetch('https://api.example.com/v1/generate-wtn', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.example.com/v1/generate-wtn",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'producer' => [
],
'producer.name' => '<string>',
'producer.address' => '<string>',
'producer.sic_code' => '<string>',
'producer.contact_name' => '<string>',
'carrier' => [
],
'carrier.registration_number' => '<string>',
'carrier.auto_verify' => true,
'waste' => [
],
'waste.description' => '<string>',
'waste.auto_classify' => true,
'waste.ewc_code' => '<string>',
'waste.quantity_kg' => 123,
'waste.container_type' => '<string>',
'destination' => [
],
'destination.name' => '<string>',
'destination.address' => '<string>',
'destination.permit_number' => '<string>',
'transfer_date' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: <authorization>",
"Content-Type: <content-type>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.example.com/v1/generate-wtn"
payload := strings.NewReader("{\n \"producer\": {},\n \"producer.name\": \"<string>\",\n \"producer.address\": \"<string>\",\n \"producer.sic_code\": \"<string>\",\n \"producer.contact_name\": \"<string>\",\n \"carrier\": {},\n \"carrier.registration_number\": \"<string>\",\n \"carrier.auto_verify\": true,\n \"waste\": {},\n \"waste.description\": \"<string>\",\n \"waste.auto_classify\": true,\n \"waste.ewc_code\": \"<string>\",\n \"waste.quantity_kg\": 123,\n \"waste.container_type\": \"<string>\",\n \"destination\": {},\n \"destination.name\": \"<string>\",\n \"destination.address\": \"<string>\",\n \"destination.permit_number\": \"<string>\",\n \"transfer_date\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "<authorization>")
req.Header.Add("Content-Type", "<content-type>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.example.com/v1/generate-wtn")
.header("Authorization", "<authorization>")
.header("Content-Type", "<content-type>")
.body("{\n \"producer\": {},\n \"producer.name\": \"<string>\",\n \"producer.address\": \"<string>\",\n \"producer.sic_code\": \"<string>\",\n \"producer.contact_name\": \"<string>\",\n \"carrier\": {},\n \"carrier.registration_number\": \"<string>\",\n \"carrier.auto_verify\": true,\n \"waste\": {},\n \"waste.description\": \"<string>\",\n \"waste.auto_classify\": true,\n \"waste.ewc_code\": \"<string>\",\n \"waste.quantity_kg\": 123,\n \"waste.container_type\": \"<string>\",\n \"destination\": {},\n \"destination.name\": \"<string>\",\n \"destination.address\": \"<string>\",\n \"destination.permit_number\": \"<string>\",\n \"transfer_date\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/v1/generate-wtn")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = '<authorization>'
request["Content-Type"] = '<content-type>'
request.body = "{\n \"producer\": {},\n \"producer.name\": \"<string>\",\n \"producer.address\": \"<string>\",\n \"producer.sic_code\": \"<string>\",\n \"producer.contact_name\": \"<string>\",\n \"carrier\": {},\n \"carrier.registration_number\": \"<string>\",\n \"carrier.auto_verify\": true,\n \"waste\": {},\n \"waste.description\": \"<string>\",\n \"waste.auto_classify\": true,\n \"waste.ewc_code\": \"<string>\",\n \"waste.quantity_kg\": 123,\n \"waste.container_type\": \"<string>\",\n \"destination\": {},\n \"destination.name\": \"<string>\",\n \"destination.address\": \"<string>\",\n \"destination.permit_number\": \"<string>\",\n \"transfer_date\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"reference": "<string>",
"duty_of_care": {},
"duty_of_care.all_checks_passed": true
}Generate WTN
Generates a fully structured, compliance-checked digital Waste Transfer Note. This is a composite endpoint that runs carrier verification and waste classification in parallel internally, then combines the results into a single WTN document. Each WTN is persisted with a unique reference and can be retrieved later via GET /v1/wtn/.Requires authentication via
Authorization header. See Authentication.Request
Method:POST
Path: /v1/generate-wtn
Headers
string
required
Bearer token with your API key, e.g.
Bearer wc_live_your_keystring
required
Must be
application/jsonBody Parameters
object
required
The business producing the waste
string
required
Business name
string
required
Business address
string
SIC code for the producer’s industry
string
Contact person’s name
object
required
The waste carrier
string
required
CBDU/CBDL registration number
boolean
Verify against EA register (default:
true)object
required
Details of the waste being transferred
string
required
Plain-English waste description
boolean
Classify into EWC codes (default:
true)string
Provide directly if
auto_classify is falsenumber
Weight in kilograms
string
Container type (e.g.
skip, wheelie_bin, drum)object
required
The receiving waste facility
string
required
Facility name
string
required
Facility address
string
Environmental permit number (e.g.
EPR/AB1234CD)string
required
Date of waste transfer (YYYY-MM-DD format)
Response
Success Response (201)
{
"reference": "WTN-2026-0325-A7X9",
"status": "complete",
"producer": {
"name": "ABC Office Fit-out Ltd",
"address": "45 High Street, Bournemouth, BH1 2AA",
"sic_code": "43320"
},
"carrier": {
"registration_number": "CBDU217016",
"business_name": "ACME WASTE SERVICES LTD",
"tier": "upper",
"verified": true,
"expiry_date": "2027-01-15"
},
"waste": {
"description": "Broken plasterboard from office refurbishment",
"ewc_code": "17 08 02",
"ewc_description": "Gypsum-based construction materials",
"is_hazardous": false,
"quantity_kg": 2500,
"container_type": "skip"
},
"destination": {
"name": "South Coast Recycling Ltd",
"address": "Industrial Estate, Poole, BH15 1NF",
"permit_number": "EPR/AB1234CD"
},
"duty_of_care": {
"producer_identified": true,
"carrier_verified": true,
"waste_classified": true,
"destination_provided": true,
"all_checks_passed": true
},
"compliance": {
"is_compliant": true,
"flags": [],
"warnings": []
},
"transfer_date": "2026-03-25",
"created_at": "2026-03-25T14:32:00Z"
}
string
Unique WTN reference (e.g.
WTN-2026-0325-A7X9). Use this to retrieve the WTN later.object
Confirms whether each legal requirement for waste transfer is met
boolean
True only when all duty of care checks pass
Duty of Care Checklist
| Field | Description |
|---|---|
producer_identified | Producer name and address are provided |
carrier_verified | Carrier registration verified against the EA register |
waste_classified | Waste has been classified with a valid EWC code |
destination_provided | Destination facility name and address are provided |
all_checks_passed | True only when all above checks pass |
Performance Notes
Total latency is typically 2-3 seconds, driven by the classification step. If you provide anewc_code directly and set auto_classify to false, latency drops to ~500ms.
WTNs are not cached. Each request creates a new document. The internal calls to /v1/verify-carrier and /v1/classify-waste use their own caches, so repeated WTNs for the same carrier or waste type are faster.
Error Responses
| Code | HTTP | When |
|---|---|---|
INVALID_REQUEST | 400 | Missing required fields |
CARRIER_NOT_FOUND | 404 | Carrier registration not found (when auto_verify is true) |
CLASSIFICATION_FAILED | 500 | Waste classification could not be completed |
Example
curl -X POST https://api.wastecheck.co.uk/v1/generate-wtn \
-H "Authorization: Bearer wc_live_your_api_key_here" \
-H "Content-Type: application/json" \
-d '{
"producer": {
"name": "ABC Office Fit-out Ltd",
"address": "45 High Street, Bournemouth, BH1 2AA",
"sic_code": "43320"
},
"carrier": {
"registration_number": "CBDU217016",
"auto_verify": true
},
"waste": {
"description": "Broken plasterboard from office refurbishment",
"auto_classify": true,
"quantity_kg": 2500,
"container_type": "skip"
},
"destination": {
"name": "South Coast Recycling Ltd",
"address": "Industrial Estate, Poole, BH15 1NF",
"permit_number": "EPR/AB1234CD"
},
"transfer_date": "2026-03-25"
}'
const response = await fetch(
"https://api.wastecheck.co.uk/v1/generate-wtn",
{
method: "POST",
headers: {
"Authorization": "Bearer wc_live_your_api_key_here",
"Content-Type": "application/json",
},
body: JSON.stringify({
producer: {
name: "ABC Office Fit-out Ltd",
address: "45 High Street, Bournemouth, BH1 2AA",
sic_code: "43320",
},
carrier: {
registration_number: "CBDU217016",
auto_verify: true,
},
waste: {
description: "Broken plasterboard from office refurbishment",
auto_classify: true,
quantity_kg: 2500,
container_type: "skip",
},
destination: {
name: "South Coast Recycling Ltd",
address: "Industrial Estate, Poole, BH15 1NF",
permit_number: "EPR/AB1234CD",
},
transfer_date: "2026-03-25",
}),
}
);
const data = await response.json();
console.log(data.reference); // "WTN-2026-0325-A7X9"
import requests
response = requests.post(
"https://api.wastecheck.co.uk/v1/generate-wtn",
headers={
"Authorization": "Bearer wc_live_your_api_key_here",
},
json={
"producer": {
"name": "ABC Office Fit-out Ltd",
"address": "45 High Street, Bournemouth, BH1 2AA",
"sic_code": "43320",
},
"carrier": {
"registration_number": "CBDU217016",
"auto_verify": True,
},
"waste": {
"description": "Broken plasterboard from office refurbishment",
"auto_classify": True,
"quantity_kg": 2500,
"container_type": "skip",
},
"destination": {
"name": "South Coast Recycling Ltd",
"address": "Industrial Estate, Poole, BH15 1NF",
"permit_number": "EPR/AB1234CD",
},
"transfer_date": "2026-03-25",
},
)
data = response.json()
print(data["reference"]) # "WTN-2026-0325-A7X9"
⌘I