Schema
DiscGolfAPI Course Data Model & JSON Schema Specification
DiscGolfAPI course records are designed for maps, directories, search, and operational tools. Unknown values are published as null, not guessed.
1.0.0Example course object
This is the public course object shape exposed inside the courses array by /courses and /courses/{id}. A single-course lookup still returns the shared response envelope with count and courses.
{
"id": "crs_a6_discgolfpark",
"slug": "a6-discgolfpark",
"name": "A6 Discgolfpark",
"lat": 57.7712848862281,
"lon": 14.2084014415741,
"country_code": "SE",
"region_code": null,
"locality": "Jönköping",
"website": "https://www.jbdg.se/a6-discgolfpark/",
"operator_name": null,
"holes": 18,
"existence_status": "existing",
"operational_status": "open",
"access_model": "unknown",
"condition_status": "unknown",
"listing_status": "listed",
"confidence_score": 0.75,
"verification_strength": "strong",
"last_verified_at": "2026-04-05T20:34:26.937241Z",
"updated_at": "2026-04-05T21:13:47.516490Z",
"primary_layout": {
"id": "e5c40fe1-f123-4986-9a27-6727d9763d06",
"slug": "main-layout",
"name": "Main Layout",
"holes": 18,
"par_total": null,
"length_meters": null,
"confidence_score": 0.75,
"verification_strength": "strong",
"last_verified_at": "2026-04-05T09:49:28.272723Z"
},
"attributes": null
}
Field definitions
| Field | Type | Meaning |
|---|---|---|
id | string | Stable public course identifier. |
slug | string | Human-readable identifier suitable for URLs. |
name | string | Course name. |
lat, lon | number | Decimal coordinates for mapping. |
country_code | string | ISO-style country code used for filtering. |
region_code | string or null | Region, state, province, or country subdivision where available. |
locality | string or null | Nearest town, city, or locality when known. |
website | string or null | Course, operator, venue, or official information URL. |
operator_name | string or null | Known operator or managing organisation. |
holes | number or null | Known hole count. Null means unknown, not zero. |
confidence_score | number | Record confidence from 0 to 1. |
verification_strength | string | Readable confidence bucket, currently strong, medium, or low. |
last_verified_at | timestamp | When the record was last checked against available evidence. |
updated_at | timestamp | When the public record was last changed. |
Completeness notes
The schema is intentionally stable even when individual fields are incomplete. Consumers should expect nullable or unknown values and render useful fallbacks.
Important: holes is currently sparse across the full dataset and is actively being improved. A null hole count means unknown, not zero. access_model and condition_status are also mostly unknown today.
Do not require holes, access_model, or condition_status for basic course display. Use them when present, but design filters and cards to handle missing values gracefully.
Status values
Status fields describe what is known. They should be displayed as data quality signals rather than hidden away.
existence_statusindicates whether the course is believed to exist.operational_statusindicates whether play appears to be available.access_modelcaptures public, private, paid, or unknown access where known.condition_statuscaptures known condition signals where available.listing_statusindicates whether the record is included in public listings.
Primary layout
primary_layout describes the main playable layout when known. Layout data may be incomplete while still being useful for a course listing.
| Field | Meaning |
|---|---|
id | Stable public layout identifier. |
slug | Layout slug, usually main-layout. |
name | Display name for the layout. |
holes | Layout hole count where known. |
par_total | Total par where known. |
length_meters | Measured or published layout length where known. |
confidence_score | Layout confidence score from 0 to 1. |
verification_strength | Layout verification bucket, such as strong, medium, or low. |
last_verified_at | When the layout was last checked against available evidence. |
Null handling
Missing values mean unknown or not yet verified. Avoid interpreting null as false, closed, free, public, or unavailable.
For production UI, show useful fallbacks such as “hole count unknown” instead of inventing values.
