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

# Public metrics

> Headline counts of what Check That Field covers. No key needed.

`GET https://api.checkthatfield.com/public/metrics` gives the platform's headline numbers: councils read, planning applications held, open fields, fields scored and reports produced. Use it for a "powered by" panel or a partner page.

> [!NOTE]
>
> This endpoint is not part of `/v1`. It needs no key, isn't counted against any quota, and isn't in the Endpoints reference.

## Request

```bash curl theme={null}
curl "https://api.checkthatfield.com/public/metrics"
```

```python Python theme={null}
import requests

m = requests.get("https://api.checkthatfield.com/public/metrics", timeout=30).json()
print(f"{m['fields_scored']:,} fields scored")
```

```javascript JavaScript theme={null}
const m = await fetch("https://api.checkthatfield.com/public/metrics").then((r) => r.json());
console.log(`${m.fields_scored.toLocaleString("en-GB")} fields scored`);
```

## Response

```json theme={null}
{
  "at": "2026-11-14T22:43:55.680021+00:00",
  "councils_read": 131,
  "applications": 1719689,
  "open_fields": 1292964,
  "fields_scored": 519,
  "reports": 490
}
```

**at** `string | null`

When the numbers were counted, in UTC (ISO 8601).

**councils\_read** `integer | null`

Councils whose planning registers we read.

**applications** `integer | null`

Planning applications we hold, of every kind.

**open\_fields** `integer | null`

Open fields we hold, which can be scored. Counted afresh once a day, so it can lag the other numbers.

**fields\_scored** `integer | null`

Fields scored under the current scoring model.

**reports** `integer | null`

Reports made on the site.

## How fresh the numbers are

We count once an hour, in the background. The endpoint returns the latest count; `at` says when it was taken. Answers are sent with `Cache-Control: public, max-age=3600`, so browsers and caches may keep them for up to an hour. Together, a number can be up to about two hours old.

> [!TIP]
>
> Cache the answer on your side too. There is no need to ask more than once an hour.

## Before the first count

Counting takes a while, so a request never starts it. Until the first hourly count exists, every field, `at` included, is `null`:

```json theme={null}
{
  "at": null,
  "councils_read": null,
  "applications": null,
  "open_fields": null,
  "fields_scored": null,
  "reports": null
}
```

Handle `null` by hiding the number, not by showing zero.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.