swagger: '2.0' info: title: Arccos On-Course Data API version: '1' description: "## Introduction\nWelcome to The On-Course Data API, powered by Arccos. The purpose of this API is to provide\ \ direct access to the data we\nuse to power our apps. Access to this API is restricted. If you are supposed to be here,\ \ you will have been issued a\nclient id and/or client secret. More details on how to use these credentials below.\n\n\ This is a living project. While backward compatibility will be preserved, updates will be regular.\n\n## Authentication\n\
\nDetails\n\nTo gain access to a user's data, almost all clients will use\nthe [OAuth 2.0\ \ Authorization Code Grant Flow.](https://oauth.net/2/grant-types/authorization-code/)\nThe basic steps for this flow\ \ are:\n1. The client sends a user to `https://signin.arccosgolf.com/login?response_type=code&client_id=&redirect_uri=&scope=`.\n For example, this swagger UI might use the url\n `https://signin.arccosgolf.com/login?response_type=code&client_id=REDACTED&redirect_uri=https%3A%2F%2Fapi.arccosgolf.com%2Foauth2-redirect.html&scope=arccos%2Fread%3Arounds%20openid`\n\ \ * `response_type`: `code` for the access code flow.\n * `client_id`: client id you have been issued by Arccos.\n\ \ * `redirect_uri`: location to send the access code upon successful authentication.\n * `scope`: list of scopes (joined\ \ by `+`) that you would like to gain on behalf of the user.\n * `client_secret` (optional): if you were issued a client\ \ secret, this parameter is required.\n1. The user signs into Arccos directly with us.\n1. Upon successful authentication,\ \ the user will be redirected to uri specified in step 1 with the query parameter `code=`\n1. The client\ \ can then use the code in a `POST` request to `https://api.arccosgolf.com/oauth2/token` with\n an `x-www-form-urlencoded`\ \ body like:\n ```\n grant_type:\t\t\"authorization_code\" # must be authorization_code\n code:\t\t\t\"my_authorization_code\"\ \ # code from the query params\n client_id:\t\t\"my client id\" # same client_id from step 1\n redirect_uri:\t\"my\ \ redirect uri\" # same redirect_uri from step 1\n client_secret:\t\"my client secret\" # same client_secret from step\ \ 1\n ```\n The access code will only be valid one time. If the response is not recorded, a user will need to authenticate\ \ the\n client again by going back to step 1.\n1. Assuming everything was successful, the client will receive a response\ \ with an `application/json` body. In this\n body, the client will find two or three tokens: `id_token`, `access_token`,\ \ and `refresh_token`.\n\n### Tokens\n\n#### `id_token`\nThe id token is used to gain basic information about a user.\ \ **It cannot be used to authenticate requests.**\n\nAn id token will only be in the token response if you include `openid`\ \ as a requested scope. It will likely be included\nin all requests a client makes because requesting the `openid` scope\ \ is also required to make any requests that\ninclude `userId` in the path (pretty much all of them).\n\nThe most important\ \ piece of information you will find in the id token payload is `custom:arccosUserId`. The string\nlocated in this key\ \ is what you use for a request's `{userId}` path parameter.\n\n#### `access_token`\nThe access token is what is actually\ \ used to authenticate requests. It must be included in authenticated requests by\npassing a header along with the request\ \ in the form `Authorization: Bearer {access_token}`. Access tokens expire after\nX hours.\n\n#### `refresh_token`\nRefresh\ \ tokens can be used to get a fresh set of tokens. This is necessary because access tokens are meant to be\nshort-lived.\ \ Refresh tokens on the other hand can be saved and don't expire for X days. After X days, a user will need\nto re-authenticate\ \ again using the same process as outlined above.\n\nTo use a refresh token, make a `POST` request to `https://api.arccosgolf.com/oauth2/token`\ \ with an\n`x-www-form-urlencoded` body like:\n```\ngrant_type:\t\t\"refresh_token\" # must be refresh_token\nrefresh_token:\t\ \"my_refresh_token\" # refresh token\nclient_id:\t\t\"my client id\" # same client_id from step 1\nclient_secret:\t\"\ my client secret\" # same client_secret from step 1\n```\n\nYou may also revoke a refresh token by making a `POST` request\ \ to `https://api.arccosgolf.com/oauth2/revoke` with an\n`x-www-form-urlencoded` body like:\n```\ntoken:\t\t\t\"my_refresh_token\"\ \ # refresh token\narccos_user_id:\t\"my_user_id\" # if you don't have all tokens for a user, you can optionally use this\ \ instead to revoke all tokens for a user\nclient_id:\t\t\"my client id\" # same client_id from step 1\nclient_secret:\t\ \"my client secret\" # same client_secret from step 1\n```\n\n### Scopes\nScopes grant specific access to different clients.\ \ If a scope is not included in the initial request for access to a\nuser's data, that scope cannot be retroactively included;\ \ a user must explicitly grant the client access to a scope.\n\nMost scopes are simply restricting access to endpoints,\ \ though in the future some may be used to restrict access to\ndata retrieved _from_ those endpoints, or be used to restrict\ \ access to certain other operations.\n\nThe ability to request a scope on behalf of a user is controlled by Arccos; a\ \ client must be granted the privilege of\nrequesting a scope for a user.\n\nScopes required for each endpoint can be\ \ seen described below. For example, to get access to the \"Get Rounds\" endpoint,\nthe access token must include the\ \ `arccos/read:rounds` scope. A full list of scopes and their descriptions can be\nviewed by clicking \"Authorize\" below.\n\ \nThe only scope that isn't formatted as `arccos/` is the `openid` scope. As a reminder, this scope must\n\ be requested for any endpoint that includes `{userId}` in its path.\n
\n\n## Resources\n\n### Example Project\n\ You can see an example of how the authentication flow can work in [this repository](https://github.com/arccosgolf/third-party-api-example-front-end).\n\ \n### Postman Collection\nYou can gain access to our Postman collection outlining these endpoints [here](https://www.postman.com/arccosgolf/workspace/arccos-public-api/collection/14095300-9001cc03-d9dd-4c77-a42d-ca6a0417350b)\n\ \n## Webhooks\n\nClients can register HTTPS webhook URLs with the `/v5/webhooks` endpoints. Arccos sends JSON `POST` requests\ \ for these event types:\n\n- `postRound` and `patchRound`: include `userId`, `roundId`, `courseId`, `courseVersion`,\ \ and `isEnded`.\n- `deleteRound`: includes `userId` and `roundId`.\n- `accountDisconnected`: sent when a user disconnects\ \ your client from Arccos UI. The payload includes `eventId`, `eventVersion`, `createdAt`, and `eventBody` with `userId`,\ \ `clientId`, `disconnectedAt`, and `reason: \"user_disconnected\"`.\n\nExample `accountDisconnected` payload:\n\n```json\n\ {\n \"eventId\": \"uuid\",\n \"eventType\": \"accountDisconnected\",\n \"eventVersion\": 1,\n \"createdAt\": \"2026-05-28T18:42:13.123Z\"\ ,\n \"eventBody\": {\n \"userId\": \"arccos-user-id\",\n \"clientId\": \"cognito-client-id\",\n \"disconnectedAt\"\ : \"2026-05-28T18:42:13.123Z\",\n \"reason\": \"user_disconnected\"\n }\n}\n```\n\nWebhook delivery is at-least-once,\ \ and consumers should tolerate duplicates and delays. For `accountDisconnected`, `eventId` is the idempotency key for\ \ a published webhook event and remains stable across delivery retries of that event. Repeated disconnect actions can\ \ produce another event for the same disconnected account, so consumers should also make cleanup idempotent by `userId`\ \ and `clientId`. `accountDisconnected` retries are per SQS message fan-out: if a client has multiple webhook URLs and\ \ one fails, a retry can duplicate `POST` requests to healthy URLs with the same `eventId`. Consumers must dedupe by `eventId`.\ \ Respond with a `2xx` status after durable receipt, and do downstream cleanup asynchronously. Ordering between webhook\ \ event types is not guaranteed. For received v1 payloads, ignore unknown fields. Ignore unsupported future top-level\ \ fields, and ignore unsupported future `eventVersion` values unless you have explicitly opted in to that newer contract.\n\ \nFor `accountDisconnected`, stop using stored Arccos tokens for the provided `userId` and disable local access for that\ \ Arccos connection. This webhook does not include tokens, email, or user PII. Webhook v1 is unsigned. Use HTTPS and a\ \ dedicated high-entropy webhook URL/path, verify that incoming requests are sent to the path you registered, and keep\ \ that URL private. HMAC signing and secret rotation are future contract upgrades, not part of the current v1 contract.\n\ \n### Typescript Type Files\nTODO\n\n## Support\nThis is a work in progress. Changes & updates will be made on a rolling\ \ basis. Please send any questions, concerns or suggestions to [john@arccosgolf.com](mailto:john@arccosgolf.com?subject=On%20Course%20Data%20API%20Inquiry)\n" paths: /v5/users/{userId}/rounds: get: summary: Get Rounds description: Paged API used to get a users rounds tags: - Rounds operationId: handle_search_rounds.get./v5/users/{userId}/rounds consumes: - application/json produces: - application/json security: - AccessCodeAuth: - arccos/read:rounds parameters: - name: userId in: path required: true type: string - in: query name: limit type: integer description: maximum number of results to get required: false - in: query name: offset type: integer description: number of results to get per request required: false responses: '200': description: 200 response schema: $ref: '#/definitions/GetRoundsResponse' /v5/users/{userId}/rounds/{roundId}: get: summary: Get One Round description: Get details for one round tags: - Rounds operationId: handle_get_one_round.get./v5/users/{userId}/rounds/{roundId} consumes: - application/json produces: - application/json security: - AccessCodeAuth: - arccos/read:rounds parameters: - name: userId in: path required: true type: string - name: roundId in: path required: true type: string responses: '200': description: 200 response schema: $ref: '#/definitions/GetOneRoundResponse' /v5/users/{userId}: get: summary: Get One User description: Get details for one user tags: - Users operationId: handle_get_one_user.get./v5/users/{userId} consumes: - application/json produces: - application/json security: - AccessCodeAuth: - arccos/read:users parameters: - name: userId in: path required: true type: string responses: '200': description: 200 response schema: $ref: '#/definitions/GetOneUserResponse' /v5/users/{userId}/rounds/{roundId}/stats: get: summary: Get Round Stats description: Get traditional stats for one round with goals relative to a goalHandicap. If no handicap is provided, 0 is assumed. tags: - Rounds operationId: handle_get_round_stats.get./v5/users/{userId}/rounds/{roundId}/stats consumes: - application/json produces: - application/json security: - AccessCodeAuth: - arccos/read:rounds parameters: - name: userId in: path required: true type: string - name: roundId in: path required: true type: string - in: query name: goalHandicap type: integer description: -30 to 10. Someone with a goal of 20 over par should enter -20. required: false responses: '200': description: 200 response schema: $ref: '#/definitions/GetOneRoundStatsResponse' /v5/courses: get: summary: Search Courses description: Search Courses tags: - Courses operationId: handle_search_courses.get./v5/courses consumes: - application/json produces: - application/json parameters: - in: query name: limit type: integer description: maximum number of results to get required: false - in: query name: offset type: integer description: number of results to get per request required: false - in: query name: name type: string description: Search by partial course name required: false responses: '200': description: 200 response schema: $ref: '#/definitions/GetCoursesResponse' /v5/courses/{courseId}: get: summary: Get One Course description: Get One Course tags: - Courses operationId: handle_get_one_course.get./v5/courses/{courseId} consumes: - application/json produces: - application/json parameters: - name: courseId in: path required: true type: string responses: '200': description: 200 response schema: $ref: '#/definitions/GetOneCourseResponse' /v5/courses/{courseId}/versions/{courseVersion}: get: summary: Get One Course Version description: Get One Course Version tags: - Courses operationId: handle_get_one_course_version.get./v5/courses/{courseId}/versions/{courseVersion} consumes: - application/json produces: - application/json parameters: - name: courseId in: path required: true type: string - name: courseVersion in: path required: true type: string responses: '200': description: 200 response schema: $ref: '#/definitions/GetCoursesResponse' /v5/users/{userId}/clubs: get: summary: Search clubs description: Search a users clubs tags: - Clubs operationId: handle_search_clubs.get./v5/users/{userId}/clubs consumes: - application/json produces: - application/json security: - AccessCodeAuth: - arccos/read:clubs parameters: - name: userId in: path required: true type: string - in: query name: limit type: integer description: maximum number of results to get required: false - in: query name: offset type: integer description: number of results to get per request required: false - in: query name: status type: string description: paired, unpaired, or deleted. defaults to paired. required: false - in: query name: numberOfShots type: number description: number of shots to consider when computing club distances. Valid values are 5, 10, 15, 20, 25, 50, 100. Defaults to 100. required: false responses: '200': description: 200 response schema: $ref: '#/definitions/GetClubsResponse' /v5/users/{userId}/clubs/{clubId}: get: summary: Get One Club description: Get One Club tags: - Clubs operationId: handle_get_one_club.get./v5/users/{userId}/clubs/{clubId} consumes: - application/json produces: - application/json security: - AccessCodeAuth: - arccos/read:clubs parameters: - name: userId in: path required: true type: string - name: clubId in: path required: true type: string responses: '200': description: 200 response schema: $ref: '#/definitions/GetOneClubResponse' /v5/webhooks: get: summary: Get Webhooks description: "Webhook events sent to registered URLs are postRound, patchRound, deleteRound, and accountDisconnected.\ \ postRound and patchRound include userId, roundId, courseId, courseVersion, and isEnded. deleteRound includes roundId\ \ and userId. accountDisconnected includes eventId, eventVersion, createdAt, userId, clientId, disconnectedAt, and\ \ reason=user_disconnected. For accountDisconnected, eventId is the idempotency key for a published webhook event\ \ and remains stable across delivery retries of that event. Repeated disconnect actions can produce another event\ \ for the same disconnected account, so consumers should also make cleanup idempotent by userId and clientId. Delivery\ \ is at-least-once, so consumers should tolerate duplicates and delays and respond with 2xx after durable receipt.\n\ \n You can use these endpoints to manage your webhooks yourself using basic authentication." tags: - Webhooks operationId: handle_get_webhooks.get./v5/webhooks consumes: - application/json produces: - application/json security: - BasicAuth: [] parameters: [] responses: '200': description: 200 response schema: $ref: '#/definitions/GetWebhooksResponse' post: summary: Create Webhook description: Create Webhook tags: - Webhooks operationId: handle_create_webhook.post./v5/webhooks consumes: - application/json produces: - application/json security: - BasicAuth: [] parameters: - in: body name: body description: Body required in the request required: true schema: $ref: '#/definitions/CreateWebhookRequest' responses: '200': description: 200 response /v5/webhooks/{webhookId}: delete: summary: Delete Webhook description: Delete Webhook tags: - Webhooks operationId: handle_delete_webhook.delete./v5/webhooks/{webhookId} consumes: - application/json produces: - application/json security: - BasicAuth: [] parameters: - name: webhookId in: path required: true type: string responses: '200': description: 200 response definitions: Round: properties: roundId: title: Round.roundId type: number userId: title: Round.userId type: string startTime: title: Round.startTime type: string endTime: title: Round.endTime nullable: true type: string totalScore: title: Round.totalScore nullable: true type: number courseId: title: Round.courseId type: number courseVersion: title: Round.courseVersion type: number courseName: title: Round.courseName type: string numberOfHoles: title: Round.numberOfHoles type: number tee: $ref: '#/definitions/Tee' title: Round.tee required: - roundId - userId - startTime - endTime - totalScore - courseId - courseVersion - courseName - numberOfHoles - tee additionalProperties: false title: Round type: object HoleStat: properties: name: enum: - gir - sand_save - up_and_down title: HoleStat.name type: string succeeded: title: HoleStat.succeeded type: boolean required: - name - succeeded additionalProperties: false title: HoleStat type: object Location: properties: latitude: title: Location.latitude type: number longitude: title: Location.longitude type: number required: - latitude - longitude additionalProperties: false title: Location type: object Pin: allOf: - $ref: '#/definitions/Location' - additionalProperties: false type: object title: Pin Terrain: enum: - tee - fairway - rough - sand - green title: Terrain type: string Shot: properties: shotId: title: Shot.shotId type: number clubId: title: Shot.clubId type: number clubType: title: Shot.clubType type: string startLocation: $ref: '#/definitions/Location' title: Shot.startLocation endLocation: anyOf: - $ref: '#/definitions/Location' title: Shot.endLocation - properties: latitude: title: Shot.endLocation.latitude nullable: true longitude: title: Shot.endLocation.longitude nullable: true required: - latitude - longitude additionalProperties: false title: Shot.endLocation type: object title: Shot.endLocation shotDistance: title: Shot.shotDistance type: number shotTime: title: Shot.shotTime type: string startAltitude: title: Shot.startAltitude nullable: true type: number endAltitude: title: Shot.endAltitude nullable: true type: number numberOfPenalties: title: Shot.numberOfPenalties type: number startTerrain: anyOf: - $ref: '#/definitions/Terrain' title: Shot.startTerrain - title: Shot.startTerrain nullable: true title: Shot.startTerrain endTerrain: anyOf: - $ref: '#/definitions/Terrain' title: Shot.endTerrain - title: Shot.endTerrain nullable: true title: Shot.endTerrain startMetersToCenterOfGreen: title: Shot.startMetersToCenterOfGreen description: The starting distance to the center of the green in meters for non-putt shots. nullable: true type: number endMetersToCenterOfGreenMeters: title: Shot.endMetersToCenterOfGreenMeters description: The ending distance to the center of the green in meters for non-putt shots nullable: true type: number endsOnFairway: anyOf: - enum: - T - F title: Shot.endsOnFairway type: string - title: Shot.endsOnFairway nullable: true title: Shot.endsOnFairway description: If the result of the shot was in the fairway, for drive or approach shots only. isLeftOfFairway: anyOf: - enum: - T - F title: Shot.isLeftOfFairway type: string - title: Shot.isLeftOfFairway nullable: true title: Shot.isLeftOfFairway description: If the result of the shot is outside the left boundary of the fairway, for drive or approach shots only. isRightOfFairway: anyOf: - enum: - T - F title: Shot.isRightOfFairway type: string - title: Shot.isRightOfFairway nullable: true title: Shot.isRightOfFairway description: If the result of the shot is outside the right boundary of the fairway, for drive or approach shots only. isLeftOfCenterline: anyOf: - enum: - T - F title: Shot.isLeftOfCenterline type: string - title: Shot.isLeftOfCenterline nullable: true title: Shot.isLeftOfCenterline description: If the shot is left of the fairway centerline, for drive or approach shots only. isRightOfCenterline: anyOf: - enum: - T - F title: Shot.isRightOfCenterline type: string - title: Shot.isRightOfCenterline nullable: true title: Shot.isRightOfCenterline description: If the shot is right of the fairway centerline, for drive or approach shots only. metersFromFairwayBounds: title: Shot.metersFromFairwayBounds description: The distance in meters from the bounds of the fairway, for drive or approach shots only nullable: true type: number metersFromFairwayCenterline: title: Shot.metersFromFairwayCenterline description: The distance, in meters, from the centerline of the fairway, for drive or approach shots only nullable: true type: number required: - shotId - clubId - clubType - startLocation - endLocation - shotDistance - shotTime - startAltitude - endAltitude - numberOfPenalties - startTerrain - endTerrain - startMetersToCenterOfGreen - endMetersToCenterOfGreenMeters - endsOnFairway - isLeftOfFairway - isRightOfFairway - isLeftOfCenterline - isRightOfCenterline - metersFromFairwayBounds - metersFromFairwayCenterline additionalProperties: false title: Shot type: object Hole: properties: holeId: title: Hole.holeId type: number required: - holeId additionalProperties: false title: Hole type: object RoundHole: allOf: - $ref: '#/definitions/Hole' - properties: stats: items: $ref: '#/definitions/HoleStat' title: stats.[] title: stats type: array startTime: title: startTime type: string endTime: title: endTime type: string mensPar: title: mensPar type: number womensPar: title: womensPar type: number pin: $ref: '#/definitions/Pin' title: pin shots: items: $ref: '#/definitions/Shot' title: shots.[] title: shots type: array required: - stats - startTime - endTime - mensPar - womensPar - pin - shots additionalProperties: false type: object title: RoundHole RoundDetails: allOf: - $ref: '#/definitions/Round' - properties: holes: items: $ref: '#/definitions/RoundHole' title: holes.[] title: holes type: array required: - holes additionalProperties: false type: object title: RoundDetails User: properties: userId: title: User.userId type: string firstName: title: User.firstName type: string lastName: title: User.lastName type: string email: title: User.email type: string stance: enum: - right - left title: User.stance type: string gender: enum: - male - female title: User.gender type: string estimatedHandicap: title: User.estimatedHandicap nullable: true type: number required: - userId - firstName - lastName - email - stance - gender - estimatedHandicap additionalProperties: false title: User type: object GetRoundsResponse: allOf: - $ref: '#/definitions/PagedResponseHelper' - properties: results: items: $ref: '#/definitions/Round' title: results.[] title: results type: array required: - results additionalProperties: false type: object title: GetRoundsResponse ClubType: title: ClubType type: string Club: properties: clubId: title: Club.clubId type: number status: enum: - paired - unpaired - deleted title: Club.status type: string make: properties: id: title: Club.make.id description: the numerical arccos id of the club's make type: number name: title: Club.make.name description: the display string/name of the make type: string required: - id - name additionalProperties: false title: Club.make description: the make of the given club. if this property doesn't exist Arccos doesn't have the make information for the club. type: object model: properties: id: title: Club.model.id description: the numerical arccos id of the club's model type: number name: title: Club.model.name description: the display string/name of the model type: string required: - id - name additionalProperties: false title: Club.model description: the model of the given club. if this property doesn't exist Arccos doesn't have the model information for the club type: object clubType: $ref: '#/definitions/ClubType' title: Club.clubType stats: properties: distances: properties: longest: title: Club.stats.distances.longest type: number average: title: Club.stats.distances.average type: number required: - longest - average additionalProperties: false title: Club.stats.distances type: object normalizedDistances: properties: longest: title: Club.stats.normalizedDistances.longest type: number average: title: Club.stats.normalizedDistances.average type: number required: - longest - average additionalProperties: false title: Club.stats.normalizedDistances type: object numberOfShots: title: Club.stats.numberOfShots type: number required: - distances - normalizedDistances - numberOfShots additionalProperties: false title: Club.stats type: object required: - clubId - status - clubType - stats additionalProperties: false title: Club type: object GetClubsResponse: allOf: - $ref: '#/definitions/PagedResponseHelper' - properties: results: items: $ref: '#/definitions/Club' title: results.[] title: results type: array required: - results additionalProperties: false type: object title: GetClubsResponse GetOneClubResponse: $ref: '#/definitions/Club' title: GetOneClubResponse GetOneRoundStatsResponse: properties: roundId: title: GetOneRoundStatsResponse.roundId type: number courseId: title: GetOneRoundStatsResponse.courseId type: number courseVersion: title: GetOneRoundStatsResponse.courseVersion type: number goalHandicap: title: GetOneRoundStatsResponse.goalHandicap type: number stats: $ref: '#/definitions/RoundStats' title: GetOneRoundStatsResponse.stats required: - roundId - courseId - courseVersion - goalHandicap - stats additionalProperties: false title: GetOneRoundStatsResponse type: object GetOneRoundResponse: $ref: '#/definitions/RoundDetails' title: GetOneRoundResponse GetOneUserResponse: $ref: '#/definitions/User' title: GetOneUserResponse CourseHole: properties: holeId: title: CourseHole.holeId type: number mensPar: title: CourseHole.mensPar type: number womensPar: title: CourseHole.womensPar type: number required: - holeId - mensPar - womensPar additionalProperties: false title: CourseHole type: object Course: properties: courseId: title: Course.courseId type: number courseVersion: title: Course.courseVersion type: number name: title: Course.name type: string numberOfHoles: title: Course.numberOfHoles type: number mensPar: title: Course.mensPar type: number womensPar: title: Course.womensPar type: number location: $ref: '#/definitions/Location' title: Course.location city: title: Course.city type: string state: title: Course.state type: string country: title: Course.country type: string altitude: title: Course.altitude type: number holes: items: $ref: '#/definitions/CourseHole' title: Course.holes.[] title: Course.holes type: array tees: items: $ref: '#/definitions/Tee' title: Course.tees.[] title: Course.tees type: array required: - courseId - courseVersion - name - numberOfHoles - mensPar - womensPar - location - city - state - country - holes - tees additionalProperties: false title: Course type: object Tee: properties: teeId: title: Tee.teeId description: the numeric identifier for the tee. this is unique against the courseId and courseVersion, not globally unique type: number teeName: title: Tee.teeName description: the display string for the tee that was played type: string required: - teeId - teeName additionalProperties: false title: Tee type: object GetCoursesResponse: allOf: - $ref: '#/definitions/PagedResponseHelper' - properties: results: items: $ref: '#/definitions/Course' title: results.[] title: results type: array required: - results additionalProperties: false type: object title: GetCoursesResponse GetOneCourseResponse: $ref: '#/definitions/Course' title: GetOneCourseResponse PagedResponseHelper: properties: paging: properties: limit: title: PagedResponseHelper.paging.limit type: number offset: title: PagedResponseHelper.paging.offset type: number previous: title: PagedResponseHelper.paging.previous type: string next: title: PagedResponseHelper.paging.next type: string required: - limit - offset additionalProperties: false title: PagedResponseHelper.paging type: object results: items: title: PagedResponseHelper.results.[] title: PagedResponseHelper.results type: array required: - paging - results additionalProperties: false title: PagedResponseHelper type: object StrokesGainedComparison: properties: actualVsTarget: title: StrokesGainedComparison.actualVsTarget type: number actualVsScratch: title: StrokesGainedComparison.actualVsScratch type: number required: - actualVsTarget - actualVsScratch additionalProperties: false title: StrokesGainedComparison type: object TraditionalStatComparison: properties: actual: title: TraditionalStatComparison.actual type: number goal: title: TraditionalStatComparison.goal type: number scratch: title: TraditionalStatComparison.scratch type: number required: - actual - goal - scratch additionalProperties: false title: TraditionalStatComparison type: object DrivingStrokesGainedBreakdown: properties: numberOfShots: title: DrivingStrokesGainedBreakdown.numberOfShots type: number averageDriveDistance: $ref: '#/definitions/TraditionalStatComparison' title: DrivingStrokesGainedBreakdown.averageDriveDistance longestDriveDistance: title: DrivingStrokesGainedBreakdown.longestDriveDistance type: number hitFairwaysPercent: $ref: '#/definitions/TraditionalStatComparison' title: DrivingStrokesGainedBreakdown.hitFairwaysPercent hitFairways: properties: chances: title: DrivingStrokesGainedBreakdown.hitFairways.chances type: number successes: title: DrivingStrokesGainedBreakdown.hitFairways.successes type: number required: - chances - successes additionalProperties: false title: DrivingStrokesGainedBreakdown.hitFairways type: object required: - numberOfShots - longestDriveDistance - hitFairways additionalProperties: false title: DrivingStrokesGainedBreakdown type: object ApproachStrokesGainedBreakdown: properties: numberOfShots: title: ApproachStrokesGainedBreakdown.numberOfShots type: number greensInRegulationPercent: $ref: '#/definitions/TraditionalStatComparison' title: ApproachStrokesGainedBreakdown.greensInRegulationPercent greensInRegulation: properties: chances: title: ApproachStrokesGainedBreakdown.greensInRegulation.chances type: number successes: title: ApproachStrokesGainedBreakdown.greensInRegulation.successes type: number required: - chances - successes additionalProperties: false title: ApproachStrokesGainedBreakdown.greensInRegulation type: object averageShotDistance: title: ApproachStrokesGainedBreakdown.averageShotDistance type: number required: - numberOfShots - averageShotDistance additionalProperties: false title: ApproachStrokesGainedBreakdown type: object ShortStrokesGainedBreakdown: properties: numberOfShots: title: ShortStrokesGainedBreakdown.numberOfShots type: number upAndDown: properties: chances: title: ShortStrokesGainedBreakdown.upAndDown.chances type: number successes: title: ShortStrokesGainedBreakdown.upAndDown.successes type: number required: - chances - successes additionalProperties: false title: ShortStrokesGainedBreakdown.upAndDown type: object required: - numberOfShots - upAndDown additionalProperties: false title: ShortStrokesGainedBreakdown type: object PuttStrokesGainedBreakdown: properties: numberOfShots: title: PuttStrokesGainedBreakdown.numberOfShots type: number zeroPutts: title: PuttStrokesGainedBreakdown.zeroPutts type: number onePutts: title: PuttStrokesGainedBreakdown.onePutts type: number twoPutts: title: PuttStrokesGainedBreakdown.twoPutts type: number threePlusPutts: title: PuttStrokesGainedBreakdown.threePlusPutts type: number required: - numberOfShots - zeroPutts - onePutts - twoPutts - threePlusPutts additionalProperties: false title: PuttStrokesGainedBreakdown type: object RoundStats: properties: overall: properties: numberOfShots: title: RoundStats.overall.numberOfShots type: number totalShotDistance: title: RoundStats.overall.totalShotDistance type: number required: - numberOfShots - totalShotDistance additionalProperties: false title: RoundStats.overall type: object driving: $ref: '#/definitions/DrivingStrokesGainedBreakdown' title: RoundStats.driving approach: $ref: '#/definitions/ApproachStrokesGainedBreakdown' title: RoundStats.approach short: $ref: '#/definitions/ShortStrokesGainedBreakdown' title: RoundStats.short putt: $ref: '#/definitions/PuttStrokesGainedBreakdown' title: RoundStats.putt required: - overall - driving - approach - short - putt additionalProperties: false title: RoundStats type: object GetWebhooksResponse: items: $ref: '#/definitions/Webhook' title: GetWebhooksResponse.[] title: GetWebhooksResponse.[] type: array CreateWebhookRequest: properties: webhookUrl: title: CreateWebhookRequest.webhookUrl type: string required: - webhookUrl additionalProperties: false title: CreateWebhookRequest type: object WebhookEventType: enum: - postRound - patchRound - deleteRound - accountDisconnected title: WebhookEventType type: string AccountDisconnectedWebhookEvent: properties: eventId: title: AccountDisconnectedWebhookEvent.eventId type: string eventType: title: AccountDisconnectedWebhookEvent.eventType enum: - accountDisconnected type: string eventVersion: title: AccountDisconnectedWebhookEvent.eventVersion enum: - 1 type: number createdAt: title: AccountDisconnectedWebhookEvent.createdAt type: string eventBody: properties: userId: title: AccountDisconnectedWebhookEvent.eventBody.userId type: string clientId: title: AccountDisconnectedWebhookEvent.eventBody.clientId type: string disconnectedAt: title: AccountDisconnectedWebhookEvent.eventBody.disconnectedAt type: string reason: title: AccountDisconnectedWebhookEvent.eventBody.reason enum: - user_disconnected type: string required: - userId - clientId - disconnectedAt - reason additionalProperties: false title: AccountDisconnectedWebhookEvent.eventBody type: object required: - eventId - eventType - eventVersion - createdAt - eventBody additionalProperties: false title: AccountDisconnectedWebhookEvent type: object Webhook: properties: id: title: Webhook.id type: number webhookUrl: title: Webhook.webhookUrl type: string required: - id - webhookUrl additionalProperties: false title: Webhook type: object securityDefinitions: AccessCodeAuth: type: oauth2 flow: accessCode authorizationUrl: https://signin.arccosgolf.com/login tokenUrl: https://api.arccosgolf.com/oauth2/token oauth2RedirectUrl: https://api.arccosgolf.com/swagger scopes: openid: Required for all endpoints that have userId in the path arccos/read:users: Grants read users access arccos/read:rounds: Grants read rounds access arccos/read:clubs: Grants read clubs access BasicAuth: type: basic schemes: - https