openapi: 3.0.3 info: title: Oura API Documentation description: "# Overview \nThe Oura API allows Oura users and partner applications\ \ to improve their user experience with Oura data.\nThis document describes the\ \ Oura API Version 2 (V2), which is the only available integration point for Oura\ \ data. The previous V1 API has been sunset.\n# Getting Started \n## What is an\ \ API?\nAn API (Application Programming Interface) allows different software applications\ \ to communicate with each other. The Oura API enables you to access your Oura\ \ Ring data programmatically.\n## Quick Start Guide\n1. Register an [API Application](https://cloud.ouraring.com/oauth/applications)\ \ and implement OAuth2\n2. **Make Your First API Call**:\n ```\n curl -X GET\ \ https://api.ouraring.com/v2/usercollection/personal_info \\\n -H \"Authorization:\ \ Bearer YOUR_TOKEN_HERE\"\n ```\n3. **Explore Data Types**:\n - Browse the\ \ available endpoints in this documentation to discover what data you can access\n\ \ - Each endpoint includes example requests and responses\n4. **Set Up Webhooks\ \ (Strongly Recommended)**:\n - Webhooks are the preferred way to consume Oura\ \ data\n - We have not had customers hit rate limits with webhooks properly\ \ implemented\n - Make a single request for historical data when a user first\ \ connects, then use webhooks for ongoing updates\n - Webhook notifications\ \ come approximately 30 seconds after data syncs from the mobile app\n - [Set\ \ up webhooks](#tag/Webhook-Subscription-Routes) to receive notifications when\ \ data changes\n## Common Questions\n- **Data Delay**: Different data types sync\ \ at different times - sleep data requires users to open the Oura app, while daily\ \ activity and stress may sync in the background\n# Data Access\nIn order to access\ \ data, a registered [API Application](https://cloud.ouraring.com/oauth/applications)\ \ is required.\n API Applications are limited to **10** users before requiring\ \ approval from Oura. There is no limit once an application is approved.\n Additionally,\ \ Oura users **must provide consent** to share each data type an API Application\ \ has access to.\nAll data access requests through the Oura API require [Authentication](https://cloud.ouraring.com/docs/authentication).\n\ Additionally, we recommend that Oura users keep their mobile app updated to support\ \ API access for the latest data types.\n# Authentication\nThe Oura Cloud API\ \ supports authentication through the industry-standard OAuth2 protocol. For more\ \ information, see our [Authentication instructions](https://cloud.ouraring.com/docs/authentication).\n\ Access tokens must be included in the request header as follows:\n```http\nGET\ \ /v2/usercollection/personal_info HTTP/1.1\nHost: api.ouraring.com\nAuthorization:\ \ Bearer \n```\nPlease note that personal access tokens were deprecated\ \ in December 2025 and are no longer available for use.\n# Oura HTTP Response\ \ Codes\n| Response Code | Description |\n| ------------------------------------\ \ | - |\n| 200 OK | Successful Response \ \ |\n| 400 Query Parameter Validation Error | The request contains query parameters\ \ that are invalid or incorrectly formatted. |\n| 401 Unauthorized \ \ | Invalid or expired authentication token. |\n| 403 Forbidden \ \ | The requested resource requires additional permissions or\ \ the user's Oura subscription has expired. |\n| 429 Too Many Requests \ \ | Rate limit exceeded. See response headers for retry guidance. |\n\n\ ## Rate Limits\nThe API enforces rate limits at two layers to ensure fair access\ \ across all applications:\n- a per-access-token limit, which throttles single-token\ \ floods, and\n- a per-application limit, which caps the aggregate traffic across\ \ all of an application's end-user tokens so one fan-out app can't dominate shared\ \ capacity.\n\nA request that trips either layer receives a `429 Too Many Requests`.\ \ The `X-RateLimit-Tier` response header identifies which layer fired.\n\nIf your\ \ application regularly approaches rate limits, [webhooks](#tag/Webhook-Subscription-Routes)\ \ are strongly recommended — most applications that implement webhooks correctly\ \ do not encounter rate limit issues.\n\n[Contact us](mailto:api-support@ouraring.com)\ \ if you expect your usage to require higher limits.\n\n## Rate Limit Response\ \ Headers\nWhen a `429 Too Many Requests` response is returned, five headers are\ \ included to guide retries. Prefer these over fixed-interval backoff:\n- **`Retry-After`**\ \ — integer seconds to wait before retrying. RFC 7231-compliant; safe to feed\ \ directly into your client's backoff logic.\n- **`X-RateLimit-Limit`** — the\ \ request ceiling for the current window.\n- **`X-RateLimit-Window`** — the rolling\ \ window length in seconds that the ceiling applies to.\n- **`X-RateLimit-Reset`**\ \ — Unix epoch (seconds) at which the window resets and quota is fully restored.\n\ - **`X-RateLimit-Tier`** — identifies which limit was exceeded, useful when contacting\ \ support.\n" termsOfService: https://cloud.ouraring.com/legal/api-agreement version: '2.0' x-logo: url: /v2/static/img/Oura_Logo-Developer_RBG_Black.svg servers: - url: https://api.ouraring.com description: Oura API paths: /v2/usercollection/personal_info: get: tags: - Personal Info Routes summary: Single Personal Info Document operationId: Single_Personal_Info_Document_v2_usercollection_personal_info_get responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/PersonalInfoResponse' '400': description: Client Exception '401': description: Unauthorized access exception. Usually means the access token is expired, malformed or revoked. '403': description: Access forbidden. Usually means the user's subscription to Oura has expired and their data is not available via the API. '429': description: Request Rate Limit Exceeded. security: - BearerAuth: [] - OAuth2: [] x-codeSamples: - lang: cURL label: cURL source: 'curl --location --request GET ''https://api.ouraring.com/v2/usercollection/personal_info'' \ --header ''Authorization: Bearer ''' - lang: Python source: "import requests \nurl = 'https://api.ouraring.com/v2/usercollection/personal_info'\ \ \nheaders = { \n 'Authorization': 'Bearer ' \n}\nresponse = requests.request('GET',\ \ url, headers=headers) \nprint(response.text)" label: Python - lang: JavaScript source: "var myHeaders = new Headers(); \nmyHeaders.append('Authorization',\ \ 'Bearer '); \nvar requestOptions = { \n method: 'GET', \n headers:\ \ myHeaders,\n}; \nfetch('https://api.ouraring.com/v2/usercollection/personal_info',\ \ requestOptions) \n .then(response => response.text()) \n .then(result\ \ => console.log(result)) \n .catch(error => console.log('error', error));" label: JavaScript - lang: Java source: "OkHttpClient client = new OkHttpClient().newBuilder() \n .build();\ \ \nRequest request = new Request.Builder() \n .url(\"https://api.ouraring.com/v2/usercollection/personal_info\"\ ) \n .method(\"GET\", null) \n .addHeader(\"Authorization\", \"Bearer\ \ \") \n .build(); \nResponse response = client.newCall(request).execute();" label: Java /v2/usercollection/tag: get: tags: - Tag Routes summary: Multiple Tag Documents operationId: Multiple_tag_Documents_v2_usercollection_tag_get parameters: - name: start_date in: query required: false schema: anyOf: - type: string format: date-time - type: string format: date - type: 'null' title: Start Date - name: end_date in: query required: false schema: anyOf: - type: string format: date-time - type: string format: date - type: 'null' title: End Date - name: next_token in: query required: false schema: type: string nullable: true title: Next Token - name: fields in: query required: false schema: type: string nullable: true description: N/A. This route does not support field selection yet, all fields will be returned. title: Fields description: N/A. This route does not support field selection yet, all fields will be returned. responses: '200': description: Successful Response content: application/json: schema: anyOf: - $ref: '#/components/schemas/MultiDocumentResponse_TagModel_' - $ref: '#/components/schemas/MultiDocumentResponseDict' title: Response Multiple Tag Documents V2 Usercollection Tag Get '400': description: Client Exception '401': description: Unauthorized access exception. Usually means the access token is expired, malformed or revoked. '403': description: Access forbidden. Usually means the user's subscription to Oura has expired and their data is not available via the API. '429': description: Request Rate Limit Exceeded. '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - BearerAuth: [] - OAuth2: [] x-codeSamples: - lang: cURL label: cURL source: 'curl --location --request GET ''https://api.ouraring.com/v2/usercollection/tag?start_date=2021-11-01&end_date=2021-12-01'' \ --header ''Authorization: Bearer ''' - lang: Python source: "import requests \nurl = 'https://api.ouraring.com/v2/usercollection/tag'\ \ \nparams={ \n 'start_date': '2021-11-01', \n 'end_date': '2021-12-01'\ \ \n}\nheaders = { \n 'Authorization': 'Bearer ' \n}\nresponse =\ \ requests.request('GET', url, headers=headers, params=params) \nprint(response.text)" label: Python - lang: JavaScript source: "var myHeaders = new Headers(); \nmyHeaders.append('Authorization',\ \ 'Bearer '); \nvar requestOptions = { \n method: 'GET', \n headers:\ \ myHeaders, \n}; \nfetch('https://api.ouraring.com/v2/usercollection/tag?start_date=2021-11-01&end_date=2021-12-01',\ \ requestOptions) \n .then(response => response.text()) \n .then(result\ \ => console.log(result)) \n .catch(error => console.log('error', error));" label: JavaScript - lang: Java source: "OkHttpClient client = new OkHttpClient().newBuilder() \n .build();\ \ \nRequest request = new Request.Builder() \n .url(\"https://api.ouraring.com/v2/usercollection/tag?start_date=2021-11-01&end_date=2021-12-01\"\ ) \n .method(\"GET\", null) \n .addHeader(\"Authorization\", \"Bearer\ \ \") \n .build(); \nResponse response = client.newCall(request).execute();" label: Java /v2/sandbox/usercollection/tag: get: tags: - Sandbox Routes summary: Sandbox - Multiple Tag Documents operationId: Sandbox___Multiple_tag_Documents_v2_sandbox_usercollection_tag_get parameters: - name: start_date in: query required: false schema: anyOf: - type: string format: date-time - type: string format: date - type: 'null' title: Start Date - name: end_date in: query required: false schema: anyOf: - type: string format: date-time - type: string format: date - type: 'null' title: End Date - name: next_token in: query required: false schema: type: string nullable: true title: Next Token responses: '200': description: Successful Response content: application/json: schema: anyOf: - $ref: '#/components/schemas/MultiDocumentResponse_TagModel_' - $ref: '#/components/schemas/MultiDocumentResponseDict' title: Response Sandbox Multiple Tag Documents V2 Sandbox Usercollection Tag Get '400': description: Client Exception '401': description: Unauthorized access exception. Usually means the access token is expired, malformed or revoked. '403': description: Access forbidden. Usually means the user's subscription to Oura has expired and their data is not available via the API. '429': description: Request Rate Limit Exceeded. '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - BearerAuth: [] - OAuth2: [] x-codeSamples: - lang: cURL label: cURL source: 'curl --location --request GET ''https://api.ouraring.com/v2/sandbox/usercollection/tag?start_date=2021-11-01&end_date=2021-12-01'' \ --header ''Authorization: Bearer ''' - lang: Python source: "import requests \nurl = 'https://api.ouraring.com/v2/sandbox/usercollection/tag'\ \ \nparams={ \n 'start_date': '2021-11-01', \n 'end_date': '2021-12-01'\ \ \n}\nheaders = { \n 'Authorization': 'Bearer ' \n}\nresponse =\ \ requests.request('GET', url, headers=headers, params=params) \nprint(response.text)" label: Python - lang: JavaScript source: "var myHeaders = new Headers(); \nmyHeaders.append('Authorization',\ \ 'Bearer '); \nvar requestOptions = { \n method: 'GET', \n headers:\ \ myHeaders, \n}; \nfetch('https://api.ouraring.com/v2/sandbox/usercollection/tag?start_date=2021-11-01&end_date=2021-12-01',\ \ requestOptions) \n .then(response => response.text()) \n .then(result\ \ => console.log(result)) \n .catch(error => console.log('error', error));" label: JavaScript - lang: Java source: "OkHttpClient client = new OkHttpClient().newBuilder() \n .build();\ \ \nRequest request = new Request.Builder() \n .url(\"https://api.ouraring.com/v2/sandbox/usercollection/tag?start_date=2021-11-01&end_date=2021-12-01\"\ ) \n .method(\"GET\", null) \n .addHeader(\"Authorization\", \"Bearer\ \ \") \n .build(); \nResponse response = client.newCall(request).execute();" label: Java /v2/usercollection/enhanced_tag: get: tags: - Enhanced Tag Routes summary: Multiple Enhanced Tag Documents operationId: Multiple_enhanced_tag_Documents_v2_usercollection_enhanced_tag_get parameters: - name: start_date in: query required: false schema: anyOf: - type: string format: date-time - type: string format: date - type: 'null' title: Start Date - name: end_date in: query required: false schema: anyOf: - type: string format: date-time - type: string format: date - type: 'null' title: End Date - name: next_token in: query required: false schema: type: string nullable: true title: Next Token - name: fields in: query required: false schema: type: string nullable: true description: N/A. This route does not support field selection yet, all fields will be returned. title: Fields description: N/A. This route does not support field selection yet, all fields will be returned. responses: '200': description: Successful Response content: application/json: schema: anyOf: - $ref: '#/components/schemas/MultiDocumentResponse_EnhancedTagModel_' - $ref: '#/components/schemas/MultiDocumentResponseDict' title: Response Multiple Enhanced Tag Documents V2 Usercollection Enhanced Tag Get '400': description: Client Exception '401': description: Unauthorized access exception. Usually means the access token is expired, malformed or revoked. '403': description: Access forbidden. Usually means the user's subscription to Oura has expired and their data is not available via the API. '429': description: Request Rate Limit Exceeded. '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - BearerAuth: [] - OAuth2: [] x-codeSamples: - lang: cURL label: cURL source: 'curl --location --request GET ''https://api.ouraring.com/v2/usercollection/enhanced_tag?start_date=2021-11-01&end_date=2021-12-01'' \ --header ''Authorization: Bearer ''' - lang: Python source: "import requests \nurl = 'https://api.ouraring.com/v2/usercollection/enhanced_tag'\ \ \nparams={ \n 'start_date': '2021-11-01', \n 'end_date': '2021-12-01'\ \ \n}\nheaders = { \n 'Authorization': 'Bearer ' \n}\nresponse =\ \ requests.request('GET', url, headers=headers, params=params) \nprint(response.text)" label: Python - lang: JavaScript source: "var myHeaders = new Headers(); \nmyHeaders.append('Authorization',\ \ 'Bearer '); \nvar requestOptions = { \n method: 'GET', \n headers:\ \ myHeaders, \n}; \nfetch('https://api.ouraring.com/v2/usercollection/enhanced_tag?start_date=2021-11-01&end_date=2021-12-01',\ \ requestOptions) \n .then(response => response.text()) \n .then(result\ \ => console.log(result)) \n .catch(error => console.log('error', error));" label: JavaScript - lang: Java source: "OkHttpClient client = new OkHttpClient().newBuilder() \n .build();\ \ \nRequest request = new Request.Builder() \n .url(\"https://api.ouraring.com/v2/usercollection/enhanced_tag?start_date=2021-11-01&end_date=2021-12-01\"\ ) \n .method(\"GET\", null) \n .addHeader(\"Authorization\", \"Bearer\ \ \") \n .build(); \nResponse response = client.newCall(request).execute();" label: Java /v2/sandbox/usercollection/enhanced_tag: get: tags: - Sandbox Routes summary: Sandbox - Multiple Enhanced Tag Documents operationId: Sandbox___Multiple_enhanced_tag_Documents_v2_sandbox_usercollection_enhanced_tag_get parameters: - name: start_date in: query required: false schema: anyOf: - type: string format: date-time - type: string format: date - type: 'null' title: Start Date - name: end_date in: query required: false schema: anyOf: - type: string format: date-time - type: string format: date - type: 'null' title: End Date - name: next_token in: query required: false schema: type: string nullable: true title: Next Token responses: '200': description: Successful Response content: application/json: schema: anyOf: - $ref: '#/components/schemas/MultiDocumentResponse_EnhancedTagModel_' - $ref: '#/components/schemas/MultiDocumentResponseDict' title: Response Sandbox Multiple Enhanced Tag Documents V2 Sandbox Usercollection Enhanced Tag Get '400': description: Client Exception '401': description: Unauthorized access exception. Usually means the access token is expired, malformed or revoked. '403': description: Access forbidden. Usually means the user's subscription to Oura has expired and their data is not available via the API. '429': description: Request Rate Limit Exceeded. '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - BearerAuth: [] - OAuth2: [] x-codeSamples: - lang: cURL label: cURL source: 'curl --location --request GET ''https://api.ouraring.com/v2/sandbox/usercollection/enhanced_tag?start_date=2021-11-01&end_date=2021-12-01'' \ --header ''Authorization: Bearer ''' - lang: Python source: "import requests \nurl = 'https://api.ouraring.com/v2/sandbox/usercollection/enhanced_tag'\ \ \nparams={ \n 'start_date': '2021-11-01', \n 'end_date': '2021-12-01'\ \ \n}\nheaders = { \n 'Authorization': 'Bearer ' \n}\nresponse =\ \ requests.request('GET', url, headers=headers, params=params) \nprint(response.text)" label: Python - lang: JavaScript source: "var myHeaders = new Headers(); \nmyHeaders.append('Authorization',\ \ 'Bearer '); \nvar requestOptions = { \n method: 'GET', \n headers:\ \ myHeaders, \n}; \nfetch('https://api.ouraring.com/v2/sandbox/usercollection/enhanced_tag?start_date=2021-11-01&end_date=2021-12-01',\ \ requestOptions) \n .then(response => response.text()) \n .then(result\ \ => console.log(result)) \n .catch(error => console.log('error', error));" label: JavaScript - lang: Java source: "OkHttpClient client = new OkHttpClient().newBuilder() \n .build();\ \ \nRequest request = new Request.Builder() \n .url(\"https://api.ouraring.com/v2/sandbox/usercollection/enhanced_tag?start_date=2021-11-01&end_date=2021-12-01\"\ ) \n .method(\"GET\", null) \n .addHeader(\"Authorization\", \"Bearer\ \ \") \n .build(); \nResponse response = client.newCall(request).execute();" label: Java /v2/usercollection/workout: get: tags: - Workout Routes summary: Multiple Workout Documents operationId: Multiple_workout_Documents_v2_usercollection_workout_get parameters: - name: start_date in: query required: false schema: anyOf: - type: string format: date-time - type: string format: date - type: 'null' title: Start Date - name: end_date in: query required: false schema: anyOf: - type: string format: date-time - type: string format: date - type: 'null' title: End Date - name: next_token in: query required: false schema: type: string nullable: true title: Next Token - name: fields in: query required: false schema: type: string nullable: true description: Comma-separated list of fields to include in the response, in addition to the always returned fields. Defaults to all fields if not provided. title: Fields description: Comma-separated list of fields to include in the response, in addition to the always returned fields. Defaults to all fields if not provided. responses: '200': description: Successful Response content: application/json: schema: anyOf: - $ref: '#/components/schemas/MultiDocumentResponse_PublicWorkout_' - $ref: '#/components/schemas/MultiDocumentResponseDict' title: Response Multiple Workout Documents V2 Usercollection Workout Get '400': description: Client Exception '401': description: Unauthorized access exception. Usually means the access token is expired, malformed or revoked. '403': description: Access forbidden. Usually means the user's subscription to Oura has expired and their data is not available via the API. '429': description: Request Rate Limit Exceeded. '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - BearerAuth: [] - OAuth2: [] x-codeSamples: - lang: cURL label: cURL source: 'curl --location --request GET ''https://api.ouraring.com/v2/usercollection/workout?start_date=2021-11-01&end_date=2021-12-01&fields=day,score'' \ --header ''Authorization: Bearer ''' - lang: Python source: "import requests \nurl = 'https://api.ouraring.com/v2/usercollection/workout'\ \ \nparams={ \n 'start_date': '2021-11-01', \n 'end_date': '2021-12-01',\n\ \ 'fields': 'day,score' \n}\nheaders = { \n 'Authorization': 'Bearer\ \ ' \n}\nresponse = requests.request('GET', url, headers=headers,\ \ params=params) \nprint(response.text)" label: Python - lang: JavaScript source: "var myHeaders = new Headers(); \nmyHeaders.append('Authorization',\ \ 'Bearer '); \nvar requestOptions = { \n method: 'GET', \n headers:\ \ myHeaders, \n}; \nfetch('https://api.ouraring.com/v2/usercollection/workout?start_date=2021-11-01&end_date=2021-12-01&fields=day,score',\ \ requestOptions) \n .then(response => response.text()) \n .then(result\ \ => console.log(result)) \n .catch(error => console.log('error', error));" label: JavaScript - lang: Java source: "OkHttpClient client = new OkHttpClient().newBuilder() \n .build();\ \ \nRequest request = new Request.Builder() \n .url(\"https://api.ouraring.com/v2/usercollection/workout?start_date=2021-11-01&end_date=2021-12-01&fields=day,score\"\ ) \n .method(\"GET\", null) \n .addHeader(\"Authorization\", \"Bearer\ \ \") \n .build(); \nResponse response = client.newCall(request).execute();" label: Java /v2/sandbox/usercollection/workout: get: tags: - Sandbox Routes summary: Sandbox - Multiple Workout Documents operationId: Sandbox___Multiple_workout_Documents_v2_sandbox_usercollection_workout_get parameters: - name: start_date in: query required: false schema: anyOf: - type: string format: date-time - type: string format: date - type: 'null' title: Start Date - name: end_date in: query required: false schema: anyOf: - type: string format: date-time - type: string format: date - type: 'null' title: End Date - name: next_token in: query required: false schema: type: string nullable: true title: Next Token responses: '200': description: Successful Response content: application/json: schema: anyOf: - $ref: '#/components/schemas/MultiDocumentResponse_PublicWorkout_' - $ref: '#/components/schemas/MultiDocumentResponseDict' title: Response Sandbox Multiple Workout Documents V2 Sandbox Usercollection Workout Get '400': description: Client Exception '401': description: Unauthorized access exception. Usually means the access token is expired, malformed or revoked. '403': description: Access forbidden. Usually means the user's subscription to Oura has expired and their data is not available via the API. '429': description: Request Rate Limit Exceeded. '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - BearerAuth: [] - OAuth2: [] x-codeSamples: - lang: cURL label: cURL source: 'curl --location --request GET ''https://api.ouraring.com/v2/sandbox/usercollection/workout?start_date=2021-11-01&end_date=2021-12-01&fields=day,score'' \ --header ''Authorization: Bearer ''' - lang: Python source: "import requests \nurl = 'https://api.ouraring.com/v2/sandbox/usercollection/workout'\ \ \nparams={ \n 'start_date': '2021-11-01', \n 'end_date': '2021-12-01',\n\ \ 'fields': 'day,score' \n}\nheaders = { \n 'Authorization': 'Bearer\ \ ' \n}\nresponse = requests.request('GET', url, headers=headers,\ \ params=params) \nprint(response.text)" label: Python - lang: JavaScript source: "var myHeaders = new Headers(); \nmyHeaders.append('Authorization',\ \ 'Bearer '); \nvar requestOptions = { \n method: 'GET', \n headers:\ \ myHeaders, \n}; \nfetch('https://api.ouraring.com/v2/sandbox/usercollection/workout?start_date=2021-11-01&end_date=2021-12-01&fields=day,score',\ \ requestOptions) \n .then(response => response.text()) \n .then(result\ \ => console.log(result)) \n .catch(error => console.log('error', error));" label: JavaScript - lang: Java source: "OkHttpClient client = new OkHttpClient().newBuilder() \n .build();\ \ \nRequest request = new Request.Builder() \n .url(\"https://api.ouraring.com/v2/sandbox/usercollection/workout?start_date=2021-11-01&end_date=2021-12-01&fields=day,score\"\ ) \n .method(\"GET\", null) \n .addHeader(\"Authorization\", \"Bearer\ \ \") \n .build(); \nResponse response = client.newCall(request).execute();" label: Java /v2/usercollection/session: get: tags: - Session Routes summary: Multiple Session Documents operationId: Multiple_session_Documents_v2_usercollection_session_get parameters: - name: start_date in: query required: false schema: anyOf: - type: string format: date-time - type: string format: date - type: 'null' title: Start Date - name: end_date in: query required: false schema: anyOf: - type: string format: date-time - type: string format: date - type: 'null' title: End Date - name: next_token in: query required: false schema: type: string nullable: true title: Next Token - name: fields in: query required: false schema: type: string nullable: true description: Comma-separated list of fields to include in the response, in addition to the always returned fields. Defaults to all fields if not provided. title: Fields description: Comma-separated list of fields to include in the response, in addition to the always returned fields. Defaults to all fields if not provided. responses: '200': description: Successful Response content: application/json: schema: anyOf: - $ref: '#/components/schemas/MultiDocumentResponse_PublicSession_' - $ref: '#/components/schemas/MultiDocumentResponseDict' title: Response Multiple Session Documents V2 Usercollection Session Get '400': description: Client Exception '401': description: Unauthorized access exception. Usually means the access token is expired, malformed or revoked. '403': description: Access forbidden. Usually means the user's subscription to Oura has expired and their data is not available via the API. '429': description: Request Rate Limit Exceeded. '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - BearerAuth: [] - OAuth2: [] x-codeSamples: - lang: cURL label: cURL source: 'curl --location --request GET ''https://api.ouraring.com/v2/usercollection/session?start_date=2021-11-01&end_date=2021-12-01&fields=day,score'' \ --header ''Authorization: Bearer ''' - lang: Python source: "import requests \nurl = 'https://api.ouraring.com/v2/usercollection/session'\ \ \nparams={ \n 'start_date': '2021-11-01', \n 'end_date': '2021-12-01',\n\ \ 'fields': 'day,score' \n}\nheaders = { \n 'Authorization': 'Bearer\ \ ' \n}\nresponse = requests.request('GET', url, headers=headers,\ \ params=params) \nprint(response.text)" label: Python - lang: JavaScript source: "var myHeaders = new Headers(); \nmyHeaders.append('Authorization',\ \ 'Bearer '); \nvar requestOptions = { \n method: 'GET', \n headers:\ \ myHeaders, \n}; \nfetch('https://api.ouraring.com/v2/usercollection/session?start_date=2021-11-01&end_date=2021-12-01&fields=day,score',\ \ requestOptions) \n .then(response => response.text()) \n .then(result\ \ => console.log(result)) \n .catch(error => console.log('error', error));" label: JavaScript - lang: Java source: "OkHttpClient client = new OkHttpClient().newBuilder() \n .build();\ \ \nRequest request = new Request.Builder() \n .url(\"https://api.ouraring.com/v2/usercollection/session?start_date=2021-11-01&end_date=2021-12-01&fields=day,score\"\ ) \n .method(\"GET\", null) \n .addHeader(\"Authorization\", \"Bearer\ \ \") \n .build(); \nResponse response = client.newCall(request).execute();" label: Java /v2/sandbox/usercollection/session: get: tags: - Sandbox Routes summary: Sandbox - Multiple Session Documents operationId: Sandbox___Multiple_session_Documents_v2_sandbox_usercollection_session_get parameters: - name: start_date in: query required: false schema: anyOf: - type: string format: date-time - type: string format: date - type: 'null' title: Start Date - name: end_date in: query required: false schema: anyOf: - type: string format: date-time - type: string format: date - type: 'null' title: End Date - name: next_token in: query required: false schema: type: string nullable: true title: Next Token responses: '200': description: Successful Response content: application/json: schema: anyOf: - $ref: '#/components/schemas/MultiDocumentResponse_PublicSession_' - $ref: '#/components/schemas/MultiDocumentResponseDict' title: Response Sandbox Multiple Session Documents V2 Sandbox Usercollection Session Get '400': description: Client Exception '401': description: Unauthorized access exception. Usually means the access token is expired, malformed or revoked. '403': description: Access forbidden. Usually means the user's subscription to Oura has expired and their data is not available via the API. '429': description: Request Rate Limit Exceeded. '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - BearerAuth: [] - OAuth2: [] x-codeSamples: - lang: cURL label: cURL source: 'curl --location --request GET ''https://api.ouraring.com/v2/sandbox/usercollection/session?start_date=2021-11-01&end_date=2021-12-01&fields=day,score'' \ --header ''Authorization: Bearer ''' - lang: Python source: "import requests \nurl = 'https://api.ouraring.com/v2/sandbox/usercollection/session'\ \ \nparams={ \n 'start_date': '2021-11-01', \n 'end_date': '2021-12-01',\n\ \ 'fields': 'day,score' \n}\nheaders = { \n 'Authorization': 'Bearer\ \ ' \n}\nresponse = requests.request('GET', url, headers=headers,\ \ params=params) \nprint(response.text)" label: Python - lang: JavaScript source: "var myHeaders = new Headers(); \nmyHeaders.append('Authorization',\ \ 'Bearer '); \nvar requestOptions = { \n method: 'GET', \n headers:\ \ myHeaders, \n}; \nfetch('https://api.ouraring.com/v2/sandbox/usercollection/session?start_date=2021-11-01&end_date=2021-12-01&fields=day,score',\ \ requestOptions) \n .then(response => response.text()) \n .then(result\ \ => console.log(result)) \n .catch(error => console.log('error', error));" label: JavaScript - lang: Java source: "OkHttpClient client = new OkHttpClient().newBuilder() \n .build();\ \ \nRequest request = new Request.Builder() \n .url(\"https://api.ouraring.com/v2/sandbox/usercollection/session?start_date=2021-11-01&end_date=2021-12-01&fields=day,score\"\ ) \n .method(\"GET\", null) \n .addHeader(\"Authorization\", \"Bearer\ \ \") \n .build(); \nResponse response = client.newCall(request).execute();" label: Java /v2/usercollection/daily_activity: get: tags: - Daily Activity Routes summary: Multiple Daily Activity Documents operationId: Multiple_daily_activity_Documents_v2_usercollection_daily_activity_get parameters: - name: start_date in: query required: false schema: anyOf: - type: string format: date-time - type: string format: date - type: 'null' title: Start Date - name: end_date in: query required: false schema: anyOf: - type: string format: date-time - type: string format: date - type: 'null' title: End Date - name: next_token in: query required: false schema: type: string nullable: true title: Next Token - name: fields in: query required: false schema: type: string nullable: true description: Comma-separated list of fields to include in the response, in addition to the always returned fields. Defaults to all fields if not provided. title: Fields description: Comma-separated list of fields to include in the response, in addition to the always returned fields. Defaults to all fields if not provided. responses: '200': description: Successful Response content: application/json: schema: anyOf: - $ref: '#/components/schemas/MultiDocumentResponse_PublicDailyActivity_' - $ref: '#/components/schemas/MultiDocumentResponseDict' title: Response Multiple Daily Activity Documents V2 Usercollection Daily Activity Get '400': description: Client Exception '401': description: Unauthorized access exception. Usually means the access token is expired, malformed or revoked. '403': description: Access forbidden. Usually means the user's subscription to Oura has expired and their data is not available via the API. '429': description: Request Rate Limit Exceeded. '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - BearerAuth: [] - OAuth2: [] x-codeSamples: - lang: cURL label: cURL source: 'curl --location --request GET ''https://api.ouraring.com/v2/usercollection/daily_activity?start_date=2021-11-01&end_date=2021-12-01&fields=day,score'' \ --header ''Authorization: Bearer ''' - lang: Python source: "import requests \nurl = 'https://api.ouraring.com/v2/usercollection/daily_activity'\ \ \nparams={ \n 'start_date': '2021-11-01', \n 'end_date': '2021-12-01',\n\ \ 'fields': 'day,score' \n}\nheaders = { \n 'Authorization': 'Bearer\ \ ' \n}\nresponse = requests.request('GET', url, headers=headers,\ \ params=params) \nprint(response.text)" label: Python - lang: JavaScript source: "var myHeaders = new Headers(); \nmyHeaders.append('Authorization',\ \ 'Bearer '); \nvar requestOptions = { \n method: 'GET', \n headers:\ \ myHeaders, \n}; \nfetch('https://api.ouraring.com/v2/usercollection/daily_activity?start_date=2021-11-01&end_date=2021-12-01&fields=day,score',\ \ requestOptions) \n .then(response => response.text()) \n .then(result\ \ => console.log(result)) \n .catch(error => console.log('error', error));" label: JavaScript - lang: Java source: "OkHttpClient client = new OkHttpClient().newBuilder() \n .build();\ \ \nRequest request = new Request.Builder() \n .url(\"https://api.ouraring.com/v2/usercollection/daily_activity?start_date=2021-11-01&end_date=2021-12-01&fields=day,score\"\ ) \n .method(\"GET\", null) \n .addHeader(\"Authorization\", \"Bearer\ \ \") \n .build(); \nResponse response = client.newCall(request).execute();" label: Java /v2/sandbox/usercollection/daily_activity: get: tags: - Sandbox Routes summary: Sandbox - Multiple Daily Activity Documents operationId: Sandbox___Multiple_daily_activity_Documents_v2_sandbox_usercollection_daily_activity_get parameters: - name: start_date in: query required: false schema: anyOf: - type: string format: date-time - type: string format: date - type: 'null' title: Start Date - name: end_date in: query required: false schema: anyOf: - type: string format: date-time - type: string format: date - type: 'null' title: End Date - name: next_token in: query required: false schema: type: string nullable: true title: Next Token responses: '200': description: Successful Response content: application/json: schema: anyOf: - $ref: '#/components/schemas/MultiDocumentResponse_PublicDailyActivity_' - $ref: '#/components/schemas/MultiDocumentResponseDict' title: Response Sandbox Multiple Daily Activity Documents V2 Sandbox Usercollection Daily Activity Get '400': description: Client Exception '401': description: Unauthorized access exception. Usually means the access token is expired, malformed or revoked. '403': description: Access forbidden. Usually means the user's subscription to Oura has expired and their data is not available via the API. '429': description: Request Rate Limit Exceeded. '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - BearerAuth: [] - OAuth2: [] x-codeSamples: - lang: cURL label: cURL source: 'curl --location --request GET ''https://api.ouraring.com/v2/sandbox/usercollection/daily_activity?start_date=2021-11-01&end_date=2021-12-01&fields=day,score'' \ --header ''Authorization: Bearer ''' - lang: Python source: "import requests \nurl = 'https://api.ouraring.com/v2/sandbox/usercollection/daily_activity'\ \ \nparams={ \n 'start_date': '2021-11-01', \n 'end_date': '2021-12-01',\n\ \ 'fields': 'day,score' \n}\nheaders = { \n 'Authorization': 'Bearer\ \ ' \n}\nresponse = requests.request('GET', url, headers=headers,\ \ params=params) \nprint(response.text)" label: Python - lang: JavaScript source: "var myHeaders = new Headers(); \nmyHeaders.append('Authorization',\ \ 'Bearer '); \nvar requestOptions = { \n method: 'GET', \n headers:\ \ myHeaders, \n}; \nfetch('https://api.ouraring.com/v2/sandbox/usercollection/daily_activity?start_date=2021-11-01&end_date=2021-12-01&fields=day,score',\ \ requestOptions) \n .then(response => response.text()) \n .then(result\ \ => console.log(result)) \n .catch(error => console.log('error', error));" label: JavaScript - lang: Java source: "OkHttpClient client = new OkHttpClient().newBuilder() \n .build();\ \ \nRequest request = new Request.Builder() \n .url(\"https://api.ouraring.com/v2/sandbox/usercollection/daily_activity?start_date=2021-11-01&end_date=2021-12-01&fields=day,score\"\ ) \n .method(\"GET\", null) \n .addHeader(\"Authorization\", \"Bearer\ \ \") \n .build(); \nResponse response = client.newCall(request).execute();" label: Java /v2/usercollection/daily_sleep: get: tags: - Daily Sleep Routes summary: Multiple Daily Sleep Documents operationId: Multiple_daily_sleep_Documents_v2_usercollection_daily_sleep_get parameters: - name: start_date in: query required: false schema: anyOf: - type: string format: date-time - type: string format: date - type: 'null' title: Start Date - name: end_date in: query required: false schema: anyOf: - type: string format: date-time - type: string format: date - type: 'null' title: End Date - name: next_token in: query required: false schema: type: string nullable: true title: Next Token - name: fields in: query required: false schema: type: string nullable: true description: Comma-separated list of fields to include in the response, in addition to the always returned fields. Defaults to all fields if not provided. title: Fields description: Comma-separated list of fields to include in the response, in addition to the always returned fields. Defaults to all fields if not provided. responses: '200': description: Successful Response content: application/json: schema: anyOf: - $ref: '#/components/schemas/MultiDocumentResponse_PublicDailySleep_' - $ref: '#/components/schemas/MultiDocumentResponseDict' title: Response Multiple Daily Sleep Documents V2 Usercollection Daily Sleep Get '400': description: Client Exception '401': description: Unauthorized access exception. Usually means the access token is expired, malformed or revoked. '403': description: Access forbidden. Usually means the user's subscription to Oura has expired and their data is not available via the API. '429': description: Request Rate Limit Exceeded. '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - BearerAuth: [] - OAuth2: [] x-codeSamples: - lang: cURL label: cURL source: 'curl --location --request GET ''https://api.ouraring.com/v2/usercollection/daily_sleep?start_date=2021-11-01&end_date=2021-12-01&fields=day,score'' \ --header ''Authorization: Bearer ''' - lang: Python source: "import requests \nurl = 'https://api.ouraring.com/v2/usercollection/daily_sleep'\ \ \nparams={ \n 'start_date': '2021-11-01', \n 'end_date': '2021-12-01',\n\ \ 'fields': 'day,score' \n}\nheaders = { \n 'Authorization': 'Bearer\ \ ' \n}\nresponse = requests.request('GET', url, headers=headers,\ \ params=params) \nprint(response.text)" label: Python - lang: JavaScript source: "var myHeaders = new Headers(); \nmyHeaders.append('Authorization',\ \ 'Bearer '); \nvar requestOptions = { \n method: 'GET', \n headers:\ \ myHeaders, \n}; \nfetch('https://api.ouraring.com/v2/usercollection/daily_sleep?start_date=2021-11-01&end_date=2021-12-01&fields=day,score',\ \ requestOptions) \n .then(response => response.text()) \n .then(result\ \ => console.log(result)) \n .catch(error => console.log('error', error));" label: JavaScript - lang: Java source: "OkHttpClient client = new OkHttpClient().newBuilder() \n .build();\ \ \nRequest request = new Request.Builder() \n .url(\"https://api.ouraring.com/v2/usercollection/daily_sleep?start_date=2021-11-01&end_date=2021-12-01&fields=day,score\"\ ) \n .method(\"GET\", null) \n .addHeader(\"Authorization\", \"Bearer\ \ \") \n .build(); \nResponse response = client.newCall(request).execute();" label: Java /v2/sandbox/usercollection/daily_sleep: get: tags: - Sandbox Routes summary: Sandbox - Multiple Daily Sleep Documents operationId: Sandbox___Multiple_daily_sleep_Documents_v2_sandbox_usercollection_daily_sleep_get parameters: - name: start_date in: query required: false schema: anyOf: - type: string format: date-time - type: string format: date - type: 'null' title: Start Date - name: end_date in: query required: false schema: anyOf: - type: string format: date-time - type: string format: date - type: 'null' title: End Date - name: next_token in: query required: false schema: type: string nullable: true title: Next Token responses: '200': description: Successful Response content: application/json: schema: anyOf: - $ref: '#/components/schemas/MultiDocumentResponse_PublicDailySleep_' - $ref: '#/components/schemas/MultiDocumentResponseDict' title: Response Sandbox Multiple Daily Sleep Documents V2 Sandbox Usercollection Daily Sleep Get '400': description: Client Exception '401': description: Unauthorized access exception. Usually means the access token is expired, malformed or revoked. '403': description: Access forbidden. Usually means the user's subscription to Oura has expired and their data is not available via the API. '429': description: Request Rate Limit Exceeded. '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - BearerAuth: [] - OAuth2: [] x-codeSamples: - lang: cURL label: cURL source: 'curl --location --request GET ''https://api.ouraring.com/v2/sandbox/usercollection/daily_sleep?start_date=2021-11-01&end_date=2021-12-01&fields=day,score'' \ --header ''Authorization: Bearer ''' - lang: Python source: "import requests \nurl = 'https://api.ouraring.com/v2/sandbox/usercollection/daily_sleep'\ \ \nparams={ \n 'start_date': '2021-11-01', \n 'end_date': '2021-12-01',\n\ \ 'fields': 'day,score' \n}\nheaders = { \n 'Authorization': 'Bearer\ \ ' \n}\nresponse = requests.request('GET', url, headers=headers,\ \ params=params) \nprint(response.text)" label: Python - lang: JavaScript source: "var myHeaders = new Headers(); \nmyHeaders.append('Authorization',\ \ 'Bearer '); \nvar requestOptions = { \n method: 'GET', \n headers:\ \ myHeaders, \n}; \nfetch('https://api.ouraring.com/v2/sandbox/usercollection/daily_sleep?start_date=2021-11-01&end_date=2021-12-01&fields=day,score',\ \ requestOptions) \n .then(response => response.text()) \n .then(result\ \ => console.log(result)) \n .catch(error => console.log('error', error));" label: JavaScript - lang: Java source: "OkHttpClient client = new OkHttpClient().newBuilder() \n .build();\ \ \nRequest request = new Request.Builder() \n .url(\"https://api.ouraring.com/v2/sandbox/usercollection/daily_sleep?start_date=2021-11-01&end_date=2021-12-01&fields=day,score\"\ ) \n .method(\"GET\", null) \n .addHeader(\"Authorization\", \"Bearer\ \ \") \n .build(); \nResponse response = client.newCall(request).execute();" label: Java /v2/usercollection/daily_spo2: get: tags: - Daily Spo2 Routes summary: Multiple Daily Spo2 Documents operationId: Multiple_daily_spo2_Documents_v2_usercollection_daily_spo2_get parameters: - name: start_date in: query required: false schema: anyOf: - type: string format: date-time - type: string format: date - type: 'null' title: Start Date - name: end_date in: query required: false schema: anyOf: - type: string format: date-time - type: string format: date - type: 'null' title: End Date - name: next_token in: query required: false schema: type: string nullable: true title: Next Token - name: fields in: query required: false schema: type: string nullable: true description: Comma-separated list of fields to include in the response, in addition to the always returned fields. Defaults to all fields if not provided. title: Fields description: Comma-separated list of fields to include in the response, in addition to the always returned fields. Defaults to all fields if not provided. responses: '200': description: Successful Response content: application/json: schema: anyOf: - $ref: '#/components/schemas/MultiDocumentResponse_PublicDailySpO2_' - $ref: '#/components/schemas/MultiDocumentResponseDict' title: Response Multiple Daily Spo2 Documents V2 Usercollection Daily Spo2 Get '400': description: Client Exception '401': description: Unauthorized access exception. Usually means the access token is expired, malformed or revoked. '403': description: Access forbidden. Usually means the user's subscription to Oura has expired and their data is not available via the API. '429': description: Request Rate Limit Exceeded. '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - BearerAuth: [] - OAuth2: [] x-codeSamples: - lang: cURL label: cURL source: 'curl --location --request GET ''https://api.ouraring.com/v2/usercollection/daily_spo2?start_date=2021-11-01&end_date=2021-12-01&fields=day,score'' \ --header ''Authorization: Bearer ''' - lang: Python source: "import requests \nurl = 'https://api.ouraring.com/v2/usercollection/daily_spo2'\ \ \nparams={ \n 'start_date': '2021-11-01', \n 'end_date': '2021-12-01',\n\ \ 'fields': 'day,score' \n}\nheaders = { \n 'Authorization': 'Bearer\ \ ' \n}\nresponse = requests.request('GET', url, headers=headers,\ \ params=params) \nprint(response.text)" label: Python - lang: JavaScript source: "var myHeaders = new Headers(); \nmyHeaders.append('Authorization',\ \ 'Bearer '); \nvar requestOptions = { \n method: 'GET', \n headers:\ \ myHeaders, \n}; \nfetch('https://api.ouraring.com/v2/usercollection/daily_spo2?start_date=2021-11-01&end_date=2021-12-01&fields=day,score',\ \ requestOptions) \n .then(response => response.text()) \n .then(result\ \ => console.log(result)) \n .catch(error => console.log('error', error));" label: JavaScript - lang: Java source: "OkHttpClient client = new OkHttpClient().newBuilder() \n .build();\ \ \nRequest request = new Request.Builder() \n .url(\"https://api.ouraring.com/v2/usercollection/daily_spo2?start_date=2021-11-01&end_date=2021-12-01&fields=day,score\"\ ) \n .method(\"GET\", null) \n .addHeader(\"Authorization\", \"Bearer\ \ \") \n .build(); \nResponse response = client.newCall(request).execute();" label: Java /v2/sandbox/usercollection/daily_spo2: get: tags: - Sandbox Routes summary: Sandbox - Multiple Daily Spo2 Documents operationId: Sandbox___Multiple_daily_spo2_Documents_v2_sandbox_usercollection_daily_spo2_get parameters: - name: start_date in: query required: false schema: anyOf: - type: string format: date-time - type: string format: date - type: 'null' title: Start Date - name: end_date in: query required: false schema: anyOf: - type: string format: date-time - type: string format: date - type: 'null' title: End Date - name: next_token in: query required: false schema: type: string nullable: true title: Next Token responses: '200': description: Successful Response content: application/json: schema: anyOf: - $ref: '#/components/schemas/MultiDocumentResponse_PublicDailySpO2_' - $ref: '#/components/schemas/MultiDocumentResponseDict' title: Response Sandbox Multiple Daily Spo2 Documents V2 Sandbox Usercollection Daily Spo2 Get '400': description: Client Exception '401': description: Unauthorized access exception. Usually means the access token is expired, malformed or revoked. '403': description: Access forbidden. Usually means the user's subscription to Oura has expired and their data is not available via the API. '429': description: Request Rate Limit Exceeded. '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - BearerAuth: [] - OAuth2: [] x-codeSamples: - lang: cURL label: cURL source: 'curl --location --request GET ''https://api.ouraring.com/v2/sandbox/usercollection/daily_spo2?start_date=2021-11-01&end_date=2021-12-01&fields=day,score'' \ --header ''Authorization: Bearer ''' - lang: Python source: "import requests \nurl = 'https://api.ouraring.com/v2/sandbox/usercollection/daily_spo2'\ \ \nparams={ \n 'start_date': '2021-11-01', \n 'end_date': '2021-12-01',\n\ \ 'fields': 'day,score' \n}\nheaders = { \n 'Authorization': 'Bearer\ \ ' \n}\nresponse = requests.request('GET', url, headers=headers,\ \ params=params) \nprint(response.text)" label: Python - lang: JavaScript source: "var myHeaders = new Headers(); \nmyHeaders.append('Authorization',\ \ 'Bearer '); \nvar requestOptions = { \n method: 'GET', \n headers:\ \ myHeaders, \n}; \nfetch('https://api.ouraring.com/v2/sandbox/usercollection/daily_spo2?start_date=2021-11-01&end_date=2021-12-01&fields=day,score',\ \ requestOptions) \n .then(response => response.text()) \n .then(result\ \ => console.log(result)) \n .catch(error => console.log('error', error));" label: JavaScript - lang: Java source: "OkHttpClient client = new OkHttpClient().newBuilder() \n .build();\ \ \nRequest request = new Request.Builder() \n .url(\"https://api.ouraring.com/v2/sandbox/usercollection/daily_spo2?start_date=2021-11-01&end_date=2021-12-01&fields=day,score\"\ ) \n .method(\"GET\", null) \n .addHeader(\"Authorization\", \"Bearer\ \ \") \n .build(); \nResponse response = client.newCall(request).execute();" label: Java /v2/usercollection/daily_readiness: get: tags: - Daily Readiness Routes summary: Multiple Daily Readiness Documents operationId: Multiple_daily_readiness_Documents_v2_usercollection_daily_readiness_get parameters: - name: start_date in: query required: false schema: anyOf: - type: string format: date-time - type: string format: date - type: 'null' title: Start Date - name: end_date in: query required: false schema: anyOf: - type: string format: date-time - type: string format: date - type: 'null' title: End Date - name: next_token in: query required: false schema: type: string nullable: true title: Next Token - name: fields in: query required: false schema: type: string nullable: true description: Comma-separated list of fields to include in the response, in addition to the always returned fields. Defaults to all fields if not provided. title: Fields description: Comma-separated list of fields to include in the response, in addition to the always returned fields. Defaults to all fields if not provided. responses: '200': description: Successful Response content: application/json: schema: anyOf: - $ref: '#/components/schemas/MultiDocumentResponse_PublicDailyReadiness_' - $ref: '#/components/schemas/MultiDocumentResponseDict' title: Response Multiple Daily Readiness Documents V2 Usercollection Daily Readiness Get '400': description: Client Exception '401': description: Unauthorized access exception. Usually means the access token is expired, malformed or revoked. '403': description: Access forbidden. Usually means the user's subscription to Oura has expired and their data is not available via the API. '429': description: Request Rate Limit Exceeded. '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - BearerAuth: [] - OAuth2: [] x-codeSamples: - lang: cURL label: cURL source: 'curl --location --request GET ''https://api.ouraring.com/v2/usercollection/daily_readiness?start_date=2021-11-01&end_date=2021-12-01&fields=day,score'' \ --header ''Authorization: Bearer ''' - lang: Python source: "import requests \nurl = 'https://api.ouraring.com/v2/usercollection/daily_readiness'\ \ \nparams={ \n 'start_date': '2021-11-01', \n 'end_date': '2021-12-01',\n\ \ 'fields': 'day,score' \n}\nheaders = { \n 'Authorization': 'Bearer\ \ ' \n}\nresponse = requests.request('GET', url, headers=headers,\ \ params=params) \nprint(response.text)" label: Python - lang: JavaScript source: "var myHeaders = new Headers(); \nmyHeaders.append('Authorization',\ \ 'Bearer '); \nvar requestOptions = { \n method: 'GET', \n headers:\ \ myHeaders, \n}; \nfetch('https://api.ouraring.com/v2/usercollection/daily_readiness?start_date=2021-11-01&end_date=2021-12-01&fields=day,score',\ \ requestOptions) \n .then(response => response.text()) \n .then(result\ \ => console.log(result)) \n .catch(error => console.log('error', error));" label: JavaScript - lang: Java source: "OkHttpClient client = new OkHttpClient().newBuilder() \n .build();\ \ \nRequest request = new Request.Builder() \n .url(\"https://api.ouraring.com/v2/usercollection/daily_readiness?start_date=2021-11-01&end_date=2021-12-01&fields=day,score\"\ ) \n .method(\"GET\", null) \n .addHeader(\"Authorization\", \"Bearer\ \ \") \n .build(); \nResponse response = client.newCall(request).execute();" label: Java /v2/sandbox/usercollection/daily_readiness: get: tags: - Sandbox Routes summary: Sandbox - Multiple Daily Readiness Documents operationId: Sandbox___Multiple_daily_readiness_Documents_v2_sandbox_usercollection_daily_readiness_get parameters: - name: start_date in: query required: false schema: anyOf: - type: string format: date-time - type: string format: date - type: 'null' title: Start Date - name: end_date in: query required: false schema: anyOf: - type: string format: date-time - type: string format: date - type: 'null' title: End Date - name: next_token in: query required: false schema: type: string nullable: true title: Next Token responses: '200': description: Successful Response content: application/json: schema: anyOf: - $ref: '#/components/schemas/MultiDocumentResponse_PublicDailyReadiness_' - $ref: '#/components/schemas/MultiDocumentResponseDict' title: Response Sandbox Multiple Daily Readiness Documents V2 Sandbox Usercollection Daily Readiness Get '400': description: Client Exception '401': description: Unauthorized access exception. Usually means the access token is expired, malformed or revoked. '403': description: Access forbidden. Usually means the user's subscription to Oura has expired and their data is not available via the API. '429': description: Request Rate Limit Exceeded. '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - BearerAuth: [] - OAuth2: [] x-codeSamples: - lang: cURL label: cURL source: 'curl --location --request GET ''https://api.ouraring.com/v2/sandbox/usercollection/daily_readiness?start_date=2021-11-01&end_date=2021-12-01&fields=day,score'' \ --header ''Authorization: Bearer ''' - lang: Python source: "import requests \nurl = 'https://api.ouraring.com/v2/sandbox/usercollection/daily_readiness'\ \ \nparams={ \n 'start_date': '2021-11-01', \n 'end_date': '2021-12-01',\n\ \ 'fields': 'day,score' \n}\nheaders = { \n 'Authorization': 'Bearer\ \ ' \n}\nresponse = requests.request('GET', url, headers=headers,\ \ params=params) \nprint(response.text)" label: Python - lang: JavaScript source: "var myHeaders = new Headers(); \nmyHeaders.append('Authorization',\ \ 'Bearer '); \nvar requestOptions = { \n method: 'GET', \n headers:\ \ myHeaders, \n}; \nfetch('https://api.ouraring.com/v2/sandbox/usercollection/daily_readiness?start_date=2021-11-01&end_date=2021-12-01&fields=day,score',\ \ requestOptions) \n .then(response => response.text()) \n .then(result\ \ => console.log(result)) \n .catch(error => console.log('error', error));" label: JavaScript - lang: Java source: "OkHttpClient client = new OkHttpClient().newBuilder() \n .build();\ \ \nRequest request = new Request.Builder() \n .url(\"https://api.ouraring.com/v2/sandbox/usercollection/daily_readiness?start_date=2021-11-01&end_date=2021-12-01&fields=day,score\"\ ) \n .method(\"GET\", null) \n .addHeader(\"Authorization\", \"Bearer\ \ \") \n .build(); \nResponse response = client.newCall(request).execute();" label: Java /v2/usercollection/sleep: get: tags: - Sleep Routes summary: Multiple Sleep Documents operationId: Multiple_sleep_Documents_v2_usercollection_sleep_get parameters: - name: start_date in: query required: false schema: anyOf: - type: string format: date-time - type: string format: date - type: 'null' title: Start Date - name: end_date in: query required: false schema: anyOf: - type: string format: date-time - type: string format: date - type: 'null' title: End Date - name: next_token in: query required: false schema: type: string nullable: true title: Next Token - name: fields in: query required: false schema: type: string nullable: true description: Comma-separated list of fields to include in the response, in addition to the always returned fields. Defaults to all fields if not provided. title: Fields description: Comma-separated list of fields to include in the response, in addition to the always returned fields. Defaults to all fields if not provided. responses: '200': description: Successful Response content: application/json: schema: anyOf: - $ref: '#/components/schemas/MultiDocumentResponse_PublicModifiedSleepModel_' - $ref: '#/components/schemas/MultiDocumentResponseDict' title: Response Multiple Sleep Documents V2 Usercollection Sleep Get '400': description: Client Exception '401': description: Unauthorized access exception. Usually means the access token is expired, malformed or revoked. '403': description: Access forbidden. Usually means the user's subscription to Oura has expired and their data is not available via the API. '429': description: Request Rate Limit Exceeded. '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - BearerAuth: [] - OAuth2: [] x-codeSamples: - lang: cURL label: cURL source: 'curl --location --request GET ''https://api.ouraring.com/v2/usercollection/sleep?start_date=2021-11-01&end_date=2021-12-01&fields=day,score'' \ --header ''Authorization: Bearer ''' - lang: Python source: "import requests \nurl = 'https://api.ouraring.com/v2/usercollection/sleep'\ \ \nparams={ \n 'start_date': '2021-11-01', \n 'end_date': '2021-12-01',\n\ \ 'fields': 'day,score' \n}\nheaders = { \n 'Authorization': 'Bearer\ \ ' \n}\nresponse = requests.request('GET', url, headers=headers,\ \ params=params) \nprint(response.text)" label: Python - lang: JavaScript source: "var myHeaders = new Headers(); \nmyHeaders.append('Authorization',\ \ 'Bearer '); \nvar requestOptions = { \n method: 'GET', \n headers:\ \ myHeaders, \n}; \nfetch('https://api.ouraring.com/v2/usercollection/sleep?start_date=2021-11-01&end_date=2021-12-01&fields=day,score',\ \ requestOptions) \n .then(response => response.text()) \n .then(result\ \ => console.log(result)) \n .catch(error => console.log('error', error));" label: JavaScript - lang: Java source: "OkHttpClient client = new OkHttpClient().newBuilder() \n .build();\ \ \nRequest request = new Request.Builder() \n .url(\"https://api.ouraring.com/v2/usercollection/sleep?start_date=2021-11-01&end_date=2021-12-01&fields=day,score\"\ ) \n .method(\"GET\", null) \n .addHeader(\"Authorization\", \"Bearer\ \ \") \n .build(); \nResponse response = client.newCall(request).execute();" label: Java /v2/sandbox/usercollection/sleep: get: tags: - Sandbox Routes summary: Sandbox - Multiple Sleep Documents operationId: Sandbox___Multiple_sleep_Documents_v2_sandbox_usercollection_sleep_get parameters: - name: start_date in: query required: false schema: anyOf: - type: string format: date-time - type: string format: date - type: 'null' title: Start Date - name: end_date in: query required: false schema: anyOf: - type: string format: date-time - type: string format: date - type: 'null' title: End Date - name: next_token in: query required: false schema: type: string nullable: true title: Next Token responses: '200': description: Successful Response content: application/json: schema: anyOf: - $ref: '#/components/schemas/MultiDocumentResponse_PublicModifiedSleepModel_' - $ref: '#/components/schemas/MultiDocumentResponseDict' title: Response Sandbox Multiple Sleep Documents V2 Sandbox Usercollection Sleep Get '400': description: Client Exception '401': description: Unauthorized access exception. Usually means the access token is expired, malformed or revoked. '403': description: Access forbidden. Usually means the user's subscription to Oura has expired and their data is not available via the API. '429': description: Request Rate Limit Exceeded. '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - BearerAuth: [] - OAuth2: [] x-codeSamples: - lang: cURL label: cURL source: 'curl --location --request GET ''https://api.ouraring.com/v2/sandbox/usercollection/sleep?start_date=2021-11-01&end_date=2021-12-01&fields=day,score'' \ --header ''Authorization: Bearer ''' - lang: Python source: "import requests \nurl = 'https://api.ouraring.com/v2/sandbox/usercollection/sleep'\ \ \nparams={ \n 'start_date': '2021-11-01', \n 'end_date': '2021-12-01',\n\ \ 'fields': 'day,score' \n}\nheaders = { \n 'Authorization': 'Bearer\ \ ' \n}\nresponse = requests.request('GET', url, headers=headers,\ \ params=params) \nprint(response.text)" label: Python - lang: JavaScript source: "var myHeaders = new Headers(); \nmyHeaders.append('Authorization',\ \ 'Bearer '); \nvar requestOptions = { \n method: 'GET', \n headers:\ \ myHeaders, \n}; \nfetch('https://api.ouraring.com/v2/sandbox/usercollection/sleep?start_date=2021-11-01&end_date=2021-12-01&fields=day,score',\ \ requestOptions) \n .then(response => response.text()) \n .then(result\ \ => console.log(result)) \n .catch(error => console.log('error', error));" label: JavaScript - lang: Java source: "OkHttpClient client = new OkHttpClient().newBuilder() \n .build();\ \ \nRequest request = new Request.Builder() \n .url(\"https://api.ouraring.com/v2/sandbox/usercollection/sleep?start_date=2021-11-01&end_date=2021-12-01&fields=day,score\"\ ) \n .method(\"GET\", null) \n .addHeader(\"Authorization\", \"Bearer\ \ \") \n .build(); \nResponse response = client.newCall(request).execute();" label: Java /v2/usercollection/sleep_time: get: tags: - Sleep Time Routes summary: Multiple Sleep Time Documents operationId: Multiple_sleep_time_Documents_v2_usercollection_sleep_time_get parameters: - name: start_date in: query required: false schema: anyOf: - type: string format: date-time - type: string format: date - type: 'null' title: Start Date - name: end_date in: query required: false schema: anyOf: - type: string format: date-time - type: string format: date - type: 'null' title: End Date - name: next_token in: query required: false schema: type: string nullable: true title: Next Token - name: fields in: query required: false schema: type: string nullable: true description: Comma-separated list of fields to include in the response, in addition to the always returned fields. Defaults to all fields if not provided. title: Fields description: Comma-separated list of fields to include in the response, in addition to the always returned fields. Defaults to all fields if not provided. responses: '200': description: Successful Response content: application/json: schema: anyOf: - $ref: '#/components/schemas/MultiDocumentResponse_PublicSleepTime_' - $ref: '#/components/schemas/MultiDocumentResponseDict' title: Response Multiple Sleep Time Documents V2 Usercollection Sleep Time Get '400': description: Client Exception '401': description: Unauthorized access exception. Usually means the access token is expired, malformed or revoked. '403': description: Access forbidden. Usually means the user's subscription to Oura has expired and their data is not available via the API. '429': description: Request Rate Limit Exceeded. '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - BearerAuth: [] - OAuth2: [] x-codeSamples: - lang: cURL label: cURL source: 'curl --location --request GET ''https://api.ouraring.com/v2/usercollection/sleep_time?start_date=2021-11-01&end_date=2021-12-01&fields=day,score'' \ --header ''Authorization: Bearer ''' - lang: Python source: "import requests \nurl = 'https://api.ouraring.com/v2/usercollection/sleep_time'\ \ \nparams={ \n 'start_date': '2021-11-01', \n 'end_date': '2021-12-01',\n\ \ 'fields': 'day,score' \n}\nheaders = { \n 'Authorization': 'Bearer\ \ ' \n}\nresponse = requests.request('GET', url, headers=headers,\ \ params=params) \nprint(response.text)" label: Python - lang: JavaScript source: "var myHeaders = new Headers(); \nmyHeaders.append('Authorization',\ \ 'Bearer '); \nvar requestOptions = { \n method: 'GET', \n headers:\ \ myHeaders, \n}; \nfetch('https://api.ouraring.com/v2/usercollection/sleep_time?start_date=2021-11-01&end_date=2021-12-01&fields=day,score',\ \ requestOptions) \n .then(response => response.text()) \n .then(result\ \ => console.log(result)) \n .catch(error => console.log('error', error));" label: JavaScript - lang: Java source: "OkHttpClient client = new OkHttpClient().newBuilder() \n .build();\ \ \nRequest request = new Request.Builder() \n .url(\"https://api.ouraring.com/v2/usercollection/sleep_time?start_date=2021-11-01&end_date=2021-12-01&fields=day,score\"\ ) \n .method(\"GET\", null) \n .addHeader(\"Authorization\", \"Bearer\ \ \") \n .build(); \nResponse response = client.newCall(request).execute();" label: Java /v2/sandbox/usercollection/sleep_time: get: tags: - Sandbox Routes summary: Sandbox - Multiple Sleep Time Documents operationId: Sandbox___Multiple_sleep_time_Documents_v2_sandbox_usercollection_sleep_time_get parameters: - name: start_date in: query required: false schema: anyOf: - type: string format: date-time - type: string format: date - type: 'null' title: Start Date - name: end_date in: query required: false schema: anyOf: - type: string format: date-time - type: string format: date - type: 'null' title: End Date - name: next_token in: query required: false schema: type: string nullable: true title: Next Token responses: '200': description: Successful Response content: application/json: schema: anyOf: - $ref: '#/components/schemas/MultiDocumentResponse_PublicSleepTime_' - $ref: '#/components/schemas/MultiDocumentResponseDict' title: Response Sandbox Multiple Sleep Time Documents V2 Sandbox Usercollection Sleep Time Get '400': description: Client Exception '401': description: Unauthorized access exception. Usually means the access token is expired, malformed or revoked. '403': description: Access forbidden. Usually means the user's subscription to Oura has expired and their data is not available via the API. '429': description: Request Rate Limit Exceeded. '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - BearerAuth: [] - OAuth2: [] x-codeSamples: - lang: cURL label: cURL source: 'curl --location --request GET ''https://api.ouraring.com/v2/sandbox/usercollection/sleep_time?start_date=2021-11-01&end_date=2021-12-01&fields=day,score'' \ --header ''Authorization: Bearer ''' - lang: Python source: "import requests \nurl = 'https://api.ouraring.com/v2/sandbox/usercollection/sleep_time'\ \ \nparams={ \n 'start_date': '2021-11-01', \n 'end_date': '2021-12-01',\n\ \ 'fields': 'day,score' \n}\nheaders = { \n 'Authorization': 'Bearer\ \ ' \n}\nresponse = requests.request('GET', url, headers=headers,\ \ params=params) \nprint(response.text)" label: Python - lang: JavaScript source: "var myHeaders = new Headers(); \nmyHeaders.append('Authorization',\ \ 'Bearer '); \nvar requestOptions = { \n method: 'GET', \n headers:\ \ myHeaders, \n}; \nfetch('https://api.ouraring.com/v2/sandbox/usercollection/sleep_time?start_date=2021-11-01&end_date=2021-12-01&fields=day,score',\ \ requestOptions) \n .then(response => response.text()) \n .then(result\ \ => console.log(result)) \n .catch(error => console.log('error', error));" label: JavaScript - lang: Java source: "OkHttpClient client = new OkHttpClient().newBuilder() \n .build();\ \ \nRequest request = new Request.Builder() \n .url(\"https://api.ouraring.com/v2/sandbox/usercollection/sleep_time?start_date=2021-11-01&end_date=2021-12-01&fields=day,score\"\ ) \n .method(\"GET\", null) \n .addHeader(\"Authorization\", \"Bearer\ \ \") \n .build(); \nResponse response = client.newCall(request).execute();" label: Java /v2/usercollection/rest_mode_period: get: tags: - Rest Mode Period Routes summary: Multiple Rest Mode Period Documents operationId: Multiple_rest_mode_period_Documents_v2_usercollection_rest_mode_period_get parameters: - name: start_date in: query required: false schema: anyOf: - type: string format: date-time - type: string format: date - type: 'null' title: Start Date - name: end_date in: query required: false schema: anyOf: - type: string format: date-time - type: string format: date - type: 'null' title: End Date - name: next_token in: query required: false schema: type: string nullable: true title: Next Token - name: fields in: query required: false schema: type: string nullable: true description: Comma-separated list of fields to include in the response, in addition to the always returned fields. Defaults to all fields if not provided. title: Fields description: Comma-separated list of fields to include in the response, in addition to the always returned fields. Defaults to all fields if not provided. responses: '200': description: Successful Response content: application/json: schema: anyOf: - $ref: '#/components/schemas/MultiDocumentResponse_PublicRestModePeriod_' - $ref: '#/components/schemas/MultiDocumentResponseDict' title: Response Multiple Rest Mode Period Documents V2 Usercollection Rest Mode Period Get '400': description: Client Exception '401': description: Unauthorized access exception. Usually means the access token is expired, malformed or revoked. '403': description: Access forbidden. Usually means the user's subscription to Oura has expired and their data is not available via the API. '429': description: Request Rate Limit Exceeded. '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - BearerAuth: [] - OAuth2: [] x-codeSamples: - lang: cURL label: cURL source: 'curl --location --request GET ''https://api.ouraring.com/v2/usercollection/rest_mode_period?start_date=2021-11-01&end_date=2021-12-01&fields=day,score'' \ --header ''Authorization: Bearer ''' - lang: Python source: "import requests \nurl = 'https://api.ouraring.com/v2/usercollection/rest_mode_period'\ \ \nparams={ \n 'start_date': '2021-11-01', \n 'end_date': '2021-12-01',\n\ \ 'fields': 'day,score' \n}\nheaders = { \n 'Authorization': 'Bearer\ \ ' \n}\nresponse = requests.request('GET', url, headers=headers,\ \ params=params) \nprint(response.text)" label: Python - lang: JavaScript source: "var myHeaders = new Headers(); \nmyHeaders.append('Authorization',\ \ 'Bearer '); \nvar requestOptions = { \n method: 'GET', \n headers:\ \ myHeaders, \n}; \nfetch('https://api.ouraring.com/v2/usercollection/rest_mode_period?start_date=2021-11-01&end_date=2021-12-01&fields=day,score',\ \ requestOptions) \n .then(response => response.text()) \n .then(result\ \ => console.log(result)) \n .catch(error => console.log('error', error));" label: JavaScript - lang: Java source: "OkHttpClient client = new OkHttpClient().newBuilder() \n .build();\ \ \nRequest request = new Request.Builder() \n .url(\"https://api.ouraring.com/v2/usercollection/rest_mode_period?start_date=2021-11-01&end_date=2021-12-01&fields=day,score\"\ ) \n .method(\"GET\", null) \n .addHeader(\"Authorization\", \"Bearer\ \ \") \n .build(); \nResponse response = client.newCall(request).execute();" label: Java /v2/sandbox/usercollection/rest_mode_period: get: tags: - Sandbox Routes summary: Sandbox - Multiple Rest Mode Period Documents operationId: Sandbox___Multiple_rest_mode_period_Documents_v2_sandbox_usercollection_rest_mode_period_get parameters: - name: start_date in: query required: false schema: anyOf: - type: string format: date-time - type: string format: date - type: 'null' title: Start Date - name: end_date in: query required: false schema: anyOf: - type: string format: date-time - type: string format: date - type: 'null' title: End Date - name: next_token in: query required: false schema: type: string nullable: true title: Next Token responses: '200': description: Successful Response content: application/json: schema: anyOf: - $ref: '#/components/schemas/MultiDocumentResponse_PublicRestModePeriod_' - $ref: '#/components/schemas/MultiDocumentResponseDict' title: Response Sandbox Multiple Rest Mode Period Documents V2 Sandbox Usercollection Rest Mode Period Get '400': description: Client Exception '401': description: Unauthorized access exception. Usually means the access token is expired, malformed or revoked. '403': description: Access forbidden. Usually means the user's subscription to Oura has expired and their data is not available via the API. '429': description: Request Rate Limit Exceeded. '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - BearerAuth: [] - OAuth2: [] x-codeSamples: - lang: cURL label: cURL source: 'curl --location --request GET ''https://api.ouraring.com/v2/sandbox/usercollection/rest_mode_period?start_date=2021-11-01&end_date=2021-12-01&fields=day,score'' \ --header ''Authorization: Bearer ''' - lang: Python source: "import requests \nurl = 'https://api.ouraring.com/v2/sandbox/usercollection/rest_mode_period'\ \ \nparams={ \n 'start_date': '2021-11-01', \n 'end_date': '2021-12-01',\n\ \ 'fields': 'day,score' \n}\nheaders = { \n 'Authorization': 'Bearer\ \ ' \n}\nresponse = requests.request('GET', url, headers=headers,\ \ params=params) \nprint(response.text)" label: Python - lang: JavaScript source: "var myHeaders = new Headers(); \nmyHeaders.append('Authorization',\ \ 'Bearer '); \nvar requestOptions = { \n method: 'GET', \n headers:\ \ myHeaders, \n}; \nfetch('https://api.ouraring.com/v2/sandbox/usercollection/rest_mode_period?start_date=2021-11-01&end_date=2021-12-01&fields=day,score',\ \ requestOptions) \n .then(response => response.text()) \n .then(result\ \ => console.log(result)) \n .catch(error => console.log('error', error));" label: JavaScript - lang: Java source: "OkHttpClient client = new OkHttpClient().newBuilder() \n .build();\ \ \nRequest request = new Request.Builder() \n .url(\"https://api.ouraring.com/v2/sandbox/usercollection/rest_mode_period?start_date=2021-11-01&end_date=2021-12-01&fields=day,score\"\ ) \n .method(\"GET\", null) \n .addHeader(\"Authorization\", \"Bearer\ \ \") \n .build(); \nResponse response = client.newCall(request).execute();" label: Java /v2/usercollection/ring_configuration: get: tags: - Ring Configuration Routes summary: Multiple Ring Configuration Documents operationId: Multiple_ring_configuration_Documents_v2_usercollection_ring_configuration_get parameters: - name: fields in: query required: false schema: type: string nullable: true description: Comma-separated list of fields to include in the response, in addition to the always returned fields. Defaults to all fields if not provided. title: Fields description: Comma-separated list of fields to include in the response, in addition to the always returned fields. Defaults to all fields if not provided. - name: next_token in: query required: false schema: type: string nullable: true title: Next Token responses: '200': description: Successful Response content: application/json: schema: anyOf: - $ref: '#/components/schemas/MultiDocumentResponse_PublicRingConfiguration_' - $ref: '#/components/schemas/MultiDocumentResponseDict' title: Response Multiple Ring Configuration Documents V2 Usercollection Ring Configuration Get '400': description: Client Exception '401': description: Unauthorized access exception. Usually means the access token is expired, malformed or revoked. '403': description: Access forbidden. Usually means the user's subscription to Oura has expired and their data is not available via the API. '429': description: Request Rate Limit Exceeded. '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - BearerAuth: [] - OAuth2: [] x-codeSamples: - lang: cURL label: cURL source: 'curl --location --request GET ''https://api.ouraring.com/v2/usercollection/ring_configuration?fields=day,score'' \ --header ''Authorization: Bearer ''' - lang: Python source: "import requests \nurl = 'https://api.ouraring.com/v2/usercollection/ring_configuration'\ \ \nparams = {'fields': 'day,score'}\nheaders = { \n 'Authorization': 'Bearer\ \ ' \n}\nresponse = requests.request('GET', url, headers=headers,\ \ params=params) \nprint(response.text)" label: Python - lang: JavaScript source: "var myHeaders = new Headers(); \nmyHeaders.append('Authorization',\ \ 'Bearer '); \nvar requestOptions = { \n method: 'GET', \n headers:\ \ myHeaders, \n}; \nfetch('https://api.ouraring.com/v2/usercollection/ring_configuration?fields=day,score',\ \ requestOptions) \n .then(response => response.text()) \n .then(result\ \ => console.log(result)) \n .catch(error => console.log('error', error));" label: JavaScript - lang: Java source: "OkHttpClient client = new OkHttpClient().newBuilder() \n .build();\ \ \nRequest request = new Request.Builder() \n .url(\"https://api.ouraring.com/v2/usercollection/ring_configuration?fields=day,score\"\ ) \n .method(\"GET\", null) \n .addHeader(\"Authorization\", \"Bearer\ \ \") \n .build(); \nResponse response = client.newCall(request).execute();" label: Java /v2/sandbox/usercollection/ring_configuration: get: tags: - Sandbox Routes summary: Sandbox - Multiple Ring Configuration Documents operationId: Sandbox___Multiple_ring_configuration_Documents_v2_sandbox_usercollection_ring_configuration_get parameters: - name: next_token in: query required: false schema: type: string nullable: true title: Next Token responses: '200': description: Successful Response content: application/json: schema: anyOf: - $ref: '#/components/schemas/MultiDocumentResponse_PublicRingConfiguration_' - $ref: '#/components/schemas/MultiDocumentResponseDict' title: Response Sandbox Multiple Ring Configuration Documents V2 Sandbox Usercollection Ring Configuration Get '400': description: Client Exception '401': description: Unauthorized access exception. Usually means the access token is expired, malformed or revoked. '403': description: Access forbidden. Usually means the user's subscription to Oura has expired and their data is not available via the API. '429': description: Request Rate Limit Exceeded. '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - BearerAuth: [] - OAuth2: [] x-codeSamples: - lang: cURL label: cURL source: 'curl --location --request GET ''https://api.ouraring.com/v2/sandbox/usercollection/ring_configuration?fields=day,score'' \ --header ''Authorization: Bearer ''' - lang: Python source: "import requests \nurl = 'https://api.ouraring.com/v2/sandbox/usercollection/ring_configuration'\ \ \nparams = {'fields': 'day,score'}\nheaders = { \n 'Authorization': 'Bearer\ \ ' \n}\nresponse = requests.request('GET', url, headers=headers,\ \ params=params) \nprint(response.text)" label: Python - lang: JavaScript source: "var myHeaders = new Headers(); \nmyHeaders.append('Authorization',\ \ 'Bearer '); \nvar requestOptions = { \n method: 'GET', \n headers:\ \ myHeaders, \n}; \nfetch('https://api.ouraring.com/v2/sandbox/usercollection/ring_configuration?fields=day,score',\ \ requestOptions) \n .then(response => response.text()) \n .then(result\ \ => console.log(result)) \n .catch(error => console.log('error', error));" label: JavaScript - lang: Java source: "OkHttpClient client = new OkHttpClient().newBuilder() \n .build();\ \ \nRequest request = new Request.Builder() \n .url(\"https://api.ouraring.com/v2/sandbox/usercollection/ring_configuration?fields=day,score\"\ ) \n .method(\"GET\", null) \n .addHeader(\"Authorization\", \"Bearer\ \ \") \n .build(); \nResponse response = client.newCall(request).execute();" label: Java /v2/usercollection/daily_stress: get: tags: - Daily Stress Routes summary: Multiple Daily Stress Documents operationId: Multiple_daily_stress_Documents_v2_usercollection_daily_stress_get parameters: - name: start_date in: query required: false schema: anyOf: - type: string format: date-time - type: string format: date - type: 'null' title: Start Date - name: end_date in: query required: false schema: anyOf: - type: string format: date-time - type: string format: date - type: 'null' title: End Date - name: next_token in: query required: false schema: type: string nullable: true title: Next Token - name: fields in: query required: false schema: type: string nullable: true description: Comma-separated list of fields to include in the response, in addition to the always returned fields. Defaults to all fields if not provided. title: Fields description: Comma-separated list of fields to include in the response, in addition to the always returned fields. Defaults to all fields if not provided. responses: '200': description: Successful Response content: application/json: schema: anyOf: - $ref: '#/components/schemas/MultiDocumentResponse_PublicDailyStress_' - $ref: '#/components/schemas/MultiDocumentResponseDict' title: Response Multiple Daily Stress Documents V2 Usercollection Daily Stress Get '400': description: Client Exception '401': description: Unauthorized access exception. Usually means the access token is expired, malformed or revoked. '403': description: Access forbidden. Usually means the user's subscription to Oura has expired and their data is not available via the API. '429': description: Request Rate Limit Exceeded. '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - BearerAuth: [] - OAuth2: [] x-codeSamples: - lang: cURL label: cURL source: 'curl --location --request GET ''https://api.ouraring.com/v2/usercollection/daily_stress?start_date=2021-11-01&end_date=2021-12-01&fields=day,score'' \ --header ''Authorization: Bearer ''' - lang: Python source: "import requests \nurl = 'https://api.ouraring.com/v2/usercollection/daily_stress'\ \ \nparams={ \n 'start_date': '2021-11-01', \n 'end_date': '2021-12-01',\n\ \ 'fields': 'day,score' \n}\nheaders = { \n 'Authorization': 'Bearer\ \ ' \n}\nresponse = requests.request('GET', url, headers=headers,\ \ params=params) \nprint(response.text)" label: Python - lang: JavaScript source: "var myHeaders = new Headers(); \nmyHeaders.append('Authorization',\ \ 'Bearer '); \nvar requestOptions = { \n method: 'GET', \n headers:\ \ myHeaders, \n}; \nfetch('https://api.ouraring.com/v2/usercollection/daily_stress?start_date=2021-11-01&end_date=2021-12-01&fields=day,score',\ \ requestOptions) \n .then(response => response.text()) \n .then(result\ \ => console.log(result)) \n .catch(error => console.log('error', error));" label: JavaScript - lang: Java source: "OkHttpClient client = new OkHttpClient().newBuilder() \n .build();\ \ \nRequest request = new Request.Builder() \n .url(\"https://api.ouraring.com/v2/usercollection/daily_stress?start_date=2021-11-01&end_date=2021-12-01&fields=day,score\"\ ) \n .method(\"GET\", null) \n .addHeader(\"Authorization\", \"Bearer\ \ \") \n .build(); \nResponse response = client.newCall(request).execute();" label: Java /v2/sandbox/usercollection/daily_stress: get: tags: - Sandbox Routes summary: Sandbox - Multiple Daily Stress Documents operationId: Sandbox___Multiple_daily_stress_Documents_v2_sandbox_usercollection_daily_stress_get parameters: - name: start_date in: query required: false schema: anyOf: - type: string format: date-time - type: string format: date - type: 'null' title: Start Date - name: end_date in: query required: false schema: anyOf: - type: string format: date-time - type: string format: date - type: 'null' title: End Date - name: next_token in: query required: false schema: type: string nullable: true title: Next Token responses: '200': description: Successful Response content: application/json: schema: anyOf: - $ref: '#/components/schemas/MultiDocumentResponse_PublicDailyStress_' - $ref: '#/components/schemas/MultiDocumentResponseDict' title: Response Sandbox Multiple Daily Stress Documents V2 Sandbox Usercollection Daily Stress Get '400': description: Client Exception '401': description: Unauthorized access exception. Usually means the access token is expired, malformed or revoked. '403': description: Access forbidden. Usually means the user's subscription to Oura has expired and their data is not available via the API. '429': description: Request Rate Limit Exceeded. '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - BearerAuth: [] - OAuth2: [] x-codeSamples: - lang: cURL label: cURL source: 'curl --location --request GET ''https://api.ouraring.com/v2/sandbox/usercollection/daily_stress?start_date=2021-11-01&end_date=2021-12-01&fields=day,score'' \ --header ''Authorization: Bearer ''' - lang: Python source: "import requests \nurl = 'https://api.ouraring.com/v2/sandbox/usercollection/daily_stress'\ \ \nparams={ \n 'start_date': '2021-11-01', \n 'end_date': '2021-12-01',\n\ \ 'fields': 'day,score' \n}\nheaders = { \n 'Authorization': 'Bearer\ \ ' \n}\nresponse = requests.request('GET', url, headers=headers,\ \ params=params) \nprint(response.text)" label: Python - lang: JavaScript source: "var myHeaders = new Headers(); \nmyHeaders.append('Authorization',\ \ 'Bearer '); \nvar requestOptions = { \n method: 'GET', \n headers:\ \ myHeaders, \n}; \nfetch('https://api.ouraring.com/v2/sandbox/usercollection/daily_stress?start_date=2021-11-01&end_date=2021-12-01&fields=day,score',\ \ requestOptions) \n .then(response => response.text()) \n .then(result\ \ => console.log(result)) \n .catch(error => console.log('error', error));" label: JavaScript - lang: Java source: "OkHttpClient client = new OkHttpClient().newBuilder() \n .build();\ \ \nRequest request = new Request.Builder() \n .url(\"https://api.ouraring.com/v2/sandbox/usercollection/daily_stress?start_date=2021-11-01&end_date=2021-12-01&fields=day,score\"\ ) \n .method(\"GET\", null) \n .addHeader(\"Authorization\", \"Bearer\ \ \") \n .build(); \nResponse response = client.newCall(request).execute();" label: Java /v2/usercollection/daily_resilience: get: tags: - Daily Resilience Routes summary: Multiple Daily Resilience Documents operationId: Multiple_daily_resilience_Documents_v2_usercollection_daily_resilience_get parameters: - name: start_date in: query required: false schema: anyOf: - type: string format: date-time - type: string format: date - type: 'null' title: Start Date - name: end_date in: query required: false schema: anyOf: - type: string format: date-time - type: string format: date - type: 'null' title: End Date - name: next_token in: query required: false schema: type: string nullable: true title: Next Token - name: fields in: query required: false schema: type: string nullable: true description: N/A. This route does not support field selection yet, all fields will be returned. title: Fields description: N/A. This route does not support field selection yet, all fields will be returned. responses: '200': description: Successful Response content: application/json: schema: anyOf: - $ref: '#/components/schemas/MultiDocumentResponse_DailyResilienceModel_' - $ref: '#/components/schemas/MultiDocumentResponseDict' title: Response Multiple Daily Resilience Documents V2 Usercollection Daily Resilience Get '400': description: Client Exception '401': description: Unauthorized access exception. Usually means the access token is expired, malformed or revoked. '403': description: Access forbidden. Usually means the user's subscription to Oura has expired and their data is not available via the API. '429': description: Request Rate Limit Exceeded. '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - BearerAuth: [] - OAuth2: [] x-codeSamples: - lang: cURL label: cURL source: 'curl --location --request GET ''https://api.ouraring.com/v2/usercollection/daily_resilience?start_date=2021-11-01&end_date=2021-12-01'' \ --header ''Authorization: Bearer ''' - lang: Python source: "import requests \nurl = 'https://api.ouraring.com/v2/usercollection/daily_resilience'\ \ \nparams={ \n 'start_date': '2021-11-01', \n 'end_date': '2021-12-01'\ \ \n}\nheaders = { \n 'Authorization': 'Bearer ' \n}\nresponse =\ \ requests.request('GET', url, headers=headers, params=params) \nprint(response.text)" label: Python - lang: JavaScript source: "var myHeaders = new Headers(); \nmyHeaders.append('Authorization',\ \ 'Bearer '); \nvar requestOptions = { \n method: 'GET', \n headers:\ \ myHeaders, \n}; \nfetch('https://api.ouraring.com/v2/usercollection/daily_resilience?start_date=2021-11-01&end_date=2021-12-01',\ \ requestOptions) \n .then(response => response.text()) \n .then(result\ \ => console.log(result)) \n .catch(error => console.log('error', error));" label: JavaScript - lang: Java source: "OkHttpClient client = new OkHttpClient().newBuilder() \n .build();\ \ \nRequest request = new Request.Builder() \n .url(\"https://api.ouraring.com/v2/usercollection/daily_resilience?start_date=2021-11-01&end_date=2021-12-01\"\ ) \n .method(\"GET\", null) \n .addHeader(\"Authorization\", \"Bearer\ \ \") \n .build(); \nResponse response = client.newCall(request).execute();" label: Java /v2/sandbox/usercollection/daily_resilience: get: tags: - Sandbox Routes summary: Sandbox - Multiple Daily Resilience Documents operationId: Sandbox___Multiple_daily_resilience_Documents_v2_sandbox_usercollection_daily_resilience_get parameters: - name: start_date in: query required: false schema: anyOf: - type: string format: date-time - type: string format: date - type: 'null' title: Start Date - name: end_date in: query required: false schema: anyOf: - type: string format: date-time - type: string format: date - type: 'null' title: End Date - name: next_token in: query required: false schema: type: string nullable: true title: Next Token responses: '200': description: Successful Response content: application/json: schema: anyOf: - $ref: '#/components/schemas/MultiDocumentResponse_DailyResilienceModel_' - $ref: '#/components/schemas/MultiDocumentResponseDict' title: Response Sandbox Multiple Daily Resilience Documents V2 Sandbox Usercollection Daily Resilience Get '400': description: Client Exception '401': description: Unauthorized access exception. Usually means the access token is expired, malformed or revoked. '403': description: Access forbidden. Usually means the user's subscription to Oura has expired and their data is not available via the API. '429': description: Request Rate Limit Exceeded. '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - BearerAuth: [] - OAuth2: [] x-codeSamples: - lang: cURL label: cURL source: 'curl --location --request GET ''https://api.ouraring.com/v2/sandbox/usercollection/daily_resilience?start_date=2021-11-01&end_date=2021-12-01'' \ --header ''Authorization: Bearer ''' - lang: Python source: "import requests \nurl = 'https://api.ouraring.com/v2/sandbox/usercollection/daily_resilience'\ \ \nparams={ \n 'start_date': '2021-11-01', \n 'end_date': '2021-12-01'\ \ \n}\nheaders = { \n 'Authorization': 'Bearer ' \n}\nresponse =\ \ requests.request('GET', url, headers=headers, params=params) \nprint(response.text)" label: Python - lang: JavaScript source: "var myHeaders = new Headers(); \nmyHeaders.append('Authorization',\ \ 'Bearer '); \nvar requestOptions = { \n method: 'GET', \n headers:\ \ myHeaders, \n}; \nfetch('https://api.ouraring.com/v2/sandbox/usercollection/daily_resilience?start_date=2021-11-01&end_date=2021-12-01',\ \ requestOptions) \n .then(response => response.text()) \n .then(result\ \ => console.log(result)) \n .catch(error => console.log('error', error));" label: JavaScript - lang: Java source: "OkHttpClient client = new OkHttpClient().newBuilder() \n .build();\ \ \nRequest request = new Request.Builder() \n .url(\"https://api.ouraring.com/v2/sandbox/usercollection/daily_resilience?start_date=2021-11-01&end_date=2021-12-01\"\ ) \n .method(\"GET\", null) \n .addHeader(\"Authorization\", \"Bearer\ \ \") \n .build(); \nResponse response = client.newCall(request).execute();" label: Java /v2/usercollection/daily_cardiovascular_age: get: tags: - Daily Cardiovascular Age Routes summary: Multiple Daily Cardiovascular Age Documents operationId: Multiple_daily_cardiovascular_age_Documents_v2_usercollection_daily_cardiovascular_age_get parameters: - name: start_date in: query required: false schema: anyOf: - type: string format: date-time - type: string format: date - type: 'null' title: Start Date - name: end_date in: query required: false schema: anyOf: - type: string format: date-time - type: string format: date - type: 'null' title: End Date - name: next_token in: query required: false schema: type: string nullable: true title: Next Token - name: fields in: query required: false schema: type: string nullable: true description: Comma-separated list of fields to include in the response, in addition to the always returned fields. Defaults to all fields if not provided. title: Fields description: Comma-separated list of fields to include in the response, in addition to the always returned fields. Defaults to all fields if not provided. responses: '200': description: Successful Response content: application/json: schema: anyOf: - $ref: '#/components/schemas/MultiDocumentResponse_PublicDailyCardiovascularAge_' - $ref: '#/components/schemas/MultiDocumentResponseDict' title: Response Multiple Daily Cardiovascular Age Documents V2 Usercollection Daily Cardiovascular Age Get '400': description: Client Exception '401': description: Unauthorized access exception. Usually means the access token is expired, malformed or revoked. '403': description: Access forbidden. Usually means the user's subscription to Oura has expired and their data is not available via the API. '429': description: Request Rate Limit Exceeded. '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - BearerAuth: [] - OAuth2: [] x-codeSamples: - lang: cURL label: cURL source: 'curl --location --request GET ''https://api.ouraring.com/v2/usercollection/daily_cardiovascular_age?start_date=2021-11-01&end_date=2021-12-01&fields=day,score'' \ --header ''Authorization: Bearer ''' - lang: Python source: "import requests \nurl = 'https://api.ouraring.com/v2/usercollection/daily_cardiovascular_age'\ \ \nparams={ \n 'start_date': '2021-11-01', \n 'end_date': '2021-12-01',\n\ \ 'fields': 'day,score' \n}\nheaders = { \n 'Authorization': 'Bearer\ \ ' \n}\nresponse = requests.request('GET', url, headers=headers,\ \ params=params) \nprint(response.text)" label: Python - lang: JavaScript source: "var myHeaders = new Headers(); \nmyHeaders.append('Authorization',\ \ 'Bearer '); \nvar requestOptions = { \n method: 'GET', \n headers:\ \ myHeaders, \n}; \nfetch('https://api.ouraring.com/v2/usercollection/daily_cardiovascular_age?start_date=2021-11-01&end_date=2021-12-01&fields=day,score',\ \ requestOptions) \n .then(response => response.text()) \n .then(result\ \ => console.log(result)) \n .catch(error => console.log('error', error));" label: JavaScript - lang: Java source: "OkHttpClient client = new OkHttpClient().newBuilder() \n .build();\ \ \nRequest request = new Request.Builder() \n .url(\"https://api.ouraring.com/v2/usercollection/daily_cardiovascular_age?start_date=2021-11-01&end_date=2021-12-01&fields=day,score\"\ ) \n .method(\"GET\", null) \n .addHeader(\"Authorization\", \"Bearer\ \ \") \n .build(); \nResponse response = client.newCall(request).execute();" label: Java /v2/sandbox/usercollection/daily_cardiovascular_age: get: tags: - Sandbox Routes summary: Sandbox - Multiple Daily Cardiovascular Age Documents operationId: Sandbox___Multiple_daily_cardiovascular_age_Documents_v2_sandbox_usercollection_daily_cardiovascular_age_get parameters: - name: start_date in: query required: false schema: anyOf: - type: string format: date-time - type: string format: date - type: 'null' title: Start Date - name: end_date in: query required: false schema: anyOf: - type: string format: date-time - type: string format: date - type: 'null' title: End Date - name: next_token in: query required: false schema: type: string nullable: true title: Next Token responses: '200': description: Successful Response content: application/json: schema: anyOf: - $ref: '#/components/schemas/MultiDocumentResponse_PublicDailyCardiovascularAge_' - $ref: '#/components/schemas/MultiDocumentResponseDict' title: Response Sandbox Multiple Daily Cardiovascular Age Documents V2 Sandbox Usercollection Daily Cardiovascular Age Get '400': description: Client Exception '401': description: Unauthorized access exception. Usually means the access token is expired, malformed or revoked. '403': description: Access forbidden. Usually means the user's subscription to Oura has expired and their data is not available via the API. '429': description: Request Rate Limit Exceeded. '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - BearerAuth: [] - OAuth2: [] x-codeSamples: - lang: cURL label: cURL source: 'curl --location --request GET ''https://api.ouraring.com/v2/sandbox/usercollection/daily_cardiovascular_age?start_date=2021-11-01&end_date=2021-12-01&fields=day,score'' \ --header ''Authorization: Bearer ''' - lang: Python source: "import requests \nurl = 'https://api.ouraring.com/v2/sandbox/usercollection/daily_cardiovascular_age'\ \ \nparams={ \n 'start_date': '2021-11-01', \n 'end_date': '2021-12-01',\n\ \ 'fields': 'day,score' \n}\nheaders = { \n 'Authorization': 'Bearer\ \ ' \n}\nresponse = requests.request('GET', url, headers=headers,\ \ params=params) \nprint(response.text)" label: Python - lang: JavaScript source: "var myHeaders = new Headers(); \nmyHeaders.append('Authorization',\ \ 'Bearer '); \nvar requestOptions = { \n method: 'GET', \n headers:\ \ myHeaders, \n}; \nfetch('https://api.ouraring.com/v2/sandbox/usercollection/daily_cardiovascular_age?start_date=2021-11-01&end_date=2021-12-01&fields=day,score',\ \ requestOptions) \n .then(response => response.text()) \n .then(result\ \ => console.log(result)) \n .catch(error => console.log('error', error));" label: JavaScript - lang: Java source: "OkHttpClient client = new OkHttpClient().newBuilder() \n .build();\ \ \nRequest request = new Request.Builder() \n .url(\"https://api.ouraring.com/v2/sandbox/usercollection/daily_cardiovascular_age?start_date=2021-11-01&end_date=2021-12-01&fields=day,score\"\ ) \n .method(\"GET\", null) \n .addHeader(\"Authorization\", \"Bearer\ \ \") \n .build(); \nResponse response = client.newCall(request).execute();" label: Java /v2/usercollection/vO2_max: get: tags: - VO2 Max Routes summary: Multiple Vo2 Max Documents operationId: Multiple_vO2_max_Documents_v2_usercollection_vO2_max_get parameters: - name: start_date in: query required: false schema: anyOf: - type: string format: date-time - type: string format: date - type: 'null' title: Start Date - name: end_date in: query required: false schema: anyOf: - type: string format: date-time - type: string format: date - type: 'null' title: End Date - name: next_token in: query required: false schema: type: string nullable: true title: Next Token - name: fields in: query required: false schema: type: string nullable: true description: Comma-separated list of fields to include in the response, in addition to the always returned fields. Defaults to all fields if not provided. title: Fields description: Comma-separated list of fields to include in the response, in addition to the always returned fields. Defaults to all fields if not provided. responses: '200': description: Successful Response content: application/json: schema: anyOf: - $ref: '#/components/schemas/MultiDocumentResponse_PublicVO2Max_' - $ref: '#/components/schemas/MultiDocumentResponseDict' title: Response Multiple Vo2 Max Documents V2 Usercollection Vo2 Max Get '400': description: Client Exception '401': description: Unauthorized access exception. Usually means the access token is expired, malformed or revoked. '403': description: Access forbidden. Usually means the user's subscription to Oura has expired and their data is not available via the API. '429': description: Request Rate Limit Exceeded. '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - BearerAuth: [] - OAuth2: [] x-codeSamples: - lang: cURL label: cURL source: 'curl --location --request GET ''https://api.ouraring.com/v2/usercollection/vO2_max?start_date=2021-11-01&end_date=2021-12-01&fields=day,score'' \ --header ''Authorization: Bearer ''' - lang: Python source: "import requests \nurl = 'https://api.ouraring.com/v2/usercollection/vO2_max'\ \ \nparams={ \n 'start_date': '2021-11-01', \n 'end_date': '2021-12-01',\n\ \ 'fields': 'day,score' \n}\nheaders = { \n 'Authorization': 'Bearer\ \ ' \n}\nresponse = requests.request('GET', url, headers=headers,\ \ params=params) \nprint(response.text)" label: Python - lang: JavaScript source: "var myHeaders = new Headers(); \nmyHeaders.append('Authorization',\ \ 'Bearer '); \nvar requestOptions = { \n method: 'GET', \n headers:\ \ myHeaders, \n}; \nfetch('https://api.ouraring.com/v2/usercollection/vO2_max?start_date=2021-11-01&end_date=2021-12-01&fields=day,score',\ \ requestOptions) \n .then(response => response.text()) \n .then(result\ \ => console.log(result)) \n .catch(error => console.log('error', error));" label: JavaScript - lang: Java source: "OkHttpClient client = new OkHttpClient().newBuilder() \n .build();\ \ \nRequest request = new Request.Builder() \n .url(\"https://api.ouraring.com/v2/usercollection/vO2_max?start_date=2021-11-01&end_date=2021-12-01&fields=day,score\"\ ) \n .method(\"GET\", null) \n .addHeader(\"Authorization\", \"Bearer\ \ \") \n .build(); \nResponse response = client.newCall(request).execute();" label: Java /v2/sandbox/usercollection/vO2_max: get: tags: - Sandbox Routes summary: Sandbox - Multiple Vo2 Max Documents operationId: Sandbox___Multiple_vO2_max_Documents_v2_sandbox_usercollection_vO2_max_get parameters: - name: start_date in: query required: false schema: anyOf: - type: string format: date-time - type: string format: date - type: 'null' title: Start Date - name: end_date in: query required: false schema: anyOf: - type: string format: date-time - type: string format: date - type: 'null' title: End Date - name: next_token in: query required: false schema: type: string nullable: true title: Next Token responses: '200': description: Successful Response content: application/json: schema: anyOf: - $ref: '#/components/schemas/MultiDocumentResponse_PublicVO2Max_' - $ref: '#/components/schemas/MultiDocumentResponseDict' title: Response Sandbox Multiple Vo2 Max Documents V2 Sandbox Usercollection Vo2 Max Get '400': description: Client Exception '401': description: Unauthorized access exception. Usually means the access token is expired, malformed or revoked. '403': description: Access forbidden. Usually means the user's subscription to Oura has expired and their data is not available via the API. '429': description: Request Rate Limit Exceeded. '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - BearerAuth: [] - OAuth2: [] x-codeSamples: - lang: cURL label: cURL source: 'curl --location --request GET ''https://api.ouraring.com/v2/sandbox/usercollection/vO2_max?start_date=2021-11-01&end_date=2021-12-01&fields=day,score'' \ --header ''Authorization: Bearer ''' - lang: Python source: "import requests \nurl = 'https://api.ouraring.com/v2/sandbox/usercollection/vO2_max'\ \ \nparams={ \n 'start_date': '2021-11-01', \n 'end_date': '2021-12-01',\n\ \ 'fields': 'day,score' \n}\nheaders = { \n 'Authorization': 'Bearer\ \ ' \n}\nresponse = requests.request('GET', url, headers=headers,\ \ params=params) \nprint(response.text)" label: Python - lang: JavaScript source: "var myHeaders = new Headers(); \nmyHeaders.append('Authorization',\ \ 'Bearer '); \nvar requestOptions = { \n method: 'GET', \n headers:\ \ myHeaders, \n}; \nfetch('https://api.ouraring.com/v2/sandbox/usercollection/vO2_max?start_date=2021-11-01&end_date=2021-12-01&fields=day,score',\ \ requestOptions) \n .then(response => response.text()) \n .then(result\ \ => console.log(result)) \n .catch(error => console.log('error', error));" label: JavaScript - lang: Java source: "OkHttpClient client = new OkHttpClient().newBuilder() \n .build();\ \ \nRequest request = new Request.Builder() \n .url(\"https://api.ouraring.com/v2/sandbox/usercollection/vO2_max?start_date=2021-11-01&end_date=2021-12-01&fields=day,score\"\ ) \n .method(\"GET\", null) \n .addHeader(\"Authorization\", \"Bearer\ \ \") \n .build(); \nResponse response = client.newCall(request).execute();" label: Java /v2/usercollection/tag/{document_id}: get: tags: - Tag Routes summary: Single Tag Document operationId: Single_tag_Document_v2_usercollection_tag__document_id__get parameters: - name: document_id in: path required: true schema: type: string title: Document Id responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/TagModel' '404': description: Not Found '400': description: Client Exception '401': description: Unauthorized access exception. Usually means the access token is expired, malformed or revoked. '403': description: Access forbidden. Usually means the user's subscription to Oura has expired and their data is not available via the API. '429': description: Request Rate Limit Exceeded. '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - BearerAuth: [] - OAuth2: [] x-codeSamples: - lang: cURL label: cURL source: 'curl --location --request GET ''https://api.ouraring.com/v2/usercollection/tag/2-5daccc095220cc5493a4e9c2b681ca941e'' \ --header ''Authorization: Bearer ''' - lang: Python source: "import requests \nurl = 'https://api.ouraring.com/v2/usercollection/tag/2-5daccc095220cc5493a4e9c2b681ca941e'\ \ \nheaders = { \n 'Authorization': 'Bearer ' \n}\nresponse = requests.request('GET',\ \ url, headers=headers, params=params) \nprint(response.text)" label: Python - lang: JavaScript source: "var myHeaders = new Headers(); \nmyHeaders.append('Authorization',\ \ 'Bearer '); \nvar requestOptions = { \n method: 'GET', \n headers:\ \ myHeaders, \n}; \nfetch('https://api.ouraring.com/v2/usercollection/tag/2-5daccc095220cc5493a4e9c2b681ca941e',\ \ requestOptions) \n .then(response => response.text()) \n .then(result\ \ => console.log(result)) \n .catch(error => console.log('error', error));" label: JavaScript - lang: Java source: "OkHttpClient client = new OkHttpClient().newBuilder() \n .build();\ \ \nRequest request = new Request.Builder() \n .url(\"https://api.ouraring.com/v2/usercollection/tag/2-5daccc095220cc5493a4e9c2b681ca941e\"\ ) \n .method(\"GET\", null) \n .addHeader(\"Authorization\", \"Bearer\ \ \") \n .build(); \nResponse response = client.newCall(request).execute();" label: Java /v2/sandbox/usercollection/tag/{document_id}: get: tags: - Sandbox Routes summary: Sandbox - Single Tag Document operationId: Sandbox___Single_tag_Document_v2_sandbox_usercollection_tag__document_id__get parameters: - name: document_id in: path required: true schema: type: string title: Document Id responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/TagModel' '404': description: Not Found '400': description: Client Exception '401': description: Unauthorized access exception. Usually means the access token is expired, malformed or revoked. '403': description: Access forbidden. Usually means the user's subscription to Oura has expired and their data is not available via the API. '429': description: Request Rate Limit Exceeded. '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - BearerAuth: [] - OAuth2: [] x-codeSamples: - lang: cURL label: cURL source: 'curl --location --request GET ''https://api.ouraring.com/v2/sandbox/usercollection/tag/2-5daccc095220cc5493a4e9c2b681ca941e'' \ --header ''Authorization: Bearer ''' - lang: Python source: "import requests \nurl = 'https://api.ouraring.com/v2/sandbox/usercollection/tag/2-5daccc095220cc5493a4e9c2b681ca941e'\ \ \nheaders = { \n 'Authorization': 'Bearer ' \n}\nresponse = requests.request('GET',\ \ url, headers=headers, params=params) \nprint(response.text)" label: Python - lang: JavaScript source: "var myHeaders = new Headers(); \nmyHeaders.append('Authorization',\ \ 'Bearer '); \nvar requestOptions = { \n method: 'GET', \n headers:\ \ myHeaders, \n}; \nfetch('https://api.ouraring.com/v2/sandbox/usercollection/tag/2-5daccc095220cc5493a4e9c2b681ca941e',\ \ requestOptions) \n .then(response => response.text()) \n .then(result\ \ => console.log(result)) \n .catch(error => console.log('error', error));" label: JavaScript - lang: Java source: "OkHttpClient client = new OkHttpClient().newBuilder() \n .build();\ \ \nRequest request = new Request.Builder() \n .url(\"https://api.ouraring.com/v2/sandbox/usercollection/tag/2-5daccc095220cc5493a4e9c2b681ca941e\"\ ) \n .method(\"GET\", null) \n .addHeader(\"Authorization\", \"Bearer\ \ \") \n .build(); \nResponse response = client.newCall(request).execute();" label: Java /v2/usercollection/enhanced_tag/{document_id}: get: tags: - Enhanced Tag Routes summary: Single Enhanced Tag Document operationId: Single_enhanced_tag_Document_v2_usercollection_enhanced_tag__document_id__get parameters: - name: document_id in: path required: true schema: type: string title: Document Id responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/EnhancedTagModel' '404': description: Not Found '400': description: Client Exception '401': description: Unauthorized access exception. Usually means the access token is expired, malformed or revoked. '403': description: Access forbidden. Usually means the user's subscription to Oura has expired and their data is not available via the API. '429': description: Request Rate Limit Exceeded. '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - BearerAuth: [] - OAuth2: [] x-codeSamples: - lang: cURL label: cURL source: 'curl --location --request GET ''https://api.ouraring.com/v2/usercollection/enhanced_tag/2-5daccc095220cc5493a4e9c2b681ca941e'' \ --header ''Authorization: Bearer ''' - lang: Python source: "import requests \nurl = 'https://api.ouraring.com/v2/usercollection/enhanced_tag/2-5daccc095220cc5493a4e9c2b681ca941e'\ \ \nheaders = { \n 'Authorization': 'Bearer ' \n}\nresponse = requests.request('GET',\ \ url, headers=headers, params=params) \nprint(response.text)" label: Python - lang: JavaScript source: "var myHeaders = new Headers(); \nmyHeaders.append('Authorization',\ \ 'Bearer '); \nvar requestOptions = { \n method: 'GET', \n headers:\ \ myHeaders, \n}; \nfetch('https://api.ouraring.com/v2/usercollection/enhanced_tag/2-5daccc095220cc5493a4e9c2b681ca941e',\ \ requestOptions) \n .then(response => response.text()) \n .then(result\ \ => console.log(result)) \n .catch(error => console.log('error', error));" label: JavaScript - lang: Java source: "OkHttpClient client = new OkHttpClient().newBuilder() \n .build();\ \ \nRequest request = new Request.Builder() \n .url(\"https://api.ouraring.com/v2/usercollection/enhanced_tag/2-5daccc095220cc5493a4e9c2b681ca941e\"\ ) \n .method(\"GET\", null) \n .addHeader(\"Authorization\", \"Bearer\ \ \") \n .build(); \nResponse response = client.newCall(request).execute();" label: Java /v2/sandbox/usercollection/enhanced_tag/{document_id}: get: tags: - Sandbox Routes summary: Sandbox - Single Enhanced Tag Document operationId: Sandbox___Single_enhanced_tag_Document_v2_sandbox_usercollection_enhanced_tag__document_id__get parameters: - name: document_id in: path required: true schema: type: string title: Document Id responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/EnhancedTagModel' '404': description: Not Found '400': description: Client Exception '401': description: Unauthorized access exception. Usually means the access token is expired, malformed or revoked. '403': description: Access forbidden. Usually means the user's subscription to Oura has expired and their data is not available via the API. '429': description: Request Rate Limit Exceeded. '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - BearerAuth: [] - OAuth2: [] x-codeSamples: - lang: cURL label: cURL source: 'curl --location --request GET ''https://api.ouraring.com/v2/sandbox/usercollection/enhanced_tag/2-5daccc095220cc5493a4e9c2b681ca941e'' \ --header ''Authorization: Bearer ''' - lang: Python source: "import requests \nurl = 'https://api.ouraring.com/v2/sandbox/usercollection/enhanced_tag/2-5daccc095220cc5493a4e9c2b681ca941e'\ \ \nheaders = { \n 'Authorization': 'Bearer ' \n}\nresponse = requests.request('GET',\ \ url, headers=headers, params=params) \nprint(response.text)" label: Python - lang: JavaScript source: "var myHeaders = new Headers(); \nmyHeaders.append('Authorization',\ \ 'Bearer '); \nvar requestOptions = { \n method: 'GET', \n headers:\ \ myHeaders, \n}; \nfetch('https://api.ouraring.com/v2/sandbox/usercollection/enhanced_tag/2-5daccc095220cc5493a4e9c2b681ca941e',\ \ requestOptions) \n .then(response => response.text()) \n .then(result\ \ => console.log(result)) \n .catch(error => console.log('error', error));" label: JavaScript - lang: Java source: "OkHttpClient client = new OkHttpClient().newBuilder() \n .build();\ \ \nRequest request = new Request.Builder() \n .url(\"https://api.ouraring.com/v2/sandbox/usercollection/enhanced_tag/2-5daccc095220cc5493a4e9c2b681ca941e\"\ ) \n .method(\"GET\", null) \n .addHeader(\"Authorization\", \"Bearer\ \ \") \n .build(); \nResponse response = client.newCall(request).execute();" label: Java /v2/usercollection/workout/{document_id}: get: tags: - Workout Routes summary: Single Workout Document operationId: Single_workout_Document_v2_usercollection_workout__document_id__get parameters: - name: document_id in: path required: true schema: type: string title: Document Id responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/PublicWorkout' '404': description: Not Found '400': description: Client Exception '401': description: Unauthorized access exception. Usually means the access token is expired, malformed or revoked. '403': description: Access forbidden. Usually means the user's subscription to Oura has expired and their data is not available via the API. '429': description: Request Rate Limit Exceeded. '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - BearerAuth: [] - OAuth2: [] x-codeSamples: - lang: cURL label: cURL source: 'curl --location --request GET ''https://api.ouraring.com/v2/usercollection/workout/2-5daccc095220cc5493a4e9c2b681ca941e'' \ --header ''Authorization: Bearer ''' - lang: Python source: "import requests \nurl = 'https://api.ouraring.com/v2/usercollection/workout/2-5daccc095220cc5493a4e9c2b681ca941e'\ \ \nheaders = { \n 'Authorization': 'Bearer ' \n}\nresponse = requests.request('GET',\ \ url, headers=headers, params=params) \nprint(response.text)" label: Python - lang: JavaScript source: "var myHeaders = new Headers(); \nmyHeaders.append('Authorization',\ \ 'Bearer '); \nvar requestOptions = { \n method: 'GET', \n headers:\ \ myHeaders, \n}; \nfetch('https://api.ouraring.com/v2/usercollection/workout/2-5daccc095220cc5493a4e9c2b681ca941e',\ \ requestOptions) \n .then(response => response.text()) \n .then(result\ \ => console.log(result)) \n .catch(error => console.log('error', error));" label: JavaScript - lang: Java source: "OkHttpClient client = new OkHttpClient().newBuilder() \n .build();\ \ \nRequest request = new Request.Builder() \n .url(\"https://api.ouraring.com/v2/usercollection/workout/2-5daccc095220cc5493a4e9c2b681ca941e\"\ ) \n .method(\"GET\", null) \n .addHeader(\"Authorization\", \"Bearer\ \ \") \n .build(); \nResponse response = client.newCall(request).execute();" label: Java /v2/sandbox/usercollection/workout/{document_id}: get: tags: - Sandbox Routes summary: Sandbox - Single Workout Document operationId: Sandbox___Single_workout_Document_v2_sandbox_usercollection_workout__document_id__get parameters: - name: document_id in: path required: true schema: type: string title: Document Id responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/PublicWorkout' '404': description: Not Found '400': description: Client Exception '401': description: Unauthorized access exception. Usually means the access token is expired, malformed or revoked. '403': description: Access forbidden. Usually means the user's subscription to Oura has expired and their data is not available via the API. '429': description: Request Rate Limit Exceeded. '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - BearerAuth: [] - OAuth2: [] x-codeSamples: - lang: cURL label: cURL source: 'curl --location --request GET ''https://api.ouraring.com/v2/sandbox/usercollection/workout/2-5daccc095220cc5493a4e9c2b681ca941e'' \ --header ''Authorization: Bearer ''' - lang: Python source: "import requests \nurl = 'https://api.ouraring.com/v2/sandbox/usercollection/workout/2-5daccc095220cc5493a4e9c2b681ca941e'\ \ \nheaders = { \n 'Authorization': 'Bearer ' \n}\nresponse = requests.request('GET',\ \ url, headers=headers, params=params) \nprint(response.text)" label: Python - lang: JavaScript source: "var myHeaders = new Headers(); \nmyHeaders.append('Authorization',\ \ 'Bearer '); \nvar requestOptions = { \n method: 'GET', \n headers:\ \ myHeaders, \n}; \nfetch('https://api.ouraring.com/v2/sandbox/usercollection/workout/2-5daccc095220cc5493a4e9c2b681ca941e',\ \ requestOptions) \n .then(response => response.text()) \n .then(result\ \ => console.log(result)) \n .catch(error => console.log('error', error));" label: JavaScript - lang: Java source: "OkHttpClient client = new OkHttpClient().newBuilder() \n .build();\ \ \nRequest request = new Request.Builder() \n .url(\"https://api.ouraring.com/v2/sandbox/usercollection/workout/2-5daccc095220cc5493a4e9c2b681ca941e\"\ ) \n .method(\"GET\", null) \n .addHeader(\"Authorization\", \"Bearer\ \ \") \n .build(); \nResponse response = client.newCall(request).execute();" label: Java /v2/usercollection/session/{document_id}: get: tags: - Session Routes summary: Single Session Document operationId: Single_session_Document_v2_usercollection_session__document_id__get parameters: - name: document_id in: path required: true schema: type: string title: Document Id responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/PublicSession' '404': description: Not Found '400': description: Client Exception '401': description: Unauthorized access exception. Usually means the access token is expired, malformed or revoked. '403': description: Access forbidden. Usually means the user's subscription to Oura has expired and their data is not available via the API. '429': description: Request Rate Limit Exceeded. '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - BearerAuth: [] - OAuth2: [] x-codeSamples: - lang: cURL label: cURL source: 'curl --location --request GET ''https://api.ouraring.com/v2/usercollection/session/2-5daccc095220cc5493a4e9c2b681ca941e'' \ --header ''Authorization: Bearer ''' - lang: Python source: "import requests \nurl = 'https://api.ouraring.com/v2/usercollection/session/2-5daccc095220cc5493a4e9c2b681ca941e'\ \ \nheaders = { \n 'Authorization': 'Bearer ' \n}\nresponse = requests.request('GET',\ \ url, headers=headers, params=params) \nprint(response.text)" label: Python - lang: JavaScript source: "var myHeaders = new Headers(); \nmyHeaders.append('Authorization',\ \ 'Bearer '); \nvar requestOptions = { \n method: 'GET', \n headers:\ \ myHeaders, \n}; \nfetch('https://api.ouraring.com/v2/usercollection/session/2-5daccc095220cc5493a4e9c2b681ca941e',\ \ requestOptions) \n .then(response => response.text()) \n .then(result\ \ => console.log(result)) \n .catch(error => console.log('error', error));" label: JavaScript - lang: Java source: "OkHttpClient client = new OkHttpClient().newBuilder() \n .build();\ \ \nRequest request = new Request.Builder() \n .url(\"https://api.ouraring.com/v2/usercollection/session/2-5daccc095220cc5493a4e9c2b681ca941e\"\ ) \n .method(\"GET\", null) \n .addHeader(\"Authorization\", \"Bearer\ \ \") \n .build(); \nResponse response = client.newCall(request).execute();" label: Java /v2/sandbox/usercollection/session/{document_id}: get: tags: - Sandbox Routes summary: Sandbox - Single Session Document operationId: Sandbox___Single_session_Document_v2_sandbox_usercollection_session__document_id__get parameters: - name: document_id in: path required: true schema: type: string title: Document Id responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/PublicSession' '404': description: Not Found '400': description: Client Exception '401': description: Unauthorized access exception. Usually means the access token is expired, malformed or revoked. '403': description: Access forbidden. Usually means the user's subscription to Oura has expired and their data is not available via the API. '429': description: Request Rate Limit Exceeded. '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - BearerAuth: [] - OAuth2: [] x-codeSamples: - lang: cURL label: cURL source: 'curl --location --request GET ''https://api.ouraring.com/v2/sandbox/usercollection/session/2-5daccc095220cc5493a4e9c2b681ca941e'' \ --header ''Authorization: Bearer ''' - lang: Python source: "import requests \nurl = 'https://api.ouraring.com/v2/sandbox/usercollection/session/2-5daccc095220cc5493a4e9c2b681ca941e'\ \ \nheaders = { \n 'Authorization': 'Bearer ' \n}\nresponse = requests.request('GET',\ \ url, headers=headers, params=params) \nprint(response.text)" label: Python - lang: JavaScript source: "var myHeaders = new Headers(); \nmyHeaders.append('Authorization',\ \ 'Bearer '); \nvar requestOptions = { \n method: 'GET', \n headers:\ \ myHeaders, \n}; \nfetch('https://api.ouraring.com/v2/sandbox/usercollection/session/2-5daccc095220cc5493a4e9c2b681ca941e',\ \ requestOptions) \n .then(response => response.text()) \n .then(result\ \ => console.log(result)) \n .catch(error => console.log('error', error));" label: JavaScript - lang: Java source: "OkHttpClient client = new OkHttpClient().newBuilder() \n .build();\ \ \nRequest request = new Request.Builder() \n .url(\"https://api.ouraring.com/v2/sandbox/usercollection/session/2-5daccc095220cc5493a4e9c2b681ca941e\"\ ) \n .method(\"GET\", null) \n .addHeader(\"Authorization\", \"Bearer\ \ \") \n .build(); \nResponse response = client.newCall(request).execute();" label: Java /v2/usercollection/daily_activity/{document_id}: get: tags: - Daily Activity Routes summary: Single Daily Activity Document operationId: Single_daily_activity_Document_v2_usercollection_daily_activity__document_id__get parameters: - name: document_id in: path required: true schema: type: string title: Document Id responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/PublicDailyActivity' '404': description: Not Found '400': description: Client Exception '401': description: Unauthorized access exception. Usually means the access token is expired, malformed or revoked. '403': description: Access forbidden. Usually means the user's subscription to Oura has expired and their data is not available via the API. '429': description: Request Rate Limit Exceeded. '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - BearerAuth: [] - OAuth2: [] x-codeSamples: - lang: cURL label: cURL source: 'curl --location --request GET ''https://api.ouraring.com/v2/usercollection/daily_activity/2-5daccc095220cc5493a4e9c2b681ca941e'' \ --header ''Authorization: Bearer ''' - lang: Python source: "import requests \nurl = 'https://api.ouraring.com/v2/usercollection/daily_activity/2-5daccc095220cc5493a4e9c2b681ca941e'\ \ \nheaders = { \n 'Authorization': 'Bearer ' \n}\nresponse = requests.request('GET',\ \ url, headers=headers, params=params) \nprint(response.text)" label: Python - lang: JavaScript source: "var myHeaders = new Headers(); \nmyHeaders.append('Authorization',\ \ 'Bearer '); \nvar requestOptions = { \n method: 'GET', \n headers:\ \ myHeaders, \n}; \nfetch('https://api.ouraring.com/v2/usercollection/daily_activity/2-5daccc095220cc5493a4e9c2b681ca941e',\ \ requestOptions) \n .then(response => response.text()) \n .then(result\ \ => console.log(result)) \n .catch(error => console.log('error', error));" label: JavaScript - lang: Java source: "OkHttpClient client = new OkHttpClient().newBuilder() \n .build();\ \ \nRequest request = new Request.Builder() \n .url(\"https://api.ouraring.com/v2/usercollection/daily_activity/2-5daccc095220cc5493a4e9c2b681ca941e\"\ ) \n .method(\"GET\", null) \n .addHeader(\"Authorization\", \"Bearer\ \ \") \n .build(); \nResponse response = client.newCall(request).execute();" label: Java /v2/sandbox/usercollection/daily_activity/{document_id}: get: tags: - Sandbox Routes summary: Sandbox - Single Daily Activity Document operationId: Sandbox___Single_daily_activity_Document_v2_sandbox_usercollection_daily_activity__document_id__get parameters: - name: document_id in: path required: true schema: type: string title: Document Id responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/PublicDailyActivity' '404': description: Not Found '400': description: Client Exception '401': description: Unauthorized access exception. Usually means the access token is expired, malformed or revoked. '403': description: Access forbidden. Usually means the user's subscription to Oura has expired and their data is not available via the API. '429': description: Request Rate Limit Exceeded. '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - BearerAuth: [] - OAuth2: [] x-codeSamples: - lang: cURL label: cURL source: 'curl --location --request GET ''https://api.ouraring.com/v2/sandbox/usercollection/daily_activity/2-5daccc095220cc5493a4e9c2b681ca941e'' \ --header ''Authorization: Bearer ''' - lang: Python source: "import requests \nurl = 'https://api.ouraring.com/v2/sandbox/usercollection/daily_activity/2-5daccc095220cc5493a4e9c2b681ca941e'\ \ \nheaders = { \n 'Authorization': 'Bearer ' \n}\nresponse = requests.request('GET',\ \ url, headers=headers, params=params) \nprint(response.text)" label: Python - lang: JavaScript source: "var myHeaders = new Headers(); \nmyHeaders.append('Authorization',\ \ 'Bearer '); \nvar requestOptions = { \n method: 'GET', \n headers:\ \ myHeaders, \n}; \nfetch('https://api.ouraring.com/v2/sandbox/usercollection/daily_activity/2-5daccc095220cc5493a4e9c2b681ca941e',\ \ requestOptions) \n .then(response => response.text()) \n .then(result\ \ => console.log(result)) \n .catch(error => console.log('error', error));" label: JavaScript - lang: Java source: "OkHttpClient client = new OkHttpClient().newBuilder() \n .build();\ \ \nRequest request = new Request.Builder() \n .url(\"https://api.ouraring.com/v2/sandbox/usercollection/daily_activity/2-5daccc095220cc5493a4e9c2b681ca941e\"\ ) \n .method(\"GET\", null) \n .addHeader(\"Authorization\", \"Bearer\ \ \") \n .build(); \nResponse response = client.newCall(request).execute();" label: Java /v2/usercollection/daily_sleep/{document_id}: get: tags: - Daily Sleep Routes summary: Single Daily Sleep Document operationId: Single_daily_sleep_Document_v2_usercollection_daily_sleep__document_id__get parameters: - name: document_id in: path required: true schema: type: string title: Document Id responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/PublicDailySleep' '404': description: Not Found '400': description: Client Exception '401': description: Unauthorized access exception. Usually means the access token is expired, malformed or revoked. '403': description: Access forbidden. Usually means the user's subscription to Oura has expired and their data is not available via the API. '429': description: Request Rate Limit Exceeded. '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - BearerAuth: [] - OAuth2: [] x-codeSamples: - lang: cURL label: cURL source: 'curl --location --request GET ''https://api.ouraring.com/v2/usercollection/daily_sleep/2-5daccc095220cc5493a4e9c2b681ca941e'' \ --header ''Authorization: Bearer ''' - lang: Python source: "import requests \nurl = 'https://api.ouraring.com/v2/usercollection/daily_sleep/2-5daccc095220cc5493a4e9c2b681ca941e'\ \ \nheaders = { \n 'Authorization': 'Bearer ' \n}\nresponse = requests.request('GET',\ \ url, headers=headers, params=params) \nprint(response.text)" label: Python - lang: JavaScript source: "var myHeaders = new Headers(); \nmyHeaders.append('Authorization',\ \ 'Bearer '); \nvar requestOptions = { \n method: 'GET', \n headers:\ \ myHeaders, \n}; \nfetch('https://api.ouraring.com/v2/usercollection/daily_sleep/2-5daccc095220cc5493a4e9c2b681ca941e',\ \ requestOptions) \n .then(response => response.text()) \n .then(result\ \ => console.log(result)) \n .catch(error => console.log('error', error));" label: JavaScript - lang: Java source: "OkHttpClient client = new OkHttpClient().newBuilder() \n .build();\ \ \nRequest request = new Request.Builder() \n .url(\"https://api.ouraring.com/v2/usercollection/daily_sleep/2-5daccc095220cc5493a4e9c2b681ca941e\"\ ) \n .method(\"GET\", null) \n .addHeader(\"Authorization\", \"Bearer\ \ \") \n .build(); \nResponse response = client.newCall(request).execute();" label: Java /v2/sandbox/usercollection/daily_sleep/{document_id}: get: tags: - Sandbox Routes summary: Sandbox - Single Daily Sleep Document operationId: Sandbox___Single_daily_sleep_Document_v2_sandbox_usercollection_daily_sleep__document_id__get parameters: - name: document_id in: path required: true schema: type: string title: Document Id responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/PublicDailySleep' '404': description: Not Found '400': description: Client Exception '401': description: Unauthorized access exception. Usually means the access token is expired, malformed or revoked. '403': description: Access forbidden. Usually means the user's subscription to Oura has expired and their data is not available via the API. '429': description: Request Rate Limit Exceeded. '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - BearerAuth: [] - OAuth2: [] x-codeSamples: - lang: cURL label: cURL source: 'curl --location --request GET ''https://api.ouraring.com/v2/sandbox/usercollection/daily_sleep/2-5daccc095220cc5493a4e9c2b681ca941e'' \ --header ''Authorization: Bearer ''' - lang: Python source: "import requests \nurl = 'https://api.ouraring.com/v2/sandbox/usercollection/daily_sleep/2-5daccc095220cc5493a4e9c2b681ca941e'\ \ \nheaders = { \n 'Authorization': 'Bearer ' \n}\nresponse = requests.request('GET',\ \ url, headers=headers, params=params) \nprint(response.text)" label: Python - lang: JavaScript source: "var myHeaders = new Headers(); \nmyHeaders.append('Authorization',\ \ 'Bearer '); \nvar requestOptions = { \n method: 'GET', \n headers:\ \ myHeaders, \n}; \nfetch('https://api.ouraring.com/v2/sandbox/usercollection/daily_sleep/2-5daccc095220cc5493a4e9c2b681ca941e',\ \ requestOptions) \n .then(response => response.text()) \n .then(result\ \ => console.log(result)) \n .catch(error => console.log('error', error));" label: JavaScript - lang: Java source: "OkHttpClient client = new OkHttpClient().newBuilder() \n .build();\ \ \nRequest request = new Request.Builder() \n .url(\"https://api.ouraring.com/v2/sandbox/usercollection/daily_sleep/2-5daccc095220cc5493a4e9c2b681ca941e\"\ ) \n .method(\"GET\", null) \n .addHeader(\"Authorization\", \"Bearer\ \ \") \n .build(); \nResponse response = client.newCall(request).execute();" label: Java /v2/usercollection/daily_spo2/{document_id}: get: tags: - Daily Spo2 Routes summary: Single Daily Spo2 Document operationId: Single_daily_spo2_Document_v2_usercollection_daily_spo2__document_id__get parameters: - name: document_id in: path required: true schema: type: string title: Document Id responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/PublicDailySpO2' '404': description: Not Found '400': description: Client Exception '401': description: Unauthorized access exception. Usually means the access token is expired, malformed or revoked. '403': description: Access forbidden. Usually means the user's subscription to Oura has expired and their data is not available via the API. '429': description: Request Rate Limit Exceeded. '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - BearerAuth: [] - OAuth2: [] x-codeSamples: - lang: cURL label: cURL source: 'curl --location --request GET ''https://api.ouraring.com/v2/usercollection/daily_spo2/2-5daccc095220cc5493a4e9c2b681ca941e'' \ --header ''Authorization: Bearer ''' - lang: Python source: "import requests \nurl = 'https://api.ouraring.com/v2/usercollection/daily_spo2/2-5daccc095220cc5493a4e9c2b681ca941e'\ \ \nheaders = { \n 'Authorization': 'Bearer ' \n}\nresponse = requests.request('GET',\ \ url, headers=headers, params=params) \nprint(response.text)" label: Python - lang: JavaScript source: "var myHeaders = new Headers(); \nmyHeaders.append('Authorization',\ \ 'Bearer '); \nvar requestOptions = { \n method: 'GET', \n headers:\ \ myHeaders, \n}; \nfetch('https://api.ouraring.com/v2/usercollection/daily_spo2/2-5daccc095220cc5493a4e9c2b681ca941e',\ \ requestOptions) \n .then(response => response.text()) \n .then(result\ \ => console.log(result)) \n .catch(error => console.log('error', error));" label: JavaScript - lang: Java source: "OkHttpClient client = new OkHttpClient().newBuilder() \n .build();\ \ \nRequest request = new Request.Builder() \n .url(\"https://api.ouraring.com/v2/usercollection/daily_spo2/2-5daccc095220cc5493a4e9c2b681ca941e\"\ ) \n .method(\"GET\", null) \n .addHeader(\"Authorization\", \"Bearer\ \ \") \n .build(); \nResponse response = client.newCall(request).execute();" label: Java /v2/sandbox/usercollection/daily_spo2/{document_id}: get: tags: - Sandbox Routes summary: Sandbox - Single Daily Spo2 Document operationId: Sandbox___Single_daily_spo2_Document_v2_sandbox_usercollection_daily_spo2__document_id__get parameters: - name: document_id in: path required: true schema: type: string title: Document Id responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/PublicDailySpO2' '404': description: Not Found '400': description: Client Exception '401': description: Unauthorized access exception. Usually means the access token is expired, malformed or revoked. '403': description: Access forbidden. Usually means the user's subscription to Oura has expired and their data is not available via the API. '429': description: Request Rate Limit Exceeded. '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - BearerAuth: [] - OAuth2: [] x-codeSamples: - lang: cURL label: cURL source: 'curl --location --request GET ''https://api.ouraring.com/v2/sandbox/usercollection/daily_spo2/2-5daccc095220cc5493a4e9c2b681ca941e'' \ --header ''Authorization: Bearer ''' - lang: Python source: "import requests \nurl = 'https://api.ouraring.com/v2/sandbox/usercollection/daily_spo2/2-5daccc095220cc5493a4e9c2b681ca941e'\ \ \nheaders = { \n 'Authorization': 'Bearer ' \n}\nresponse = requests.request('GET',\ \ url, headers=headers, params=params) \nprint(response.text)" label: Python - lang: JavaScript source: "var myHeaders = new Headers(); \nmyHeaders.append('Authorization',\ \ 'Bearer '); \nvar requestOptions = { \n method: 'GET', \n headers:\ \ myHeaders, \n}; \nfetch('https://api.ouraring.com/v2/sandbox/usercollection/daily_spo2/2-5daccc095220cc5493a4e9c2b681ca941e',\ \ requestOptions) \n .then(response => response.text()) \n .then(result\ \ => console.log(result)) \n .catch(error => console.log('error', error));" label: JavaScript - lang: Java source: "OkHttpClient client = new OkHttpClient().newBuilder() \n .build();\ \ \nRequest request = new Request.Builder() \n .url(\"https://api.ouraring.com/v2/sandbox/usercollection/daily_spo2/2-5daccc095220cc5493a4e9c2b681ca941e\"\ ) \n .method(\"GET\", null) \n .addHeader(\"Authorization\", \"Bearer\ \ \") \n .build(); \nResponse response = client.newCall(request).execute();" label: Java /v2/usercollection/daily_readiness/{document_id}: get: tags: - Daily Readiness Routes summary: Single Daily Readiness Document operationId: Single_daily_readiness_Document_v2_usercollection_daily_readiness__document_id__get parameters: - name: document_id in: path required: true schema: type: string title: Document Id responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/PublicDailyReadiness' '404': description: Not Found '400': description: Client Exception '401': description: Unauthorized access exception. Usually means the access token is expired, malformed or revoked. '403': description: Access forbidden. Usually means the user's subscription to Oura has expired and their data is not available via the API. '429': description: Request Rate Limit Exceeded. '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - BearerAuth: [] - OAuth2: [] x-codeSamples: - lang: cURL label: cURL source: 'curl --location --request GET ''https://api.ouraring.com/v2/usercollection/daily_readiness/2-5daccc095220cc5493a4e9c2b681ca941e'' \ --header ''Authorization: Bearer ''' - lang: Python source: "import requests \nurl = 'https://api.ouraring.com/v2/usercollection/daily_readiness/2-5daccc095220cc5493a4e9c2b681ca941e'\ \ \nheaders = { \n 'Authorization': 'Bearer ' \n}\nresponse = requests.request('GET',\ \ url, headers=headers, params=params) \nprint(response.text)" label: Python - lang: JavaScript source: "var myHeaders = new Headers(); \nmyHeaders.append('Authorization',\ \ 'Bearer '); \nvar requestOptions = { \n method: 'GET', \n headers:\ \ myHeaders, \n}; \nfetch('https://api.ouraring.com/v2/usercollection/daily_readiness/2-5daccc095220cc5493a4e9c2b681ca941e',\ \ requestOptions) \n .then(response => response.text()) \n .then(result\ \ => console.log(result)) \n .catch(error => console.log('error', error));" label: JavaScript - lang: Java source: "OkHttpClient client = new OkHttpClient().newBuilder() \n .build();\ \ \nRequest request = new Request.Builder() \n .url(\"https://api.ouraring.com/v2/usercollection/daily_readiness/2-5daccc095220cc5493a4e9c2b681ca941e\"\ ) \n .method(\"GET\", null) \n .addHeader(\"Authorization\", \"Bearer\ \ \") \n .build(); \nResponse response = client.newCall(request).execute();" label: Java /v2/sandbox/usercollection/daily_readiness/{document_id}: get: tags: - Sandbox Routes summary: Sandbox - Single Daily Readiness Document operationId: Sandbox___Single_daily_readiness_Document_v2_sandbox_usercollection_daily_readiness__document_id__get parameters: - name: document_id in: path required: true schema: type: string title: Document Id responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/PublicDailyReadiness' '404': description: Not Found '400': description: Client Exception '401': description: Unauthorized access exception. Usually means the access token is expired, malformed or revoked. '403': description: Access forbidden. Usually means the user's subscription to Oura has expired and their data is not available via the API. '429': description: Request Rate Limit Exceeded. '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - BearerAuth: [] - OAuth2: [] x-codeSamples: - lang: cURL label: cURL source: 'curl --location --request GET ''https://api.ouraring.com/v2/sandbox/usercollection/daily_readiness/2-5daccc095220cc5493a4e9c2b681ca941e'' \ --header ''Authorization: Bearer ''' - lang: Python source: "import requests \nurl = 'https://api.ouraring.com/v2/sandbox/usercollection/daily_readiness/2-5daccc095220cc5493a4e9c2b681ca941e'\ \ \nheaders = { \n 'Authorization': 'Bearer ' \n}\nresponse = requests.request('GET',\ \ url, headers=headers, params=params) \nprint(response.text)" label: Python - lang: JavaScript source: "var myHeaders = new Headers(); \nmyHeaders.append('Authorization',\ \ 'Bearer '); \nvar requestOptions = { \n method: 'GET', \n headers:\ \ myHeaders, \n}; \nfetch('https://api.ouraring.com/v2/sandbox/usercollection/daily_readiness/2-5daccc095220cc5493a4e9c2b681ca941e',\ \ requestOptions) \n .then(response => response.text()) \n .then(result\ \ => console.log(result)) \n .catch(error => console.log('error', error));" label: JavaScript - lang: Java source: "OkHttpClient client = new OkHttpClient().newBuilder() \n .build();\ \ \nRequest request = new Request.Builder() \n .url(\"https://api.ouraring.com/v2/sandbox/usercollection/daily_readiness/2-5daccc095220cc5493a4e9c2b681ca941e\"\ ) \n .method(\"GET\", null) \n .addHeader(\"Authorization\", \"Bearer\ \ \") \n .build(); \nResponse response = client.newCall(request).execute();" label: Java /v2/usercollection/sleep/{document_id}: get: tags: - Sleep Routes summary: Single Sleep Document operationId: Single_sleep_Document_v2_usercollection_sleep__document_id__get parameters: - name: document_id in: path required: true schema: type: string title: Document Id responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/PublicModifiedSleepModel' '404': description: Not Found '400': description: Client Exception '401': description: Unauthorized access exception. Usually means the access token is expired, malformed or revoked. '403': description: Access forbidden. Usually means the user's subscription to Oura has expired and their data is not available via the API. '429': description: Request Rate Limit Exceeded. '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - BearerAuth: [] - OAuth2: [] x-codeSamples: - lang: cURL label: cURL source: 'curl --location --request GET ''https://api.ouraring.com/v2/usercollection/sleep/2-5daccc095220cc5493a4e9c2b681ca941e'' \ --header ''Authorization: Bearer ''' - lang: Python source: "import requests \nurl = 'https://api.ouraring.com/v2/usercollection/sleep/2-5daccc095220cc5493a4e9c2b681ca941e'\ \ \nheaders = { \n 'Authorization': 'Bearer ' \n}\nresponse = requests.request('GET',\ \ url, headers=headers, params=params) \nprint(response.text)" label: Python - lang: JavaScript source: "var myHeaders = new Headers(); \nmyHeaders.append('Authorization',\ \ 'Bearer '); \nvar requestOptions = { \n method: 'GET', \n headers:\ \ myHeaders, \n}; \nfetch('https://api.ouraring.com/v2/usercollection/sleep/2-5daccc095220cc5493a4e9c2b681ca941e',\ \ requestOptions) \n .then(response => response.text()) \n .then(result\ \ => console.log(result)) \n .catch(error => console.log('error', error));" label: JavaScript - lang: Java source: "OkHttpClient client = new OkHttpClient().newBuilder() \n .build();\ \ \nRequest request = new Request.Builder() \n .url(\"https://api.ouraring.com/v2/usercollection/sleep/2-5daccc095220cc5493a4e9c2b681ca941e\"\ ) \n .method(\"GET\", null) \n .addHeader(\"Authorization\", \"Bearer\ \ \") \n .build(); \nResponse response = client.newCall(request).execute();" label: Java /v2/sandbox/usercollection/sleep/{document_id}: get: tags: - Sandbox Routes summary: Sandbox - Single Sleep Document operationId: Sandbox___Single_sleep_Document_v2_sandbox_usercollection_sleep__document_id__get parameters: - name: document_id in: path required: true schema: type: string title: Document Id responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/PublicModifiedSleepModel' '404': description: Not Found '400': description: Client Exception '401': description: Unauthorized access exception. Usually means the access token is expired, malformed or revoked. '403': description: Access forbidden. Usually means the user's subscription to Oura has expired and their data is not available via the API. '429': description: Request Rate Limit Exceeded. '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - BearerAuth: [] - OAuth2: [] x-codeSamples: - lang: cURL label: cURL source: 'curl --location --request GET ''https://api.ouraring.com/v2/sandbox/usercollection/sleep/2-5daccc095220cc5493a4e9c2b681ca941e'' \ --header ''Authorization: Bearer ''' - lang: Python source: "import requests \nurl = 'https://api.ouraring.com/v2/sandbox/usercollection/sleep/2-5daccc095220cc5493a4e9c2b681ca941e'\ \ \nheaders = { \n 'Authorization': 'Bearer ' \n}\nresponse = requests.request('GET',\ \ url, headers=headers, params=params) \nprint(response.text)" label: Python - lang: JavaScript source: "var myHeaders = new Headers(); \nmyHeaders.append('Authorization',\ \ 'Bearer '); \nvar requestOptions = { \n method: 'GET', \n headers:\ \ myHeaders, \n}; \nfetch('https://api.ouraring.com/v2/sandbox/usercollection/sleep/2-5daccc095220cc5493a4e9c2b681ca941e',\ \ requestOptions) \n .then(response => response.text()) \n .then(result\ \ => console.log(result)) \n .catch(error => console.log('error', error));" label: JavaScript - lang: Java source: "OkHttpClient client = new OkHttpClient().newBuilder() \n .build();\ \ \nRequest request = new Request.Builder() \n .url(\"https://api.ouraring.com/v2/sandbox/usercollection/sleep/2-5daccc095220cc5493a4e9c2b681ca941e\"\ ) \n .method(\"GET\", null) \n .addHeader(\"Authorization\", \"Bearer\ \ \") \n .build(); \nResponse response = client.newCall(request).execute();" label: Java /v2/usercollection/sleep_time/{document_id}: get: tags: - Sleep Time Routes summary: Single Sleep Time Document operationId: Single_sleep_time_Document_v2_usercollection_sleep_time__document_id__get parameters: - name: document_id in: path required: true schema: type: string title: Document Id responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/PublicSleepTime' '404': description: Not Found '400': description: Client Exception '401': description: Unauthorized access exception. Usually means the access token is expired, malformed or revoked. '403': description: Access forbidden. Usually means the user's subscription to Oura has expired and their data is not available via the API. '429': description: Request Rate Limit Exceeded. '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - BearerAuth: [] - OAuth2: [] x-codeSamples: - lang: cURL label: cURL source: 'curl --location --request GET ''https://api.ouraring.com/v2/usercollection/sleep_time/2-5daccc095220cc5493a4e9c2b681ca941e'' \ --header ''Authorization: Bearer ''' - lang: Python source: "import requests \nurl = 'https://api.ouraring.com/v2/usercollection/sleep_time/2-5daccc095220cc5493a4e9c2b681ca941e'\ \ \nheaders = { \n 'Authorization': 'Bearer ' \n}\nresponse = requests.request('GET',\ \ url, headers=headers, params=params) \nprint(response.text)" label: Python - lang: JavaScript source: "var myHeaders = new Headers(); \nmyHeaders.append('Authorization',\ \ 'Bearer '); \nvar requestOptions = { \n method: 'GET', \n headers:\ \ myHeaders, \n}; \nfetch('https://api.ouraring.com/v2/usercollection/sleep_time/2-5daccc095220cc5493a4e9c2b681ca941e',\ \ requestOptions) \n .then(response => response.text()) \n .then(result\ \ => console.log(result)) \n .catch(error => console.log('error', error));" label: JavaScript - lang: Java source: "OkHttpClient client = new OkHttpClient().newBuilder() \n .build();\ \ \nRequest request = new Request.Builder() \n .url(\"https://api.ouraring.com/v2/usercollection/sleep_time/2-5daccc095220cc5493a4e9c2b681ca941e\"\ ) \n .method(\"GET\", null) \n .addHeader(\"Authorization\", \"Bearer\ \ \") \n .build(); \nResponse response = client.newCall(request).execute();" label: Java /v2/sandbox/usercollection/sleep_time/{document_id}: get: tags: - Sandbox Routes summary: Sandbox - Single Sleep Time Document operationId: Sandbox___Single_sleep_time_Document_v2_sandbox_usercollection_sleep_time__document_id__get parameters: - name: document_id in: path required: true schema: type: string title: Document Id responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/PublicSleepTime' '404': description: Not Found '400': description: Client Exception '401': description: Unauthorized access exception. Usually means the access token is expired, malformed or revoked. '403': description: Access forbidden. Usually means the user's subscription to Oura has expired and their data is not available via the API. '429': description: Request Rate Limit Exceeded. '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - BearerAuth: [] - OAuth2: [] x-codeSamples: - lang: cURL label: cURL source: 'curl --location --request GET ''https://api.ouraring.com/v2/sandbox/usercollection/sleep_time/2-5daccc095220cc5493a4e9c2b681ca941e'' \ --header ''Authorization: Bearer ''' - lang: Python source: "import requests \nurl = 'https://api.ouraring.com/v2/sandbox/usercollection/sleep_time/2-5daccc095220cc5493a4e9c2b681ca941e'\ \ \nheaders = { \n 'Authorization': 'Bearer ' \n}\nresponse = requests.request('GET',\ \ url, headers=headers, params=params) \nprint(response.text)" label: Python - lang: JavaScript source: "var myHeaders = new Headers(); \nmyHeaders.append('Authorization',\ \ 'Bearer '); \nvar requestOptions = { \n method: 'GET', \n headers:\ \ myHeaders, \n}; \nfetch('https://api.ouraring.com/v2/sandbox/usercollection/sleep_time/2-5daccc095220cc5493a4e9c2b681ca941e',\ \ requestOptions) \n .then(response => response.text()) \n .then(result\ \ => console.log(result)) \n .catch(error => console.log('error', error));" label: JavaScript - lang: Java source: "OkHttpClient client = new OkHttpClient().newBuilder() \n .build();\ \ \nRequest request = new Request.Builder() \n .url(\"https://api.ouraring.com/v2/sandbox/usercollection/sleep_time/2-5daccc095220cc5493a4e9c2b681ca941e\"\ ) \n .method(\"GET\", null) \n .addHeader(\"Authorization\", \"Bearer\ \ \") \n .build(); \nResponse response = client.newCall(request).execute();" label: Java /v2/usercollection/rest_mode_period/{document_id}: get: tags: - Rest Mode Period Routes summary: Single Rest Mode Period Document operationId: Single_rest_mode_period_Document_v2_usercollection_rest_mode_period__document_id__get parameters: - name: document_id in: path required: true schema: type: string title: Document Id responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/PublicRestModePeriod' '404': description: Not Found '400': description: Client Exception '401': description: Unauthorized access exception. Usually means the access token is expired, malformed or revoked. '403': description: Access forbidden. Usually means the user's subscription to Oura has expired and their data is not available via the API. '429': description: Request Rate Limit Exceeded. '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - BearerAuth: [] - OAuth2: [] x-codeSamples: - lang: cURL label: cURL source: 'curl --location --request GET ''https://api.ouraring.com/v2/usercollection/rest_mode_period/2-5daccc095220cc5493a4e9c2b681ca941e'' \ --header ''Authorization: Bearer ''' - lang: Python source: "import requests \nurl = 'https://api.ouraring.com/v2/usercollection/rest_mode_period/2-5daccc095220cc5493a4e9c2b681ca941e'\ \ \nheaders = { \n 'Authorization': 'Bearer ' \n}\nresponse = requests.request('GET',\ \ url, headers=headers, params=params) \nprint(response.text)" label: Python - lang: JavaScript source: "var myHeaders = new Headers(); \nmyHeaders.append('Authorization',\ \ 'Bearer '); \nvar requestOptions = { \n method: 'GET', \n headers:\ \ myHeaders, \n}; \nfetch('https://api.ouraring.com/v2/usercollection/rest_mode_period/2-5daccc095220cc5493a4e9c2b681ca941e',\ \ requestOptions) \n .then(response => response.text()) \n .then(result\ \ => console.log(result)) \n .catch(error => console.log('error', error));" label: JavaScript - lang: Java source: "OkHttpClient client = new OkHttpClient().newBuilder() \n .build();\ \ \nRequest request = new Request.Builder() \n .url(\"https://api.ouraring.com/v2/usercollection/rest_mode_period/2-5daccc095220cc5493a4e9c2b681ca941e\"\ ) \n .method(\"GET\", null) \n .addHeader(\"Authorization\", \"Bearer\ \ \") \n .build(); \nResponse response = client.newCall(request).execute();" label: Java /v2/sandbox/usercollection/rest_mode_period/{document_id}: get: tags: - Sandbox Routes summary: Sandbox - Single Rest Mode Period Document operationId: Sandbox___Single_rest_mode_period_Document_v2_sandbox_usercollection_rest_mode_period__document_id__get parameters: - name: document_id in: path required: true schema: type: string title: Document Id responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/PublicRestModePeriod' '404': description: Not Found '400': description: Client Exception '401': description: Unauthorized access exception. Usually means the access token is expired, malformed or revoked. '403': description: Access forbidden. Usually means the user's subscription to Oura has expired and their data is not available via the API. '429': description: Request Rate Limit Exceeded. '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - BearerAuth: [] - OAuth2: [] x-codeSamples: - lang: cURL label: cURL source: 'curl --location --request GET ''https://api.ouraring.com/v2/sandbox/usercollection/rest_mode_period/2-5daccc095220cc5493a4e9c2b681ca941e'' \ --header ''Authorization: Bearer ''' - lang: Python source: "import requests \nurl = 'https://api.ouraring.com/v2/sandbox/usercollection/rest_mode_period/2-5daccc095220cc5493a4e9c2b681ca941e'\ \ \nheaders = { \n 'Authorization': 'Bearer ' \n}\nresponse = requests.request('GET',\ \ url, headers=headers, params=params) \nprint(response.text)" label: Python - lang: JavaScript source: "var myHeaders = new Headers(); \nmyHeaders.append('Authorization',\ \ 'Bearer '); \nvar requestOptions = { \n method: 'GET', \n headers:\ \ myHeaders, \n}; \nfetch('https://api.ouraring.com/v2/sandbox/usercollection/rest_mode_period/2-5daccc095220cc5493a4e9c2b681ca941e',\ \ requestOptions) \n .then(response => response.text()) \n .then(result\ \ => console.log(result)) \n .catch(error => console.log('error', error));" label: JavaScript - lang: Java source: "OkHttpClient client = new OkHttpClient().newBuilder() \n .build();\ \ \nRequest request = new Request.Builder() \n .url(\"https://api.ouraring.com/v2/sandbox/usercollection/rest_mode_period/2-5daccc095220cc5493a4e9c2b681ca941e\"\ ) \n .method(\"GET\", null) \n .addHeader(\"Authorization\", \"Bearer\ \ \") \n .build(); \nResponse response = client.newCall(request).execute();" label: Java /v2/usercollection/ring_configuration/{document_id}: get: tags: - Ring Configuration Routes summary: Single Ring Configuration Document operationId: Single_ring_configuration_Document_v2_usercollection_ring_configuration__document_id__get parameters: - name: document_id in: path required: true schema: type: string title: Document Id responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/PublicRingConfiguration' '404': description: Not Found '400': description: Client Exception '401': description: Unauthorized access exception. Usually means the access token is expired, malformed or revoked. '403': description: Access forbidden. Usually means the user's subscription to Oura has expired and their data is not available via the API. '429': description: Request Rate Limit Exceeded. '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - BearerAuth: [] - OAuth2: [] x-codeSamples: - lang: cURL label: cURL source: 'curl --location --request GET ''https://api.ouraring.com/v2/usercollection/ring_configuration/2-5daccc095220cc5493a4e9c2b681ca941e'' \ --header ''Authorization: Bearer ''' - lang: Python source: "import requests \nurl = 'https://api.ouraring.com/v2/usercollection/ring_configuration/2-5daccc095220cc5493a4e9c2b681ca941e'\ \ \nheaders = { \n 'Authorization': 'Bearer ' \n}\nresponse = requests.request('GET',\ \ url, headers=headers, params=params) \nprint(response.text)" label: Python - lang: JavaScript source: "var myHeaders = new Headers(); \nmyHeaders.append('Authorization',\ \ 'Bearer '); \nvar requestOptions = { \n method: 'GET', \n headers:\ \ myHeaders, \n}; \nfetch('https://api.ouraring.com/v2/usercollection/ring_configuration/2-5daccc095220cc5493a4e9c2b681ca941e',\ \ requestOptions) \n .then(response => response.text()) \n .then(result\ \ => console.log(result)) \n .catch(error => console.log('error', error));" label: JavaScript - lang: Java source: "OkHttpClient client = new OkHttpClient().newBuilder() \n .build();\ \ \nRequest request = new Request.Builder() \n .url(\"https://api.ouraring.com/v2/usercollection/ring_configuration/2-5daccc095220cc5493a4e9c2b681ca941e\"\ ) \n .method(\"GET\", null) \n .addHeader(\"Authorization\", \"Bearer\ \ \") \n .build(); \nResponse response = client.newCall(request).execute();" label: Java /v2/sandbox/usercollection/ring_configuration/{document_id}: get: tags: - Sandbox Routes summary: Sandbox - Single Ring Configuration Document operationId: Sandbox___Single_ring_configuration_Document_v2_sandbox_usercollection_ring_configuration__document_id__get parameters: - name: document_id in: path required: true schema: type: string title: Document Id responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/PublicRingConfiguration' '404': description: Not Found '400': description: Client Exception '401': description: Unauthorized access exception. Usually means the access token is expired, malformed or revoked. '403': description: Access forbidden. Usually means the user's subscription to Oura has expired and their data is not available via the API. '429': description: Request Rate Limit Exceeded. '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - BearerAuth: [] - OAuth2: [] x-codeSamples: - lang: cURL label: cURL source: 'curl --location --request GET ''https://api.ouraring.com/v2/sandbox/usercollection/ring_configuration/2-5daccc095220cc5493a4e9c2b681ca941e'' \ --header ''Authorization: Bearer ''' - lang: Python source: "import requests \nurl = 'https://api.ouraring.com/v2/sandbox/usercollection/ring_configuration/2-5daccc095220cc5493a4e9c2b681ca941e'\ \ \nheaders = { \n 'Authorization': 'Bearer ' \n}\nresponse = requests.request('GET',\ \ url, headers=headers, params=params) \nprint(response.text)" label: Python - lang: JavaScript source: "var myHeaders = new Headers(); \nmyHeaders.append('Authorization',\ \ 'Bearer '); \nvar requestOptions = { \n method: 'GET', \n headers:\ \ myHeaders, \n}; \nfetch('https://api.ouraring.com/v2/sandbox/usercollection/ring_configuration/2-5daccc095220cc5493a4e9c2b681ca941e',\ \ requestOptions) \n .then(response => response.text()) \n .then(result\ \ => console.log(result)) \n .catch(error => console.log('error', error));" label: JavaScript - lang: Java source: "OkHttpClient client = new OkHttpClient().newBuilder() \n .build();\ \ \nRequest request = new Request.Builder() \n .url(\"https://api.ouraring.com/v2/sandbox/usercollection/ring_configuration/2-5daccc095220cc5493a4e9c2b681ca941e\"\ ) \n .method(\"GET\", null) \n .addHeader(\"Authorization\", \"Bearer\ \ \") \n .build(); \nResponse response = client.newCall(request).execute();" label: Java /v2/usercollection/daily_stress/{document_id}: get: tags: - Daily Stress Routes summary: Single Daily Stress Document operationId: Single_daily_stress_Document_v2_usercollection_daily_stress__document_id__get parameters: - name: document_id in: path required: true schema: type: string title: Document Id responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/PublicDailyStress' '404': description: Not Found '400': description: Client Exception '401': description: Unauthorized access exception. Usually means the access token is expired, malformed or revoked. '403': description: Access forbidden. Usually means the user's subscription to Oura has expired and their data is not available via the API. '429': description: Request Rate Limit Exceeded. '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - BearerAuth: [] - OAuth2: [] x-codeSamples: - lang: cURL label: cURL source: 'curl --location --request GET ''https://api.ouraring.com/v2/usercollection/daily_stress/2-5daccc095220cc5493a4e9c2b681ca941e'' \ --header ''Authorization: Bearer ''' - lang: Python source: "import requests \nurl = 'https://api.ouraring.com/v2/usercollection/daily_stress/2-5daccc095220cc5493a4e9c2b681ca941e'\ \ \nheaders = { \n 'Authorization': 'Bearer ' \n}\nresponse = requests.request('GET',\ \ url, headers=headers, params=params) \nprint(response.text)" label: Python - lang: JavaScript source: "var myHeaders = new Headers(); \nmyHeaders.append('Authorization',\ \ 'Bearer '); \nvar requestOptions = { \n method: 'GET', \n headers:\ \ myHeaders, \n}; \nfetch('https://api.ouraring.com/v2/usercollection/daily_stress/2-5daccc095220cc5493a4e9c2b681ca941e',\ \ requestOptions) \n .then(response => response.text()) \n .then(result\ \ => console.log(result)) \n .catch(error => console.log('error', error));" label: JavaScript - lang: Java source: "OkHttpClient client = new OkHttpClient().newBuilder() \n .build();\ \ \nRequest request = new Request.Builder() \n .url(\"https://api.ouraring.com/v2/usercollection/daily_stress/2-5daccc095220cc5493a4e9c2b681ca941e\"\ ) \n .method(\"GET\", null) \n .addHeader(\"Authorization\", \"Bearer\ \ \") \n .build(); \nResponse response = client.newCall(request).execute();" label: Java /v2/sandbox/usercollection/daily_stress/{document_id}: get: tags: - Sandbox Routes summary: Sandbox - Single Daily Stress Document operationId: Sandbox___Single_daily_stress_Document_v2_sandbox_usercollection_daily_stress__document_id__get parameters: - name: document_id in: path required: true schema: type: string title: Document Id responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/PublicDailyStress' '404': description: Not Found '400': description: Client Exception '401': description: Unauthorized access exception. Usually means the access token is expired, malformed or revoked. '403': description: Access forbidden. Usually means the user's subscription to Oura has expired and their data is not available via the API. '429': description: Request Rate Limit Exceeded. '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - BearerAuth: [] - OAuth2: [] x-codeSamples: - lang: cURL label: cURL source: 'curl --location --request GET ''https://api.ouraring.com/v2/sandbox/usercollection/daily_stress/2-5daccc095220cc5493a4e9c2b681ca941e'' \ --header ''Authorization: Bearer ''' - lang: Python source: "import requests \nurl = 'https://api.ouraring.com/v2/sandbox/usercollection/daily_stress/2-5daccc095220cc5493a4e9c2b681ca941e'\ \ \nheaders = { \n 'Authorization': 'Bearer ' \n}\nresponse = requests.request('GET',\ \ url, headers=headers, params=params) \nprint(response.text)" label: Python - lang: JavaScript source: "var myHeaders = new Headers(); \nmyHeaders.append('Authorization',\ \ 'Bearer '); \nvar requestOptions = { \n method: 'GET', \n headers:\ \ myHeaders, \n}; \nfetch('https://api.ouraring.com/v2/sandbox/usercollection/daily_stress/2-5daccc095220cc5493a4e9c2b681ca941e',\ \ requestOptions) \n .then(response => response.text()) \n .then(result\ \ => console.log(result)) \n .catch(error => console.log('error', error));" label: JavaScript - lang: Java source: "OkHttpClient client = new OkHttpClient().newBuilder() \n .build();\ \ \nRequest request = new Request.Builder() \n .url(\"https://api.ouraring.com/v2/sandbox/usercollection/daily_stress/2-5daccc095220cc5493a4e9c2b681ca941e\"\ ) \n .method(\"GET\", null) \n .addHeader(\"Authorization\", \"Bearer\ \ \") \n .build(); \nResponse response = client.newCall(request).execute();" label: Java /v2/usercollection/daily_resilience/{document_id}: get: tags: - Daily Resilience Routes summary: Single Daily Resilience Document operationId: Single_daily_resilience_Document_v2_usercollection_daily_resilience__document_id__get parameters: - name: document_id in: path required: true schema: type: string title: Document Id responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/DailyResilienceModel' '404': description: Not Found '400': description: Client Exception '401': description: Unauthorized access exception. Usually means the access token is expired, malformed or revoked. '403': description: Access forbidden. Usually means the user's subscription to Oura has expired and their data is not available via the API. '429': description: Request Rate Limit Exceeded. '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - BearerAuth: [] - OAuth2: [] x-codeSamples: - lang: cURL label: cURL source: 'curl --location --request GET ''https://api.ouraring.com/v2/usercollection/daily_resilience/2-5daccc095220cc5493a4e9c2b681ca941e'' \ --header ''Authorization: Bearer ''' - lang: Python source: "import requests \nurl = 'https://api.ouraring.com/v2/usercollection/daily_resilience/2-5daccc095220cc5493a4e9c2b681ca941e'\ \ \nheaders = { \n 'Authorization': 'Bearer ' \n}\nresponse = requests.request('GET',\ \ url, headers=headers, params=params) \nprint(response.text)" label: Python - lang: JavaScript source: "var myHeaders = new Headers(); \nmyHeaders.append('Authorization',\ \ 'Bearer '); \nvar requestOptions = { \n method: 'GET', \n headers:\ \ myHeaders, \n}; \nfetch('https://api.ouraring.com/v2/usercollection/daily_resilience/2-5daccc095220cc5493a4e9c2b681ca941e',\ \ requestOptions) \n .then(response => response.text()) \n .then(result\ \ => console.log(result)) \n .catch(error => console.log('error', error));" label: JavaScript - lang: Java source: "OkHttpClient client = new OkHttpClient().newBuilder() \n .build();\ \ \nRequest request = new Request.Builder() \n .url(\"https://api.ouraring.com/v2/usercollection/daily_resilience/2-5daccc095220cc5493a4e9c2b681ca941e\"\ ) \n .method(\"GET\", null) \n .addHeader(\"Authorization\", \"Bearer\ \ \") \n .build(); \nResponse response = client.newCall(request).execute();" label: Java /v2/sandbox/usercollection/daily_resilience/{document_id}: get: tags: - Sandbox Routes summary: Sandbox - Single Daily Resilience Document operationId: Sandbox___Single_daily_resilience_Document_v2_sandbox_usercollection_daily_resilience__document_id__get parameters: - name: document_id in: path required: true schema: type: string title: Document Id responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/DailyResilienceModel' '404': description: Not Found '400': description: Client Exception '401': description: Unauthorized access exception. Usually means the access token is expired, malformed or revoked. '403': description: Access forbidden. Usually means the user's subscription to Oura has expired and their data is not available via the API. '429': description: Request Rate Limit Exceeded. '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - BearerAuth: [] - OAuth2: [] x-codeSamples: - lang: cURL label: cURL source: 'curl --location --request GET ''https://api.ouraring.com/v2/sandbox/usercollection/daily_resilience/2-5daccc095220cc5493a4e9c2b681ca941e'' \ --header ''Authorization: Bearer ''' - lang: Python source: "import requests \nurl = 'https://api.ouraring.com/v2/sandbox/usercollection/daily_resilience/2-5daccc095220cc5493a4e9c2b681ca941e'\ \ \nheaders = { \n 'Authorization': 'Bearer ' \n}\nresponse = requests.request('GET',\ \ url, headers=headers, params=params) \nprint(response.text)" label: Python - lang: JavaScript source: "var myHeaders = new Headers(); \nmyHeaders.append('Authorization',\ \ 'Bearer '); \nvar requestOptions = { \n method: 'GET', \n headers:\ \ myHeaders, \n}; \nfetch('https://api.ouraring.com/v2/sandbox/usercollection/daily_resilience/2-5daccc095220cc5493a4e9c2b681ca941e',\ \ requestOptions) \n .then(response => response.text()) \n .then(result\ \ => console.log(result)) \n .catch(error => console.log('error', error));" label: JavaScript - lang: Java source: "OkHttpClient client = new OkHttpClient().newBuilder() \n .build();\ \ \nRequest request = new Request.Builder() \n .url(\"https://api.ouraring.com/v2/sandbox/usercollection/daily_resilience/2-5daccc095220cc5493a4e9c2b681ca941e\"\ ) \n .method(\"GET\", null) \n .addHeader(\"Authorization\", \"Bearer\ \ \") \n .build(); \nResponse response = client.newCall(request).execute();" label: Java /v2/usercollection/daily_cardiovascular_age/{document_id}: get: tags: - Daily Cardiovascular Age Routes summary: Single Daily Cardiovascular Age Document operationId: Single_daily_cardiovascular_age_Document_v2_usercollection_daily_cardiovascular_age__document_id__get parameters: - name: document_id in: path required: true schema: type: string title: Document Id responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/PublicDailyCardiovascularAge' '404': description: Not Found '400': description: Client Exception '401': description: Unauthorized access exception. Usually means the access token is expired, malformed or revoked. '403': description: Access forbidden. Usually means the user's subscription to Oura has expired and their data is not available via the API. '429': description: Request Rate Limit Exceeded. '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - BearerAuth: [] - OAuth2: [] x-codeSamples: - lang: cURL label: cURL source: 'curl --location --request GET ''https://api.ouraring.com/v2/usercollection/daily_cardiovascular_age/2-5daccc095220cc5493a4e9c2b681ca941e'' \ --header ''Authorization: Bearer ''' - lang: Python source: "import requests \nurl = 'https://api.ouraring.com/v2/usercollection/daily_cardiovascular_age/2-5daccc095220cc5493a4e9c2b681ca941e'\ \ \nheaders = { \n 'Authorization': 'Bearer ' \n}\nresponse = requests.request('GET',\ \ url, headers=headers, params=params) \nprint(response.text)" label: Python - lang: JavaScript source: "var myHeaders = new Headers(); \nmyHeaders.append('Authorization',\ \ 'Bearer '); \nvar requestOptions = { \n method: 'GET', \n headers:\ \ myHeaders, \n}; \nfetch('https://api.ouraring.com/v2/usercollection/daily_cardiovascular_age/2-5daccc095220cc5493a4e9c2b681ca941e',\ \ requestOptions) \n .then(response => response.text()) \n .then(result\ \ => console.log(result)) \n .catch(error => console.log('error', error));" label: JavaScript - lang: Java source: "OkHttpClient client = new OkHttpClient().newBuilder() \n .build();\ \ \nRequest request = new Request.Builder() \n .url(\"https://api.ouraring.com/v2/usercollection/daily_cardiovascular_age/2-5daccc095220cc5493a4e9c2b681ca941e\"\ ) \n .method(\"GET\", null) \n .addHeader(\"Authorization\", \"Bearer\ \ \") \n .build(); \nResponse response = client.newCall(request).execute();" label: Java /v2/sandbox/usercollection/daily_cardiovascular_age/{document_id}: get: tags: - Sandbox Routes summary: Sandbox - Single Daily Cardiovascular Age Document operationId: Sandbox___Single_daily_cardiovascular_age_Document_v2_sandbox_usercollection_daily_cardiovascular_age__document_id__get parameters: - name: document_id in: path required: true schema: type: string title: Document Id responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/PublicDailyCardiovascularAge' '404': description: Not Found '400': description: Client Exception '401': description: Unauthorized access exception. Usually means the access token is expired, malformed or revoked. '403': description: Access forbidden. Usually means the user's subscription to Oura has expired and their data is not available via the API. '429': description: Request Rate Limit Exceeded. '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - BearerAuth: [] - OAuth2: [] x-codeSamples: - lang: cURL label: cURL source: 'curl --location --request GET ''https://api.ouraring.com/v2/sandbox/usercollection/daily_cardiovascular_age/2-5daccc095220cc5493a4e9c2b681ca941e'' \ --header ''Authorization: Bearer ''' - lang: Python source: "import requests \nurl = 'https://api.ouraring.com/v2/sandbox/usercollection/daily_cardiovascular_age/2-5daccc095220cc5493a4e9c2b681ca941e'\ \ \nheaders = { \n 'Authorization': 'Bearer ' \n}\nresponse = requests.request('GET',\ \ url, headers=headers, params=params) \nprint(response.text)" label: Python - lang: JavaScript source: "var myHeaders = new Headers(); \nmyHeaders.append('Authorization',\ \ 'Bearer '); \nvar requestOptions = { \n method: 'GET', \n headers:\ \ myHeaders, \n}; \nfetch('https://api.ouraring.com/v2/sandbox/usercollection/daily_cardiovascular_age/2-5daccc095220cc5493a4e9c2b681ca941e',\ \ requestOptions) \n .then(response => response.text()) \n .then(result\ \ => console.log(result)) \n .catch(error => console.log('error', error));" label: JavaScript - lang: Java source: "OkHttpClient client = new OkHttpClient().newBuilder() \n .build();\ \ \nRequest request = new Request.Builder() \n .url(\"https://api.ouraring.com/v2/sandbox/usercollection/daily_cardiovascular_age/2-5daccc095220cc5493a4e9c2b681ca941e\"\ ) \n .method(\"GET\", null) \n .addHeader(\"Authorization\", \"Bearer\ \ \") \n .build(); \nResponse response = client.newCall(request).execute();" label: Java /v2/usercollection/vO2_max/{document_id}: get: tags: - VO2 Max Routes summary: Single Vo2 Max Document operationId: Single_vO2_max_Document_v2_usercollection_vO2_max__document_id__get parameters: - name: document_id in: path required: true schema: type: string title: Document Id responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/PublicVO2Max' '404': description: Not Found '400': description: Client Exception '401': description: Unauthorized access exception. Usually means the access token is expired, malformed or revoked. '403': description: Access forbidden. Usually means the user's subscription to Oura has expired and their data is not available via the API. '429': description: Request Rate Limit Exceeded. '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - BearerAuth: [] - OAuth2: [] x-codeSamples: - lang: cURL label: cURL source: 'curl --location --request GET ''https://api.ouraring.com/v2/usercollection/vO2_max/2-5daccc095220cc5493a4e9c2b681ca941e'' \ --header ''Authorization: Bearer ''' - lang: Python source: "import requests \nurl = 'https://api.ouraring.com/v2/usercollection/vO2_max/2-5daccc095220cc5493a4e9c2b681ca941e'\ \ \nheaders = { \n 'Authorization': 'Bearer ' \n}\nresponse = requests.request('GET',\ \ url, headers=headers, params=params) \nprint(response.text)" label: Python - lang: JavaScript source: "var myHeaders = new Headers(); \nmyHeaders.append('Authorization',\ \ 'Bearer '); \nvar requestOptions = { \n method: 'GET', \n headers:\ \ myHeaders, \n}; \nfetch('https://api.ouraring.com/v2/usercollection/vO2_max/2-5daccc095220cc5493a4e9c2b681ca941e',\ \ requestOptions) \n .then(response => response.text()) \n .then(result\ \ => console.log(result)) \n .catch(error => console.log('error', error));" label: JavaScript - lang: Java source: "OkHttpClient client = new OkHttpClient().newBuilder() \n .build();\ \ \nRequest request = new Request.Builder() \n .url(\"https://api.ouraring.com/v2/usercollection/vO2_max/2-5daccc095220cc5493a4e9c2b681ca941e\"\ ) \n .method(\"GET\", null) \n .addHeader(\"Authorization\", \"Bearer\ \ \") \n .build(); \nResponse response = client.newCall(request).execute();" label: Java /v2/sandbox/usercollection/vO2_max/{document_id}: get: tags: - Sandbox Routes summary: Sandbox - Single Vo2 Max Document operationId: Sandbox___Single_vO2_max_Document_v2_sandbox_usercollection_vO2_max__document_id__get parameters: - name: document_id in: path required: true schema: type: string title: Document Id responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/PublicVO2Max' '404': description: Not Found '400': description: Client Exception '401': description: Unauthorized access exception. Usually means the access token is expired, malformed or revoked. '403': description: Access forbidden. Usually means the user's subscription to Oura has expired and their data is not available via the API. '429': description: Request Rate Limit Exceeded. '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - BearerAuth: [] - OAuth2: [] x-codeSamples: - lang: cURL label: cURL source: 'curl --location --request GET ''https://api.ouraring.com/v2/sandbox/usercollection/vO2_max/2-5daccc095220cc5493a4e9c2b681ca941e'' \ --header ''Authorization: Bearer ''' - lang: Python source: "import requests \nurl = 'https://api.ouraring.com/v2/sandbox/usercollection/vO2_max/2-5daccc095220cc5493a4e9c2b681ca941e'\ \ \nheaders = { \n 'Authorization': 'Bearer ' \n}\nresponse = requests.request('GET',\ \ url, headers=headers, params=params) \nprint(response.text)" label: Python - lang: JavaScript source: "var myHeaders = new Headers(); \nmyHeaders.append('Authorization',\ \ 'Bearer '); \nvar requestOptions = { \n method: 'GET', \n headers:\ \ myHeaders, \n}; \nfetch('https://api.ouraring.com/v2/sandbox/usercollection/vO2_max/2-5daccc095220cc5493a4e9c2b681ca941e',\ \ requestOptions) \n .then(response => response.text()) \n .then(result\ \ => console.log(result)) \n .catch(error => console.log('error', error));" label: JavaScript - lang: Java source: "OkHttpClient client = new OkHttpClient().newBuilder() \n .build();\ \ \nRequest request = new Request.Builder() \n .url(\"https://api.ouraring.com/v2/sandbox/usercollection/vO2_max/2-5daccc095220cc5493a4e9c2b681ca941e\"\ ) \n .method(\"GET\", null) \n .addHeader(\"Authorization\", \"Bearer\ \ \") \n .build(); \nResponse response = client.newCall(request).execute();" label: Java /v2/webhook/subscription: get: tags: - Webhook Subscription Routes summary: List Webhook Subscriptions operationId: list_webhook_subscriptions_v2_webhook_subscription_get responses: '200': description: Successful Response content: application/json: schema: items: $ref: '#/components/schemas/WebhookSubscriptionModel' type: array title: Response List Webhook Subscriptions V2 Webhook Subscription Get security: - ClientIdAuth: [] ClientSecretAuth: [] x-codeSamples: - lang: cURL label: cURL source: 'curl --location --request GET ''https://api.ouraring.com/v2/webhook/subscription'' --header ''x-client-id: client-id'' --header ''x-client-secret: client-secret''' post: tags: - Webhook Subscription Routes summary: Create Webhook Subscription operationId: create_webhook_subscription_v2_webhook_subscription_post requestBody: content: application/json: schema: $ref: '#/components/schemas/CreateWebhookSubscriptionRequest' required: true responses: '201': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/WebhookSubscriptionModel' '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - ClientIdAuth: [] ClientSecretAuth: [] x-codeSamples: - lang: cURL label: cURL source: "curl --location --request POST 'https://api.ouraring.com/v2/webhook/subscription'\ \ --header 'x-client-id: client-id' --header 'x-client-secret: client-secret'\ \ --header 'Content-Type: application/json' --data-raw '{\n \"callback_url\"\ : \"https://my-api/oura/tag/delete\",\n \"verification_token\": \"123\"\ ,\n \"event_type\": \"delete\",\n \"data_type\": \"tag\"\n}'" /v2/webhook/subscription/{id}: get: tags: - Webhook Subscription Routes summary: Get Webhook Subscription operationId: get_webhook_subscription_v2_webhook_subscription__id__get parameters: - name: id in: path required: true schema: type: string title: Id responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/WebhookSubscriptionModel' '403': description: Webhook with specified id does not exist. '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - ClientIdAuth: [] ClientSecretAuth: [] x-codeSamples: - lang: cURL label: cURL source: 'curl --location --request GET ''https://api.ouraring.com/v2/webhook/subscription/5d3fe17b-f880-4d93-b9b6-afbfb76c1e78'' --header ''x-client-id: client-id'' --header ''x-client-secret: client-secret''' put: tags: - Webhook Subscription Routes summary: Update Webhook Subscription operationId: update_webhook_subscription_v2_webhook_subscription__id__put parameters: - name: id in: path required: true schema: type: string title: Id requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/UpdateWebhookSubscriptionRequest' responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/WebhookSubscriptionModel' '403': description: Webhook with specified id does not exist. '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - ClientIdAuth: [] ClientSecretAuth: [] x-codeSamples: - lang: cURL label: cURL source: "curl --location --request PUT 'https://api.ouraring.com/v2/webhook/subscription/5d3fe17b-f880-4d93-b9b6-afbfb76c1e78'\ \ --header 'x-client-id: client-id' --header 'x-client-secret: client-secret'\ \ --header 'Content-Type: application/json' --data-raw '{\n \"callback_url\"\ : \"https://my-api/oura/tag/delete\",\n \"verification_token\": \"123\"\ ,\n \"event_type\": \"delete\",\n \"data_type\": \"tag\"\n}'" delete: tags: - Webhook Subscription Routes summary: Delete Webhook Subscription operationId: delete_webhook_subscription_v2_webhook_subscription__id__delete parameters: - name: id in: path required: true schema: type: string title: Id responses: '204': description: Successful Response '403': description: Webhook with specified id does not exist. '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - ClientIdAuth: [] ClientSecretAuth: [] x-codeSamples: - lang: cURL label: cURL source: 'curl --location --request DELETE ''https://api.ouraring.com/v2/webhook/subscription/5d3fe17b-f880-4d93-b9b6-afbfb76c1e78'' --header ''x-client-id: client-id'' --header ''x-client-secret: client-secret''' /v2/webhook/subscription/renew/{id}: put: tags: - Webhook Subscription Routes summary: Renew Webhook Subscription operationId: renew_webhook_subscription_v2_webhook_subscription_renew__id__put parameters: - name: id in: path required: true schema: type: string title: Id responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/WebhookSubscriptionModel' '403': description: Webhook with specified id does not exist. '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - ClientIdAuth: [] ClientSecretAuth: [] x-codeSamples: - lang: cURL label: cURL source: 'curl --location --request PUT ''https://api.ouraring.com/v2/webhook/subscription/renew/5d3fe17b-f880-4d93-b9b6-afbfb76c1e78'' --header ''x-client-id: client-id'' --header ''x-client-secret: client-secret'' --header ''Content-Type: application/json''' /v2/usercollection/heartrate: get: tags: - Heart Rate Routes summary: Multiple Heartrate Documents operationId: Multiple_heartrate_Documents_v2_usercollection_heartrate_get parameters: - name: start_datetime in: query required: false schema: type: string format: date-time nullable: true title: Start Datetime - name: end_datetime in: query required: false schema: type: string format: date-time nullable: true title: End Datetime - name: next_token in: query required: false schema: type: string nullable: true title: Next Token - name: latest in: query required: false schema: type: boolean nullable: true description: If True, returns most recent sample. title: Latest description: If True, returns most recent sample. - name: fields in: query required: false schema: type: string nullable: true description: Comma-separated list of fields to include in the response, in addition to the always returned fields. Defaults to all fields if not provided. title: Fields description: Comma-separated list of fields to include in the response, in addition to the always returned fields. Defaults to all fields if not provided. responses: '200': description: Successful Response content: application/json: schema: anyOf: - $ref: '#/components/schemas/TimeSeriesResponse_PublicHeartRateRow_' - $ref: '#/components/schemas/TimeSeriesResponseDict' title: Response Multiple Heartrate Documents V2 Usercollection Heartrate Get '400': description: Client Exception '401': description: Unauthorized access exception. Usually means the access token is expired, malformed or revoked. '403': description: Access forbidden. Usually means the user's subscription to Oura has expired and their data is not available via the API. '429': description: Request Rate Limit Exceeded. '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - BearerAuth: [] - OAuth2: [] x-codeSamples: - lang: cURL label: cURL source: "# The '+' symbol in the timezone must be escaped to `%2B` if included.\ \ \ncurl --location --request GET 'https://api.ouraring.com/v2/usercollection/heartrate?start_datetime=2021-11-01T00:00:00-08:00&end_datetime=2021-12-01T00:00:00-08:00&fields=timestamp,bpm'\ \ \\ \n--header 'Authorization: Bearer '" - lang: Python source: "import requests \nurl = 'https://api.ouraring.com/v2/usercollection/heartrate'\ \ \nparams={ \n 'start_datetime': '2021-11-01T00:00:00-08:00', \n \ \ 'end_datetime': '2021-12-01T00:00:00-08:00',\n 'fields': 'timestamp,bpm'\ \ \n} \nheaders = { \n 'Authorization': 'Bearer ' \n}\nresponse\ \ = requests.request('GET', url, headers=headers, params=params) \nprint(response.text)" label: Python - lang: JavaScript source: "var myHeaders = new Headers(); \nmyHeaders.append('Authorization',\ \ 'Bearer '); \nvar requestOptions = { \n method: 'GET', \n headers:\ \ myHeaders, \n}; \nfetch('https://api.ouraring.com/v2/usercollection/heartrate?start_datetime=2021-11-01T00:00:00-08:00&end_datetime=2021-12-01T00:00:00-08:00&fields=timestamp,bpm',\ \ requestOptions) \n .then(response => response.text()) \n .then(result\ \ => console.log(result)) \n .catch(error => console.log('error', error));" label: JavaScript - lang: Java source: "OkHttpClient client = new OkHttpClient().newBuilder() \n .build();\ \ \nRequest request = new Request.Builder() \n .url(\"https://api.ouraring.com/v2/usercollection/heartrate?start_datetime=2021-11-01T00:00:00-08:00&end_datetime=2021-12-01T00:00:00-08:00&fields=timestamp,bpm\"\ ) \n .method(\"GET\", null) \n .addHeader(\"Authorization\", \"Bearer\ \ \") \n .build(); \nResponse response = client.newCall(request).execute();" label: Java /v2/sandbox/usercollection/heartrate: get: tags: - Sandbox Routes summary: Sandbox - Multiple Heartrate Documents operationId: Sandbox___Multiple_heartrate_Documents_v2_sandbox_usercollection_heartrate_get parameters: - name: start_datetime in: query required: false schema: type: string format: date-time nullable: true title: Start Datetime - name: end_datetime in: query required: false schema: type: string format: date-time nullable: true title: End Datetime - name: next_token in: query required: false schema: type: string nullable: true title: Next Token responses: '200': description: Successful Response content: application/json: schema: anyOf: - $ref: '#/components/schemas/TimeSeriesResponse_PublicHeartRateRow_' - $ref: '#/components/schemas/TimeSeriesResponseDict' title: Response Sandbox Multiple Heartrate Documents V2 Sandbox Usercollection Heartrate Get '400': description: Client Exception '401': description: Unauthorized access exception. Usually means the access token is expired, malformed or revoked. '403': description: Access forbidden. Usually means the user's subscription to Oura has expired and their data is not available via the API. '429': description: Request Rate Limit Exceeded. '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - BearerAuth: [] - OAuth2: [] x-codeSamples: - lang: cURL label: cURL source: "# The '+' symbol in the timezone must be escaped to `%2B` if included.\ \ \ncurl --location --request GET 'https://api.ouraring.com/v2/sandbox/usercollection/heartrate?start_datetime=2021-11-01T00:00:00-08:00&end_datetime=2021-12-01T00:00:00-08:00&fields=timestamp,bpm'\ \ \\ \n--header 'Authorization: Bearer '" - lang: Python source: "import requests \nurl = 'https://api.ouraring.com/v2/sandbox/usercollection/heartrate'\ \ \nparams={ \n 'start_datetime': '2021-11-01T00:00:00-08:00', \n \ \ 'end_datetime': '2021-12-01T00:00:00-08:00',\n 'fields': 'timestamp,bpm'\ \ \n} \nheaders = { \n 'Authorization': 'Bearer ' \n}\nresponse\ \ = requests.request('GET', url, headers=headers, params=params) \nprint(response.text)" label: Python - lang: JavaScript source: "var myHeaders = new Headers(); \nmyHeaders.append('Authorization',\ \ 'Bearer '); \nvar requestOptions = { \n method: 'GET', \n headers:\ \ myHeaders, \n}; \nfetch('https://api.ouraring.com/v2/sandbox/usercollection/heartrate?start_datetime=2021-11-01T00:00:00-08:00&end_datetime=2021-12-01T00:00:00-08:00&fields=timestamp,bpm',\ \ requestOptions) \n .then(response => response.text()) \n .then(result\ \ => console.log(result)) \n .catch(error => console.log('error', error));" label: JavaScript - lang: Java source: "OkHttpClient client = new OkHttpClient().newBuilder() \n .build();\ \ \nRequest request = new Request.Builder() \n .url(\"https://api.ouraring.com/v2/sandbox/usercollection/heartrate?start_datetime=2021-11-01T00:00:00-08:00&end_datetime=2021-12-01T00:00:00-08:00&fields=timestamp,bpm\"\ ) \n .method(\"GET\", null) \n .addHeader(\"Authorization\", \"Bearer\ \ \") \n .build(); \nResponse response = client.newCall(request).execute();" label: Java /v2/usercollection/ring_battery_level: get: tags: - Ring Battery Level Routes summary: Multiple Ring Battery Level Documents operationId: Multiple_ring_battery_level_Documents_v2_usercollection_ring_battery_level_get parameters: - name: start_datetime in: query required: false schema: type: string format: date-time nullable: true title: Start Datetime - name: end_datetime in: query required: false schema: type: string format: date-time nullable: true title: End Datetime - name: next_token in: query required: false schema: type: string nullable: true title: Next Token - name: latest in: query required: false schema: type: boolean nullable: true description: If True, returns most recent sample. title: Latest description: If True, returns most recent sample. - name: fields in: query required: false schema: type: string nullable: true description: Comma-separated list of fields to include in the response, in addition to the always returned fields. Defaults to all fields if not provided. title: Fields description: Comma-separated list of fields to include in the response, in addition to the always returned fields. Defaults to all fields if not provided. responses: '200': description: Successful Response content: application/json: schema: anyOf: - $ref: '#/components/schemas/TimeSeriesResponse_PublicRingBatteryLevelRow_' - $ref: '#/components/schemas/TimeSeriesResponseDict' title: Response Multiple Ring Battery Level Documents V2 Usercollection Ring Battery Level Get '400': description: Client Exception '401': description: Unauthorized access exception. Usually means the access token is expired, malformed or revoked. '403': description: Access forbidden. Usually means the user's subscription to Oura has expired and their data is not available via the API. '429': description: Request Rate Limit Exceeded. '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - BearerAuth: [] - OAuth2: [] x-codeSamples: - lang: cURL label: cURL source: "# The '+' symbol in the timezone must be escaped to `%2B` if included.\ \ \ncurl --location --request GET 'https://api.ouraring.com/v2/usercollection/ring_battery_level?start_datetime=2021-11-01T00:00:00-08:00&end_datetime=2021-12-01T00:00:00-08:00&fields=timestamp,bpm'\ \ \\ \n--header 'Authorization: Bearer '" - lang: Python source: "import requests \nurl = 'https://api.ouraring.com/v2/usercollection/ring_battery_level'\ \ \nparams={ \n 'start_datetime': '2021-11-01T00:00:00-08:00', \n \ \ 'end_datetime': '2021-12-01T00:00:00-08:00',\n 'fields': 'timestamp,bpm'\ \ \n} \nheaders = { \n 'Authorization': 'Bearer ' \n}\nresponse\ \ = requests.request('GET', url, headers=headers, params=params) \nprint(response.text)" label: Python - lang: JavaScript source: "var myHeaders = new Headers(); \nmyHeaders.append('Authorization',\ \ 'Bearer '); \nvar requestOptions = { \n method: 'GET', \n headers:\ \ myHeaders, \n}; \nfetch('https://api.ouraring.com/v2/usercollection/ring_battery_level?start_datetime=2021-11-01T00:00:00-08:00&end_datetime=2021-12-01T00:00:00-08:00&fields=timestamp,bpm',\ \ requestOptions) \n .then(response => response.text()) \n .then(result\ \ => console.log(result)) \n .catch(error => console.log('error', error));" label: JavaScript - lang: Java source: "OkHttpClient client = new OkHttpClient().newBuilder() \n .build();\ \ \nRequest request = new Request.Builder() \n .url(\"https://api.ouraring.com/v2/usercollection/ring_battery_level?start_datetime=2021-11-01T00:00:00-08:00&end_datetime=2021-12-01T00:00:00-08:00&fields=timestamp,bpm\"\ ) \n .method(\"GET\", null) \n .addHeader(\"Authorization\", \"Bearer\ \ \") \n .build(); \nResponse response = client.newCall(request).execute();" label: Java /v2/sandbox/usercollection/ring_battery_level: get: tags: - Sandbox Routes summary: Sandbox - Multiple Ring Battery Level Documents operationId: Sandbox___Multiple_ring_battery_level_Documents_v2_sandbox_usercollection_ring_battery_level_get parameters: - name: start_datetime in: query required: false schema: type: string format: date-time nullable: true title: Start Datetime - name: end_datetime in: query required: false schema: type: string format: date-time nullable: true title: End Datetime - name: next_token in: query required: false schema: type: string nullable: true title: Next Token responses: '200': description: Successful Response content: application/json: schema: anyOf: - $ref: '#/components/schemas/TimeSeriesResponse_PublicRingBatteryLevelRow_' - $ref: '#/components/schemas/TimeSeriesResponseDict' title: Response Sandbox Multiple Ring Battery Level Documents V2 Sandbox Usercollection Ring Battery Level Get '400': description: Client Exception '401': description: Unauthorized access exception. Usually means the access token is expired, malformed or revoked. '403': description: Access forbidden. Usually means the user's subscription to Oura has expired and their data is not available via the API. '429': description: Request Rate Limit Exceeded. '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - BearerAuth: [] - OAuth2: [] x-codeSamples: - lang: cURL label: cURL source: "# The '+' symbol in the timezone must be escaped to `%2B` if included.\ \ \ncurl --location --request GET 'https://api.ouraring.com/v2/sandbox/usercollection/ring_battery_level?start_datetime=2021-11-01T00:00:00-08:00&end_datetime=2021-12-01T00:00:00-08:00&fields=timestamp,bpm'\ \ \\ \n--header 'Authorization: Bearer '" - lang: Python source: "import requests \nurl = 'https://api.ouraring.com/v2/sandbox/usercollection/ring_battery_level'\ \ \nparams={ \n 'start_datetime': '2021-11-01T00:00:00-08:00', \n \ \ 'end_datetime': '2021-12-01T00:00:00-08:00',\n 'fields': 'timestamp,bpm'\ \ \n} \nheaders = { \n 'Authorization': 'Bearer ' \n}\nresponse\ \ = requests.request('GET', url, headers=headers, params=params) \nprint(response.text)" label: Python - lang: JavaScript source: "var myHeaders = new Headers(); \nmyHeaders.append('Authorization',\ \ 'Bearer '); \nvar requestOptions = { \n method: 'GET', \n headers:\ \ myHeaders, \n}; \nfetch('https://api.ouraring.com/v2/sandbox/usercollection/ring_battery_level?start_datetime=2021-11-01T00:00:00-08:00&end_datetime=2021-12-01T00:00:00-08:00&fields=timestamp,bpm',\ \ requestOptions) \n .then(response => response.text()) \n .then(result\ \ => console.log(result)) \n .catch(error => console.log('error', error));" label: JavaScript - lang: Java source: "OkHttpClient client = new OkHttpClient().newBuilder() \n .build();\ \ \nRequest request = new Request.Builder() \n .url(\"https://api.ouraring.com/v2/sandbox/usercollection/ring_battery_level?start_datetime=2021-11-01T00:00:00-08:00&end_datetime=2021-12-01T00:00:00-08:00&fields=timestamp,bpm\"\ ) \n .method(\"GET\", null) \n .addHeader(\"Authorization\", \"Bearer\ \ \") \n .build(); \nResponse response = client.newCall(request).execute();" label: Java components: schemas: Array_Union_float__NoneType__Bits64_: items: type: number nullable: true type: array title: ArrayNullableFloatBits64 CreateWebhookSubscriptionRequest: properties: callback_url: type: string title: Callback Url verification_token: type: string title: Verification Token event_type: $ref: '#/components/schemas/WebhookOperation' data_type: $ref: '#/components/schemas/ExtApiV2DataType' type: object required: - callback_url - verification_token - event_type - data_type title: CreateWebhookSubscriptionRequest DailyResilienceModel: properties: id: type: string title: Id day: type: string format: date title: Day description: Day when the resilience record was recorded. contributors: $ref: '#/components/schemas/ResilienceContributors' description: Contributors to the resilience score. level: $ref: '#/components/schemas/LongTermResilienceLevel' description: Resilience level. type: object required: - id - day - contributors - level title: DailyResilienceModel EnhancedTagModel: properties: id: type: string title: Id tag_type_code: type: string nullable: true title: Tag Type Code description: The unique code of the selected tag type, `NULL` for text-only tags, or `custom` for custom tag types. start_time: $ref: '#/components/schemas/LocalDateTime' description: Timestamp of the tag (if no duration) or the start time of the tag (with duration). end_time: $ref: '#/components/schemas/LocalDateTime' nullable: true description: Timestamp of the tag's end for events with duration or `NULL` if there is no duration. start_day: type: string format: date title: Start Day description: Day of the tag (if no duration) or the start day of the tag (with duration). end_day: type: string format: date nullable: true title: End Day description: Day of the tag's end for events with duration or `NULL` if there is no duration. comment: type: string nullable: true title: Comment description: Additional freeform text on the tag. custom_name: type: string nullable: true title: Custom Name description: The name of the tag if the tag_type_code is `custom`. type: object required: - id - start_time - start_day title: EnhancedTagModel description: 'An EnhancedTagModel maps an ASSATag. An ASSATag in ExtAPIV2 is called a EnhancedTag An EnhancedTagModel will be populated by data from an ASSATag The fields in the EnhancedTagModel map to fields in an ASSATag' ExtApiV2DataType: type: string enum: - tag - enhanced_tag - workout - session - sleep - daily_sleep - daily_readiness - daily_activity - daily_spo2 - sleep_time - rest_mode_period - ring_configuration - daily_stress - daily_cardiovascular_age - daily_resilience - vo2_max - meal title: ExtApiV2DataType HTTPValidationError: properties: detail: items: $ref: '#/components/schemas/ValidationError' type: array title: Detail type: object title: HTTPValidationError ISODate: type: string LocalDateTime: type: string LocalizedDateTime: type: string LongTermResilienceLevel: type: string enum: - limited - adequate - solid - strong - exceptional title: LongTermResilienceLevel description: Possible long term resilience level values. MultiDocumentResponseDict: properties: data: items: additionalProperties: true type: object type: array title: Data next_token: type: string nullable: true title: Next Token type: object required: - data - next_token title: MultiDocumentResponseDict MultiDocumentResponse_DailyResilienceModel_: properties: data: items: $ref: '#/components/schemas/DailyResilienceModel' type: array title: Data next_token: type: string nullable: true title: Next Token type: object required: - data - next_token title: MultiDocumentResponse[DailyResilienceModel] MultiDocumentResponse_EnhancedTagModel_: properties: data: items: $ref: '#/components/schemas/EnhancedTagModel' type: array title: Data next_token: type: string nullable: true title: Next Token type: object required: - data - next_token title: MultiDocumentResponse[EnhancedTagModel] MultiDocumentResponse_PublicDailyActivity_: properties: data: items: $ref: '#/components/schemas/PublicDailyActivity' type: array title: Data next_token: type: string nullable: true title: Next Token type: object required: - data - next_token title: MultiDocumentResponse[PublicDailyActivity] MultiDocumentResponse_PublicDailyCardiovascularAge_: properties: data: items: $ref: '#/components/schemas/PublicDailyCardiovascularAge' type: array title: Data next_token: type: string nullable: true title: Next Token type: object required: - data - next_token title: MultiDocumentResponse[PublicDailyCardiovascularAge] MultiDocumentResponse_PublicDailyReadiness_: properties: data: items: $ref: '#/components/schemas/PublicDailyReadiness' type: array title: Data next_token: type: string nullable: true title: Next Token type: object required: - data - next_token title: MultiDocumentResponse[PublicDailyReadiness] MultiDocumentResponse_PublicDailySleep_: properties: data: items: $ref: '#/components/schemas/PublicDailySleep' type: array title: Data next_token: type: string nullable: true title: Next Token type: object required: - data - next_token title: MultiDocumentResponse[PublicDailySleep] MultiDocumentResponse_PublicDailySpO2_: properties: data: items: $ref: '#/components/schemas/PublicDailySpO2' type: array title: Data next_token: type: string nullable: true title: Next Token type: object required: - data - next_token title: MultiDocumentResponse[PublicDailySpO2] MultiDocumentResponse_PublicDailyStress_: properties: data: items: $ref: '#/components/schemas/PublicDailyStress' type: array title: Data next_token: type: string nullable: true title: Next Token type: object required: - data - next_token title: MultiDocumentResponse[PublicDailyStress] MultiDocumentResponse_PublicModifiedSleepModel_: properties: data: items: $ref: '#/components/schemas/PublicModifiedSleepModel' type: array title: Data next_token: type: string nullable: true title: Next Token type: object required: - data - next_token title: MultiDocumentResponse[PublicModifiedSleepModel] MultiDocumentResponse_PublicRestModePeriod_: properties: data: items: $ref: '#/components/schemas/PublicRestModePeriod' type: array title: Data next_token: type: string nullable: true title: Next Token type: object required: - data - next_token title: MultiDocumentResponse[PublicRestModePeriod] MultiDocumentResponse_PublicRingConfiguration_: properties: data: items: $ref: '#/components/schemas/PublicRingConfiguration' type: array title: Data next_token: type: string nullable: true title: Next Token type: object required: - data - next_token title: MultiDocumentResponse[PublicRingConfiguration] MultiDocumentResponse_PublicSession_: properties: data: items: $ref: '#/components/schemas/PublicSession' type: array title: Data next_token: type: string nullable: true title: Next Token type: object required: - data - next_token title: MultiDocumentResponse[PublicSession] MultiDocumentResponse_PublicSleepTime_: properties: data: items: $ref: '#/components/schemas/PublicSleepTime' type: array title: Data next_token: type: string nullable: true title: Next Token type: object required: - data - next_token title: MultiDocumentResponse[PublicSleepTime] MultiDocumentResponse_PublicVO2Max_: properties: data: items: $ref: '#/components/schemas/PublicVO2Max' type: array title: Data next_token: type: string nullable: true title: Next Token type: object required: - data - next_token title: MultiDocumentResponse[PublicVO2Max] MultiDocumentResponse_PublicWorkout_: properties: data: items: $ref: '#/components/schemas/PublicWorkout' type: array title: Data next_token: type: string nullable: true title: Next Token type: object required: - data - next_token title: MultiDocumentResponse[PublicWorkout] MultiDocumentResponse_TagModel_: properties: data: items: $ref: '#/components/schemas/TagModel' type: array title: Data next_token: type: string nullable: true title: Next Token type: object required: - data - next_token title: MultiDocumentResponse[TagModel] PersonalInfoResponse: properties: id: type: string title: Id age: type: integer nullable: true title: Age weight: type: number nullable: true title: Weight height: type: number nullable: true title: Height biological_sex: type: string nullable: true title: Biological Sex email: type: string nullable: true title: Email type: object required: - id title: PersonalInfoResponse PublicActivityContributors: properties: meet_daily_targets: type: integer nullable: true title: '' description: Contribution of meeting previous 7-day daily activity targets in range [1, 100]. move_every_hour: type: integer nullable: true title: '' description: Contribution of previous 24-hour inactivity alerts in range [1, 100]. recovery_time: type: integer nullable: true title: '' description: Contribution of previous 7-day recovery time in range [1, 100]. stay_active: type: integer nullable: true title: '' description: Contribution of previous 24-hour activity in range [1, 100]. training_frequency: type: integer nullable: true title: '' description: Contribution of previous 7-day exercise frequency in range [1, 100]. training_volume: type: integer nullable: true title: '' description: Contribution of previous 7-day exercise volume in range [1, 100]. type: object title: PublicActivityContributors description: Object defining activity score contributors. PublicDailyActivity: properties: id: type: string minLength: 1 title: '' description: Unique identifier of the object. active_calories: type: integer title: '' description: Active calories expended in kilocalories. average_met_minutes: type: number title: '' description: Average MET minutes. class_5_min: type: string nullable: true title: '' description: '5-minute activity classification for the period where every character corresponds to: ''0'' = non wear ''1'' = rest ''2'' = inactive ''3'' = low activity ''4'' = medium activity ''5'' = high activity Example: "001233334555524001".' contributors: $ref: '#/components/schemas/PublicActivityContributors' title: '' description: Object containing activity score contributors. day: $ref: '#/components/schemas/ISODate' title: '' description: Day that the daily activity belong to. equivalent_walking_distance: type: integer title: '' description: Equivalent walking distance of energe expenditure in meters. high_activity_met_minutes: type: integer title: '' description: The total METs of each minute classified as high activity. high_activity_time: type: integer title: '' description: The total time in seconds of each minute classified as high activity. inactivity_alerts: type: integer title: '' description: Number of inactivity alerts received. low_activity_met_minutes: type: integer title: '' description: The total METs of each minute classified as low activity. low_activity_time: type: integer title: '' description: The total time in seconds of each minute classified as low activity. medium_activity_met_minutes: type: integer title: '' description: The total METs of each minute classified as medium activity. medium_activity_time: type: integer title: '' description: The total time in seconds of each minute classified as medium activity. met: $ref: '#/components/schemas/PublicSample' title: '' description: Sample containing METs. meters_to_target: type: integer title: '' description: Meters remaining to target. non_wear_time: type: integer title: '' description: Ring non-wear time in seconds. resting_time: type: integer title: '' description: Resting time in seconds. score: type: integer nullable: true title: '' description: Activity score in range [1, 100]. sedentary_met_minutes: type: integer title: '' description: Sedentary MET minutes. sedentary_time: type: integer title: '' description: Sedentary time in seconds. steps: type: integer title: '' description: Total number of steps taken. target_calories: type: integer title: '' description: Daily activity target in kilocalories. target_meters: type: integer title: '' description: Daily activity target in meters. timestamp: $ref: '#/components/schemas/LocalizedDateTime' title: '' description: Timestamp of the daily activity. total_calories: type: integer title: '' description: Total calories expended in kilocalories. type: object required: - id - active_calories - average_met_minutes - contributors - day - equivalent_walking_distance - high_activity_met_minutes - high_activity_time - inactivity_alerts - low_activity_met_minutes - low_activity_time - medium_activity_met_minutes - medium_activity_time - met - meters_to_target - non_wear_time - resting_time - sedentary_met_minutes - sedentary_time - steps - target_calories - target_meters - timestamp - total_calories title: PublicDailyActivity description: Object defining a daily activity that is a 24-hour period starting at 4 a.m. x-cloud-only: true x-collection: publicdailyactivity x-owner: movement-squad PublicDailyCardiovascularAge: properties: id: type: string minLength: 1 title: '' description: Unique identifier of the object. day: $ref: '#/components/schemas/ISODate' title: '' description: Day that the prediction belongs to. pulse_wave_velocity: type: number nullable: true title: '' description: Pulse wave velocity (m/s), derived from vascular age, with possible offset added. vascular_age: type: integer nullable: true title: '' description: Predicted vascular age in range [18, 100]. type: object required: - id - day title: PublicDailyCardiovascularAge description: Daily Cardiovascular Age. x-cloud-only: true x-collection: publicdailycardiovascularage x-owner: heart-health-squad PublicDailyReadiness: properties: id: type: string minLength: 1 title: '' description: Unique identifier of the object. contributors: $ref: '#/components/schemas/PublicReadinessContributors' title: '' description: Contributors of the daily readiness score. day: $ref: '#/components/schemas/ISODate' title: '' description: Day that the daily readiness belongs to. score: type: integer nullable: true title: '' description: Daily readiness score. temperature_deviation: type: number nullable: true title: '' description: Temperature deviation in degrees Celsius. temperature_trend_deviation: type: number nullable: true title: '' description: Temperature trend deviation in degrees Celsius. timestamp: $ref: '#/components/schemas/LocalizedDateTime' title: '' description: Timestamp of the daily readiness. type: object required: - id - contributors - day - timestamp title: PublicDailyReadiness description: Public object defining daily readiness. x-cloud-only: true x-collection: publicdailyreadiness x-owner: wellbeing-squad PublicDailySleep: properties: id: type: string minLength: 1 title: '' description: Unique identifier of the object. contributors: $ref: '#/components/schemas/PublicSleepContributors' title: '' description: Contributors for the daily sleep score. day: $ref: '#/components/schemas/ISODate' title: '' description: Day that the daily sleep belongs to. score: type: integer nullable: true title: '' description: Daily sleep score. timestamp: $ref: '#/components/schemas/LocalizedDateTime' title: '' description: Timestamp of the daily sleep. type: object required: - id - contributors - day - timestamp title: PublicDailySleep description: Public object defining daily sleep. x-cloud-only: true x-collection: publicdailysleep x-owner: sleep-squad PublicDailySpO2: properties: id: type: string minLength: 1 title: '' description: Unique identifier of the object. breathing_disturbance_index: type: integer nullable: true title: '' description: Breathing Disturbance Index (BDI) calculated using detected SpO2 drops from timeseries. Values should be in range [0, 100] day: $ref: '#/components/schemas/ISODate' title: '' description: Day that the spo2 values belong to. spo2_percentage: $ref: '#/components/schemas/PublicSpo2AggregatedValues' nullable: true title: '' description: The daily SpO2 percentage value aggregates. Sourced from SpO2 percentage timeseries values. type: object required: - id - day title: PublicDailySpO2 description: Daily SpO2 (Oxygen saturation). x-cloud-only: true x-collection: publicdailyspo2 x-owner: sleep-squad PublicDailyStress: properties: id: type: string minLength: 1 title: '' description: Unique identifier of the object. day: $ref: '#/components/schemas/ISODate' title: '' description: Day that the daily stress belongs to. day_summary: $ref: '#/components/schemas/PublicDailyStressSummary' nullable: true title: '' description: Stress summary of full day. recovery_high: type: integer nullable: true title: '' description: Time spent in a high recovery zone (bottom quartile data) in seconds. stress_high: type: integer nullable: true title: '' description: Time spent in a high stress zone (top quartile of data) in seconds. type: object required: - id - day title: PublicDailyStress description: Daily stress. x-cloud-only: true x-collection: publicdailystress x-owner: wellbeing-squad PublicDailyStressSummary: type: string enum: - restored - normal - stressful title: PublicDailyStressSummary description: Possible public daily stress summary types. PublicHeartRateRow: properties: timestamp: $ref: '#/components/schemas/UtcDateTime' title: '' description: Timestamp of the discrete sample. timestamp_unix: type: integer title: '' description: Timestamp of the discrete sample as unix time in milliseconds. bpm: type: integer title: '' description: Heart rate as beats per minute. source: $ref: '#/components/schemas/PublicHeartRateSource' title: '' description: Source of the sample. type: object required: - timestamp - timestamp_unix - bpm - source title: PublicHeartRateRow description: Heart rate sample x-cloud-only: true x-collection: publicheartrate x-owner: core-sensing-squad PublicHeartRateSource: type: string enum: - awake - workout - rest - sleep - live - session title: PublicHeartRateSource description: Possible heart rate sources. PublicModifiedSleepModel: properties: id: type: string minLength: 1 title: '' description: Unique identifier of the object. average_breath: type: number nullable: true title: '' description: Average breathing rate during sleep as breaths/minute. average_heart_rate: type: number nullable: true title: '' description: 'Average heart rate during sleep as beats/minute. NOTE: this is the average calculated by ecore (based on 30-second samples) which is different from what is shown in the app. The app shows the average of aggregated 5-minute heart rate samples.' average_hrv: type: integer nullable: true title: '' description: Average heart rate variability during sleep. awake_time: type: integer nullable: true title: '' description: Duration spent awake in seconds. bedtime_end: $ref: '#/components/schemas/LocalizedDateTime' title: '' description: Bedtime end of the sleep. bedtime_start: $ref: '#/components/schemas/LocalizedDateTime' title: '' description: Bedtime start of the sleep. day: $ref: '#/components/schemas/ISODate' title: '' description: Day that the sleep belongs to. deep_sleep_duration: type: integer nullable: true title: '' description: Duration spent in deep sleep in seconds. efficiency: type: integer nullable: true title: '' description: Sleep efficiency rating in range [1, 100]. heart_rate: $ref: '#/components/schemas/PublicSample' nullable: true title: '' description: Object containing heart rate samples. hrv: $ref: '#/components/schemas/PublicSample' nullable: true title: '' description: Object containing heart rate variability samples. latency: type: integer nullable: true title: '' description: Sleep latency in seconds. This is the time it took for the user to fall asleep after going to bed. light_sleep_duration: type: integer nullable: true title: '' description: Duration spent in light sleep in seconds. low_battery_alert: type: boolean title: '' description: Flag indicating if a low battery alert occurred. lowest_heart_rate: type: integer nullable: true title: '' description: 'Lowest heart rate during sleep. NOTE: this is the value calculated by ecore (based on 30-second samples) which is different from what is shown in the app. The app shows the minimum of aggregated 5-minute heart rate samples.' movement_30_sec: type: string nullable: true title: '' description: '30-second movement classification for the period where every character corresponds to: ''1'' = no motion, ''2'' = restless, ''3'' = tossing and turning ''4'' = active Example: "1143222134".' period: type: integer title: '' description: ECore sleep period identifier. readiness: $ref: '#/components/schemas/PublicReadiness' nullable: true title: '' description: Object containing the readiness details. readiness_score_delta: type: integer nullable: true title: '' description: Effect on readiness score caused by this sleep period. rem_sleep_duration: type: integer nullable: true title: '' description: Duration spent in REM sleep in seconds. restless_periods: type: integer nullable: true title: '' description: Number of restless periods during sleep. sleep_algorithm_version: $ref: '#/components/schemas/PublicSleepAlgorithmVersion' nullable: true title: '' description: Version of the sleep algorithm used to calculate the sleep data. sleep_analysis_reason: $ref: '#/components/schemas/PublicSleepAnalysisReason' nullable: true title: '' description: The reason for the creation or update of the latest version of this sleep. sleep_phase_30_sec: type: string nullable: true title: '' description: '30-second sleep phase classification for the period where every character corresponds to: ''1'' = deep sleep, ''2'' = light sleep, ''3'' = REM sleep ''4'' = awake. Example: "444423323441114".' sleep_phase_5_min: type: string nullable: true title: '' description: '5-minute sleep phase classification for the period where every character corresponds to: ''1'' = deep sleep, ''2'' = light sleep, ''3'' = REM sleep ''4'' = awake. Example: "444423323441114".' sleep_score_delta: type: integer nullable: true title: '' description: Effect on sleep score caused by this sleep period. time_in_bed: type: integer title: '' description: Duration spent in bed in seconds. total_sleep_duration: type: integer nullable: true title: '' description: Total sleep duration in seconds. type: $ref: '#/components/schemas/PublicSleepType' nullable: true title: '' description: Type of the sleep period. ring_id: type: string nullable: true title: Ring Id description: Encrypted identifier of the ring that produced this sleep data. app_sleep_phase_5_min: type: string nullable: true title: App Sleep Phase 5 Min description: "\n 5-minute sleep phase classification for the period\ \ aligned with what is shown in the app\n where every character\ \ corresponds to:\n '1' = deep sleep,\n '2' = light sleep,\n\ \ '3' = REM sleep\n '4' = awake.\n Example: \"444423323441114\"\ .\n NOTE: This field will be removed in the future after a transition\ \ period.\n " type: object required: - id - bedtime_end - bedtime_start - day - low_battery_alert - period - time_in_bed title: PublicModifiedSleepModel x-cloud-only: true x-collection: publicsleepmodel x-owner: sleep-squad PublicMomentMood: type: string enum: - bad - worse - same - good - great title: PublicMomentMood description: Possible Moment moods. PublicMomentType: type: string enum: - breathing - meditation - nap - relaxation - rest - body_status title: PublicMomentType description: Possible Moment types. PublicReadiness: properties: contributors: $ref: '#/components/schemas/PublicReadinessContributors' title: '' description: Contributors of the readiness score. score: type: integer nullable: true title: '' description: Readiness score in range [1, 100]. temperature_deviation: type: number nullable: true title: '' description: Temperature deviation in degrees Celsius. temperature_trend_deviation: type: number nullable: true title: '' description: Temperature trend deviation in degrees Celsius. type: object required: - contributors title: PublicReadiness description: Object defining readiness. PublicReadinessContributors: properties: activity_balance: type: integer nullable: true title: '' description: Contribution of cumulative activity balance in range [1, 100]. body_temperature: type: integer nullable: true title: '' description: Contribution of body temperature in range [1, 100]. hrv_balance: type: integer nullable: true title: '' description: Contribution of heart rate variability balance in range [1, 100]. previous_day_activity: type: integer nullable: true title: '' description: Contribution of previous day's activity in range [1, 100]. previous_night: type: integer nullable: true title: '' description: Contribution of previous night's sleep in range [1, 100]. recovery_index: type: integer nullable: true title: '' description: Contribution of recovery index in range [1, 100]. resting_heart_rate: type: integer nullable: true title: '' description: Contribution of resting heart rate in range [1, 100]. sleep_balance: type: integer nullable: true title: '' description: Contribution of sleep balance in range [1, 100]. sleep_regularity: type: integer nullable: true title: '' description: Contribution of sleep regularity in range [1, 100]. type: object title: PublicReadinessContributors description: Object defining readiness score contributors. PublicRestModeEpisode: properties: tags: items: type: string type: array title: '' description: Tags selected for the episode. timestamp: $ref: '#/components/schemas/LocalizedDateTime' title: '' description: Timestamp indicating when the episode occurred. type: object required: - tags - timestamp title: PublicRestModeEpisode description: Object defining a public Rest Mode episode. PublicRestModePeriod: properties: id: type: string minLength: 1 title: '' description: Unique identifier of the object. end_day: $ref: '#/components/schemas/ISODate' nullable: true title: '' description: End date of rest mode. end_time: $ref: '#/components/schemas/LocalizedDateTime' nullable: true title: '' description: Timestamp when rest mode ended. episodes: items: $ref: '#/components/schemas/PublicRestModeEpisode' type: array title: '' description: Collection of episodes during rest mode, consisting of tags. start_day: $ref: '#/components/schemas/ISODate' title: '' description: Start date of rest mode. start_time: $ref: '#/components/schemas/LocalizedDateTime' nullable: true title: '' description: Timestamp when rest mode ended. type: object required: - id - episodes - start_day title: PublicRestModePeriod description: Rest mode episode information. x-cloud-only: true x-collection: publicrestmodeperiod x-owner: sleep-squad PublicRingBatteryLevelRow: properties: timestamp: $ref: '#/components/schemas/UtcDateTime' title: '' description: Timestamp of the discrete sample. timestamp_unix: type: integer title: '' description: Timestamp of the discrete sample as unix time in milliseconds. charging: type: boolean nullable: true title: '' description: Flag indicating if the ring was charging. in_charger: type: boolean nullable: true title: '' description: Flag indicating if the ring was in charger. level: type: integer title: '' description: Ring battery level percentage. These values are within [0, 100]. type: object required: - timestamp - timestamp_unix - level title: PublicRingBatteryLevelRow description: Object defining a ring battery level event. x-cloud-only: true x-collection: publicringbatterylevel x-owner: connectivity-squad PublicRingColor: type: string enum: - brushed_silver - glossy_black - glossy_gold - glossy_white - gucci - matt_gold - rose - silver - stealth_black - titanium - titanium_and_gold - cloud - petal - midnight - tide title: PublicRingColor description: Possible ring colors. PublicRingConfiguration: properties: id: type: string minLength: 1 title: '' description: Unique identifier of the object. color: $ref: '#/components/schemas/PublicRingColor' nullable: true title: '' description: Color of the ring. design: $ref: '#/components/schemas/PublicRingDesign' nullable: true title: '' description: Design of the ring. firmware_version: type: string nullable: true title: '' description: Firmware version of the ring. hardware_type: $ref: '#/components/schemas/PublicRingHardwareType' nullable: true title: '' description: Hardware type of the ring. set_up_at: $ref: '#/components/schemas/UtcDateTime' nullable: true title: '' description: UTC timestamp indicating when the ring was set up. size: type: integer nullable: true title: '' description: US size of the ring. type: object required: - id title: PublicRingConfiguration description: Ring configuration. x-cloud-only: true x-collection: publicringconfiguration x-owner: connectivity-squad PublicRingDesign: type: string enum: - heritage - balance - balance_diamond - horizon - ceramic title: PublicRingDesign description: Possible ring designs. PublicRingHardwareType: type: string enum: - gen1 - gen2 - gen2m - gen3 - gen4 title: PublicRingHardwareType description: Possible ring hardware types. PublicSample: properties: interval: type: number title: '' description: Interval in seconds between the sampled items. items: $ref: '#/components/schemas/Array_Union_float__NoneType__Bits64_' title: '' description: Recorded sample items. timestamp: $ref: '#/components/schemas/LocalizedDateTime' title: '' description: Timestamp when the sample recording started. type: object required: - interval - items - timestamp title: PublicSample description: Object defining a recorded sample. PublicSession: properties: id: type: string minLength: 1 title: '' description: Unique identifier of the object. day: $ref: '#/components/schemas/ISODate' title: '' description: The date when the session occurred. end_datetime: $ref: '#/components/schemas/LocalizedDateTime' title: '' description: Timestamp indicating when the Moment ended. heart_rate: $ref: '#/components/schemas/PublicSample' nullable: true title: '' description: Recorded heart rate samples during the Moment. heart_rate_variability: $ref: '#/components/schemas/PublicSample' nullable: true title: '' description: Recorded heart rate variability samples during the Moment. mood: $ref: '#/components/schemas/PublicMomentMood' nullable: true title: '' description: User-selected mood for the Moment. motion_count: $ref: '#/components/schemas/PublicSample' nullable: true title: '' description: Recorded motion count samples during the Moment. start_datetime: $ref: '#/components/schemas/LocalizedDateTime' title: '' description: Timestamp indicating when the Moment started. type: $ref: '#/components/schemas/PublicMomentType' title: '' description: Type of the Moment. type: object required: - id - day - end_datetime - start_datetime - type title: PublicSession description: Public model defining a recorded Session. x-cloud-only: true x-collection: publicsession x-owner: wellbeing-squad PublicSleepAlgorithmVersion: type: string enum: - v1 - v2 title: PublicSleepAlgorithmVersion description: 'Oura Sleep Staging Algorithms. v1 = original aka legacy aka OSSA 1.0, v2 = latest sleep algorithm' PublicSleepAnalysisReason: type: string enum: - foreground_sleep_analysis - bedtime_edit title: PublicSleepAnalysisReason description: Possible sleep analysis reasons. PublicSleepContributors: properties: deep_sleep: type: integer nullable: true title: '' description: Contribution of deep sleep in range [1, 100]. efficiency: type: integer nullable: true title: '' description: Contribution of sleep efficiency in range [1, 100]. latency: type: integer nullable: true title: '' description: Contribution of sleep latency in range [1, 100]. rem_sleep: type: integer nullable: true title: '' description: Contribution of REM sleep in range [1, 100]. restfulness: type: integer nullable: true title: '' description: Contribution of sleep restfulness in range [1, 100]. timing: type: integer nullable: true title: '' description: Contribution of sleep timing in range [1, 100]. total_sleep: type: integer nullable: true title: '' description: Contribution of total sleep in range [1, 100]. type: object title: PublicSleepContributors description: Object defining sleep score contributors. PublicSleepTime: properties: id: type: string minLength: 1 title: '' description: Unique identifier of the object. day: $ref: '#/components/schemas/ISODate' title: '' description: Corresponding day for the sleep time. optimal_bedtime: $ref: '#/components/schemas/PublicSleepTimeWindow' nullable: true title: '' description: Optimal bedtime. recommendation: $ref: '#/components/schemas/PublicSleepTimeRecommendation' nullable: true title: '' description: Recommended action for bedtime. status: $ref: '#/components/schemas/PublicSleepTimeStatus' nullable: true title: '' description: Sleep time status; used to inform sleep time recommendation. type: object required: - id - day title: PublicSleepTime description: Suggested bedtime for the user. x-cloud-only: true x-collection: publicsleeptime x-owner: sleep-squad PublicSleepTimeRecommendation: type: string enum: - improve_efficiency - earlier_bedtime - later_bedtime - earlier_wake_up_time - later_wake_up_time - follow_optimal_bedtime title: PublicSleepTimeRecommendation description: Possible public SleepTime recommendation. PublicSleepTimeStatus: type: string enum: - not_enough_nights - not_enough_recent_nights - bad_sleep_quality - only_recommended_found - optimal_found title: PublicSleepTimeStatus description: Possible public SleepTime status. PublicSleepTimeWindow: properties: day_tz: type: integer title: '' description: Timezone offset in second from GMT of the day end_offset: type: integer title: '' description: End offset from midnight in second start_offset: type: integer title: '' description: Start offset from midnight in second type: object required: - day_tz - end_offset - start_offset title: PublicSleepTimeWindow description: Object defining sleep time window PublicSleepType: type: string enum: - deleted - sleep - long_sleep - late_nap - rest title: PublicSleepType description: 'Possible sleep period types. ''deleted'' = deleted sleep by user. ''sleep'' = user confirmed sleep / nap, min 15 minutes, max 3 hours, contributes to daily scores ''late_nap'' = user confirmed sleep / nap, min 15 minutes, ended after sleep day change (6 pm), contributes to next days daily scores ''long_sleep'' = sleep that is long enough (>3h) to automatically contribute to daily scores ''rest'' = Falsely detected sleep / nap, rejected in confirm prompt by user' PublicSpo2AggregatedValues: properties: average: type: number title: '' description: Average of spo2. type: object required: - average title: PublicSpo2AggregatedValues description: Object defining public spo2 aggregated values. PublicVO2Max: properties: id: type: string minLength: 1 title: '' description: Unique identifier of the object. day: $ref: '#/components/schemas/ISODate' title: '' description: Day that the estimate belongs to. timestamp: $ref: '#/components/schemas/LocalizedDateTime' title: '' description: Timestamp indicating when the estimate was created. vo2_max: type: integer title: '' description: VO2 max value. type: object required: - id - day - timestamp - vo2_max title: PublicVO2Max description: VO2Max estimate. x-cloud-only: true x-collection: publicvo2max x-owner: movement-squad PublicWorkout: properties: id: type: string minLength: 1 title: '' description: Unique identifier of the object. activity: type: string title: '' description: Type of the workout activity. calories: type: number nullable: true title: '' description: Energy burned in kilocalories during the workout. day: $ref: '#/components/schemas/ISODate' title: '' description: Day when the workout occurred. distance: type: number nullable: true title: '' description: Distance traveled in meters during the workout. end_datetime: $ref: '#/components/schemas/LocalizedDateTime' title: '' description: Timestamp indicating when the workout ended. intensity: $ref: '#/components/schemas/PublicWorkoutIntensity' title: '' description: Intensity of the workout. label: type: string nullable: true title: '' description: User-defined label for the workout. source: $ref: '#/components/schemas/PublicWorkoutSource' title: '' description: Possible workout sources. start_datetime: $ref: '#/components/schemas/LocalizedDateTime' title: '' description: Timestamp indicating when the workout started. type: object required: - id - activity - day - end_datetime - intensity - source - start_datetime title: PublicWorkout description: Public model for Workout. x-cloud-only: true x-collection: publicworkout x-owner: movement-squad PublicWorkoutIntensity: type: string enum: - easy - moderate - hard title: PublicWorkoutIntensity description: Possible workout intensities. PublicWorkoutSource: type: string enum: - manual - autodetected - confirmed - workout_heart_rate title: PublicWorkoutSource description: Possible workout sources. ResilienceContributors: properties: sleep_recovery: type: number title: Sleep Recovery description: 'Sleep recovery contributor to the resilience score. Range: [0, 100]' daytime_recovery: type: number title: Daytime Recovery description: 'Daytime recovery contributor to the resilience score. Range: [0, 100]' stress: type: number title: Stress description: 'Stress contributor to the resilience score. Range: [0, 100]' type: object required: - sleep_recovery - daytime_recovery - stress title: ResilienceContributors TagModel: properties: id: type: string title: Id day: type: string format: date title: Day description: Day that the note belongs to. text: type: string nullable: true title: Text description: Textual contents of the note. timestamp: $ref: '#/components/schemas/LocalDateTime' description: Timestamp of the note. tags: items: type: string type: array title: Tags description: Selected tags for the tag. type: object required: - id - day - text - timestamp - tags title: TagModel description: 'A TagModel maps to an ASSANote. An ASSANote in ExtAPIV2 is called a Tag A TagModel will be populated by data from an ASSANote The fields in the TagModel map to fields in an ASSANote' TimeSeriesResponseDict: properties: data: items: additionalProperties: true type: object type: array title: Data next_token: type: string nullable: true title: Next Token type: object required: - data title: TimeSeriesResponseDict TimeSeriesResponse_PublicHeartRateRow_: properties: data: items: $ref: '#/components/schemas/PublicHeartRateRow' type: array title: Data next_token: type: string nullable: true title: Next Token type: object required: - data title: TimeSeriesResponse[PublicHeartRateRow] TimeSeriesResponse_PublicRingBatteryLevelRow_: properties: data: items: $ref: '#/components/schemas/PublicRingBatteryLevelRow' type: array title: Data next_token: type: string nullable: true title: Next Token type: object required: - data title: TimeSeriesResponse[PublicRingBatteryLevelRow] UpdateWebhookSubscriptionRequest: properties: verification_token: type: string title: Verification Token callback_url: type: string nullable: true title: Callback Url event_type: $ref: '#/components/schemas/WebhookOperation' nullable: true data_type: $ref: '#/components/schemas/ExtApiV2DataType' nullable: true type: object required: - verification_token title: UpdateWebhookSubscriptionRequest UtcDateTime: type: string ValidationError: properties: loc: items: anyOf: - type: string - type: integer type: array title: Location msg: type: string title: Message type: type: string title: Error Type type: object required: - loc - msg - type title: ValidationError WebhookOperation: type: string enum: - create - update - delete title: WebhookOperation WebhookSubscriptionModel: properties: id: type: string format: uuid4 title: Id callback_url: type: string title: Callback Url event_type: $ref: '#/components/schemas/WebhookOperation' data_type: $ref: '#/components/schemas/ExtApiV2DataType' expiration_time: type: string format: date-time title: Expiration Time type: object required: - id - callback_url - event_type - data_type - expiration_time title: WebhookSubscriptionModel securitySchemes: BearerAuth: type: http scheme: bearer OAuth2: type: oauth2 flows: authorizationCode: authorizationUrl: https://cloud.ouraring.com/oauth/authorize tokenUrl: https://api.ouraring.com/oauth/token scopes: email: Email address of the user personal: Personal information (gender, age, height, weight) daily: Daily summaries of sleep, activity and readiness heartrate: Time series heart rate for Gen 3 users workout: Summaries for auto-detected and user entered workouts tag: User entered tags session: Guided and unguided sessions in the Oura app spo2Daily: SpO2 Average recorded during sleep ClientIdAuth: type: apiKey in: header name: x-client-id description: Client ID for webhook subscription endpoints. Must be used together with x-client-secret header. ClientSecretAuth: type: apiKey in: header name: x-client-secret description: Client Secret for webhook subscription endpoints. Must be used together with x-client-id header. tags: - name: Data Model & Concepts description: "## Core Concepts\nThe Oura API provides access to various types of\ \ health data collected by the Oura Ring. Understanding how this data is organized\ \ is essential for effective API usage.\n### Data Types Overview\n- **Daily Summaries**:\ \ Aggregated metrics for each day (sleep score, readiness score, activity score)\n\ - **Time Series Data**: Detailed measurements taken throughout the day (heart\ \ rate, HRV, temperature)\n- **Events**: Discrete occurrences such as workouts,\ \ tags, and sessions\n### Data Processing Timeline\n1. **Data Collection**: The\ \ Oura Ring continuously collects biometric data\n2. **Syncing**: Data transfers\ \ to the Oura cloud when users sync their ring via the mobile app\n3. **Processing**:\ \ Algorithms analyze raw data to generate insights and scores\n4. **API Availability**:\ \ Processed data becomes available through API endpoints\n### Data Syncing Behavior\n\ Different data types follow different syncing patterns:\n- **User-Initiated Sync\ \ Data**:\n - **Sleep Data**: Only syncs when the user opens the Oura app and\ \ actively syncs their ring\n - **Sleep Time Recommendations**: Updated after\ \ sleep data syncs\n - **Readiness**: Calculated after sleep data is processed\n\ - **Background Sync Data**:\n - **Daily Activity**: Updates periodically in the\ \ background\n - **Daily Stress**: Updates periodically in the background\n \ \ - **Heart Rate**: Updates periodically in the background\nThis difference in\ \ syncing behavior affects when data becomes available through the API. For the\ \ most reliable access to all data types, we strongly recommend implementing webhooks\ \ to receive notifications when new data is available.\n### Common Data Structures\n\ - **Timestamps**: All time-based data uses ISO 8601 format\n- **Scores**: Range\ \ from 0-100, with higher values indicating better performance\n- **Durations**:\ \ Provided in seconds unless otherwise specified\n- **IDs**: Unique identifiers\ \ for specific data objects follow a consistent format\n### Data Freshness\nThe\ \ Oura API provides the most recently synced data, which depends on when users\ \ last synced their ring. For real-time updates, consider using webhooks to receive\ \ notifications when new data becomes available.\n### Best Practices for Data\ \ Access\n- **Initial Load**: When a user first connects to your application,\ \ make a single request for historical data\n- **Ongoing Updates**: Use webhooks\ \ for all subsequent data updates\n- **Webhook Integration**: This approach minimizes\ \ API calls and ensures you always have the latest data\n- **Error Handling**:\ \ Be prepared for occasional gaps in data if users don't regularly sync their\ \ rings\n### API Version Information\nThe current Oura API (V2) is the only available\ \ integration point. The previous V1 API has been sunset and is no longer available.\n" - name: Code Examples description: "Below are end-to-end examples showing how to use the Oura API in different\ \ programming languages:\n## OAuth2 Authentication Flow\n### Python\n```python\n\ import requests\nimport json\nfrom urllib.parse import urlencode\nimport webbrowser\n\ \n# Your OAuth2 application credentials\nCLIENT_ID = \"YOUR_CLIENT_ID\"\nCLIENT_SECRET\ \ = \"YOUR_CLIENT_SECRET\"\nREDIRECT_URI = \"YOUR_REDIRECT_URI\"\n\n# Step 1:\ \ Direct user to authorization page\nauth_params = {\n \"client_id\": CLIENT_ID,\n\ \ \"redirect_uri\": REDIRECT_URI,\n \"response_type\": \"code\",\n \"\ scope\": \"daily heartrate personal\"\n}\nauth_url = f\"https://cloud.ouraring.com/oauth/authorize?{urlencode(auth_params)}\"\ \nprint(f\"Please visit this URL to authorize: {auth_url}\")\nwebbrowser.open(auth_url)\n\ \n# Step 2: Exchange authorization code for access token\n# After user authorizes,\ \ they'll be redirected to your redirect URI with a code parameter\nauth_code\ \ = input(\"Enter the authorization code from the redirect URL: \")\n\ntoken_url\ \ = \"https://api.ouraring.com/oauth/token\"\ntoken_data = {\n \"grant_type\"\ : \"authorization_code\",\n \"code\": auth_code,\n \"client_id\": CLIENT_ID,\n\ \ \"client_secret\": CLIENT_SECRET,\n \"redirect_uri\": REDIRECT_URI\n}\n\ response = requests.post(token_url, data=token_data)\ntokens = response.json()\n\ access_token = tokens[\"access_token\"]\nrefresh_token = tokens[\"refresh_token\"\ ]\n\n# Step 3: Use the access token to make API calls\nheaders = {\"Authorization\"\ : f\"Bearer {access_token}\"}\nsleep_data = requests.get(\n \"https://api.ouraring.com/v2/usercollection/sleep\"\ ,\n headers=headers,\n params={\"start_date\": \"2023-01-01\", \"end_date\"\ : \"2023-01-07\"}\n)\nprint(json.dumps(sleep_data.json(), indent=2))\n\n# Step\ \ 4: Refresh the token when it expires\ndef refresh_access_token(refresh_token):\n\ \ token_data = {\n \"grant_type\": \"refresh_token\",\n \"refresh_token\"\ : refresh_token,\n \"client_id\": CLIENT_ID,\n \"client_secret\"\ : CLIENT_SECRET\n }\n response = requests.post(token_url, data=token_data)\n\ \ new_tokens = response.json()\n return new_tokens[\"access_token\"], new_tokens[\"\ refresh_token\"]\n```\n### JavaScript\n```javascript\n// Step 1: Redirect to authorization\ \ page\nconst authorizeUser = () => {\n const CLIENT_ID = \"YOUR_CLIENT_ID\"\ ;\n const REDIRECT_URI = \"YOUR_REDIRECT_URI\";\n const scopes = [\"daily\"\ , \"heartrate\", \"personal\"];\n\n const authUrl = `https://cloud.ouraring.com/oauth/authorize?`\ \ +\n `client_id=${CLIENT_ID}&` +\n `redirect_uri=${encodeURIComponent(REDIRECT_URI)}&`\ \ +\n `response_type=code&` +\n `scope=${scopes.join(\" \")}`;\n\n // Redirect\ \ user to authorization page\n window.location.href = authUrl;\n};\n\n// Step\ \ 2: Exchange authorization code for access token\n// This should be implemented\ \ on your server to protect your client secret\nasync function getAccessToken(code)\ \ {\n const response = await fetch(\"https://api.ouraring.com/oauth/token\",\ \ {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded\"\ ,\n },\n body: new URLSearchParams({\n grant_type: \"authorization_code\"\ ,\n code: code,\n client_id: \"YOUR_CLIENT_ID\",\n client_secret:\ \ \"YOUR_CLIENT_SECRET\",\n redirect_uri: \"YOUR_REDIRECT_URI\"\n })\n\ \ });\n\n const tokens = await response.json();\n return tokens;\n}\n\n// Step\ \ 3: Make API calls\nasync function fetchSleepData(accessToken) {\n const startDate\ \ = \"2023-01-01\";\n const endDate = \"2023-01-07\";\n\n const response = await\ \ fetch(\n `https://api.ouraring.com/v2/usercollection/sleep?start_date=${startDate}&end_date=${endDate}`,\n\ \ {\n headers: {\n Authorization: `Bearer ${accessToken}`\n \ \ }\n }\n );\n\n return await response.json();\n}\n```\n## Working with\ \ Webhooks\n### NodeJS Express Server Example\n```javascript\nconst express =\ \ require('express');\nconst bodyParser = require('body-parser');\nconst crypto\ \ = require('crypto');\n\nconst app = express();\napp.use(bodyParser.json());\n\ \nconst CLIENT_SECRET = \"YOUR_CLIENT_SECRET\";\n\n// Verification endpoint for\ \ webhook setup\napp.get('/oura-webhook', (req, res) => {\n const { verification_token,\ \ challenge } = req.query;\n\n // Verify the token matches what you expect\n\ \ if (verification_token === \"YOUR_VERIFICATION_TOKEN\") {\n res.json({ challenge\ \ });\n } else {\n res.status(401).send('Invalid verification token');\n \ \ }\n});\n\n// Webhook handler for incoming data\napp.post('/oura-webhook', (req,\ \ res) => {\n const signature = req.headers['x-oura-signature'];\n const timestamp\ \ = req.headers['x-oura-timestamp'];\n\n // Verify HMAC signature for security\n\ \ const hmac = crypto.createHmac('sha256', CLIENT_SECRET);\n hmac.update(timestamp\ \ + JSON.stringify(req.body));\n const calculatedSignature = hmac.digest('hex').toUpperCase();\n\ \n if (calculatedSignature !== signature) {\n return res.status(401).send('Invalid\ \ signature');\n }\n\n // Process the webhook data\n const { event_type, data_type,\ \ object_id, user_id } = req.body;\n\n console.log(`Received ${event_type} event\ \ for ${data_type}`);\n\n // Fetch the updated data using the object_id\n //\ \ This should be done asynchronously to respond quickly\n fetchDataAsync(data_type,\ \ object_id, user_id);\n\n // Respond quickly to acknowledge receipt\n res.status(200).send('OK');\n\ });\n\napp.listen(3000, () => {\n console.log('Webhook server listening on port\ \ 3000');\n});\n\n// Asynchronous function to fetch the updated data\nasync function\ \ fetchDataAsync(dataType, objectId, userId) {\n // Implementation depends on\ \ your data storage and processing needs\n // This would typically fetch the\ \ new data from the Oura API\n // and update your database or application state\n\ }\n```\n" - name: Frequently Asked Questions description: '## General Questions ### What is the Oura API used for? The Oura API allows developers to access Oura Ring data programmatically. This enables building applications, conducting research, or personal projects that use sleep, activity, readiness, and other health metrics collected by the Oura Ring. ### How do I get started with the Oura API? 1. Register an [OAuth application](https://cloud.ouraring.com/oauth/applications) 2. Read the documentation and explore the available endpoints 3. Make your first API call using the examples provided ### What data types are available in the API? The Oura API provides access to various data types including: - Sleep metrics and stages - Activity and movement data - Readiness scores and contributors - Heart rate and HRV measurements - Workout information - Tags and sessions - And more specialized metrics like SpO2, body temperature, and stress levels ### Is the Oura API free to use? Yes, the Oura API is free to use for both personal and commercial applications. However, API applications accessing more than 10 users require approval from Oura. ## Technical Questions ### What''s the recommended way to consume Oura data? Webhooks are the preferred way to consume Oura data. We recommend: 1. Make a single request for historical data when a user first connects to your application 2. Set up webhook subscriptions for all data types you need 3. Use webhook notifications to get updates as new data becomes available This approach is efficient and we have not had customers hit rate limits with webhooks properly implemented. ### How do I handle rate limits? The Oura API is limited to 5000 requests per 5-minute period. To avoid hitting rate limits: - Use webhooks instead of polling (strongly recommended - we have not seen any customers hit rate limits with webhooks properly implemented) - Cache responses when appropriate - Batch requests for multiple days of data rather than individual day requests - Implement exponential backoff when you receive a 429 response ### Why am I not seeing today''s data? Oura Ring data availability depends on the data type: - **Sleep, Readiness, and Sleep Time data**: Only available after the user opens the Oura app and syncs their ring - **Daily Activity, Daily Stress, and Heart Rate**: May update periodically in the background For the most reliable access to all data types, implement webhooks to receive notifications when new data is available (approximately 30 seconds after the data syncs from the mobile app). ### How do I handle timezone differences? All timestamps in the Oura API use ISO 8601 format with timezone information. When querying data with date parameters, the dates are interpreted in the user''s local timezone. Make sure to account for this when processing data across different timezones. ### What API version should I use? The current Oura API (V2) is the only available integration point. The previous V1 API has been sunset and is no longer available. ### How do webhooks work with the Oura API? Webhooks allow you to receive near real-time notifications when new data is available, rather than constantly polling the API. You''ll need to: 1. Set up an endpoint on your server to receive webhook events 2. Create webhook subscriptions for each data type and event type you''re interested in 3. Verify your endpoint when creating subscriptions 4. Process webhook events as they arrive 5. Fetch the full data using the provided IDs Webhook notifications arrive approximately 30 seconds after data syncs from the mobile app. ## Troubleshooting ### I''m getting 401 Unauthorized errors This typically means your access token is invalid or expired. Check that: - You''re including the token correctly in the Authorization header - The token hasn''t expired (they typically last 30 days) - The user hasn''t revoked access - For OAuth2 applications, try refreshing the token ### I''m getting 403 Forbidden errors This usually means the user''s Oura subscription has expired or they haven''t granted permission for the specific data type you''re requesting. ### Why am I not receiving webhook events? Ensure that: - Your webhook endpoint is publicly accessible - The endpoint responds to the verification challenge correctly - Your endpoint responds within 10 seconds with a 2xx or 3xx status code - You''ve subscribed to the correct data types and event types - The user has synced their ring recently to generate new data ### How can I validate that a webhook is legitimate? Always verify the HMAC signature included in the x-oura-signature header using your client secret as shown in the webhook code examples. ## Best Practices ### What''s the best approach for accessing historical data? We recommend: 1. When a user first connects to your application, make a single request for historical data 2. For ongoing updates, use webhooks instead of repeated API calls 3. Store the historical data in your own database for easy access 4. Only fetch new or updated data based on webhook notifications This approach minimizes API calls and ensures your application always has the latest data without hitting rate limits. ### How should I handle missing data? Some users may have gaps in their data if they didn''t wear their ring or haven''t synced it recently. Your application should: - Check for null values in responses - Have fallback logic for missing data points - Consider displaying gaps in visualizations rather than connecting across missing data - Use webhooks to ensure you''re promptly notified when new data becomes available ### What''s the best way to get historical data? To efficiently retrieve a large amount of historical data: 1. Use date range queries with reasonable time spans (e.g., 1-3 months at a time) 2. Implement pagination using the next_token parameter for large result sets 3. Consider running historical data collection as a background job 4. Store the data in your own database to avoid repeated API calls ### How can I ensure user privacy? - Only request access to the data types your application needs - Store tokens securely and never expose them in client-side code - Implement proper security measures for storing health data - Be transparent with users about how their data will be used - Allow users to disconnect your application and delete their data ' - name: Authentication Troubleshooting description: "## Common Authentication Issues\n### \"401 Unauthorized\" Error\n\ This is the most common authentication error and typically means there's an issue\ \ with your token. Here are the most frequent causes and solutions:\n#### 1. Invalid\ \ Token Format\n**Problem**: The token you're using isn't formatted correctly\ \ in the request.\n**Solution**: Ensure you're including \"Bearer\" before your\ \ token:\n```\nAuthorization: Bearer your-token-here\n```\n**Example Correct Implementation**:\n\ ```javascript\n// JavaScript example\nfetch('https://api.ouraring.com/v2/usercollection/personal_info',\ \ {\n headers: {\n 'Authorization': 'Bearer ' + accessToken // Note the space\ \ after \"Bearer\"\n }\n})\n```\n#### 2. Expired Token\n**Problem**: OAuth2 access\ \ tokens expire after a period (typically 24 hours for Oura).\n**Solution**: Use\ \ your refresh token to get a new access token:\n```http\nPOST https://api.ouraring.com/oauth/token\n\ Content-Type: application/x-www-form-urlencoded\n\ngrant_type=refresh_token&\n\ refresh_token=YOUR_REFRESH_TOKEN&\nclient_id=YOUR_CLIENT_ID&\nclient_secret=YOUR_CLIENT_SECRET\n\ ```\n\n**Handling Token Expiration**:\n```javascript\n// JavaScript example of\ \ handling expired tokens\nasync function callApi(endpoint, accessToken, refreshToken)\ \ {\n try {\n const response = await fetch(`https://api.ouraring.com/v2/${endpoint}`,\ \ {\n headers: {\n 'Authorization': `Bearer ${accessToken}`\n \ \ }\n });\n\n if (response.status === 401) {\n // Token expired, try\ \ to refresh\n const newTokens = await refreshAccessToken(refreshToken);\n\ \n // Retry the request with the new token\n return fetch(`https://api.ouraring.com/v2/${endpoint}`,\ \ {\n headers: {\n 'Authorization': `Bearer ${newTokens.access_token}`\n\ \ }\n });\n }\n\n return response;\n } catch (error) {\n \ \ console.error('API call failed:', error);\n throw error;\n }\n}\n\nasync\ \ function refreshAccessToken(refreshToken) {\n const response = await fetch('https://api.ouraring.com/oauth/token',\ \ {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded'\n\ \ },\n body: new URLSearchParams({\n 'grant_type': 'refresh_token',\n\ \ 'refresh_token': refreshToken,\n 'client_id': YOUR_CLIENT_ID,\n \ \ 'client_secret': YOUR_CLIENT_SECRET\n })\n });\n\n return response.json();\n\ }\n```\n\n#### 3. Revoked Access\n**Problem**: The user has revoked access to\ \ your application.\n\n**Solution**: The user needs to re-authorize your application.\ \ Direct them to the authorization URL:\n```\nhttps://cloud.ouraring.com/oauth/authorize?\n\ \ client_id=YOUR_CLIENT_ID&\n redirect_uri=YOUR_REDIRECT_URI&\n response_type=code&\n\ \ scope=daily heartrate personal\n```\n### \"403 Forbidden\" Error\nThis error\ \ means your authentication is valid, but you don't have permission to access\ \ the requested resource.\n#### 1. Missing Scope Permission\n**Problem**: Your\ \ OAuth application doesn't have the necessary scope for the endpoint.\n**Solution**:\ \ Request the needed scopes during authorization:\n```\nhttps://cloud.ouraring.com/oauth/authorize?\n\ \ client_id=YOUR_CLIENT_ID&\n redirect_uri=YOUR_REDIRECT_URI&\n response_type=code&\n\ \ scope=daily heartrate personal workout session\n```\n**Available Scopes**:\n\ - `daily`: Daily summaries (sleep, activity, readiness)\n- `heartrate`: Heart\ \ rate data\n- `personal`: Personal information (age, gender, etc.)\n- `workout`:\ \ Workout data\n- `session`: Session data\n- `tag`: Tag data\n#### 2. Expired\ \ Oura Membership\n**Problem**: The user's Oura membership has expired.\n**Solution**:\ \ The user needs to renew their Oura membership to restore API access.\n### OAuth2\ \ Flow Debugging\n#### Authorization Code Flow Issues\n**Problem**: Not receiving\ \ an authorization code after user consent.\n**Solutions**:\n1. Verify your redirect\ \ URI exactly matches what's registered in your application\n2. Check for errors\ \ in the redirect (look for `error` and `error_description` query parameters)\n\ 3. Ensure the user is completing the consent process\n**Example Debugging**:\n\ ```javascript\n// Parse the URL after redirect\nconst urlParams = new URLSearchParams(window.location.search);\n\ const error = urlParams.get('error');\nconst errorDescription = urlParams.get('error_description');\n\ \nif (error) {\n console.error(`Authorization failed: ${error} - ${errorDescription}`);\n\ } else {\n const code = urlParams.get('code');\n if (code) {\n // Proceed\ \ with token exchange\n } else {\n console.error('No authorization code received\ \ in the redirect');\n }\n}\n```\n#### Token Exchange Issues\n**Problem**: Error\ \ when exchanging authorization code for tokens.\n**Common Errors and Solutions**:\n\ - `invalid_grant`: The authorization code is expired (valid for only 10 minutes)\ \ or already used\n- `invalid_client`: Client ID or secret is incorrect\n- `invalid_redirect_uri`:\ \ Redirect URI doesn't match the one used during authorization\n**Testing Token\ \ Exchange**:\n```bash\n# Using curl to debug token exchange\ncurl -X POST https://api.ouraring.com/oauth/token\ \ -d \"grant_type=authorization_code\" -d \"code=YOUR_AUTH_CODE\" -d \"\ client_id=YOUR_CLIENT_ID\" -d \"client_secret=YOUR_CLIENT_SECRET\" -d \"redirect_uri=YOUR_REDIRECT_URI\"\ \n```\n## Authentication Best Practices\n### Security Recommendations\n1. **Never\ \ store access tokens in client-side code** or expose them in URLs\n2. **Use HTTPS**\ \ for all communication with the Oura API\n3. **Store refresh tokens securely**\ \ (e.g., in an encrypted database)\n4. **Implement token rotation** to regularly\ \ refresh access tokens\n5. **Validate tokens** before using them if they've been\ \ stored for a while\n### Token Management\n1. **Create a token service** in your\ \ backend to handle token operations:\n - Storing tokens securely\n - Refreshing\ \ expired tokens\n - Associating tokens with user accounts\n2. **Handle token\ \ revocation gracefully**:\n - Detect when a token has been revoked\n - Clear\ \ local token storage\n - Prompt the user to re-authorize when needed\n3. **Implement\ \ proper error handling**:\n - Distinguish between different types of auth errors\n\ \ - Provide clear messages to users\n - Log authentication issues for debugging\n" - name: Daily Activity Routes description: The Daily Activity scope includes daily activity summary values and detailed activity levels. Activity levels are expressed in [metabolic equivalent of task minutes](https://en.wikipedia.org/wiki/Metabolic_equivalent) (MET mins). Oura tracks activity based on the movement. - name: Daily Cardiovascular Age Routes description: Cardiovascular Age is an estimate of the health of your cardiovascular system in relation to your actual age. See more details [here](https://support.ouraring.com/hc/en-us/articles/28451491040019-Cardiovascular-Age). - name: Daily Readiness Routes description: Readiness tells how ready you are for the day. - name: Daily Resilience Routes description: Resilience is an estimate of your ability to withstand physiological stress and recover from it over time. externalDocs: description: Learn more about Resilience url: https://support.ouraring.com/hc/en-us/articles/25358829055251-Resilience - name: Daily Sleep Routes description: Sleep period is a nearly continuous, longish period of time spent lying down in bed. - name: Daily Spo2 Routes description: The Daily SpO2 (blood oxygenation) routes include daily SpO2 average. Data will only be available for users with a Gen 3 Oura Ring externalDocs: description: Blood Oxygen Sensing (SpO2) on Oura url: https://ouraring.com/blog/blood-oxygen-sensing-spo2 - name: Daily Stress Routes description: The daily stress route includes a summary of the number of minutes the user spends in high stress and high recovery each day. This is a great way to see how your stress and recovery are trending over time. Stress and recovery are mutally exclusive. E.g. one can only be stressed or recovered at any given moement - and cannot be stressed and recovered at the same time. externalDocs: description: Learn more about daytime stress url: https://ouraring.com/blog/daytime-stress-feature - name: Enhanced Tag Routes description: 'The Enhanced Tags data scope includes tags that Oura users enter within the Oura mobile app. Enhanced Tags can be added for any lifestyle choice, habit, mood change, or environmental factor an Oura user wants to monitor the effects of. Enhanced Tags also contain context on a tag''s start and end time, whether a tag repeats daily, and comments. [Learn more about how Oura users add Enhanced Tags](https://support.ouraring.com/hc/en-us/articles/360038676993-How-to-Use-Tags)' externalDocs: description: More information about Enhanced Tags url: https://ouraring.com/blog/tags/ - name: Heart Rate Routes description: The Heart Rate data scope includes time-series heart rate data throughout the day and night. Heart rate is provided at 5-minute increments. For heart rate data recorded from a Session, see Sessions endpoint. externalDocs: description: How accurate is the heart rate data generated by the Oura Ring? url: https://ouraring.com/blog/how-accurate-is-oura/ - name: Personal Info Routes description: The Personal Info scope includes personal information (e.g. age, email, weight, and height) about the user. You can access the id on the personal_info route with any access token (no scopes are required). - name: Rest Mode Period Routes description: The Rest Mode scope includes information about rest mode periods. This includes the start, end time and detaials of the rest mode period. - name: Ring Configuration Routes description: The Ring Configuration scope includes information about the user's ring(s). This includes the model, size, color, etc. - name: Session Routes description: The Sessions data scope provides information on how users engage with guided and unguided sessions in the Oura app, including the user's biometric trends during the sessions. externalDocs: description: Learn about the available session types within the Explore Tab url: https://ouraring.com/blog/oura-explore-tab/ - name: Sleep Routes description: Returns Oura Sleep data for the specified Oura user within a given timeframe. A user can have multiple sleep periods per day. - name: Sleep Time Routes description: Recommendations for the optimal bedtime window that is calculated based on sleep data. - name: Tag Routes description: '**Note:** Tag is deprecated. We recommend transitioning to [Enhanced Tag](#tag/Enhanced-Tag-Routes). ~~The Tags data scope includes tags that Oura users enter within the Oura mobile app. Tags are a growing list of activities, environment factors, symptoms, emotions, and other aspects that provide broader context into what''s happening with users beyond the objective data generated by the Oura Ring.~~ ~~[More information on tag translations](https://cloud.ouraring.com/edu/tag-translations)~~' - name: VO2 Max Routes description: VO2 Max is a measure of the maximum volume of oxygen that an individual can use during intense exercise. See more details [here](https://support.ouraring.com/hc/en-us/articles/28336620578835-Cardio-Capacity-VO2-Max). - name: Workout Routes description: The Workout data scope includes information about user workouts. This is a diverse, growing list of workouts that help inform how the user is training and exercising. - name: Sandbox Routes description: Fake user data that you can access without an Oura account. There is a corresponding sandbox endpoint to each available data type. This is useful for testing and development purposes. The data is not real and should not be used for any production purposes. The data is generated by Oura and is not based on any real user data. The data is not updated in real-time and is not guaranteed to be accurate. The rate limit for the sandbox endpoints is shared with your rate limit on other data endpoints. - name: Webhook Subscription Routes description: "# Webhooks for Real-Time Data Updates\n\n## What are Webhooks?\nWebhooks\ \ are a way for the Oura API to notify your application when new data is available,\ \ instead of requiring your application to constantly check for updates (polling).\ \ Think of webhooks as \"reverse APIs\" - instead of your application requesting\ \ data, Oura's servers send data to your application when something changes.\n\ \n## Why Use Webhooks (Important!)\n- **RECOMMENDED APPROACH**: Webhooks are the\ \ preferred way to consume Oura data\n- **Avoid Rate Limits**: We have not had\ \ customers hit rate limits with webhooks properly implemented\n- **Near Real-Time\ \ Updates**: Webhook notifications come approximately 30 seconds after data syncs\ \ from the mobile app\n- **Efficient Resource Usage**: Reduces unnecessary API\ \ calls and server load\n- **Better User Experience**: Your application stays\ \ updated without constant polling\n\n## How Webhooks Work with Oura\n1. **You\ \ set up an endpoint**: Create a URL on your server that can receive POST requests\n\ 2. **You subscribe to events**: Tell Oura what data types and events you want\ \ to be notified about\n3. **Oura verifies your endpoint**: A one-time check to\ \ ensure your endpoint is valid\n4. **Oura sends notifications**: When data changes,\ \ Oura sends a POST request to your endpoint\n5. **You process the event**: Your\ \ endpoint receives basic event details\n6. **You fetch complete data**: Use the\ \ provided IDs to retrieve the full data via the API\n\n## Recommended Implementation\ \ Pattern\n1. **Initial Data Load**: When a user first connects, make a single\ \ API request for historical data\n2. **Subscribe to Webhooks**: Set up webhook\ \ subscriptions for all data types you need\n3. **Process Webhook Events**: As\ \ users sync their rings, you'll receive notifications about new data\n4. **Fetch\ \ Updated Data**: Use the object_id from webhook events to fetch the specific\ \ updated data\n\nThis pattern minimizes API calls while ensuring your application\ \ always has the latest data.\n\n## Setup Guide\n\n### Step 1: Create Your Webhook\ \ Endpoint\nSet up an HTTP endpoint on your server that can:\n- Handle both GET\ \ requests (for verification) and POST requests (for events)\n- Respond to verification\ \ challenges during subscription setup\n- Process incoming webhook events quickly\ \ (under 10 seconds)\n\nExample endpoint implementation (Node.js):\n```javascript\n\ // Express.js route handlers for your webhook endpoint\napp.get('/oura-webhook',\ \ (req, res) => {\n // Verification handler - required during subscription setup\n\ \ const { verification_token, challenge } = req.query;\n\n // Verify the token\ \ matches your expected token\n if (verification_token === YOUR_VERIFICATION_TOKEN)\ \ {\n // Return the challenge in the required format\n return res.json({\ \ challenge });\n }\n\n // If verification fails\n return res.status(401).send('Invalid\ \ verification token');\n});\n\napp.post('/oura-webhook', (req, res) => {\n //\ \ Event handler - processes incoming webhook events\n\n // Always respond quickly\ \ (under 10 seconds)\n // Process the event asynchronously if needed\n res.status(200).send('OK');\n\ \n // Then process the event data\n const { event_type, data_type, object_id,\ \ user_id } = req.body;\n processEventAsync(event_type, data_type, object_id,\ \ user_id);\n});\n```\n\n### Step 2: Create a Webhook Subscription\nCall the `POST\ \ /v2/webhook/subscription` endpoint to register your webhook:\n\n```\nPOST /v2/webhook/subscription\n\ Headers:\n x-client-id: YOUR_CLIENT_ID\n x-client-secret: YOUR_CLIENT_SECRET\n\ \ Content-Type: application/json\n\nBody:\n{\n \"callback_url\": \"https://your-server.com/oura-webhook\"\ ,\n \"verification_token\": \"your-secret-verification-token\",\n \"event_type\"\ : \"update\",\n \"data_type\": \"sleep\"\n}\n```\n\nYou need to create separate\ \ subscriptions for each combination of:\n- **event_type**: The type of event\ \ (create, update, delete)\n- **data_type**: The type of data you're interested\ \ in (sleep, activity, etc.)\n\n### Step 3: Verification Process\nWhen you create\ \ a subscription, Oura verifies your endpoint:\n\n1. Oura sends a GET request\ \ to your callback URL with query parameters:\n ```\n GET https://your-server.com/oura-webhook?verification_token=your-token&challenge=random-string\n\ \ ```\n\n2. Your endpoint must verify the token and respond with the challenge:\n\ \ ```json\n {\n \"challenge\": \"random-string\"\n }\n ```\n\n3. If\ \ verification succeeds, your subscription is activated\n\n![Verification Flow](/img/webhook-verification-flow-diagram.drawio.png)\n\ \n### Step 4: Receiving and Processing Events\nWhen an event occurs (e.g., user\ \ syncs new sleep data):\n\n1. Oura sends a POST request to your callback URL:\n\ \ ```\n POST https://your-server.com/oura-webhook\n Headers:\n x-oura-signature:\ \ HMAC_SIGNATURE\n x-oura-timestamp: 1234567890\n\n Body:\n {\n \"\ event_type\": \"update\",\n \"data_type\": \"sleep\",\n \"object_id\"\ : \"12345abc\",\n \"event_time\": \"2023-01-01T08:00:00+00:00\",\n \"\ user_id\": \"user123\"\n }\n ```\n\n2. Your endpoint should:\n - Verify\ \ the signature for security (see below)\n - Respond quickly (under 10 seconds)\ \ with a 2xx status\n - Process the event asynchronously if needed\n - Use\ \ the object_id to fetch the complete data via the API\n\n## Security Best Practices\n\ \n### Verify Webhook Signatures\nAlways verify that webhook requests are actually\ \ from Oura by checking the HMAC signature:\n\n```javascript\nconst crypto = require('crypto');\n\ \nfunction verifySignature(headers, body, clientSecret) {\n const signature =\ \ headers['x-oura-signature'];\n const timestamp = headers['x-oura-timestamp'];\n\ \n // Create HMAC using your client secret\n const hmac = crypto.createHmac('sha256',\ \ clientSecret);\n hmac.update(timestamp + JSON.stringify(body));\n const calculatedSignature\ \ = hmac.digest('hex').toUpperCase();\n\n // Compare calculated signature with\ \ received signature\n return calculatedSignature === signature;\n}\n\n// In\ \ your webhook handler\napp.post('/oura-webhook', (req, res) => {\n // Verify\ \ signature\n if (!verifySignature(req.headers, req.body, CLIENT_SECRET)) {\n\ \ return res.status(401).send('Invalid signature');\n }\n\n // Process valid\ \ webhook\n res.status(200).send('OK');\n // ...\n});\n```\n\n### Use HTTPS\n\ Always use HTTPS for your webhook endpoint to ensure data is encrypted in transit.\n\ \n### Keep Your Verification Token Secret\nChoose a strong, random verification\ \ token and don't share it.\n\n## Handling Webhook Failures\n\n### Retry Mechanism\n\ Oura will retry failed webhook deliveries:\n- For 4xx responses: 10 retries\n\ - For 5xx responses: 10 retries\n- For timeouts: 10 retries\n\n### Canceling Subscriptions\n\ If you want to cancel a subscription, you can:\n- Use the DELETE endpoint: `DELETE\ \ /v2/webhook/subscription/{id}`\n- Or respond with a 410 status code to automatically\ \ cancel\n\n## Common Questions\n\n### How quickly will I receive webhooks?\n\ Webhook notifications arrive approximately 30 seconds after data syncs from the\ \ mobile app. The timing depends on the data type:\n- **Sleep, Readiness, and\ \ other user-initiated sync data**: These only sync when the user opens the Oura\ \ app and actively syncs their ring\n- **Daily Activity, Daily Stress, and other\ \ background data**: These may update periodically in the background without user\ \ action\n\n### What if my server goes down?\nOura will retry webhook deliveries\ \ for about an hour if your server doesn't respond properly. However, if your\ \ server is down for an extended period, you might miss some events. It's a good\ \ practice to implement a reconciliation process that can fetch data for periods\ \ when your webhook might have been unavailable.\n\n### How can I test webhooks\ \ locally?\nUse a tool like [ngrok](https://ngrok.com/) to expose your local development\ \ server to the internet with a public URL.\n\n### Can I use the same callback\ \ URL for different subscriptions?\nYes, you can use the same URL for multiple\ \ subscriptions. Your handler can differentiate between events using the `event_type`\ \ and `data_type` fields in the webhook payload.\n\n### Will I hit rate limits\ \ using webhooks?\nWe have not had customers hit rate limits with webhooks properly\ \ implemented. The recommended pattern is:\n1. Make a single request for historical\ \ data when a user first connects\n2. Use webhooks for all ongoing data updates\n\ 3. Only fetch the specific data that has changed based on webhook notifications\n\ \nThis approach minimizes API calls while ensuring your application always has\ \ the latest data.\n "