Verify Carrier
curl --request POST \
--url https://api.example.com/v1/verify-carrier \
--header 'Authorization: <authorization>' \
--header 'Content-Type: <content-type>' \
--data '
{
"registration_number": "<string>",
"business_name": "<string>",
"postcode": "<string>"
}
'import requests
url = "https://api.example.com/v1/verify-carrier"
payload = {
"registration_number": "<string>",
"business_name": "<string>",
"postcode": "<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({
registration_number: '<string>',
business_name: '<string>',
postcode: '<string>'
})
};
fetch('https://api.example.com/v1/verify-carrier', 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/verify-carrier",
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([
'registration_number' => '<string>',
'business_name' => '<string>',
'postcode' => '<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/verify-carrier"
payload := strings.NewReader("{\n \"registration_number\": \"<string>\",\n \"business_name\": \"<string>\",\n \"postcode\": \"<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/verify-carrier")
.header("Authorization", "<authorization>")
.header("Content-Type", "<content-type>")
.body("{\n \"registration_number\": \"<string>\",\n \"business_name\": \"<string>\",\n \"postcode\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/v1/verify-carrier")
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 \"registration_number\": \"<string>\",\n \"business_name\": \"<string>\",\n \"postcode\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"status": "<string>",
"verification": {},
"registrations": [
{}
],
"compliance": {}
}API Reference
Verify Carrier
Verify a waste carrier’s registration against the Environment Agency register
POST
/
v1
/
verify-carrier
Verify Carrier
curl --request POST \
--url https://api.example.com/v1/verify-carrier \
--header 'Authorization: <authorization>' \
--header 'Content-Type: <content-type>' \
--data '
{
"registration_number": "<string>",
"business_name": "<string>",
"postcode": "<string>"
}
'import requests
url = "https://api.example.com/v1/verify-carrier"
payload = {
"registration_number": "<string>",
"business_name": "<string>",
"postcode": "<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({
registration_number: '<string>',
business_name: '<string>',
postcode: '<string>'
})
};
fetch('https://api.example.com/v1/verify-carrier', 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/verify-carrier",
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([
'registration_number' => '<string>',
'business_name' => '<string>',
'postcode' => '<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/verify-carrier"
payload := strings.NewReader("{\n \"registration_number\": \"<string>\",\n \"business_name\": \"<string>\",\n \"postcode\": \"<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/verify-carrier")
.header("Authorization", "<authorization>")
.header("Content-Type", "<content-type>")
.body("{\n \"registration_number\": \"<string>\",\n \"business_name\": \"<string>\",\n \"postcode\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/v1/verify-carrier")
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 \"registration_number\": \"<string>\",\n \"business_name\": \"<string>\",\n \"postcode\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"status": "<string>",
"verification": {},
"registrations": [
{}
],
"compliance": {}
}Verify Carrier
Verifies a waste carrier’s registration against the Environment Agency public register. Also available as a GET request with query parameters. Supports three search modes: direct lookup by registration number (fastest), search by business name, or search by postcode. If multiple fields are provided,registration_number takes priority.
Requires authentication via
Authorization header. See Authentication.Request
Method:POST (or GET with query parameters)
Path: /v1/verify-carrier
Headers
string
required
Bearer token with your API key, e.g.
Bearer wc_live_your_keystring
required
Must be
application/json (POST only)Body Parameters
At least one field is required.string
CBDU or CBDL registration number (e.g.
CBDU217016). Direct lookup — fastest.string
Business name to search for
string
Postcode to search for registered carriers
Response
Success Response (200)
{
"status": "valid",
"verification": {
"checked_at": "2026-03-25T14:30:00Z",
"source": "environment_agency",
"cached": false
},
"registrations": [
{
"registration_number": "CBDU217016",
"business_name": "ACME WASTE SERVICES LTD",
"company_number": "12345678",
"tier": "upper",
"status": "valid",
"expiry_date": "2027-01-15",
"days_until_expiry": 298,
"expiry_warning": false
}
],
"compliance": {
"is_compliant": true,
"flags": [],
"recommendation": "Registration is valid and current."
}
}
string
Overall status:
valid, expiring_soon, expired, not_found, or lower_tierobject
Metadata about the check including timestamp, source, and cache status
array
Array of matching carrier registrations
object
Compliance assessment with flags and recommendation text
Status Values
| Status | Meaning |
|---|---|
valid | Active registration, not expired |
expiring_soon | Valid but within 90 days of expiry (upper tier only) |
expired | Past expiry date |
not_found | No matching registration |
lower_tier | Valid but lower tier registration only |
Compliance Flags
| Flag | Meaning |
|---|---|
EXPIRING_WITHIN_90_DAYS | Upper tier registration nearing expiry |
LOWER_TIER_ONLY | May not meet requirements for commercial waste |
MULTIPLE_REGISTRATIONS_FOUND | Name or postcode search returned multiple matches |
Caching
Direct lookups by registration number are cached for 24 hours. Name and postcode searches are cached for 1 hour. Theverification.cached field indicates whether the result was served from cache.
Error Responses
| Code | HTTP | When |
|---|---|---|
CARRIER_NOT_FOUND | 404 | No registration matches the input |
INVALID_REGISTRATION_NUMBER | 400 | Registration number doesn’t match CBDU/CBDL format |
EA_REGISTER_UNAVAILABLE | 503 | Environment Agency register is down or unreachable |
Example
curl -X POST https://api.wastecheck.co.uk/v1/verify-carrier \
-H "Authorization: Bearer wc_live_your_api_key_here" \
-H "Content-Type: application/json" \
-d '{"registration_number": "CBDU217016"}'
const response = await fetch(
"https://api.wastecheck.co.uk/v1/verify-carrier",
{
method: "POST",
headers: {
"Authorization": "Bearer wc_live_your_api_key_here",
"Content-Type": "application/json",
},
body: JSON.stringify({
registration_number: "CBDU217016",
}),
}
);
const data = await response.json();
console.log(data.status); // "valid"
import requests
response = requests.post(
"https://api.wastecheck.co.uk/v1/verify-carrier",
headers={
"Authorization": "Bearer wc_live_your_api_key_here",
},
json={
"registration_number": "CBDU217016",
},
)
data = response.json()
print(data["status"]) # "valid"
$ch = curl_init("https://api.wastecheck.co.uk/v1/verify-carrier");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer wc_live_your_api_key_here",
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode([
"registration_number" => "CBDU217016",
]),
]);
$response = json_decode(curl_exec($ch), true);
echo $response["status"]; // "valid"