> For the complete documentation index, see [llms.txt](https://docs.speedtest-tracker.dev/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.speedtest-tracker.dev/api/responses/models.md).

# Models

## The ForbiddenError object

```json
{"openapi":"3.0.0","info":{"title":"Speedtest Tracker API","version":"1.0.0"},"components":{"schemas":{"ForbiddenError":{"description":"Forbidden error response when user lacks permission","properties":{"message":{"description":"Error message indicating lack of permission","type":"string"}},"type":"object"}}}}
```

## The NotAcceptableError object

```json
{"openapi":"3.0.0","info":{"title":"Speedtest Tracker API","version":"1.0.0"},"components":{"schemas":{"NotAcceptableError":{"description":"Error response when the Accept header is missing or invalid","properties":{"message":{"type":"string"},"error":{"type":"string"}},"type":"object"}}}}
```

## The NotFoundError object

```json
{"openapi":"3.0.0","info":{"title":"Speedtest Tracker API","version":"1.0.0"},"components":{"schemas":{"NotFoundError":{"description":"Error when a requested result is not found","properties":{"message":{"description":"Result not found error message","type":"string"}},"type":"object"}}}}
```

## The ResultResponse object

```json
{"openapi":"3.0.0","info":{"title":"Speedtest Tracker API","version":"1.0.0"},"components":{"schemas":{"ResultResponse":{"description":"Response for an Single Speedtest result entry","properties":{"data":{"$ref":"#/components/schemas/Result"},"message":{"description":"Response status message","type":"string"}},"type":"object"},"Result":{"description":"Speedtest result entry","properties":{"id":{"type":"integer"},"service":{"type":"string"},"ping":{"type":"number"},"download":{"type":"integer"},"upload":{"type":"integer"},"download_bits":{"type":"integer"},"upload_bits":{"type":"integer"},"download_bits_human":{"type":"string"},"upload_bits_human":{"type":"string"},"benchmarks":{"type":"array","items":{"type":"object"},"nullable":true},"healthy":{"type":"boolean","nullable":true},"status":{"type":"string"},"scheduled":{"type":"boolean"},"comments":{"type":"string","nullable":true},"data":{"description":"Nested speedtest data payload","properties":{"isp":{"type":"string"},"ping":{"properties":{"low":{"type":"number","format":"float"},"high":{"type":"number","format":"float"},"jitter":{"type":"number","format":"float"},"latency":{"type":"number","format":"float"}},"type":"object"},"type":{"type":"string"},"result":{"properties":{"id":{"type":"string"},"url":{"type":"string","format":"uri"},"persisted":{"type":"boolean"}},"type":"object"},"server":{"properties":{"id":{"type":"integer"},"ip":{"type":"string","format":"ipv4"},"host":{"type":"string"},"name":{"type":"string"},"port":{"type":"integer"},"country":{"type":"string"},"location":{"type":"string"}},"type":"object"},"upload":{"properties":{"bytes":{"type":"integer"},"elapsed":{"type":"integer"},"latency":{"properties":{"iqm":{"type":"number","format":"float"},"low":{"type":"number","format":"float"},"high":{"type":"number","format":"float"},"jitter":{"type":"number","format":"float"}},"type":"object"},"bandwidth":{"type":"integer"}},"type":"object"},"download":{"properties":{"bytes":{"type":"integer"},"elapsed":{"type":"integer"},"latency":{"properties":{"iqm":{"type":"number","format":"float"},"low":{"type":"number","format":"float"},"high":{"type":"number","format":"float"},"jitter":{"type":"number","format":"float"}},"type":"object"},"bandwidth":{"type":"integer"}},"type":"object"},"interface":{"properties":{"name":{"type":"string"},"isVpn":{"type":"boolean"},"macAddr":{"type":"string","pattern":"^([0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}$"},"externalIp":{"type":"string","format":"ipv4"},"internalIp":{"type":"string","format":"ipv4"}},"type":"object"},"timestamp":{"type":"string","format":"date-time"},"packetLoss":{"type":"number"}},"type":"object"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}},"type":"object","additionalProperties":false}}}}
```

## The Result object

```json
{"openapi":"3.0.0","info":{"title":"Speedtest Tracker API","version":"1.0.0"},"components":{"schemas":{"Result":{"description":"Speedtest result entry","properties":{"id":{"type":"integer"},"service":{"type":"string"},"ping":{"type":"number"},"download":{"type":"integer"},"upload":{"type":"integer"},"download_bits":{"type":"integer"},"upload_bits":{"type":"integer"},"download_bits_human":{"type":"string"},"upload_bits_human":{"type":"string"},"benchmarks":{"type":"array","items":{"type":"object"},"nullable":true},"healthy":{"type":"boolean","nullable":true},"status":{"type":"string"},"scheduled":{"type":"boolean"},"comments":{"type":"string","nullable":true},"data":{"description":"Nested speedtest data payload","properties":{"isp":{"type":"string"},"ping":{"properties":{"low":{"type":"number","format":"float"},"high":{"type":"number","format":"float"},"jitter":{"type":"number","format":"float"},"latency":{"type":"number","format":"float"}},"type":"object"},"type":{"type":"string"},"result":{"properties":{"id":{"type":"string"},"url":{"type":"string","format":"uri"},"persisted":{"type":"boolean"}},"type":"object"},"server":{"properties":{"id":{"type":"integer"},"ip":{"type":"string","format":"ipv4"},"host":{"type":"string"},"name":{"type":"string"},"port":{"type":"integer"},"country":{"type":"string"},"location":{"type":"string"}},"type":"object"},"upload":{"properties":{"bytes":{"type":"integer"},"elapsed":{"type":"integer"},"latency":{"properties":{"iqm":{"type":"number","format":"float"},"low":{"type":"number","format":"float"},"high":{"type":"number","format":"float"},"jitter":{"type":"number","format":"float"}},"type":"object"},"bandwidth":{"type":"integer"}},"type":"object"},"download":{"properties":{"bytes":{"type":"integer"},"elapsed":{"type":"integer"},"latency":{"properties":{"iqm":{"type":"number","format":"float"},"low":{"type":"number","format":"float"},"high":{"type":"number","format":"float"},"jitter":{"type":"number","format":"float"}},"type":"object"},"bandwidth":{"type":"integer"}},"type":"object"},"interface":{"properties":{"name":{"type":"string"},"isVpn":{"type":"boolean"},"macAddr":{"type":"string","pattern":"^([0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}$"},"externalIp":{"type":"string","format":"ipv4"},"internalIp":{"type":"string","format":"ipv4"}},"type":"object"},"timestamp":{"type":"string","format":"date-time"},"packetLoss":{"type":"number"}},"type":"object"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}},"type":"object","additionalProperties":false}}}}
```

## The ResultsCollection object

```json
{"openapi":"3.0.0","info":{"title":"Speedtest Tracker API","version":"1.0.0"},"components":{"schemas":{"ResultsCollection":{"description":"Paginated list of Speedtest results","properties":{"data":{"description":"Array of result objects","type":"array","items":{"$ref":"#/components/schemas/Result"}},"links":{"properties":{"first":{"type":"string"},"last":{"type":"string"},"prev":{"type":"string","nullable":true},"next":{"type":"string","nullable":true}},"type":"object","additionalProperties":false},"meta":{"properties":{"current_page":{"type":"integer"},"from":{"type":"integer"},"last_page":{"type":"integer"},"links":{"type":"array","items":{"properties":{"url":{"type":"string","nullable":true},"label":{"type":"string"},"active":{"type":"boolean"}},"type":"object","additionalProperties":false}},"path":{"type":"string"},"per.page":{"type":"integer"},"to":{"type":"integer"},"total":{"type":"integer"}},"type":"object","additionalProperties":false}},"type":"object","additionalProperties":false},"Result":{"description":"Speedtest result entry","properties":{"id":{"type":"integer"},"service":{"type":"string"},"ping":{"type":"number"},"download":{"type":"integer"},"upload":{"type":"integer"},"download_bits":{"type":"integer"},"upload_bits":{"type":"integer"},"download_bits_human":{"type":"string"},"upload_bits_human":{"type":"string"},"benchmarks":{"type":"array","items":{"type":"object"},"nullable":true},"healthy":{"type":"boolean","nullable":true},"status":{"type":"string"},"scheduled":{"type":"boolean"},"comments":{"type":"string","nullable":true},"data":{"description":"Nested speedtest data payload","properties":{"isp":{"type":"string"},"ping":{"properties":{"low":{"type":"number","format":"float"},"high":{"type":"number","format":"float"},"jitter":{"type":"number","format":"float"},"latency":{"type":"number","format":"float"}},"type":"object"},"type":{"type":"string"},"result":{"properties":{"id":{"type":"string"},"url":{"type":"string","format":"uri"},"persisted":{"type":"boolean"}},"type":"object"},"server":{"properties":{"id":{"type":"integer"},"ip":{"type":"string","format":"ipv4"},"host":{"type":"string"},"name":{"type":"string"},"port":{"type":"integer"},"country":{"type":"string"},"location":{"type":"string"}},"type":"object"},"upload":{"properties":{"bytes":{"type":"integer"},"elapsed":{"type":"integer"},"latency":{"properties":{"iqm":{"type":"number","format":"float"},"low":{"type":"number","format":"float"},"high":{"type":"number","format":"float"},"jitter":{"type":"number","format":"float"}},"type":"object"},"bandwidth":{"type":"integer"}},"type":"object"},"download":{"properties":{"bytes":{"type":"integer"},"elapsed":{"type":"integer"},"latency":{"properties":{"iqm":{"type":"number","format":"float"},"low":{"type":"number","format":"float"},"high":{"type":"number","format":"float"},"jitter":{"type":"number","format":"float"}},"type":"object"},"bandwidth":{"type":"integer"}},"type":"object"},"interface":{"properties":{"name":{"type":"string"},"isVpn":{"type":"boolean"},"macAddr":{"type":"string","pattern":"^([0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}$"},"externalIp":{"type":"string","format":"ipv4"},"internalIp":{"type":"string","format":"ipv4"}},"type":"object"},"timestamp":{"type":"string","format":"date-time"},"packetLoss":{"type":"number"}},"type":"object"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}},"type":"object","additionalProperties":false}}}}
```

## The ServersCollection object

```json
{"openapi":"3.0.0","info":{"title":"Speedtest Tracker API","version":"1.0.0"},"components":{"schemas":{"ServersCollection":{"description":"Collection of Ookla speedtest servers","properties":{"data":{"description":"List of server objects","type":"array","items":{"properties":{"id":{"type":"string"},"host":{"type":"string"},"name":{"type":"string"},"location":{"type":"string"},"country":{"type":"string"}},"type":"object"}},"message":{"description":"Response status message","type":"string"}},"type":"object","additionalProperties":false}}}}
```

## The SpeedtestRun object

```json
{"openapi":"3.0.0","info":{"title":"Speedtest Tracker API","version":"1.0.0"},"components":{"schemas":{"SpeedtestRun":{"description":"A queued speedtest result","properties":{"data":{"description":"Queued speedtest result payload","properties":{"id":{"type":"integer"},"service":{"type":"string"},"ping":{"type":"number","format":"float","nullable":true},"download":{"type":"integer","nullable":true},"upload":{"type":"integer","nullable":true},"benchmarks":{"type":"object","nullable":true},"healthy":{"type":"boolean","nullable":true},"status":{"type":"string"},"scheduled":{"type":"boolean"},"comments":{"type":"string","nullable":true},"data":{"description":"Additional data for queued result","properties":{"server":{"properties":{"id":{"type":"integer","nullable":true}},"type":"object"}},"type":"object"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}},"type":"object","additionalProperties":false},"message":{"description":"Response status message","type":"string"}},"type":"object","additionalProperties":false}}}}
```

## The Stats object

```json
{"openapi":"3.0.0","info":{"title":"Speedtest Tracker API","version":"1.0.0"},"components":{"schemas":{"Stats":{"description":"Aggregated speedtest statistics","properties":{"total_results":{"type":"integer"},"avg_ping":{"type":"number","format":"float"},"avg_download":{"type":"number","format":"float"},"avg_upload":{"type":"number","format":"float"},"min_ping":{"type":"number","format":"float"},"min_download":{"type":"number","format":"float"},"min_upload":{"type":"number","format":"float"},"max_ping":{"type":"number","format":"float"},"max_download":{"type":"number","format":"float"},"max_upload":{"type":"number","format":"float"}},"type":"object"}}}}
```

## The UnauthenticatedError object

```json
{"openapi":"3.0.0","info":{"title":"Speedtest Tracker API","version":"1.0.0"},"components":{"schemas":{"UnauthenticatedError":{"description":"Error when user is not authenticated","properties":{"message":{"description":"Unauthenticated error message","type":"string"}},"type":"object"}}}}
```

## The ValidationError object

```json
{"openapi":"3.0.0","info":{"title":"Speedtest Tracker API","version":"1.0.0"},"components":{"schemas":{"ValidationError":{"description":"Validation failed due to invalid server_id input","properties":{"message":{"description":"Validation failed due to invalid server_id input","type":"string"}},"type":"object"}}}}
```
