{"openapi":"3.1.0","info":{"title":"CADDIE.100 API","version":"1.0.0-beta.1","description":"Golf course data and production services. Golf Course Graphics creates configurable finished imagery; Golf Course Maps delivers north-up raster tiles for mapping clients.","contact":{"name":"Caddie Forge, Inc."}},"servers":[{"url":"https://www.caddie100.com/api/v1"}],"tags":[{"name":"Golf Courses","description":"Golf course identity, details, and search"},{"name":"Golf Course Graphics","description":"Configurable golf hole, green, and full-course imagery"},{"name":"Golf Course Maps","description":"North-up Web Mercator XYZ tiles, PMTiles archives, and bounded static images"}],"paths":{"/services":{"get":{"summary":"List CADDIE.100 services","responses":{"200":{"description":"Service catalog"}}}},"/courses/{courseId}/graphics/images":{"post":{"tags":["Golf Course Graphics"],"summary":"Create a stable golf course graphic URL","operationId":"createMapImage","security":[{"CaddieApiKey":[]},{"CaddieBearer":[]}],"parameters":[{"name":"courseId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MapImageRequest"}}}},"responses":{"201":{"description":"Artifact URL and short-lived render receipt created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GraphicRenderDescriptor"}}}},"400":{"$ref":"#/components/responses/Problem"}}}},"/courses/{courseId}/graphics/images/{subject}/{format}":{"get":{"tags":["Golf Course Graphics"],"summary":"Generate and download a golf course graphic","operationId":"getMapImage","security":[{"CaddieApiKey":[]},{"CaddieBearer":[]}],"parameters":[{"name":"courseId","in":"path","required":true,"schema":{"type":"string"}},{"name":"subject","in":"path","required":true,"schema":{"type":"string","pattern":"^(course|hole-[1-9][0-9]*|green-[1-9][0-9]*)$","examples":["hole-1","green-9","course"]}},{"name":"format","in":"path","required":true,"description":"Use webp for the default efficient output, png for explicit lossless PNG, or jpeg/jpg for JPEG.","schema":{"type":"string","enum":["webp","png","jpeg","jpg"],"default":"webp"}},{"name":"graphicStyle","in":"query","required":false,"description":"Top-level visual language. Traditional is the established filled, colored treatment; Pencil is geometry-native graphite linework; Colored Pencil uses uniform soft flat feature colors, restrained paths, and simple Overture building and parking surfaces without terrain, shading, or texture. Each style has a separate cache identity.","schema":{"type":"string","enum":["traditional","pencil","colored-pencil"],"default":"traditional"}},{"name":"width","in":"query","required":false,"description":"Output width in pixels. Together with height, this defines the composition aspect ratio used for fitting, rotation, and placement; output is uniformly scaled without cropping.","schema":{"type":"integer","minimum":320,"maximum":8000}},{"name":"height","in":"query","required":false,"description":"Output height in pixels. Together with width, this defines the composition aspect ratio used for fitting, rotation, and placement; output is uniformly scaled without cropping.","schema":{"type":"integer","minimum":320,"maximum":8000}},{"name":"quality","in":"query","required":false,"description":"JPEG quality; ignored for PNG.","schema":{"type":"integer","minimum":40,"maximum":95,"default":90}},{"name":"fairwayPattern","in":"query","required":false,"description":"Fairway mowing treatment. Large, medium, and small checked patterns cross two perpendicular stripe passes to form diamonds and use the same 7.2 m, 3.8 m, and 2 m physical band widths as the corresponding stripe presets. The legacy checkered-v1 and checkered-v2 inputs remain accepted as aliases for medium-checks and small-checks.","schema":{"type":"string","enum":["large-stripes","medium-stripes","small-stripes","large-checks","medium-checks","small-checks","blank-v1","blank-v2"],"default":"medium-stripes"}},{"name":"teePattern","in":"query","required":false,"description":"Tee mowing treatment. Stripe widths use fixed real-world meter dimensions converted through the final camera projection.","schema":{"type":"string","enum":["plain","small-stripes","thin-stripes"],"default":"plain"}},{"name":"waterTreatment","in":"query","required":false,"description":"Water color. auto resolves from the course state: southern coastal states plus California and Hawaii use light, northern states use dark, and all remaining states use medium. Tropical US territories use light; unknown and non-US locations use medium. Water remains visible for every option; none is not supported.","schema":{"type":"string","enum":["auto","light","medium","dark"],"default":"auto"}},{"name":"bunkerTreatment","in":"query","required":false,"schema":{"type":"string","enum":["classic","dark","flat","raised-edge"],"default":"classic"}},{"name":"greenery","in":"query","required":false,"description":"Coordinated turf, fleck, forest-floor, and tree-crown color family. auto uses a state-level proxy for the GCSAA agronomic regions; split-region states are approximate. classic preserves the exact established colors and is the fallback for unknown and non-US locations.","schema":{"type":"string","enum":["auto","classic","cool-blue","cool-apple","warm-emerald","warm-golden"],"default":"auto"}},{"name":"housing","in":"query","required":false,"description":"Housing treatment. auto uses the course state’s modal IECC climate zone by county count: zones 1–3 select warm brown, clay, sand, and brick roofs; zone 4 selects mixed warm and cool roofs; zones 5–8 select cool gray, slate, and charcoal roofs. Cross-family zone ties, unknown states, and non-US courses fall back to mixed. none omits housing roofs and hole-render housing footprint context edges.","schema":{"type":"string","enum":["auto","warm","cool","mixed","none"],"default":"auto"}},{"name":"overtureSegments","in":"query","required":false,"description":"Traditional accepts all, small, or none. Pencil fixes this option to none. Colored Pencil defaults to small but admits only service and non-motorized path classes, rendered as one flat soft path color; it also accepts none and rejects all. Course-authored cart paths, Overture building footprints, and Overture parking polygons remain independent.","schema":{"type":"string","enum":["all","small","none"],"default":"all"}},{"name":"perimeterTreatment","in":"query","required":false,"description":"Hole and full-course outer terrain treatment. classic is the default and naturally unions measured-line and maintained-feature buffers with tee, green, boundary-intersection, forward/reverse landing-target, and optional authored-dogleg accents. Full-course Classic naturally unions those shapes across every hole, so overlapping buffers become one organic course perimeter instead of retaining rectangular authored bbox sections. classic-wide, classic-wider, and classic-widest increase only forward and reverse landing-circle buffers by 10%, 20%, and 30%. legacy-v1 preserves the authored measured hole or course envelope; none renders edge-to-edge. Retired default and tapered-family inputs remain compatibility aliases.","schema":{"type":"string","enum":["none","legacy-v1","classic","classic-wide","classic-wider","classic-widest"],"default":"classic"}},{"name":"nearbyHoles","in":"query","required":false,"description":"Hole-only rendering of maintained surfaces from other holes entering the viewport. hidden omits them; stroked-dark and stroked-light draw measured outlines at 15% opacity in dark green or white; filled-dark and filled-light fill the measured surfaces using the same colors and opacity; detailed renders their selected colors, mowing patterns, textures, and terrain response. The legacy stroked value aliases stroked-dark. Artwork is clipped by perimeterTreatment.","schema":{"type":"string","enum":["hidden","stroked-dark","stroked-light","filled-dark","filled-light","stroked","detailed"],"default":"hidden"}},{"name":"contextGraphing","in":"query","required":false,"description":"contextGraphing independently enables or disables this paper-context layer. Graphing applies to hole, green, and course views; the other layers apply to hole views.","schema":{"type":"boolean"}},{"name":"contextEdges","in":"query","required":false,"description":"contextEdges independently enables or disables this paper-context layer. Graphing applies to hole, green, and course views; the other layers apply to hole views. Edges includes Overture segment centerlines admitted by overtureSegments and housing footprint polygons without procedural gables unless housing is none.","schema":{"type":"boolean"}},{"name":"contextContours","in":"query","required":false,"description":"contextContours independently enables or disables this paper-context layer. Graphing applies to hole, green, and course views; the other layers apply to hole views.","schema":{"type":"boolean"}},{"name":"contextWashes","in":"query","required":false,"description":"contextWashes independently enables or disables this paper-context layer. Graphing applies to hole, green, and course views; the other layers apply to hole views.","schema":{"type":"boolean"}},{"name":"contextTexture","in":"query","required":false,"deprecated":true,"description":"Deprecated compatibility alias for contextGraphing.","schema":{"type":"boolean"}},{"name":"layout","in":"query","required":false,"description":"Hole-only composition layout.","schema":{"type":"string","enum":["portrait","landscape"],"default":"portrait"}},{"name":"flagAnchor","in":"query","required":false,"description":"Portrait: left/middle/right. Landscape: top/middle/bottom.","schema":{"type":"string","enum":["left","middle","right","top","bottom"],"default":"middle"}},{"name":"teeAnchor","in":"query","required":false,"description":"Portrait: left/middle/right. Landscape: top/middle/bottom.","schema":{"type":"string","enum":["left","middle","right","top","bottom"],"default":"middle"}},{"name":"teeSide","in":"query","required":false,"description":"Landscape-only play direction.","schema":{"type":"string","enum":["left","right"],"default":"left"}},{"name":"padding","in":"query","required":false,"description":"Hole- or course-only CSS-style composition padding. Supply one to four comma- or space-separated values in top/right/bottom/left shorthand order. Unitless values above 0 and below 1 are fractions of the corresponding image dimension; values 1 or greater are output pixels. Explicit % and px units are accepted. Course output also accepts auto and defaults to its canonical fit.","schema":{"type":"string","examples":[".025 .05","2.5% 5% 0 5%","48px","auto"]}},{"name":"paperTheme","in":"query","required":false,"description":"Paper background preset or a six-digit hex color. transparent omits the paper fill, graphing grid, and paper grain while retaining selected edges, contours, and washes. PNG preserves alpha; JPEG composites transparent pixels over white because JPEG has no alpha channel. Edge-to-edge terrain can still fill the complete viewport. Invalid values fall back to light. Context colors darken light custom colors and lighten dark custom colors.","schema":{"oneOf":[{"type":"string","enum":["light","dark","transparent"]},{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$"}],"examples":["light","dark","transparent","#DDE7D2"],"default":"light"}},{"name":"context","in":"query","required":false,"description":"Comma-separated context layers (graphing, edges, contours, washes), or none to disable every paper-context layer. With an opaque paperTheme, none leaves the solid paper fill; with transparent, none leaves only rendered map artwork. The legacy texture name remains an alias for graphing.","schema":{"type":"string","examples":["graphing,edges,contours","none"]}},{"name":"terrainIntensity","in":"query","required":false,"description":"Terrain color and shading strength across rough, fairways and their first cut, short-cut surfaces, bunker sand, and Overture concrete paths. Values above 2.2 scale proportionally; 4.4 is twice the contribution of 2.2. Terrain reconstruction is camera-scale-aware across hole, green, and course subjects, so close crops retain a stable physical smoothing footprint. Sand and concrete use restrained material responses that preserve their selected surface details; concrete relief is clipped to each path's class-derived physical corridor.","schema":{"type":"number","minimum":0.5,"maximum":5,"default":2.2}},{"name":"terrainTexture","in":"query","required":false,"description":"Enables the additional scale-aware, material-specific fleck texture on base turf, generated rough, fairways, greens, tees, bunker sand, concrete, and water. Water flecks use the resolved light, medium, or dark treatment palette. Defaults to true. false preserves the underlying fills, mowing, established drawRough treatment, water depth/ripples/glints, and measured terrain lighting while omitting only the added fleck passes.","schema":{"type":"boolean","default":true}},{"name":"compositionMode","in":"query","required":false,"description":"For hole presets, flagAnchor/teeAnchor choose orientation and align the complete measured envelope inside configurable CSS-style padding, defaulting to 5% per side. Portrait top/bottom padding set the flag/tee endpoint bands while Left/Middle/Right remain 25%/50%/75% horizontal presets. Landscape left/right padding set the endpoint bands while Top/Middle/Bottom remain 25%/50%/75% vertical presets. Optional numeric targets override the rotation axis. exact maps numeric targets directly. Numeric targets select exact by default.","schema":{"type":"string","enum":["preset","exact"]}},{"name":"greenOrientation","in":"query","required":false,"description":"Green-only camera orientation. approach points from the green toward a point interpolated 100 yards back along the incoming play line; north keeps geographic north at the top before any requested rotation.","schema":{"type":"string","enum":["approach","north"],"default":"approach"}},{"name":"greenPaddingMeters","in":"query","required":false,"description":"Green-only measured buffer around the complete green polygon. Accepts one to four comma- or space-separated values from 1 to 60 meters in CSS shorthand order. The renderer retains at least this mapped distance on every side while gravity resolves placement.","schema":{"oneOf":[{"type":"number","minimum":1,"maximum":60},{"type":"string","examples":["12","8 12 18 12"]}],"default":12}},{"name":"greenRotationDegrees","in":"query","required":false,"description":"Green-only additional clockwise rotation applied before fitting. Landscape output also rotates the resolved portrait composition clockwise by 90 degrees.","schema":{"type":"number","minimum":-180,"maximum":180,"default":0}},{"name":"greenGravity","in":"query","required":false,"description":"Green-only placement after fitting. center aligns the measured green center to the image center. Directional values pin the padded green to an edge or corner. auto preserves legacy shape-based placement.","schema":{"type":"string","enum":["auto","center","top","right","bottom","left","top-left","top-right","bottom-left","bottom-right"],"default":"center"}},{"name":"heatmap","in":"query","required":false,"description":"Hole- and green-image analytical overlay sampled from the precomputed 2-foot putting-surface grid for the subject hole. elevation smooths sub-putt noise and requires meaningful signed high/low relief as grade over putting-scale runs before applying color. Sustained slope and regional structure can strengthen an established high or low area but cannot independently color a near-median ripple. Meaningfully low terrain is transparent blue, the dominant elevation is transparent, and meaningfully high terrain is transparent red. No fixed percentage of the green is forced to receive color. slope is reserved for a future presentation and is not currently accepted.","schema":{"type":"string","enum":["elevation"]}},{"name":"heatmapOpacity","in":"query","required":false,"description":"Hole- and green-image maximum alpha used at the red and blue ends of the Green elevation heatmap. The normalized central elevation band remains fully transparent.","schema":{"type":"number","minimum":0.1,"maximum":0.8,"default":0.42}},{"name":"breaks","in":"query","required":false,"description":"Enables green-only slope arrows. Use breakStyle to choose grid or fluid placement, breakDensity to choose light, medium, or high detail, and breakColor for a solid arrow color. These are not simulated putt paths.","schema":{"type":"boolean","default":false}},{"name":"breakStyle","in":"query","required":false,"description":"Green-only slope-arrow presentation. grid uses a regular staggered field of traditional straight arrows with shorter, heavier shafts and triangular heads; fluid traces curved downhill streamlines from elevation-prioritized seeds, retains full-path collision clearance, and removes cramped or tightly curled remnants.","schema":{"type":"string","enum":["grid","fluid"],"default":"fluid"}},{"name":"breakDensity","in":"query","required":false,"description":"Green-only slope-arrow detail level. Higher detail reduces mark spacing while shortening and slightly thinning individual marks to preserve legibility. Fluid mark budgets scale with measured green area and use safety bounds for unusually tiny or large greens; density does not increase source terrain resolution.","schema":{"type":"string","enum":["light","medium","high"],"default":"medium"}},{"name":"breakColor","in":"query","required":false,"description":"Green-only arrow color. Use dark (#142622), light (#F8FAF7), or a strict six-digit hex color. Arrow shafts and heads render at solid opacity.","schema":{"oneOf":[{"type":"string","enum":["dark","light"]},{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$"}],"examples":["dark","light","#24594B"],"default":"dark"}},{"name":"flagX","in":"query","required":false,"description":"flagX exact flag-side content-edge target as a percentage from the left image edge. Supplying a numeric target selects exact mode unless compositionMode=preset.","schema":{"type":"number","minimum":0,"maximum":100}},{"name":"flagY","in":"query","required":false,"description":"flagY exact flag-side content-edge target as a percentage from the top image edge. Supplying a numeric target selects exact mode unless compositionMode=preset.","schema":{"type":"number","minimum":0,"maximum":100}},{"name":"teeX","in":"query","required":false,"description":"teeX exact tee-side content-edge target as a percentage from the left image edge. Supplying a numeric target selects exact mode unless compositionMode=preset.","schema":{"type":"number","minimum":0,"maximum":100}},{"name":"teeY","in":"query","required":false,"description":"teeY exact tee-side content-edge target as a percentage from the top image edge. Supplying a numeric target selects exact mode unless compositionMode=preset.","schema":{"type":"number","minimum":0,"maximum":100}}],"responses":{"200":{"description":"Rendered image. WebP is the default output format; API-key responses do not expose the internal spatial metadata sidecar.","content":{"image/webp":{"schema":{"type":"string","format":"binary"}},"image/png":{"schema":{"type":"string","format":"binary"}},"image/jpeg":{"schema":{"type":"string","format":"binary"}}}},"400":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"}}}},"/renders/{renderId}/overlays":{"post":{"tags":["Golf Course Graphics"],"summary":"Resolve licensed browser overlays for a rendered hole graphic","operationId":"resolveGraphicOverlays","description":"Validates the credential and signed render receipt, resolves the requested Smart Components against the exact artifact, and returns only artifact-bound display instructions. Geographic coordinates, projection transforms, source geometry, measurement records, and the spatial sidecar are not returned.","security":[{"CaddieApiKey":[]},{"CaddieBearer":[]}],"parameters":[{"name":"renderId","in":"path","required":true,"schema":{"type":"string","pattern":"^rnd_[A-Za-z0-9_-]+$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GraphicOverlayRequest"}}}},"responses":{"200":{"description":"Display-only overlay placements bound to the rendered image","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GraphicOverlayResponse"}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/Problem"},"403":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"}}}},"/courses/{courseId}":{"get":{"tags":["Golf Courses"],"summary":"Read a normalized golf course summary","operationId":"getCourseSummary","security":[{"CaddieApiKey":[]},{"CaddieBearer":[]}],"parameters":[{"name":"courseId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Golf course summary","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CourseSummary"}}}},"401":{"$ref":"#/components/responses/Problem"},"404":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"}}}},"/courses/{courseId}/data":{"get":{"tags":["Golf Courses"],"summary":"Read selected course datasets","operationId":"getCourseDatasets","description":"Returns one or more named course datasets from a consistent versioned catalog snapshot. This server-to-server endpoint requires a private c100_live_ or c100_test_ key; c100_pk_ publishable browser keys and browser Origin requests are rejected. Identity is enabled by default. Other datasets require a client-level grant managed by CADDIE.100 staff. Recognized unavailable datasets and unauthorized datasets remain present with explicit status objects.","security":[{"CaddieApiKey":[]},{"CaddieBearer":[]}],"parameters":[{"name":"courseId","in":"path","required":true,"description":"Canonical course layout ID, compatible with the source course_location ID.","schema":{"type":"string"}},{"name":"include","in":"query","required":false,"description":"Comma-separated dataset keywords. geometry and geometry.* expand every geometry layer; elevations and elevations.* expand both elevation layers; measurements and measurements.* expand green and fairway measurements. Defaults to identity. Supported keywords: identity, contact, amenities, operations, scorecard, holes.summary, holes.detail, holes.strategy, greens.summary, greens.analysis, geometry.course-boundary, geometry.hole-boundaries, geometry.fairways, geometry.greens, geometry.tees, geometry.centerlines, geometry.bunkers, geometry.water, geometry.waste, geometry.cart-paths, geometry.trees, geometry.buildings, geometry.roads, geometry.parking, geometry.land-surfaces, geometry.other, elevations.ground, elevations.trees, measurements.greens, measurements.fairways, editorial.course, editorial.holes, editorial.greens, editorial.operations, media.images, media.videos, provenance.","schema":{"type":"string","examples":["identity,contact,scorecard","holes.strategy,measurements.greens,measurements.fairways","holes.detail,geometry.fairways,elevations.ground"]}},{"name":"holes","in":"query","required":false,"description":"Comma-separated hole numbers. Filters scorecard rows, hole/green/strategy datasets, measurements, assigned geometry, context geometry within a 50-meter hole-bounds buffer, and elevation points.","schema":{"type":"string","pattern":"^[1-9][0-9]?(,[1-9][0-9]?)*$","examples":["9","1,9,18"]}}],"responses":{"200":{"description":"Requested datasets, including explicit TODO or permission-denied properties when applicable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CourseDataBundleResponse"}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/Problem"},"403":{"$ref":"#/components/responses/Problem"},"404":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/Problem"},"502":{"$ref":"#/components/responses/Problem"},"503":{"$ref":"#/components/responses/Problem"}}}},"/courses/{longitude}/{latitude}":{"get":{"tags":["Golf Courses"],"summary":"Find the 10 nearest golf courses within 10 miles","operationId":"findNearbyCourses","security":[{"CaddieApiKey":[]},{"CaddieBearer":[]}],"parameters":[{"name":"longitude","in":"path","required":true,"schema":{"type":"number","minimum":-180,"maximum":180}},{"name":"latitude","in":"path","required":true,"schema":{"type":"number","minimum":-90,"maximum":90}}],"responses":{"200":{"description":"Nearest active courses with geometry, ordered by distance","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NearbyCourseResponse"}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/Problem"},"502":{"$ref":"#/components/responses/Problem"},"503":{"$ref":"#/components/responses/Problem"}}}},"/courses/bulk-ids":{"get":{"tags":["Golf Courses"],"summary":"Download the compact active course directory","operationId":"getBulkCourseIds","security":[{"CaddieApiKey":[]},{"CaddieBearer":[]}],"responses":{"200":{"description":"All active geometry-backed course IDs, names, and locations","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkCourseDirectory"}}}},"401":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/Problem"},"502":{"$ref":"#/components/responses/Problem"},"503":{"$ref":"#/components/responses/Problem"}}}},"/courses/{courseId}/maps/tiles":{"get":{"tags":["Golf Course Maps"],"summary":"Plan raster tile coverage for a golf course","operationId":"getCourseMapTilePlan","security":[{"CaddieApiKey":[]},{"CaddieBearer":[]}],"parameters":[{"name":"courseId","in":"path","required":true,"schema":{"type":"string"}},{"name":"zoom","in":"query","required":false,"schema":{"type":"integer","minimum":0,"maximum":22,"default":17}},{"name":"tileSize","in":"query","required":false,"schema":{"type":"integer","enum":[256,512],"default":256}},{"name":"format","in":"query","required":false,"schema":{"type":"string","enum":["webp","png"],"default":"webp"},"description":"Raster image format. WebP is lossless and is the default; PNG remains available as an explicit override."},{"name":"revision","in":"query","required":false,"schema":{"type":"string","pattern":"^(sha256:)?[a-f0-9]{64}$"},"description":"Pin the expected course revision. A stale revision receives 409; authenticated responses remain private and no-store."}],"responses":{"200":{"description":"Course coverage, tile ranges, revision-pinned XYZ URL template, static-map link, and PMTiles archive status"},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/Problem"},"409":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/Problem"}}}},"/courses/{courseId}/maps/tiles/{zoom}/{x}/{y}":{"get":{"tags":["Golf Course Maps"],"summary":"Download a north-up golf course raster tile","operationId":"getCourseMapTile","security":[{"CaddieApiKey":[]},{"CaddieBearer":[]}],"parameters":[{"name":"courseId","in":"path","required":true,"schema":{"type":"string"}},{"name":"zoom","in":"path","required":true,"schema":{"type":"integer","minimum":0,"maximum":22}},{"name":"x","in":"path","required":true,"schema":{"type":"integer","minimum":0}},{"name":"y","in":"path","required":true,"schema":{"type":"integer","minimum":0}},{"name":"tileSize","in":"query","required":false,"schema":{"type":"integer","enum":[256,512],"default":256}},{"name":"format","in":"query","required":false,"schema":{"type":"string","enum":["webp","png"],"default":"webp"},"description":"Raster image format. WebP is lossless and is the default; PNG remains available as an explicit override."},{"name":"revision","in":"query","required":false,"schema":{"type":"string","pattern":"^(sha256:)?[a-f0-9]{64}$"}}],"responses":{"200":{"description":"Lossless WebP raster tile by default, or PNG when format=png","content":{"image/webp":{"schema":{"type":"string","format":"binary"}},"image/png":{"schema":{"type":"string","format":"binary"}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/Problem"},"404":{"$ref":"#/components/responses/Problem"},"409":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/Problem"}}}},"/courses/{courseId}/maps/static":{"get":{"tags":["Golf Course Maps"],"summary":"Render a bounded static golf course map","operationId":"getCourseStaticMap","security":[{"CaddieApiKey":[]},{"CaddieBearer":[]}],"parameters":[{"name":"courseId","in":"path","required":true,"schema":{"type":"string"}},{"name":"bbox","in":"query","required":true,"description":"west,south,east,north in WGS84 longitude/latitude","schema":{"type":"string","example":"-83.110736,39.987982,-83.092498,39.997394"}},{"name":"zoom","in":"query","required":true,"schema":{"type":"integer","minimum":0,"maximum":22}},{"name":"revision","in":"query","required":false,"schema":{"type":"string","pattern":"^(sha256:)?[a-f0-9]{64}$"}}],"responses":{"200":{"description":"North-up branded PNG cropped to the resolved pixel-aligned bounds; source XYZ tiles remain unbranded","content":{"image/png":{"schema":{"type":"string","format":"binary"}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/Problem"},"422":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/Problem"}}}},"/courses/{courseId}/maps/archive.pmtiles":{"get":{"tags":["Golf Course Maps"],"summary":"Stream a published course PMTiles archive","operationId":"getCourseMapArchive","security":[{"CaddieApiKey":[]},{"CaddieBearer":[]}],"parameters":[{"name":"courseId","in":"path","required":true,"schema":{"type":"string"}},{"name":"revision","in":"query","required":false,"schema":{"type":"string","pattern":"^(sha256:)?[a-f0-9]{64}$"},"description":"Full expected course revision. A stale revision is rejected; authenticated archive responses remain private and no-store."},{"name":"Range","in":"header","required":false,"schema":{"type":"string","example":"bytes=0-16383"}}],"responses":{"200":{"description":"Complete PMTiles archive"},"206":{"description":"Requested PMTiles byte range"},"401":{"$ref":"#/components/responses/Problem"},"404":{"$ref":"#/components/responses/Problem"},"416":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/Problem"}}}},"/maptiles/{courseId}":{"get":{"tags":["Golf Course Maps"],"deprecated":true,"summary":"Legacy alias for the course map tile plan","operationId":"getLegacyCourseMapTilePlan","security":[{"CaddieApiKey":[]},{"CaddieBearer":[]}],"responses":{"200":{"description":"Canonical tile plan"}}}},"/maptiles/{courseId}/{zoom}/{x}/{y}":{"get":{"tags":["Golf Course Maps"],"deprecated":true,"summary":"Legacy alias for a course map tile","operationId":"getLegacyCourseMapTile","security":[{"CaddieApiKey":[]},{"CaddieBearer":[]}],"responses":{"200":{"description":"Lossless WebP raster tile by default, or PNG when format=png"}}}},"/styles":{"get":{"tags":["Golf Course Graphics"],"summary":"List golf graphics generator options and limits","responses":{"200":{"description":"Capabilities"}}}}},"components":{"securitySchemes":{"CaddieApiKey":{"type":"apiKey","in":"header","name":"x-api-key","description":"Organization credential with the endpoint's required product scope. c100_live_ and c100_test_ keys are server-only. c100_pk_live_ and c100_pk_test_ keys also require an exact licensed browser Origin."},"CaddieBearer":{"type":"http","scheme":"bearer","description":"The same organization credential as a Bearer token. Credentials in URL query strings are not accepted."}},"schemas":{"CourseSummary":{"type":"object","required":["id","name","location","holeCount","holes","services"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"location":{"type":"object","required":["city","region","country","longitude","latitude"],"properties":{"city":{"type":["string","null"]},"region":{"type":["string","null"]},"country":{"type":["string","null"]},"longitude":{"type":["number","null"],"minimum":-180,"maximum":180},"latitude":{"type":["number","null"],"minimum":-90,"maximum":90}},"additionalProperties":false},"holeCount":{"type":"integer","minimum":1,"maximum":99},"holes":{"type":"array","items":{"type":"object","required":["number","available"],"properties":{"number":{"type":"integer","minimum":1,"maximum":99},"available":{"type":"boolean"}},"additionalProperties":false}},"services":{"type":"object","required":["graphics","courseMap","staticMapImages"],"properties":{"graphics":{"$ref":"#/components/schemas/OnDemandCourseService"},"courseMap":{"$ref":"#/components/schemas/CachedMapService"},"staticMapImages":{"$ref":"#/components/schemas/CachedMapService"}},"additionalProperties":false}},"additionalProperties":false},"CourseDataBundleResponse":{"type":"object","required":["courseId","revision","data","meta"],"properties":{"courseId":{"type":"string"},"revision":{"type":"string","pattern":"^sha256:[a-f0-9]{64}$"},"data":{"type":"object","description":"Requested dataset properties. Dotted keywords become nested objects, such as geometry.fairways at data.geometry.fairways.","additionalProperties":true},"meta":{"type":"object","required":["complete","requestedDatasets","returnedDatasets","todoDatasets","deniedDatasets","requestedHoles","resolvedHoles","spatialFilter"],"properties":{"complete":{"type":"boolean"},"requestedDatasets":{"type":"array","items":{"type":"string","enum":["identity","contact","amenities","operations","scorecard","holes.summary","holes.detail","holes.strategy","greens.summary","greens.analysis","geometry.course-boundary","geometry.hole-boundaries","geometry.fairways","geometry.greens","geometry.tees","geometry.centerlines","geometry.bunkers","geometry.water","geometry.waste","geometry.cart-paths","geometry.trees","geometry.buildings","geometry.roads","geometry.parking","geometry.land-surfaces","geometry.other","elevations.ground","elevations.trees","measurements.greens","measurements.fairways","editorial.course","editorial.holes","editorial.greens","editorial.operations","media.images","media.videos","provenance"]}},"returnedDatasets":{"type":"array","items":{"type":"string","enum":["identity","contact","amenities","operations","scorecard","holes.summary","holes.detail","holes.strategy","greens.summary","greens.analysis","geometry.course-boundary","geometry.hole-boundaries","geometry.fairways","geometry.greens","geometry.tees","geometry.centerlines","geometry.bunkers","geometry.water","geometry.waste","geometry.cart-paths","geometry.trees","geometry.buildings","geometry.roads","geometry.parking","geometry.land-surfaces","geometry.other","elevations.ground","elevations.trees","measurements.greens","measurements.fairways","editorial.course","editorial.holes","editorial.greens","editorial.operations","media.images","media.videos","provenance"]}},"todoDatasets":{"type":"array","items":{"type":"string","enum":["identity","contact","amenities","operations","scorecard","holes.summary","holes.detail","holes.strategy","greens.summary","greens.analysis","geometry.course-boundary","geometry.hole-boundaries","geometry.fairways","geometry.greens","geometry.tees","geometry.centerlines","geometry.bunkers","geometry.water","geometry.waste","geometry.cart-paths","geometry.trees","geometry.buildings","geometry.roads","geometry.parking","geometry.land-surfaces","geometry.other","elevations.ground","elevations.trees","measurements.greens","measurements.fairways","editorial.course","editorial.holes","editorial.greens","editorial.operations","media.images","media.videos","provenance"]}},"deniedDatasets":{"type":"array","items":{"type":"string","enum":["identity","contact","amenities","operations","scorecard","holes.summary","holes.detail","holes.strategy","greens.summary","greens.analysis","geometry.course-boundary","geometry.hole-boundaries","geometry.fairways","geometry.greens","geometry.tees","geometry.centerlines","geometry.bunkers","geometry.water","geometry.waste","geometry.cart-paths","geometry.trees","geometry.buildings","geometry.roads","geometry.parking","geometry.land-surfaces","geometry.other","elevations.ground","elevations.trees","measurements.greens","measurements.fairways","editorial.course","editorial.holes","editorial.greens","editorial.operations","media.images","media.videos","provenance"]}},"requestedHoles":{"type":["array","null"],"items":{"type":"integer","minimum":1,"maximum":99}},"resolvedHoles":{"type":"array","items":{"type":"integer","minimum":1,"maximum":99}},"spatialFilter":{"oneOf":[{"type":"null"},{"type":"object","required":["method","contextBufferMeters"],"properties":{"method":{"type":"string","const":"hole-bounds"},"contextBufferMeters":{"type":"number","const":50}},"additionalProperties":false}]}},"additionalProperties":false}},"additionalProperties":false},"OnDemandCourseService":{"type":"object","required":["available","delivery"],"properties":{"available":{"type":"boolean"},"delivery":{"type":"string","const":"generated-on-demand"}},"additionalProperties":false},"CachedMapService":{"type":"object","required":["available","delivery"],"properties":{"available":{"type":"boolean"},"delivery":{"type":"string","const":"pre-rendered-pmtiles"}},"additionalProperties":false},"CompactCourse":{"type":"object","required":["id","name","location"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"location":{"type":"object","required":["city","region","country","longitude","latitude"],"properties":{"city":{"type":["string","null"]},"region":{"type":["string","null"]},"country":{"type":["string","null"]},"longitude":{"type":["number","null"],"minimum":-180,"maximum":180},"latitude":{"type":["number","null"],"minimum":-90,"maximum":90}},"additionalProperties":false}},"additionalProperties":false},"NearbyCourse":{"type":"object","required":["id","name","location","distanceMiles"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"location":{"type":"object","required":["city","region","country","longitude","latitude"],"properties":{"city":{"type":["string","null"]},"region":{"type":["string","null"]},"country":{"type":["string","null"]},"longitude":{"type":"number","minimum":-180,"maximum":180},"latitude":{"type":"number","minimum":-90,"maximum":90}},"additionalProperties":false},"distanceMiles":{"type":"number","minimum":0,"maximum":10}},"additionalProperties":false},"NearbyCourseResponse":{"type":"object","required":["origin","radiusMiles","limit","courses"],"properties":{"origin":{"type":"object","required":["longitude","latitude"],"properties":{"longitude":{"type":"number","minimum":-180,"maximum":180},"latitude":{"type":"number","minimum":-90,"maximum":90}},"additionalProperties":false},"radiusMiles":{"type":"number","const":10},"limit":{"type":"integer","const":10},"courses":{"type":"array","maxItems":10,"items":{"$ref":"#/components/schemas/NearbyCourse"}}},"additionalProperties":false},"BulkCourseDirectory":{"type":"object","required":["courses"],"properties":{"courses":{"type":"array","items":{"$ref":"#/components/schemas/CompactCourse"}}},"additionalProperties":false},"MapImageRequest":{"type":"object","properties":{"subject":{"description":"Defaults to Hole 1 when omitted.","oneOf":[{"type":"object","required":["type"],"properties":{"type":{"const":"hole"},"holeNumber":{"type":"integer","minimum":1,"default":1}},"additionalProperties":false},{"type":"object","required":["type","holeNumber"],"properties":{"type":{"const":"green"},"holeNumber":{"type":"integer","minimum":1}},"additionalProperties":false},{"type":"object","required":["type"],"properties":{"type":{"const":"course"}},"additionalProperties":false}]},"output":{"type":"object","description":"Defaults to WebP at 1440×2400 for portrait holes, 2400×1440 for landscape holes, 1200×1200 for greens, or 2400×1600 for a course. Width and height define the composition aspect ratio; output is uniformly scaled without cropping or distortion.","properties":{"format":{"type":"string","enum":["webp","png","jpeg","jpg"],"default":"webp"},"width":{"type":"integer","minimum":320,"maximum":8000},"height":{"type":"integer","minimum":320,"maximum":8000},"quality":{"type":"integer","minimum":40,"maximum":95,"default":90}},"additionalProperties":false},"style":{"type":"object","properties":{"graphicStyle":{"type":"string","enum":["traditional","pencil","colored-pencil"],"default":"traditional","description":"Top-level visual language. Traditional is the established filled, colored treatment; Pencil is geometry-native graphite linework; Colored Pencil uses uniform soft flat feature colors, restrained paths, and simple Overture building and parking surfaces without terrain, shading, or texture. Each style has a separate cache identity."},"paperTheme":{"description":"light, dark, transparent, or a six-digit #RRGGBB value. transparent omits the paper fill, graphing grid, and paper grain while retaining selected edges, contours, and washes. WebP and PNG preserve alpha; JPEG composites over white. Edge-to-edge terrain can still fill the viewport. Invalid values fall back to light.","oneOf":[{"type":"string","enum":["light","dark","transparent"]},{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$"}],"examples":["light","dark","transparent","#DDE7D2"],"default":"light"},"terrainIntensity":{"type":"number","minimum":0.5,"maximum":5,"default":2.2,"description":"Terrain color and shading strength across rough, fairways and their first cut, short-cut surfaces, and bunker sand. 4.4 is twice the contribution of 2.2. Sampling and filtering adapt to camera scale before this visual gain is applied; sand uses restrained material-specific limits."},"terrainTexture":{"type":"boolean","default":true,"description":"Adds scale-aware, material-specific flecks, including treatment-aware water and bunker-sand palettes. Sand uses the finer fairway half-radius model; water uses the larger rough/base model. false omits only the added drawTerrainTexture, drawWaterTexture, and drawTextureSand passes and retains drawRough, bunker grain/rakes/lips, water depth/ripples/glints, mowing treatments, surface fills, and measured terrain lighting."},"fairwayPattern":{"type":"string","enum":["large-stripes","medium-stripes","small-stripes","large-checks","medium-checks","small-checks","blank-v1","blank-v2"],"default":"medium-stripes","description":"Fairway mowing treatment. Checked patterns cross two perpendicular stripe passes to form diamonds and share the corresponding stripe preset's physical band width. Legacy checkered-v1 and checkered-v2 inputs remain accepted as aliases."},"teePattern":{"type":"string","enum":["plain","small-stripes","thin-stripes"],"default":"plain","description":"Tee mowing treatment. Stripe widths use fixed real-world meter dimensions converted through the final camera projection."},"waterTreatment":{"type":"string","enum":["auto","light","medium","dark"],"default":"auto","description":"Water color. auto resolves Light, Medium, or Dark from the course state. Tropical US territories use light; unknown and non-US locations use medium. none is not supported."},"bunkerTreatment":{"type":"string","enum":["classic","dark","flat","raised-edge"],"default":"classic"},"greenery":{"type":"string","enum":["auto","classic","cool-blue","cool-apple","warm-emerald","warm-golden"],"default":"auto","description":"Coordinated color family for context base, rough, fairway and first cut, greens, tees, fringes, grass terrain flecks, forest floor, and tree crowns. auto uses a state-level GCSAA agronomic-region proxy; classic is the exact established palette and fallback."},"housing":{"type":"string","enum":["auto","warm","cool","mixed","none"],"default":"auto","description":"Housing treatment. auto resolves from the course state’s modal IECC climate zone by county count; zones 1–3 are warm, zone 4 is mixed, and zones 5–8 are cool. Cross-family ties, unknown states, and non-US courses use mixed. none omits housing roofs and hole-render housing footprint context edges."},"overtureSegments":{"type":"string","enum":["all","small","none"],"default":"all","description":"Traditional accepts all, small, or none. Pencil fixes this option to none. Colored Pencil defaults to small, renders only service and non-motorized path classes as flat soft paths, accepts none, and rejects all. Course-authored cart paths, Overture building footprints, and Overture parking polygons remain independent."},"perimeterTreatment":{"type":"string","enum":["none","legacy-v1","classic","classic-wide","classic-wider","classic-widest"],"default":"classic","description":"Hole and full-course outer terrain treatment. Classic full-course renders naturally union every hole's buffered measured-feature accents into one organic perimeter. classic-wide, classic-wider, and classic-widest increase only forward and reverse landing-circle buffers by 10%, 20%, and 30%. legacy-v1 preserves the authored measured hole or course envelope, including rectangular source sections, and none renders edge-to-edge. Retired default and tapered-family inputs remain compatibility aliases."},"nearbyHoles":{"type":"string","enum":["hidden","stroked-dark","stroked-light","filled-dark","filled-light","stroked","detailed"],"default":"hidden","description":"Hole-only rendering of maintained surfaces from other holes entering the viewport. hidden omits them; stroked-dark and stroked-light draw measured outlines at 15% opacity in dark green or white; filled-dark and filled-light fill the measured surfaces using the same colors and opacity; detailed renders their selected colors, mowing patterns, textures, and terrain response. The legacy stroked value aliases stroked-dark. Artwork is clipped by perimeterTreatment."},"context":{"description":"Independent paper-context layers. Edges includes Overture segment centerlines admitted by overtureSegments and housing footprint polygons without procedural gables unless housing is none. Set graphing, edges, contours, and washes to false to disable all context artwork; opaque paper themes retain their fill, while transparent leaves only rendered map artwork. The deprecated texture property remains an alias for graphing.","oneOf":[{"type":"string","const":"none"},{"type":"object","properties":{"graphing":{"type":"boolean","default":true},"texture":{"type":"boolean","deprecated":true,"description":"Compatibility alias for graphing."},"edges":{"type":"boolean","default":true},"contours":{"type":"boolean","default":true},"washes":{"type":"boolean","default":false}}}]}},"additionalProperties":true},"composition":{"type":"object","description":"Hole-only composition. Presets fit the complete measured envelope inside configurable CSS-style padding, defaulting to 5% on every side. Portrait anchors align Left/Middle/Right horizontally; Landscape aligns Top/Middle/Bottom vertically. Mixed anchors rotate along the target axis. Optional numeric targets override that axis; exact mode maps them directly.","properties":{"mode":{"type":"string","enum":["preset","exact"],"description":"Defaults to exact when numeric targets are supplied; otherwise preset."},"layout":{"type":"string","enum":["portrait","landscape"],"default":"portrait"},"flagAnchor":{"type":"string","description":"Preset selector. Portrait: left, middle, right. Landscape: top, middle, bottom."},"teeAnchor":{"type":"string","description":"Preset selector. Portrait: left, middle, right. Landscape: top, middle, bottom."},"teeSide":{"type":"string","enum":["left","right"],"default":"left","description":"Landscape-only play direction."},"flagTarget":{"$ref":"#/components/schemas/CompositionTarget"},"teeTarget":{"$ref":"#/components/schemas/CompositionTarget"},"padding":{"$ref":"#/components/schemas/ImagePadding"}},"additionalProperties":true},"greenComposition":{"type":"object","description":"Green-only camera controls. The complete measured green is fitted as large as possible while preserving metric padding. center aligns the measured green center at every aspect ratio; directional gravity pins the padded green to an edge or corner; auto preserves legacy shape-based placement. The rendered viewport is opaque and edge-to-edge.","properties":{"orientation":{"type":"string","enum":["approach","north"],"default":"approach"},"paddingMeters":{"$ref":"#/components/schemas/MetricPadding"},"rotationDegrees":{"type":"number","minimum":-180,"maximum":180,"default":0},"gravity":{"type":"string","enum":["auto","center","top","right","bottom","left","top-left","top-right","bottom-left","bottom-right"],"default":"center"}},"additionalProperties":false},"courseComposition":{"type":"object","description":"Full-course composition controls. auto preserves the canonical fit. Custom CSS-style padding is applied after automatic course rotation around the complete support envelope.","properties":{"padding":{"oneOf":[{"type":"string","const":"auto"},{"$ref":"#/components/schemas/ImagePadding"}],"default":"auto"}},"additionalProperties":false},"greenData":{"type":"object","description":"Optional putting-surface overlays for hole and green images from the provider's putting-surface-v1 bundle: 1-yard buffered source elevations, a 2-foot slope grid, and 6-foot gradient sampling. Green elevation heatmaps apply to both subjects. Green-detail grid marks use traditional straight arrows; fluid marks use curved streamlines. Both indicate local downhill terrain direction, not a simulated putt path.","properties":{"heatmap":{"type":"string","enum":["elevation"],"description":"Blue-low / neutral-band-transparent / red-high elevation map clipped to the measured green, with signed-relief grade gating and inside-green robust statistics."},"heatmapOpacity":{"type":"number","minimum":0.1,"maximum":0.8,"default":0.42},"breaks":{"type":"boolean","default":false},"breakStyle":{"type":"string","enum":["grid","fluid"],"default":"fluid","description":"grid renders traditional straight line-and-triangle arrows at regular metric spacing; fluid renders curved, traced, and consolidated streamlines."},"breakDensity":{"type":"string","enum":["light","medium","high"],"default":"medium"},"breakColor":{"oneOf":[{"type":"string","enum":["dark","light"]},{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$"}],"examples":["dark","light","#24594B"],"default":"dark","description":"Solid arrow color preset or strict six-digit hex value."}},"additionalProperties":false}}},"GraphicRenderDescriptor":{"type":"object","required":["request","artifact","render","service","renderer"],"properties":{"request":{"type":"object","additionalProperties":true},"artifact":{"type":"object","required":["imageUrl","contentType","width","height"],"properties":{"imageUrl":{"type":"string","format":"uri"},"contentType":{"type":"string","enum":["image/webp","image/png","image/jpeg"]},"width":{"type":"integer","minimum":320},"height":{"type":"integer","minimum":320},"cacheState":{"type":"string","enum":["HIT","MISS","COALESCED","RENDERING","FAILED"]},"delivery":{"type":"string","enum":["api","signed-cloudfront"],"description":"READY AWS artifacts use a short-lived signed CloudFront URL; pending and local artifacts retain the authenticated API URL."},"artifactKey":{"type":"string","pattern":"^sha256:[0-9a-f]{64}$"},"sha256":{"type":"string","pattern":"^sha256:[0-9a-f]{64}$"},"deliveryExpiresAt":{"type":"string","format":"date-time"}},"additionalProperties":false},"render":{"type":"object","required":["id","receipt","expiresAt","overlaysUrl","allowedOverlays"],"properties":{"id":{"type":"string","pattern":"^rnd_[A-Za-z0-9_-]+$"},"receipt":{"type":"string","description":"Short-lived signed capability bound to the credential and normalized render request."},"expiresAt":{"type":"string","format":"date-time"},"overlaysUrl":{"type":"string","format":"uri"},"allowedOverlays":{"type":"array","items":{"type":"string","enum":["hole-centerline","hole-spine","shot-dispersion","tee","flag","cup","approach-rings","approach-markers","grids","green-elevation-heatmap","green-downhill-arrows","green-measurements","fairway-widths","teeboxes","teeboxes-legend","hole-number"]}}},"additionalProperties":false},"service":{"const":"course-graphics"},"renderer":{"type":"string"}},"additionalProperties":false},"GraphicOverlayRequest":{"type":"object","required":["receipt","overlays"],"properties":{"receipt":{"type":"string"},"overlays":{"type":"array","minItems":1,"maxItems":64,"items":{"oneOf":[{"type":"object","required":["type"],"additionalProperties":false,"properties":{"id":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$","description":"Optional stable instance ID. Required only when the caller needs to address one repeated Smart Component independently; omitted repeated instances receive deterministic IDs."},"type":{"const":"hole-centerline"},"style":{"type":"object","additionalProperties":false,"properties":{"strokeColor":{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$"},"strokeWidth":{"type":"integer","minimum":1,"maximum":16},"strokeStyle":{"type":"string","enum":["solid","dashed","dotted","dash-dot"]}}}}},{"type":"object","required":["type"],"additionalProperties":false,"properties":{"id":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$","description":"Optional stable instance ID. Required only when the caller needs to address one repeated Smart Component independently; omitted repeated instances receive deterministic IDs."},"type":{"const":"green-elevation-heatmap"},"style":{"type":"object","additionalProperties":false,"properties":{"opacity":{"type":"number","minimum":0.1,"maximum":0.8,"default":0.42}}}}},{"type":"object","required":["type"],"additionalProperties":false,"properties":{"id":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$","description":"Optional stable instance ID. Required only when the caller needs to address one repeated Smart Component independently; omitted repeated instances receive deterministic IDs."},"type":{"const":"green-downhill-arrows"},"layout":{"type":"string","enum":["fluid","grid"],"default":"fluid","description":"Fluid fall-line paths or a staggered traditional straight-arrow grid."},"density":{"type":"string","enum":["light","medium","high"],"default":"medium"},"style":{"type":"object","additionalProperties":false,"properties":{"color":{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$","default":"#142622"},"opacity":{"type":"number","minimum":0.1,"maximum":1,"default":1}}}}},{"type":"object","required":["type"],"additionalProperties":false,"properties":{"id":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$","description":"Optional stable instance ID. Required only when the caller needs to address one repeated Smart Component independently; omitted repeated instances receive deterministic IDs."},"type":{"const":"green-measurements"},"origin":{"type":"string","enum":["green-center","maximum-dimensions"],"default":"green-center","description":"Center width plus depth, or maximum width plus depth."},"depthLabelPosition":{"type":"string","enum":["top","bottom"],"default":"top","description":"Inside depth-label side and outside width-line side."},"widthLabelPosition":{"type":"string","enum":["left","right"],"default":"right","description":"Inside width-label side and outside depth-line side."},"style":{"type":"object","additionalProperties":false,"properties":{"strokeColor":{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$"},"strokeWidth":{"type":"integer","minimum":1,"maximum":16,"default":4},"strokeStyle":{"type":"string","enum":["solid","dashed","dotted","dash-dot"],"default":"solid"},"linePosition":{"type":"string","enum":["inside","outside"],"default":"inside","description":"Inside connects the measured green edges. Outside translates both complete spans beyond the selected sides while preserving their measured lengths and angles."},"endCap":{"type":"string","enum":["none","dot","point"],"default":"none","description":"Matching decoration at both displayed line endpoints."},"endCapSize":{"type":"integer","minimum":4,"maximum":32,"default":10,"description":"Dot diameter or point length in image pixels."},"showDepth":{"type":"boolean","default":true},"showWidth":{"type":"boolean","default":true},"showLabels":{"type":"boolean","default":true},"showDepthLabel":{"type":"boolean","default":true},"showWidthLabel":{"type":"boolean","default":true},"labelPrecision":{"type":"string","enum":["rounded","measured"],"default":"rounded","description":"Rounded shows whole yards. Measured preserves one decimal place when needed."},"labelSize":{"type":"integer","minimum":1,"default":16,"description":"Positive whole-number label size in image pixels with no upper limit."},"labelColor":{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$"},"labelBackgroundColor":{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$"},"labelXPadding":{"type":"integer","minimum":0,"maximum":32,"default":8},"labelYPadding":{"type":"integer","minimum":0,"maximum":20,"default":6},"labelGap":{"type":"integer","minimum":0,"default":8,"description":"Non-negative whole-number inside-label gap or outside-line clearance beyond the selected edge, with no upper limit."}}}}},{"type":"object","required":["type"],"additionalProperties":false,"properties":{"id":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$","description":"Optional stable instance ID. Required only when the caller needs to address one repeated Smart Component independently; omitted repeated instances receive deterministic IDs."},"type":{"const":"fairway-widths"},"measurement":{"type":"string","enum":["bearing","profile"],"default":"bearing","description":"Measurement set. Bearing uses the configured tee's straight-shot cross-sections at 220–260 carry yards; profile uses the full fairway-following 10-yard samples."},"yardages":{"oneOf":[{"type":"array","minItems":1,"maxItems":12,"items":{"type":"integer","minimum":1,"maximum":800}},{"type":"string","description":"Comma-delimited whole-number targets, for example 240,270."}],"description":"Optional start-relative targets. The nearest measured station is selected independently for each target and repeated matches collapse to one line. Bearing uses straight carry yardage; profile uses radial station distance. Omit to show every measured station."},"from":{"type":"string","maxLength":100,"description":"Configured start point: WGS 84 longitude,latitude pair or case-insensitive tee name. Defaults to the furthest tee."},"style":{"type":"object","additionalProperties":false,"properties":{"strokeColor":{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$","default":"#FFFFFF"},"strokeWidth":{"type":"integer","minimum":1,"maximum":16,"default":3},"strokeStyle":{"type":"string","enum":["solid","dashed","dotted","dash-dot"],"default":"solid"},"pointSize":{"type":"integer","minimum":4,"maximum":32,"default":10},"pointColor":{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$","default":"#FFFFFF"},"pointOutlineColor":{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$","default":"#07110D"},"showLabels":{"type":"boolean","default":true},"labelPosition":{"type":"string","enum":["left","right","alternate"],"default":"right","description":"Places pills horizontally beside the image-left or image-right edge dots; alternate switches sides by station."},"labelPrecision":{"type":"string","enum":["rounded","measured"],"default":"rounded","description":"Rounded shows whole yards. Measured preserves one decimal place when the stored width is not a whole number."},"labelSize":{"type":"integer","minimum":1,"default":16,"description":"Positive whole-number label size in image pixels with no upper limit."},"labelColor":{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$","default":"#FFFFFF"},"labelBackgroundColor":{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$","default":"#07110D"},"labelXPadding":{"type":"integer","minimum":0,"maximum":32,"default":8},"labelYPadding":{"type":"integer","minimum":0,"maximum":20,"default":6},"labelGap":{"type":"integer","minimum":0,"maximum":40,"default":8}}}}},{"type":"object","required":["type"],"additionalProperties":false,"properties":{"id":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$","description":"Optional stable instance ID. Required only when the caller needs to address one repeated Smart Component independently; omitted repeated instances receive deterministic IDs."},"type":{"const":"hole-spine"},"style":{"type":"object","additionalProperties":false,"properties":{"strokeColor":{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$"},"strokeWidth":{"type":"integer","minimum":1,"maximum":16},"strokeStyle":{"type":"string","enum":["solid","dashed","dotted","dash-dot"]}}}}},{"type":"object","required":["type"],"additionalProperties":false,"properties":{"id":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$","description":"Optional stable instance ID. Required only when the caller needs to address one repeated Smart Component independently; omitted repeated instances receive deterministic IDs."},"type":{"const":"shot-dispersion"},"yardage":{"type":"integer","minimum":10,"maximum":400,"default":260,"description":"Direct start-centered radius; distance is not accumulated along the centerline."},"from":{"type":"string","maxLength":100,"description":"WGS 84 longitude,latitude pair or case-insensitive tee name. Omit to use the graphic's authored tee point."},"handicap":{"type":"number","default":12,"description":"Optional golfer handicap used to scale the visible target dispersion width. Numeric values are capped to the 1–20 range."},"style":{"type":"object","additionalProperties":false,"properties":{"strokeColor":{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$","default":"#FFFFFF"},"strokeWidth":{"type":"integer","minimum":1,"maximum":12,"default":3},"pointSize":{"type":"integer","minimum":12,"maximum":48,"default":22},"teePointColor":{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$","default":"#07110D","description":"Tee-point fill color."},"targetPointColor":{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$","default":"#00AEEF","description":"Target-point fill color."},"pointColor":{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$","default":"#00AEEF","deprecated":true,"description":"Deprecated alias for targetPointColor."},"pointOutlineColor":{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$","default":"#FFFFFF"},"dispersionColor":{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$","default":"#39B54A"},"dispersionOpacity":{"type":"number","minimum":0,"maximum":1,"default":0.4},"showLabels":{"type":"boolean","default":true},"showLabel":{"type":"boolean","default":true,"deprecated":true,"description":"Deprecated alias for showLabels."},"labelPosition":{"type":"string","enum":["target-top","line-center","target-left","target-right","sticky-left","sticky-right"],"default":"target-top","description":"Places the live yardage label above the target, on the shot line, toward either horizontal edge, or flush against either edge with only the inward side rounded."},"labelPrecision":{"type":"string","enum":["rounded","measured"],"default":"rounded","description":"Rounded shows whole yards. Measured preserves one decimal place as the endpoints move."},"labelSize":{"type":"integer","minimum":1,"default":16,"description":"Positive whole-number label size in image pixels with no upper limit."},"labelColor":{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$","default":"#FFFFFF"},"labelBackgroundColor":{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$","default":"#07110D"},"labelXPadding":{"type":"integer","minimum":0,"maximum":32,"default":9},"labelYPadding":{"type":"integer","minimum":0,"maximum":20,"default":7},"labelGap":{"type":"integer","minimum":0,"maximum":40,"default":8,"description":"Gap below an above-target pill, or target-point clearance for a lateral label leader."}}}}},{"type":"object","required":["type"],"additionalProperties":false,"properties":{"id":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$","description":"Optional stable instance ID. Required only when the caller needs to address one repeated Smart Component independently; omitted repeated instances receive deterministic IDs."},"type":{"const":"tee"},"style":{"type":"object","additionalProperties":false,"properties":{"color":{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$"},"outlineColor":{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$"},"size":{"type":"integer","minimum":20,"maximum":96},"label":{"oneOf":[{"type":"string","maxLength":40},{"type":"boolean"},{"type":"null"}]}}}}},{"type":"object","required":["type"],"additionalProperties":false,"properties":{"id":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$","description":"Optional stable instance ID. Required only when the caller needs to address one repeated Smart Component independently; omitted repeated instances receive deterministic IDs."},"type":{"const":"flag"},"style":{"type":"object","additionalProperties":false,"properties":{"flagColor":{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$"},"poleColor":{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$"},"outlineColor":{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$"},"size":{"type":"integer","minimum":20,"maximum":96},"label":{"oneOf":[{"type":"string","maxLength":40},{"type":"boolean"},{"type":"null"}]}}}}},{"type":"object","required":["type"],"additionalProperties":false,"properties":{"id":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$","description":"Optional stable instance ID. Required only when the caller needs to address one repeated Smart Component independently; omitted repeated instances receive deterministic IDs."},"type":{"const":"cup"},"style":{"type":"object","additionalProperties":false,"properties":{"size":{"type":"integer","minimum":4,"maximum":64,"default":16,"description":"Scale-aware proxy diameter in inches. The server resolves the default 16-inch proxy to rendered-image pixels; the SDK applies later size changes locally."}}}}},{"type":"object","required":["type"],"additionalProperties":false,"properties":{"id":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$","description":"Optional stable instance ID. Required only when the caller needs to address one repeated Smart Component independently; omitted repeated instances receive deterministic IDs."},"type":{"const":"approach-rings"},"yardages":{"type":"array","minItems":1,"maxItems":12,"uniqueItems":true,"items":{"type":"integer","minimum":10,"maximum":400},"description":"Hole or Green radial rings. Paths may cross the canvas boundary; visible portions render and off-image portions are clipped."}}},{"type":"object","required":["type"],"additionalProperties":false,"properties":{"id":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$","description":"Optional stable instance ID. Required only when the caller needs to address one repeated Smart Component independently; omitted repeated instances receive deterministic IDs."},"type":{"const":"approach-markers"},"yardages":{"type":"array","minItems":1,"maxItems":12,"uniqueItems":true,"items":{"type":"integer","minimum":10,"maximum":400}},"style":{"type":"object","additionalProperties":false,"properties":{"color":{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$"},"showLabels":{"type":"boolean","default":true},"labelSize":{"type":"integer","minimum":1,"default":16,"description":"Positive whole-number label size in image pixels with no upper limit."},"labelPadding":{"type":"integer","minimum":0,"maximum":32,"default":5},"labelBackgroundColor":{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$"},"labelColor":{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$"},"outlineColor":{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$"},"showPointer":{"type":"boolean","default":false,"description":"Shows a triangular marker pointer aimed toward center green."},"pointerSize":{"type":"integer","minimum":4,"maximum":32,"default":10,"description":"Pointer scale in image pixels. Its tip protrudes by this amount."},"pointerColor":{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$","description":"Pointer fill color. Defaults to the marker outline color."}}}}},{"type":"object","required":["type"],"additionalProperties":false,"properties":{"id":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$","description":"Optional stable instance ID. Required only when the caller needs to address one repeated Smart Component independently; omitted repeated instances receive deterministic IDs."},"type":{"const":"grids"},"spacingYards":{"type":"integer","minimum":1,"maximum":25,"default":5},"scope":{"type":"string","enum":["image","green","green-buffer"],"default":"image","description":"Cover the rendered image, clip to the protected putting surface, or extend beyond a protected buffered green with faded tips."},"origin":{"type":"string","enum":["green-center","maximum-dimensions"],"default":"green-center","description":"Anchor to image-aligned axes through green center, or to measured depth and preferred maximum-width axes. Measured mode falls back to center width, then green center."},"bufferYards":{"type":"number","minimum":1,"maximum":25,"default":7.5,"description":"Metric extension beyond the green for green-buffer scope."},"detailed":{"type":"boolean","default":false,"description":"Adds one-yard subdivision lines inside the primary yardage boxes."},"style":{"type":"object","additionalProperties":false,"properties":{"strokeColor":{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$"},"strokeWidth":{"type":"integer","minimum":1,"maximum":8},"detailStrokeWidth":{"type":"integer","minimum":1,"maximum":8},"strokeStyle":{"type":"string","enum":["solid","dashed","dotted","dash-dot"]},"opacity":{"type":"number","minimum":0.05,"maximum":1}}}}},{"type":"object","required":["type"],"additionalProperties":false,"properties":{"id":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$","description":"Optional stable instance ID. Required only when the caller needs to address one repeated Smart Component independently; omitted repeated instances receive deterministic IDs."},"type":{"const":"teeboxes"},"name":{"type":"string","minLength":1,"maxLength":80,"description":"Optional exact tee-set name match. Matching is case-insensitive and tolerant of spaces and punctuation; when supplied, one matching teebox is returned."},"limit":{"oneOf":[{"const":"all"},{"type":"integer","enum":[3,4,5]}]}}},{"type":"object","required":["type"],"additionalProperties":false,"properties":{"id":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$","description":"Optional stable instance ID. Required only when the caller needs to address one repeated Smart Component independently; omitted repeated instances receive deterministic IDs."},"type":{"const":"teeboxes-legend"},"limit":{"oneOf":[{"const":"all"},{"type":"integer","enum":[3,4,5]}]}}},{"type":"object","required":["type"],"additionalProperties":false,"properties":{"id":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$","description":"Optional stable instance ID. Required only when the caller needs to address one repeated Smart Component independently; omitted repeated instances receive deterministic IDs."},"type":{"const":"hole-number"},"target":{"type":"string","enum":["dogleg","tee","flag","middle"]},"numbers":{"oneOf":[{"type":"null"},{"type":"string","pattern":"^\\s*\\d{1,2}(\\s*,\\s*\\d{1,2})*\\s*$"},{"type":"array","minItems":1,"maxItems":99,"uniqueItems":true,"items":{"type":"integer","minimum":1,"maximum":99}}],"description":"Course only. Null or omitted selects all holes; a comma-delimited string or integer array selects specific holes."},"style":{"type":"object","additionalProperties":false,"properties":{"shape":{"type":"string","enum":["circle","square"]},"size":{"type":"integer","minimum":32,"maximum":96},"backgroundColor":{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$"},"strokeColor":{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$"},"strokeWidth":{"type":"integer","minimum":0,"maximum":12},"textColor":{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$"}}}}}]}}},"additionalProperties":false},"GraphicOverlayResponse":{"type":"object","required":["renderId","requestSignature","artifactSha256","canvas","placements"],"properties":{"renderId":{"type":"string"},"requestSignature":{"type":"string","pattern":"^sha256:[a-f0-9]{64}$","description":"Stable signature of the normalized graphic request, course-data revision, and renderer version."},"artifactSha256":{"type":"string","pattern":"^sha256:[a-f0-9]{64}$","description":"SHA-256 digest of the exact rendered image bytes that the placements target."},"canvas":{"type":"object","required":["width","height"],"additionalProperties":false,"properties":{"width":{"type":"integer"},"height":{"type":"integer"}}},"placements":{"type":"array","maxItems":64,"items":{"type":"object","required":["id","type","component","x","y","anchor","style"],"properties":{"id":{"type":"string"},"type":{"type":"string","enum":["hole-centerline","hole-spine","shot-dispersion","tee","flag","cup","approach-rings","approach-markers","grids","green-elevation-heatmap","green-downhill-arrows","green-measurements","fairway-widths","teeboxes","teeboxes-legend","hole-number"]},"component":{"type":"string","enum":["caddie-hole-centerline","caddie-hole-spine","caddie-shot-dispersion","caddie-tee-marker","caddie-flag-marker","caddie-cup-marker","caddie-approach-rings","caddie-approach-markers","caddie-grids","caddie-green-elevation-heatmap","caddie-green-downhill-arrows","caddie-green-measurements","caddie-fairway-widths","caddie-teeboxes","caddie-teeboxes-legend","caddie-hole-number"]},"x":{"type":"number","description":"Absolute pixel from the left edge of the exact rendered image."},"y":{"type":"number","description":"Absolute pixel from the top edge of the exact rendered image."},"anchor":{"type":"string","enum":["center","bottom-center","top-left"],"description":"Default DOM origin for the built-in marker. Tee and cup markers are centered; flag markers align their bottom center to the target pixel."},"style":{"type":"object","additionalProperties":true},"resolvedSize":{"type":"number","description":"Cup only. Base rendered-image pixel diameter for the default 16-inch scale-aware proxy."},"yardage":{"type":"integer","minimum":10,"maximum":400,"description":"Shot dispersion only. Direct start-centered radius used for the protected starting placement."},"points":{"type":"array","minItems":2,"description":"Hole centerline, Hole spine, or Shot dispersion's final visible points in rendered-image pixels. Excludes geographic coordinates and projection transforms.","items":{"type":"array","minItems":2,"maxItems":2,"items":{"type":"number"}}},"rings":{"type":"array","items":{"type":"object","additionalProperties":true}},"markers":{"type":"array","items":{"type":"object","additionalProperties":true}},"resolvedOrigin":{"type":"string","enum":["green-center","maximum-dimensions"],"description":"Grid or Green measurement origin actually used after protected measurement fallback resolution."},"segments":{"type":"array","description":"Grids' final visible full-image, green-clipped, or green-buffered line segments in rendered-image pixels. Each line is primary or detailed; buffered lines may include final fade fractions. Excludes green polygons, measured cross-sections, geographic coordinates, and metric transforms.","items":{"type":"object","required":["kind","start","end"],"additionalProperties":false,"properties":{"kind":{"type":"string","enum":["detail","major"]},"start":{"type":"array","minItems":2,"maxItems":2,"items":{"type":"number"}},"end":{"type":"array","minItems":2,"maxItems":2,"items":{"type":"number"}},"fadeStart":{"type":"number","minimum":0,"maximum":1,"description":"Optional fraction where a buffered segment reaches full opacity."},"fadeEnd":{"type":"number","minimum":0,"maximum":1,"description":"Optional fraction where a buffered segment leaves full opacity."}}}},"raster":{"type":"object","description":"Final display-only RGBA heatmap pixels. Contains no elevations, slopes, coordinates, polygon, or transforms.","required":["width","height","pixelFormat","pixels"],"additionalProperties":false,"properties":{"width":{"type":"integer","minimum":1},"height":{"type":"integer","minimum":1},"pixelFormat":{"const":"rgba8"},"pixels":{"type":"string","contentEncoding":"base64"}}},"arrows":{"type":"array","maxItems":280,"description":"Green downhill arrows' final visible SVG instructions. Contains no slope percentages, downhill bearings, elevations, putting samples, coordinates, green polygon, or transforms.","items":{"type":"object","required":["points","bodyWidth","head"],"additionalProperties":false,"properties":{"points":{"type":"array","minItems":2,"maxItems":14,"items":{"type":"array","minItems":2,"maxItems":2,"items":{"type":"number"}}},"bodyWidth":{"type":"number","minimum":0.1,"maximum":32},"head":{"type":"array","minItems":3,"maxItems":3,"items":{"type":"array","minItems":2,"maxItems":2,"items":{"type":"number"}}}}}},"measurements":{"type":"array","minItems":2,"maxItems":2,"description":"Green measurements' final edge-to-edge line pixels, visible label instructions, and safe display values used for local rounding. Excludes source measurement records, green polygons, coordinates, and transforms.","items":{"type":"object","required":["kind","start","end","label"],"additionalProperties":false,"properties":{"kind":{"type":"string","enum":["depth","width"]},"start":{"type":"array","minItems":2,"maxItems":2,"items":{"type":"number"}},"end":{"type":"array","minItems":2,"maxItems":2,"items":{"type":"number"}},"label":{"type":"object","required":["text","valueYards","point","outside"],"additionalProperties":false,"properties":{"text":{"type":"string","pattern":"^[0-9]+(\\.[0-9])? yds$"},"valueYards":{"type":"number","minimum":0,"description":"Safe display value represented by the visible label, retained so the SDK can switch rounding locally."},"point":{"type":"array","minItems":2,"maxItems":2,"items":{"type":"number"}},"outside":{"type":"array","minItems":2,"maxItems":2,"items":{"type":"number","minimum":-1,"maximum":1}}}}}}},"widths":{"type":"array","minItems":1,"description":"Fairway widths' final measured edge-to-edge line pixels, width values, start-relative station distances, and visible label instructions. Excludes source cross-sections, tee identities, geographic coordinates, and transforms.","items":{"type":"object","required":["start","end","widthYards","distanceYards","label"],"additionalProperties":false,"properties":{"start":{"type":"array","minItems":2,"maxItems":2,"items":{"type":"number"}},"end":{"type":"array","minItems":2,"maxItems":2,"items":{"type":"number"}},"widthYards":{"type":"number","minimum":0},"distanceYards":{"type":"number","minimum":0},"label":{"type":"object","required":["text","point","outside"],"additionalProperties":false,"properties":{"text":{"type":"string","pattern":"^[0-9]+(\\.[0-9])? yds$"},"point":{"type":"array","minItems":2,"maxItems":2,"items":{"type":"number"}},"outside":{"type":"array","minItems":2,"maxItems":2,"items":{"type":"number","minimum":-1,"maximum":1}}}}}}},"teeboxes":{"type":"array","items":{"type":"object","required":["point","color"],"additionalProperties":false,"properties":{"point":{"type":"array","minItems":2,"maxItems":2,"items":{"type":"number"}},"color":{"type":"string","pattern":"^#[0-9A-F]{6}$"}}}},"holeNumber":{"type":"integer","minimum":1,"maximum":99},"numbers":{"type":"array","description":"Course-subject Hole number instructions. Contains only visible hole numbers and final image pixels.","items":{"type":"object","required":["holeNumber","point"],"additionalProperties":false,"properties":{"holeNumber":{"type":"integer","minimum":1,"maximum":99},"point":{"type":"array","minItems":2,"maxItems":2,"items":{"type":"number"}}}}},"entries":{"type":"array","items":{"type":"object","required":["color","yardage"],"additionalProperties":false,"properties":{"color":{"type":"string","pattern":"^#[0-9A-F]{6}$"},"yardage":{"type":"integer","minimum":1}}}}},"additionalProperties":false}}},"additionalProperties":false},"RenderMetadata":{"type":"object","required":["schema","schemaVersion","assetId","requestSignature","asset","image","course","render","spatial"],"properties":{"schema":{"type":"string","const":"https://www.caddie100.com/schemas/image-metadata/v1.json"},"schemaVersion":{"type":"string","const":"1.8.0"},"assetId":{"type":"string"},"requestSignature":{"type":"string"},"asset":{"type":"object","additionalProperties":true},"image":{"type":"object","additionalProperties":true},"course":{"type":"object","additionalProperties":true},"greenComposition":{"oneOf":[{"type":"null"},{"type":"object","additionalProperties":true}]},"greenData":{"oneOf":[{"type":"null"},{"type":"object","additionalProperties":true}]},"hole":{"type":["object","null"],"additionalProperties":true},"render":{"type":"object","additionalProperties":true},"spatial":{"type":"object","additionalProperties":true},"elevation":{"type":"object","additionalProperties":true,"description":"Measured elevation range, visual exaggeration, and resolved scale-aware terrain sampling profile."}}},"CompositionTarget":{"type":"object","required":["x","y"],"properties":{"x":{"type":"number","minimum":0,"maximum":100,"description":"Percentage from the left image edge."},"y":{"type":"number","minimum":0,"maximum":100,"description":"Percentage from the top image edge."}}},"ImagePadding":{"description":"One-to-four-value CSS shorthand. Unitless numbers in (0,1) are image fractions; numbers >=1 are output pixels. Explicit percentage and px strings are accepted.","oneOf":[{"type":"number","minimum":0},{"type":"string","examples":[".025 .05","2.5% 5% 0 5%","48px"]},{"type":"array","minItems":1,"maxItems":4,"items":{"oneOf":[{"type":"number","minimum":0},{"type":"string"}]}}]},"MetricPadding":{"description":"One-to-four meter values in CSS shorthand order; every side must be from 1 to 60 meters.","oneOf":[{"type":"number","minimum":1,"maximum":60,"default":12},{"type":"string","examples":["12","8 12 18 12"]},{"type":"array","minItems":1,"maxItems":4,"items":{"type":"number","minimum":1,"maximum":60}}]},"Problem":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"}}}},"responses":{"Problem":{"description":"Problem details","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}}