> ## Documentation Index
> Fetch the complete documentation index at: https://docs.wastecheck.co.uk/llms.txt
> Use this file to discover all available pages before exploring further.

# Verify Carrier

> Verify a waste carrier's registration against the Environment Agency register

# 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.

<Note>
  Requires authentication via `Authorization` header. See [Authentication](/authentication).
</Note>

## Request

**Method:** `POST` (or `GET` with query parameters)
**Path:** `/v1/verify-carrier`

### Headers

<ParamField header="Authorization" type="string" required>
  Bearer token with your API key, e.g. `Bearer wc_live_your_key`
</ParamField>

<ParamField header="Content-Type" type="string" required>
  Must be `application/json` (POST only)
</ParamField>

### Body Parameters

At least one field is required.

<ParamField body="registration_number" type="string">
  CBDU or CBDL registration number (e.g. `CBDU217016`). Direct lookup -- fastest.
</ParamField>

<ParamField body="business_name" type="string">
  Business name to search for
</ParamField>

<ParamField body="postcode" type="string">
  Postcode to search for registered carriers
</ParamField>

## Response

### Success Response (200)

```json theme={null}
{
  "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."
  }
}
```

<ResponseField name="status" type="string">
  Overall status: `valid`, `expiring_soon`, `expired`, `not_found`, or `lower_tier`
</ResponseField>

<ResponseField name="verification" type="object">
  Metadata about the check including timestamp, source, and cache status
</ResponseField>

<ResponseField name="registrations" type="array">
  Array of matching carrier registrations
</ResponseField>

<ResponseField name="compliance" type="object">
  Compliance assessment with flags and recommendation text
</ResponseField>

### 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. The `verification.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

<CodeGroup>
  ```bash curl theme={null}
  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"}'
  ```

  ```javascript Node.js theme={null}
  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"
  ```

  ```python Python theme={null}
  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"
  ```

  ```php PHP theme={null}
  $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"
  ```
</CodeGroup>
