diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d3c9420..585f9e0 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -14,7 +14,7 @@ jobs: - name: Setup PHP uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 # 2.36.0 with: - php-version: 8.2 + php-version: 8.3 ini-values: assert.exception=1, phar.readonly=0, zend.assertions=1 extensions: curl, json, phar, mbstring, gzip, bzip2, openssl tools: pecl, phing diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index f0be4f1..14867c5 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -16,11 +16,13 @@ jobs: key: cache-v1 # can be any string, change to clear the extension cache. strategy: matrix: - php-versions: ['8.2', '8.3'] + php-versions: ['8.3'] experimental: [ false ] include: - php-versions: '8.4' experimental: true + - php-versions: '8.5' + experimental: true steps: - name: Checkout uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 @@ -65,7 +67,7 @@ jobs: run: composer validate - name: Install dependencies - run: composer install --prefer-dist --no-progress --no-suggest --ignore-platform-reqs + run: composer install --prefer-dist --no-progress --ignore-platform-reqs - name: Setup Problem Matchers for PHPUnit run: echo "::add-matcher::${{ runner.tool_cache }}/phpunit.json" @@ -223,7 +225,7 @@ jobs: run: composer validate - name: Install dependencies - run: composer install --prefer-dist --no-progress --no-suggest --ignore-platform-reqs + run: composer install --prefer-dist --no-progress --ignore-platform-reqs - name: Run test suite run: ./vendor/phpunit/phpunit/phpunit --configuration tests/phpunit.xml --exclude-group twig --coverage-clover=./var/coverage/clover.xml diff --git a/.vacuum/ruleset.yaml b/.vacuum/ruleset.yaml new file mode 100644 index 0000000..0321a8e --- /dev/null +++ b/.vacuum/ruleset.yaml @@ -0,0 +1,991 @@ +description: Recommended rules for a high quality specification. +documentationUrl: https://quobix.com/vacuum/rulesets/recommended +rules: + camel-case-properties: + category: + description: Schemas are how request bodies and response payloads are defined. They define the data going in and the data flowing out of an operation. These rules check for structural validity, checking types, checking required fields and validating correct use of structures. + id: schemas + name: Schemas + description: Schema property names should use camelCase instead of snake_case, PascalCase, kebab-case, or other formats. + formats: + - oas3 + - oas3_1 + - oas3_2 + given: $ + howToFix: Schema property names should use camelCase for consistency and better compatibility with code generation tools. Property names should start with a lowercase letter and use uppercase letters for word boundaries. + id: camel-case-properties + recommended: true + resolved: true + severity: warn + then: + function: oasCamelCaseProperties + type: style + component-description: + category: + description: Documentation is really important, in OpenAPI, just about everything can and should have a description. This set of rules checks for absent descriptions, poor quality descriptions (copy/paste), or short descriptions. + id: descriptions + name: Descriptions + description: Component description check + formats: + - oas3 + - oas3_1 + - oas3_2 + given: $ + howToFix: Components are the inputs and outputs of a specification. A user needs to be able to understand each component and what it does. Descriptions are critical to understanding components. Add a description! + id: component-description + recommended: true + resolved: true + severity: warn + then: + function: oasComponentDescriptions + type: validation + duplicate-paths: + category: + description: Operations are the core of the contract, they define paths and HTTP methods. These rules check operations have been well constructed, looks for operationId, parameter, schema and return types in depth. + id: operations + name: Operations + description: Paths cannot be duplicated; only the last definition will be kept. + formats: + - oas3 + - oas3_1 + - oas3_2 + given: $ + howToFix: Duplicate path definitions found in your OpenAPI specification. In YAML, duplicate keys are allowed, but only the last occurrence is used. This means earlier path definitions are silently ignored, which can lead to missing API endpoints in your specification. + id: duplicate-paths + recommended: true + severity: error + then: + function: duplicatePaths + type: validation + duplicated-entry-in-enum: + category: + description: Schemas are how request bodies and response payloads are defined. They define the data going in and the data flowing out of an operation. These rules check for structural validity, checking types, checking required fields and validating correct use of structures. + id: schemas + name: Schemas + description: Enum values must not have duplicate entry + formats: + - oas3 + - oas3_1 + - oas3_2 + - oas2 + given: $ + howToFix: Enums need to be unique, you can't duplicate them in the same definition. Please remove the duplicate value. + id: duplicated-entry-in-enum + recommended: true + severity: error + then: + function: duplicatedEnum + type: validation + info-description: + category: + description: The info object contains licencing, contact, authorship details and more. Checks to confirm required details have been completed. + id: information + name: Contract Information + description: Info section is missing a description + formats: + - oas3 + - oas3_1 + - oas3_2 + - oas2 + given: $ + howToFix: The 'info' section is missing a description, surely you want people to know what this spec is all about, right? + id: info-description + recommended: true + resolved: true + severity: error + then: + function: infoDescription + type: validation + info-license-spdx: + category: + description: The info object contains licencing, contact, authorship details and more. Checks to confirm required details have been completed. + id: information + name: Contract Information + description: License section cannot contain both an identifier and a URL, they are mutually exclusive. + formats: + - oas3 + - oas3_1 + - oas3_2 + - oas2 + given: $ + howToFix: A license can contain either a URL or an SPDX identifier, but not both, They are mutually exclusive and cannot both be present. Choose one or the other + id: info-license-spdx + recommended: true + resolved: true + severity: error + then: + function: infoLicenseURLSPDX + type: validation + migrate-zally-ignore: + category: + description: Validation rules make sure that certain characters or patterns have not been used that may cause issues when rendering in different types of applications. + id: validation + name: Validation + description: x-zally-ignore keys should be migrated to x-lint-ignore for compatibility with vacuum + formats: + - oas3 + - oas3_1 + - oas3_2 + - oas2 + given: $ + howToFix: Migrate x-zally-ignore directives to vacuum's x-lint-ignore. Rename the key to x-lint-ignore and update the ignored rule id to the vacuum equivalent rule. + id: migrate-zally-ignore + recommended: true + resolved: true + severity: warn + then: + function: migrateZallyIgnore + type: validation + no-$ref-siblings: + category: + description: Schemas are how request bodies and response payloads are defined. They define the data going in and the data flowing out of an operation. These rules check for structural validity, checking types, checking required fields and validating correct use of structures. + id: schemas + name: Schemas + description: $ref values cannot be placed next to other properties (like a description) + formats: + - oas2 + - oas3_0 + given: $ + howToFix: $ref values must not be placed next to sibling nodes, There should only be a single node when using $ref. A common mistake is adding 'description' next to a $ref. This is wrong. remove all siblings! + id: no-$ref-siblings + recommended: true + severity: error + then: + function: refSiblings + type: validation + no-ambiguous-paths: + category: + description: Operations are the core of the contract, they define paths and HTTP methods. These rules check operations have been well constructed, looks for operationId, parameter, schema and return types in depth. + id: operations + name: Operations + description: Paths need to resolve unambiguously from one another + formats: + - oas3 + - oas3_1 + - oas3_2 + - oas2 + given: $ + howToFix: Paths must all resolve unambiguously, they can't be confused with one another (/{id}/ambiguous and /ambiguous/{id} are the same thing. Make sure every path and the variables used are unique and do conflict with one another. Check the ordering of variables and the naming of path segments. + id: no-ambiguous-paths + recommended: true + resolved: true + severity: error + then: + function: noAmbiguousPaths + type: validation + no-eval-in-markdown: + category: + description: Validation rules make sure that certain characters or patterns have not been used that may cause issues when rendering in different types of applications. + id: validation + name: Validation + description: Markdown descriptions must not have `eval()` statements' + formats: + - oas3 + - oas3_1 + - oas3_2 + - oas2 + given: $ + howToFix: Remove all references to 'eval()' in the description. These can be used by malicious actors to embed code in contracts that is then executed when read by a browser. + id: no-eval-in-markdown + recommended: true + resolved: true + severity: error + then: + function: noEvalDescription + functionOptions: + pattern: eval\( + type: validation + no-http-verbs-in-path: + category: + description: Operations are the core of the contract, they define paths and HTTP methods. These rules check operations have been well constructed, looks for operationId, parameter, schema and return types in depth. + id: operations + name: Operations + description: Path segments must not contain an HTTP verb + formats: + - oas3 + - oas3_1 + - oas3_2 + - oas2 + given: $ + howToFix: When HTTP verbs (get/post/put etc) are used in path segments, it muddies the semantics of REST and creates a confusing and inconsistent experience. It's highly recommended that verbs are not used in path segments. Replace those HTTP verbs with more meaningful nouns. + id: no-http-verbs-in-path + recommended: true + severity: warn + then: + function: noVerbsInPath + type: style + no-request-body: + category: + description: Operations are the core of the contract, they define paths and HTTP methods. These rules check operations have been well constructed, looks for operationId, parameter, schema and return types in depth. + id: operations + name: Operations + description: HTTP GET and DELETE should not accept request bodies + formats: + - oas3 + - oas3_1 + - oas3_2 + given: $ + howToFix: Remove 'requestBody' from HTTP GET and DELETE methods + id: no-request-body + recommended: true + severity: warn + then: + function: noRequestBody + type: style + no-script-tags-in-markdown: + category: + description: Validation rules make sure that certain characters or patterns have not been used that may cause issues when rendering in different types of applications. + id: validation + name: Validation + description: Markdown descriptions must not have ` + +
+76 "responses": {
+77 "200": {
+78 "description": "",
+79 "headers": {},
+80 "content": {
+81 "application/json": {
+124 "responses": {
+125 "200": {
+126 "description": "",
+127 "headers": {},
+128 "content": {
+129 "application/json": {
+151 "type": "string"
+152 },
+153 "description": "The id of the Vehicle."
+154 }
+155 ],
+156 "get": {
+172 "responses": {
+173 "200": {
+174 "description": "",
+175 "headers": {},
+176 "content": {
+177 "application/json": {
+199 "type": "string"
+200 },
+201 "description": "The id of the Vehicle."
+202 }
+203 ],
+204 "get": {
+220 "responses": {
+221 "200": {
+222 "description": "",
+223 "headers": {},
+224 "content": {
+225 "application/json": {
+247 "type": "string"
+248 },
+249 "description": "The id of the Vehicle."
+250 }
+251 ],
+252 "get": {
+268 "responses": {
+269 "200": {
+270 "description": "",
+271 "headers": {},
+272 "content": {
+273 "application/json": {
+295 "type": "string"
+296 },
+297 "description": "The id of the Vehicle."
+298 }
+299 ],
+300 "get": {
+316 "responses": {
+317 "200": {
+318 "description": "",
+319 "headers": {},
+320 "content": {
+321 "application/json": {
+343 "type": "string"
+344 },
+345 "description": "The id of the Vehicle."
+346 }
+347 ],
+348 "get": {
+364 "responses": {
+365 "200": {
+366 "description": "",
+367 "headers": {},
+368 "content": {
+369 "application/json": {
+391 "type": "string"
+392 },
+393 "description": "The id of the Vehicle."
+394 }
+395 ],
+396 "post": {
+412 "responses": {
+413 "200": {
+414 "description": "",
+415 "headers": {},
+416 "content": {
+417 "application/json": {
+439 "type": "string"
+440 },
+441 "description": "The id of the Vehicle."
+442 }
+443 ],
+444 "post": {
+460 "responses": {
+461 "200": {
+462 "description": "",
+463 "headers": {},
+464 "content": {
+465 "application/json": {
+487 "type": "string"
+488 },
+489 "description": "The id of the Vehicle."
+490 }
+491 ],
+492 "post": {
+508 "responses": {
+509 "200": {
+510 "description": "",
+511 "headers": {},
+512 "content": {
+513 "application/json": {
+535 "type": "string"
+536 },
+537 "description": "The id of the Vehicle."
+538 }
+539 ],
+540 "post": {
+556 "responses": {
+557 "200": {
+558 "description": "",
+559 "headers": {},
+560 "content": {
+561 "application/json": {
+583 "type": "string"
+584 },
+585 "description": "The id of the Vehicle."
+586 }
+587 ],
+588 "post": {
+604 "responses": {
+605 "200": {
+606 "description": "",
+607 "headers": {},
+608 "content": {
+609 "application/json": {
+631 "type": "string"
+632 },
+633 "description": "The id of the Vehicle."
+634 }
+635 ],
+636 "post": {
+652 "responses": {
+653 "200": {
+654 "description": "",
+655 "headers": {},
+656 "content": {
+657 "application/json": {
+679 "type": "string"
+680 },
+681 "description": "The id of the Vehicle."
+682 },
+683 {
+684 "name": "limit_value",
+709 "responses": {
+710 "200": {
+711 "description": "",
+712 "headers": {},
+713 "content": {
+714 "application/json": {
+736 "type": "string"
+737 },
+738 "description": "The id of the Vehicle."
+739 }
+740 ],
+741 "post": {
+757 "responses": {
+758 "200": {
+759 "description": "",
+760 "headers": {},
+761 "content": {
+762 "application/json": {
+784 "type": "string"
+785 },
+786 "description": "The id of the Vehicle."
+787 }
+788 ],
+789 "post": {
+805 "responses": {
+806 "200": {
+807 "description": "",
+808 "headers": {},
+809 "content": {
+810 "application/json": {
+832 "type": "string"
+833 },
+834 "description": "The id of the Vehicle."
+835 }
+836 ],
+837 "post": {
+853 "responses": {
+854 "200": {
+855 "description": "",
+856 "headers": {},
+857 "content": {
+858 "application/json": {
+880 "type": "string"
+881 },
+882 "description": "The id of the Vehicle."
+883 }
+884 ],
+885 "post": {
+901 "responses": {
+902 "200": {
+903 "description": "",
+904 "headers": {},
+905 "content": {
+906 "application/json": {
+928 "type": "string"
+929 },
+930 "description": "The id of the Vehicle."
+931 }
+932 ],
+933 "post": {
+949 "responses": {
+950 "200": {
+951 "description": "",
+952 "headers": {},
+953 "content": {
+954 "application/json": {
+976 "type": "string"
+977 },
+978 "description": "The id of the Vehicle."
+979 }
+980 ],
+981 "post": {
+ 997 "responses": {
+ 998 "200": {
+ 999 "description": "",
+1000 "headers": {},
+1001 "content": {
+1002 "application/json": {
+1024 "type": "string"
+1025 },
+1026 "description": "The id of the Vehicle."
+1027 },
+1028 {
+1029 "name": "driver_degC",
+1063 "responses": {
+1064 "200": {
+1065 "description": "",
+1066 "headers": {},
+1067 "content": {
+1068 "application/json": {
+1090 "type": "string"
+1091 },
+1092 "description": "The id of the Vehicle."
+1093 }
+1094 ],
+1095 "post": {
+1111 "responses": {
+1112 "200": {
+1113 "description": "",
+1114 "headers": {},
+1115 "content": {
+1116 "application/json": {
+1138 "type": "string"
+1139 },
+1140 "description": "The id of the Vehicle."
+1141 }
+1142 ],
+1143 "post": {
+1159 "responses": {
+1160 "200": {
+1161 "description": "",
+1162 "headers": {},
+1163 "content": {
+1164 "application/json": {
+1186 "type": "string"
+1187 },
+1188 "description": "The id of the Vehicle."
+1189 },
+1190 {
+1191 "name": "state",
+1232 "responses": {
+1233 "200": {
+1234 "description": "",
+1235 "headers": {},
+1236 "content": {
+1237 "application/json": {
+1259 "type": "string"
+1260 },
+1261 "description": "The id of the Vehicle."
+1262 },
+1263 {
+1264 "name": "password",
+1289 "responses": {
+1290 "200": {
+1291 "description": "",
+1292 "headers": {},
+1293 "content": {
+1294 "application/json": {
+1316 "type": "string"
+1317 },
+1318 "description": "The id of the Vehicle."
+1319 }
+1320 ],
+1321 "post": {
+1337 "responses": {
+1338 "200": {
+1339 "description": "",
+1340 "headers": {},
+1341 "content": {
+1342 "application/json": {
+66 "description": "Retrieve a list of your owned vehicles (includes vehicles not yet shipped!)",
+67 "parameters": [
+68 {
+69 "name": "Authorization",
+70 "in": "header",
+71 "schema": {
+114 "description": "Determines if mobile access to the vehicle is enabled.",
+115 "parameters": [
+116 {
+117 "name": "Authorization",
+118 "in": "header",
+119 "schema": {
+162 "description": "Returns the state of charge in the battery.",
+163 "parameters": [
+164 {
+165 "name": "Authorization",
+166 "in": "header",
+167 "schema": {
+210 "description": "Returns the current temperature and climate control state.",
+211 "parameters": [
+212 {
+213 "name": "Authorization",
+214 "in": "header",
+215 "schema": {
+258 "description": "Returns the driving and position state of the vehicle.",
+259 "parameters": [
+260 {
+261 "name": "Authorization",
+262 "in": "header",
+263 "schema": {
+306 "description": "Returns various information about the GUI settings of the car, such as unit format and range display.",
+307 "parameters": [
+308 {
+309 "name": "Authorization",
+310 "in": "header",
+311 "schema": {
+354 "description": "Returns the vehicle's physical state, such as which doors are open.",
+355 "parameters": [
+356 {
+357 "name": "Authorization",
+358 "in": "header",
+359 "schema": {
+402 "description": "Wakes up the car from the sleep state. Necessary to get some data from the car.",
+403 "parameters": [
+404 {
+405 "name": "Authorization",
+406 "in": "header",
+407 "schema": {
+450 "description": "Sets valet mode on or off with a PIN to disable it from within the car. Reuses last PIN from previous valet session.\nValet Mode limits the car's top speed to 70MPH and 80kW of acceleration power. It also disables Homelink, Bluetooth and\nWifi settings, and the ability to disable mobile access to the car. It also hides your favorites, home, and work\nlocations in navigation.",
+451 "parameters": [
+452 {
+453 "name": "Authorization",
+454 "in": "header",
+455 "schema": {
+498 "description": "Resets the PIN set for valet mode, if set.",
+499 "parameters": [
+500 {
+501 "name": "Authorization",
+502 "in": "header",
+503 "schema": {
+546 "description": "Opens the charge port. Does not close the charge port (for now...)",
+547 "parameters": [
+548 {
+549 "name": "Authorization",
+550 "in": "header",
+551 "schema": {
+594 "description": "Set the charge mode to standard (90% under the new percentage system introduced in 4.5).",
+595 "parameters": [
+596 {
+597 "name": "Authorization",
+598 "in": "header",
+599 "schema": {
+642 "description": "Set the charge mode to max range (100% under the new percentage system introduced in 4.5). Use sparingly!",
+643 "parameters": [
+644 {
+645 "name": "Authorization",
+646 "in": "header",
+647 "schema": {
+699 "description": "Set the charge limit to a custom percentage.",
+700 "parameters": [
+701 {
+702 "name": "Authorization",
+703 "in": "header",
+704 "schema": {
+747 "description": "Start charging. Must be plugged in, have power available, and not have reached your charge limit.",
+748 "parameters": [
+749 {
+750 "name": "Authorization",
+751 "in": "header",
+752 "schema": {
+795 "description": "Stop charging. Must already be charging.",
+796 "parameters": [
+797 {
+798 "name": "Authorization",
+799 "in": "header",
+800 "schema": {
+843 "description": "Flash the lights once.",
+844 "parameters": [
+845 {
+846 "name": "Authorization",
+847 "in": "header",
+848 "schema": {
+891 "description": "Honk the horn once.",
+892 "parameters": [
+893 {
+894 "name": "Authorization",
+895 "in": "header",
+896 "schema": {
+939 "description": "Unlock the car's doors.",
+940 "parameters": [
+941 {
+942 "name": "Authorization",
+943 "in": "header",
+944 "schema": {
+987 "description": "Lock the car's doors.",
+988 "parameters": [
+989 {
+990 "name": "Authorization",
+991 "in": "header",
+992 "schema": {
+1053 "description": "Set the temperature target for the HVAC system.",
+1054 "parameters": [
+1055 {
+1056 "name": "Authorization",
+1057 "in": "header",
+1058 "schema": {
+1101 "description": "Start the climate control system. Will cool or heat automatically, depending on set temperature.",
+1102 "parameters": [
+1103 {
+1104 "name": "Authorization",
+1105 "in": "header",
+1106 "schema": {
+1149 "description": "Stop the climate control system.",
+1150 "parameters": [
+1151 {
+1152 "name": "Authorization",
+1153 "in": "header",
+1154 "schema": {
+1222 "description": "Controls the car's panoramic roof, if installed.",
+1223 "parameters": [
+1224 {
+1225 "name": "Authorization",
+1226 "in": "header",
+1227 "schema": {
+1279 "description": "Start the car for keyless driving. Must start driving within 2 minutes of issuing this request.",
+1280 "parameters": [
+1281 {
+1282 "name": "Authorization",
+1283 "in": "header",
+1284 "schema": {
+1327 "description": "Open the trunk or frunk. Currently inoperable.",
+1328 "parameters": [
+1329 {
+1330 "name": "Authorization",
+1331 "in": "header",
+1332 "schema": {
+1203 },
+1204 "description": "\nThe desired state of the panoramic roof. The approximate percent open values for each state are `open` = 100%, `close` = 0%, `comfort` = 80%, and `vent` = ~15%\n"
+1205 },
+1206 {
+1207 "name": "percent",
+1208 "in": "path",
+1357 },
+1358 "webhooks": {},
+1359 "components": {
+1360 "schemas": []
+1361 },
+1362 "security": [],
+25 ],
+26 "description": "Performs the login. Takes in an plain text email and password, matching the owner's login information for [https://my.teslamotors.com/user/login](https://my.teslamotors.com/user/login).\n\nReturns a `access_token` which is passed along as a header with all future requests to authenticate the user.\n\nYou must provide the `Authorization: Bearer {access_token}` header in all other requests.\n\nThe current client ID and secret are [available here](http://pastebin.com/fX6ejAHd)",
+27 "requestBody": {
+28 "content": {
+29 "application/json": {
+30 "examples": {
+38 },
+39 "responses": {
+40 "200": {
+41 "description": "",
+42 "headers": {},
+43 "content": {
+75 ],
+76 "responses": {
+77 "200": {
+78 "description": "",
+79 "headers": {},
+80 "content": {
+123 ],
+124 "responses": {
+125 "200": {
+126 "description": "",
+127 "headers": {},
+128 "content": {
+171 ],
+172 "responses": {
+173 "200": {
+174 "description": "",
+175 "headers": {},
+176 "content": {
+219 ],
+220 "responses": {
+221 "200": {
+222 "description": "",
+223 "headers": {},
+224 "content": {
+267 ],
+268 "responses": {
+269 "200": {
+270 "description": "",
+271 "headers": {},
+272 "content": {
+315 ],
+316 "responses": {
+317 "200": {
+318 "description": "",
+319 "headers": {},
+320 "content": {
+363 ],
+364 "responses": {
+365 "200": {
+366 "description": "",
+367 "headers": {},
+368 "content": {
+411 ],
+412 "responses": {
+413 "200": {
+414 "description": "",
+415 "headers": {},
+416 "content": {
+459 ],
+460 "responses": {
+461 "200": {
+462 "description": "",
+463 "headers": {},
+464 "content": {
+507 ],
+508 "responses": {
+509 "200": {
+510 "description": "",
+511 "headers": {},
+512 "content": {
+555 ],
+556 "responses": {
+557 "200": {
+558 "description": "",
+559 "headers": {},
+560 "content": {
+603 ],
+604 "responses": {
+605 "200": {
+606 "description": "",
+607 "headers": {},
+608 "content": {
+651 ],
+652 "responses": {
+653 "200": {
+654 "description": "",
+655 "headers": {},
+656 "content": {
+708 ],
+709 "responses": {
+710 "200": {
+711 "description": "",
+712 "headers": {},
+713 "content": {
+756 ],
+757 "responses": {
+758 "200": {
+759 "description": "",
+760 "headers": {},
+761 "content": {
+804 ],
+805 "responses": {
+806 "200": {
+807 "description": "",
+808 "headers": {},
+809 "content": {
+852 ],
+853 "responses": {
+854 "200": {
+855 "description": "",
+856 "headers": {},
+857 "content": {
+900 ],
+901 "responses": {
+902 "200": {
+903 "description": "",
+904 "headers": {},
+905 "content": {
+948 ],
+949 "responses": {
+950 "200": {
+951 "description": "",
+952 "headers": {},
+953 "content": {
+ 996 ],
+ 997 "responses": {
+ 998 "200": {
+ 999 "description": "",
+1000 "headers": {},
+1001 "content": {
+1062 ],
+1063 "responses": {
+1064 "200": {
+1065 "description": "",
+1066 "headers": {},
+1067 "content": {
+1110 ],
+1111 "responses": {
+1112 "200": {
+1113 "description": "",
+1114 "headers": {},
+1115 "content": {
+1158 ],
+1159 "responses": {
+1160 "200": {
+1161 "description": "",
+1162 "headers": {},
+1163 "content": {
+1231 ],
+1232 "responses": {
+1233 "200": {
+1234 "description": "",
+1235 "headers": {},
+1236 "content": {
+1288 ],
+1289 "responses": {
+1290 "200": {
+1291 "description": "",
+1292 "headers": {},
+1293 "content": {
+1336 ],
+1337 "responses": {
+1338 "200": {
+1339 "description": "",
+1340 "headers": {},
+1341 "content": {
+670 }
+671 },
+672 "/api/1/vehicles/{vehicle_id}/command/set_charge_limit?percent={limit_value}": {
+673 "parameters": [
+674 {
+675 "name": "vehicle_id",
+1015 }
+1016 },
+1017 "/api/1/vehicles/{vehicle_id}/command/set_temps?driver_temp={driver_degC}&passenger_temp={pass_degC}": {
+1018 "parameters": [
+1019 {
+1020 "name": "vehicle_id",
+1177 }
+1178 },
+1179 "/api/1/vehicles/{vehicle_id}/command/sun_roof_control?state={state}&percent={percent}": {
+1180 "parameters": [
+1181 {
+1182 "name": "vehicle_id",
+1250 }
+1251 },
+1252 "/api/1/vehicles/{vehicle_id}/command/remote_start_drive?password={password}": {
+1253 "parameters": [
+1254 {
+1255 "name": "vehicle_id",
+1178 },
+1179 "/api/1/vehicles/{vehicle_id}/command/sun_roof_control?state={state}&percent={percent}": {
+1180 "parameters": [
+1181 {
+1182 "name": "vehicle_id",
+1183 "in": "path",
+94 }
+95 },
+96 "/api/1/vehicles/{vehicle_id}/mobile_enabled": {
+97 "parameters": [
+98 {
+99 "name": "vehicle_id",
+142 }
+143 },
+144 "/api/1/vehicles/{vehicle_id}/data_request/charge_state": {
+145 "parameters": [
+146 {
+147 "name": "vehicle_id",
+190 }
+191 },
+192 "/api/1/vehicles/{vehicle_id}/data_request/climate_state": {
+193 "parameters": [
+194 {
+195 "name": "vehicle_id",
+238 }
+239 },
+240 "/api/1/vehicles/{vehicle_id}/data_request/drive_state": {
+241 "parameters": [
+242 {
+243 "name": "vehicle_id",
+286 }
+287 },
+288 "/api/1/vehicles/{vehicle_id}/data_request/gui_settings": {
+289 "parameters": [
+290 {
+291 "name": "vehicle_id",
+334 }
+335 },
+336 "/api/1/vehicles/{vehicle_id}/data_request/vehicle_state": {
+337 "parameters": [
+338 {
+339 "name": "vehicle_id",
+382 }
+383 },
+384 "/api/1/vehicles/{vehicle_id}/wake_up": {
+385 "parameters": [
+386 {
+387 "name": "vehicle_id",
+430 }
+431 },
+432 "/api/1/vehicles/{vehicle_id}/command/set_valet_mode": {
+433 "parameters": [
+434 {
+435 "name": "vehicle_id",
+478 }
+479 },
+480 "/api/1/vehicles/{vehicle_id}/command/reset_valet_pin": {
+481 "parameters": [
+482 {
+483 "name": "vehicle_id",
+526 }
+527 },
+528 "/api/1/vehicles/{vehicle_id}/command/charge_port_door_open": {
+529 "parameters": [
+530 {
+531 "name": "vehicle_id",
+574 }
+575 },
+576 "/api/1/vehicles/{vehicle_id}/command/charge_standard": {
+577 "parameters": [
+578 {
+579 "name": "vehicle_id",
+622 }
+623 },
+624 "/api/1/vehicles/{vehicle_id}/command/charge_max_range": {
+625 "parameters": [
+626 {
+627 "name": "vehicle_id",
+670 }
+671 },
+672 "/api/1/vehicles/{vehicle_id}/command/set_charge_limit?percent={limit_value}": {
+673 "parameters": [
+674 {
+675 "name": "vehicle_id",
+727 }
+728 },
+729 "/api/1/vehicles/{vehicle_id}/command/charge_start": {
+730 "parameters": [
+731 {
+732 "name": "vehicle_id",
+775 }
+776 },
+777 "/api/1/vehicles/{vehicle_id}/command/charge_stop": {
+778 "parameters": [
+779 {
+780 "name": "vehicle_id",
+823 }
+824 },
+825 "/api/1/vehicles/{vehicle_id}/command/flash_lights": {
+826 "parameters": [
+827 {
+828 "name": "vehicle_id",
+871 }
+872 },
+873 "/api/1/vehicles/{vehicle_id}/command/honk_horn": {
+874 "parameters": [
+875 {
+876 "name": "vehicle_id",
+919 }
+920 },
+921 "/api/1/vehicles/{vehicle_id}/command/door_unlock": {
+922 "parameters": [
+923 {
+924 "name": "vehicle_id",
+967 }
+968 },
+969 "/api/1/vehicles/{vehicle_id}/command/door_lock": {
+970 "parameters": [
+971 {
+972 "name": "vehicle_id",
+1015 }
+1016 },
+1017 "/api/1/vehicles/{vehicle_id}/command/set_temps?driver_temp={driver_degC}&passenger_temp={pass_degC}": {
+1018 "parameters": [
+1019 {
+1020 "name": "vehicle_id",
+1081 }
+1082 },
+1083 "/api/1/vehicles/{vehicle_id}/command/auto_conditioning_start": {
+1084 "parameters": [
+1085 {
+1086 "name": "vehicle_id",
+1129 }
+1130 },
+1131 "/api/1/vehicles/{vehicle_id}/command/auto_conditioning_stop": {
+1132 "parameters": [
+1133 {
+1134 "name": "vehicle_id",
+1177 }
+1178 },
+1179 "/api/1/vehicles/{vehicle_id}/command/sun_roof_control?state={state}&percent={percent}": {
+1180 "parameters": [
+1181 {
+1182 "name": "vehicle_id",
+1250 }
+1251 },
+1252 "/api/1/vehicles/{vehicle_id}/command/remote_start_drive?password={password}": {
+1253 "parameters": [
+1254 {
+1255 "name": "vehicle_id",
+1307 }
+1308 },
+1309 "/api/1/vehicles/{vehicle_id}/command/trunk_open": {
+1310 "parameters": [
+1311 {
+1312 "name": "vehicle_id",
+670 }
+671 },
+672 "/api/1/vehicles/{vehicle_id}/command/set_charge_limit?percent={limit_value}": {
+673 "parameters": [
+674 {
+675 "name": "vehicle_id",
+1015 }
+1016 },
+1017 "/api/1/vehicles/{vehicle_id}/command/set_temps?driver_temp={driver_degC}&passenger_temp={pass_degC}": {
+1018 "parameters": [
+1019 {
+1020 "name": "vehicle_id",
+1177 }
+1178 },
+1179 "/api/1/vehicles/{vehicle_id}/command/sun_roof_control?state={state}&percent={percent}": {
+1180 "parameters": [
+1181 {
+1182 "name": "vehicle_id",
+1250 }
+1251 },
+1252 "/api/1/vehicles/{vehicle_id}/command/remote_start_drive?password={password}": {
+1253 "parameters": [
+1254 {
+1255 "name": "vehicle_id",
+1178 },
+1179 "/api/1/vehicles/{vehicle_id}/command/sun_roof_control?state={state}&percent={percent}": {
+1180 "parameters": [
+1181 {
+1182 "name": "vehicle_id",
+1183 "in": "path",
+94 }
+95 },
+96 "/api/1/vehicles/{vehicle_id}/mobile_enabled": {
+97 "parameters": [
+98 {
+99 "name": "vehicle_id",
+142 }
+143 },
+144 "/api/1/vehicles/{vehicle_id}/data_request/charge_state": {
+145 "parameters": [
+146 {
+147 "name": "vehicle_id",
+190 }
+191 },
+192 "/api/1/vehicles/{vehicle_id}/data_request/climate_state": {
+193 "parameters": [
+194 {
+195 "name": "vehicle_id",
+238 }
+239 },
+240 "/api/1/vehicles/{vehicle_id}/data_request/drive_state": {
+241 "parameters": [
+242 {
+243 "name": "vehicle_id",
+286 }
+287 },
+288 "/api/1/vehicles/{vehicle_id}/data_request/gui_settings": {
+289 "parameters": [
+290 {
+291 "name": "vehicle_id",
+334 }
+335 },
+336 "/api/1/vehicles/{vehicle_id}/data_request/vehicle_state": {
+337 "parameters": [
+338 {
+339 "name": "vehicle_id",
+382 }
+383 },
+384 "/api/1/vehicles/{vehicle_id}/wake_up": {
+385 "parameters": [
+386 {
+387 "name": "vehicle_id",
+430 }
+431 },
+432 "/api/1/vehicles/{vehicle_id}/command/set_valet_mode": {
+433 "parameters": [
+434 {
+435 "name": "vehicle_id",
+478 }
+479 },
+480 "/api/1/vehicles/{vehicle_id}/command/reset_valet_pin": {
+481 "parameters": [
+482 {
+483 "name": "vehicle_id",
+526 }
+527 },
+528 "/api/1/vehicles/{vehicle_id}/command/charge_port_door_open": {
+529 "parameters": [
+530 {
+531 "name": "vehicle_id",
+574 }
+575 },
+576 "/api/1/vehicles/{vehicle_id}/command/charge_standard": {
+577 "parameters": [
+578 {
+579 "name": "vehicle_id",
+622 }
+623 },
+624 "/api/1/vehicles/{vehicle_id}/command/charge_max_range": {
+625 "parameters": [
+626 {
+627 "name": "vehicle_id",
+670 }
+671 },
+672 "/api/1/vehicles/{vehicle_id}/command/set_charge_limit?percent={limit_value}": {
+673 "parameters": [
+674 {
+675 "name": "vehicle_id",
+727 }
+728 },
+729 "/api/1/vehicles/{vehicle_id}/command/charge_start": {
+730 "parameters": [
+731 {
+732 "name": "vehicle_id",
+775 }
+776 },
+777 "/api/1/vehicles/{vehicle_id}/command/charge_stop": {
+778 "parameters": [
+779 {
+780 "name": "vehicle_id",
+823 }
+824 },
+825 "/api/1/vehicles/{vehicle_id}/command/flash_lights": {
+826 "parameters": [
+827 {
+828 "name": "vehicle_id",
+871 }
+872 },
+873 "/api/1/vehicles/{vehicle_id}/command/honk_horn": {
+874 "parameters": [
+875 {
+876 "name": "vehicle_id",
+919 }
+920 },
+921 "/api/1/vehicles/{vehicle_id}/command/door_unlock": {
+922 "parameters": [
+923 {
+924 "name": "vehicle_id",
+967 }
+968 },
+969 "/api/1/vehicles/{vehicle_id}/command/door_lock": {
+970 "parameters": [
+971 {
+972 "name": "vehicle_id",
+1015 }
+1016 },
+1017 "/api/1/vehicles/{vehicle_id}/command/set_temps?driver_temp={driver_degC}&passenger_temp={pass_degC}": {
+1018 "parameters": [
+1019 {
+1020 "name": "vehicle_id",
+1081 }
+1082 },
+1083 "/api/1/vehicles/{vehicle_id}/command/auto_conditioning_start": {
+1084 "parameters": [
+1085 {
+1086 "name": "vehicle_id",
+1129 }
+1130 },
+1131 "/api/1/vehicles/{vehicle_id}/command/auto_conditioning_stop": {
+1132 "parameters": [
+1133 {
+1134 "name": "vehicle_id",
+1177 }
+1178 },
+1179 "/api/1/vehicles/{vehicle_id}/command/sun_roof_control?state={state}&percent={percent}": {
+1180 "parameters": [
+1181 {
+1182 "name": "vehicle_id",
+1250 }
+1251 },
+1252 "/api/1/vehicles/{vehicle_id}/command/remote_start_drive?password={password}": {
+1253 "parameters": [
+1254 {
+1255 "name": "vehicle_id",
+1307 }
+1308 },
+1309 "/api/1/vehicles/{vehicle_id}/command/trunk_open": {
+1310 "parameters": [
+1311 {
+1312 "name": "vehicle_id",
+1203 },
+1204 "description": "\nThe desired state of the panoramic roof. The approximate percent open values for each state are `open` = 100%, `close` = 0%, `comfort` = 80%, and `vent` = ~15%\n"
+1205 },
+1206 {
+1207 "name": "percent",
+1208 "in": "path",
+1357 },
+1358 "webhooks": {},
+1359 "components": {
+1360 "schemas": []
+1361 },
+1362 "security": [],
+76 "responses": {
+77 "200": {
+78 "description": "",
+79 "headers": {},
+80 "content": {
+81 "application/json": {
+124 "responses": {
+125 "200": {
+126 "description": "",
+127 "headers": {},
+128 "content": {
+129 "application/json": {
+151 "type": "string"
+152 },
+153 "description": "The id of the Vehicle."
+154 }
+155 ],
+156 "get": {
+172 "responses": {
+173 "200": {
+174 "description": "",
+175 "headers": {},
+176 "content": {
+177 "application/json": {
+199 "type": "string"
+200 },
+201 "description": "The id of the Vehicle."
+202 }
+203 ],
+204 "get": {
+220 "responses": {
+221 "200": {
+222 "description": "",
+223 "headers": {},
+224 "content": {
+225 "application/json": {
+247 "type": "string"
+248 },
+249 "description": "The id of the Vehicle."
+250 }
+251 ],
+252 "get": {
+268 "responses": {
+269 "200": {
+270 "description": "",
+271 "headers": {},
+272 "content": {
+273 "application/json": {
+295 "type": "string"
+296 },
+297 "description": "The id of the Vehicle."
+298 }
+299 ],
+300 "get": {
+316 "responses": {
+317 "200": {
+318 "description": "",
+319 "headers": {},
+320 "content": {
+321 "application/json": {
+343 "type": "string"
+344 },
+345 "description": "The id of the Vehicle."
+346 }
+347 ],
+348 "get": {
+364 "responses": {
+365 "200": {
+366 "description": "",
+367 "headers": {},
+368 "content": {
+369 "application/json": {
+391 "type": "string"
+392 },
+393 "description": "The id of the Vehicle."
+394 }
+395 ],
+396 "post": {
+412 "responses": {
+413 "200": {
+414 "description": "",
+415 "headers": {},
+416 "content": {
+417 "application/json": {
+439 "type": "string"
+440 },
+441 "description": "The id of the Vehicle."
+442 }
+443 ],
+444 "post": {
+460 "responses": {
+461 "200": {
+462 "description": "",
+463 "headers": {},
+464 "content": {
+465 "application/json": {
+487 "type": "string"
+488 },
+489 "description": "The id of the Vehicle."
+490 }
+491 ],
+492 "post": {
+508 "responses": {
+509 "200": {
+510 "description": "",
+511 "headers": {},
+512 "content": {
+513 "application/json": {
+535 "type": "string"
+536 },
+537 "description": "The id of the Vehicle."
+538 }
+539 ],
+540 "post": {
+556 "responses": {
+557 "200": {
+558 "description": "",
+559 "headers": {},
+560 "content": {
+561 "application/json": {
+583 "type": "string"
+584 },
+585 "description": "The id of the Vehicle."
+586 }
+587 ],
+588 "post": {
+604 "responses": {
+605 "200": {
+606 "description": "",
+607 "headers": {},
+608 "content": {
+609 "application/json": {
+631 "type": "string"
+632 },
+633 "description": "The id of the Vehicle."
+634 }
+635 ],
+636 "post": {
+652 "responses": {
+653 "200": {
+654 "description": "",
+655 "headers": {},
+656 "content": {
+657 "application/json": {
+679 "type": "string"
+680 },
+681 "description": "The id of the Vehicle."
+682 },
+683 {
+684 "name": "limit_value",
+709 "responses": {
+710 "200": {
+711 "description": "",
+712 "headers": {},
+713 "content": {
+714 "application/json": {
+736 "type": "string"
+737 },
+738 "description": "The id of the Vehicle."
+739 }
+740 ],
+741 "post": {
+757 "responses": {
+758 "200": {
+759 "description": "",
+760 "headers": {},
+761 "content": {
+762 "application/json": {
+784 "type": "string"
+785 },
+786 "description": "The id of the Vehicle."
+787 }
+788 ],
+789 "post": {
+805 "responses": {
+806 "200": {
+807 "description": "",
+808 "headers": {},
+809 "content": {
+810 "application/json": {
+832 "type": "string"
+833 },
+834 "description": "The id of the Vehicle."
+835 }
+836 ],
+837 "post": {
+853 "responses": {
+854 "200": {
+855 "description": "",
+856 "headers": {},
+857 "content": {
+858 "application/json": {
+880 "type": "string"
+881 },
+882 "description": "The id of the Vehicle."
+883 }
+884 ],
+885 "post": {
+901 "responses": {
+902 "200": {
+903 "description": "",
+904 "headers": {},
+905 "content": {
+906 "application/json": {
+928 "type": "string"
+929 },
+930 "description": "The id of the Vehicle."
+931 }
+932 ],
+933 "post": {
+949 "responses": {
+950 "200": {
+951 "description": "",
+952 "headers": {},
+953 "content": {
+954 "application/json": {
+976 "type": "string"
+977 },
+978 "description": "The id of the Vehicle."
+979 }
+980 ],
+981 "post": {
+ 997 "responses": {
+ 998 "200": {
+ 999 "description": "",
+1000 "headers": {},
+1001 "content": {
+1002 "application/json": {
+1024 "type": "string"
+1025 },
+1026 "description": "The id of the Vehicle."
+1027 },
+1028 {
+1029 "name": "driver_degC",
+1063 "responses": {
+1064 "200": {
+1065 "description": "",
+1066 "headers": {},
+1067 "content": {
+1068 "application/json": {
+1090 "type": "string"
+1091 },
+1092 "description": "The id of the Vehicle."
+1093 }
+1094 ],
+1095 "post": {
+1111 "responses": {
+1112 "200": {
+1113 "description": "",
+1114 "headers": {},
+1115 "content": {
+1116 "application/json": {
+1138 "type": "string"
+1139 },
+1140 "description": "The id of the Vehicle."
+1141 }
+1142 ],
+1143 "post": {
+1159 "responses": {
+1160 "200": {
+1161 "description": "",
+1162 "headers": {},
+1163 "content": {
+1164 "application/json": {
+1186 "type": "string"
+1187 },
+1188 "description": "The id of the Vehicle."
+1189 },
+1190 {
+1191 "name": "state",
+1232 "responses": {
+1233 "200": {
+1234 "description": "",
+1235 "headers": {},
+1236 "content": {
+1237 "application/json": {
+1259 "type": "string"
+1260 },
+1261 "description": "The id of the Vehicle."
+1262 },
+1263 {
+1264 "name": "password",
+1289 "responses": {
+1290 "200": {
+1291 "description": "",
+1292 "headers": {},
+1293 "content": {
+1294 "application/json": {
+1316 "type": "string"
+1317 },
+1318 "description": "The id of the Vehicle."
+1319 }
+1320 ],
+1321 "post": {
+1337 "responses": {
+1338 "200": {
+1339 "description": "",
+1340 "headers": {},
+1341 "content": {
+1342 "application/json": {
+66 "description": "Retrieve a list of your owned vehicles (includes vehicles not yet shipped!)",
+67 "parameters": [
+68 {
+69 "name": "Authorization",
+70 "in": "header",
+71 "schema": {
+114 "description": "Determines if mobile access to the vehicle is enabled.",
+115 "parameters": [
+116 {
+117 "name": "Authorization",
+118 "in": "header",
+119 "schema": {
+162 "description": "Returns the state of charge in the battery.",
+163 "parameters": [
+164 {
+165 "name": "Authorization",
+166 "in": "header",
+167 "schema": {
+210 "description": "Returns the current temperature and climate control state.",
+211 "parameters": [
+212 {
+213 "name": "Authorization",
+214 "in": "header",
+215 "schema": {
+258 "description": "Returns the driving and position state of the vehicle.",
+259 "parameters": [
+260 {
+261 "name": "Authorization",
+262 "in": "header",
+263 "schema": {
+306 "description": "Returns various information about the GUI settings of the car, such as unit format and range display.",
+307 "parameters": [
+308 {
+309 "name": "Authorization",
+310 "in": "header",
+311 "schema": {
+354 "description": "Returns the vehicle's physical state, such as which doors are open.",
+355 "parameters": [
+356 {
+357 "name": "Authorization",
+358 "in": "header",
+359 "schema": {
+402 "description": "Wakes up the car from the sleep state. Necessary to get some data from the car.",
+403 "parameters": [
+404 {
+405 "name": "Authorization",
+406 "in": "header",
+407 "schema": {
+450 "description": "Sets valet mode on or off with a PIN to disable it from within the car. Reuses last PIN from previous valet session.\nValet Mode limits the car's top speed to 70MPH and 80kW of acceleration power. It also disables Homelink, Bluetooth and\nWifi settings, and the ability to disable mobile access to the car. It also hides your favorites, home, and work\nlocations in navigation.",
+451 "parameters": [
+452 {
+453 "name": "Authorization",
+454 "in": "header",
+455 "schema": {
+498 "description": "Resets the PIN set for valet mode, if set.",
+499 "parameters": [
+500 {
+501 "name": "Authorization",
+502 "in": "header",
+503 "schema": {
+546 "description": "Opens the charge port. Does not close the charge port (for now...)",
+547 "parameters": [
+548 {
+549 "name": "Authorization",
+550 "in": "header",
+551 "schema": {
+594 "description": "Set the charge mode to standard (90% under the new percentage system introduced in 4.5).",
+595 "parameters": [
+596 {
+597 "name": "Authorization",
+598 "in": "header",
+599 "schema": {
+642 "description": "Set the charge mode to max range (100% under the new percentage system introduced in 4.5). Use sparingly!",
+643 "parameters": [
+644 {
+645 "name": "Authorization",
+646 "in": "header",
+647 "schema": {
+699 "description": "Set the charge limit to a custom percentage.",
+700 "parameters": [
+701 {
+702 "name": "Authorization",
+703 "in": "header",
+704 "schema": {
+747 "description": "Start charging. Must be plugged in, have power available, and not have reached your charge limit.",
+748 "parameters": [
+749 {
+750 "name": "Authorization",
+751 "in": "header",
+752 "schema": {
+795 "description": "Stop charging. Must already be charging.",
+796 "parameters": [
+797 {
+798 "name": "Authorization",
+799 "in": "header",
+800 "schema": {
+843 "description": "Flash the lights once.",
+844 "parameters": [
+845 {
+846 "name": "Authorization",
+847 "in": "header",
+848 "schema": {
+891 "description": "Honk the horn once.",
+892 "parameters": [
+893 {
+894 "name": "Authorization",
+895 "in": "header",
+896 "schema": {
+939 "description": "Unlock the car's doors.",
+940 "parameters": [
+941 {
+942 "name": "Authorization",
+943 "in": "header",
+944 "schema": {
+987 "description": "Lock the car's doors.",
+988 "parameters": [
+989 {
+990 "name": "Authorization",
+991 "in": "header",
+992 "schema": {
+1053 "description": "Set the temperature target for the HVAC system.",
+1054 "parameters": [
+1055 {
+1056 "name": "Authorization",
+1057 "in": "header",
+1058 "schema": {
+1101 "description": "Start the climate control system. Will cool or heat automatically, depending on set temperature.",
+1102 "parameters": [
+1103 {
+1104 "name": "Authorization",
+1105 "in": "header",
+1106 "schema": {
+1149 "description": "Stop the climate control system.",
+1150 "parameters": [
+1151 {
+1152 "name": "Authorization",
+1153 "in": "header",
+1154 "schema": {
+1222 "description": "Controls the car's panoramic roof, if installed.",
+1223 "parameters": [
+1224 {
+1225 "name": "Authorization",
+1226 "in": "header",
+1227 "schema": {
+1279 "description": "Start the car for keyless driving. Must start driving within 2 minutes of issuing this request.",
+1280 "parameters": [
+1281 {
+1282 "name": "Authorization",
+1283 "in": "header",
+1284 "schema": {
+1327 "description": "Open the trunk or frunk. Currently inoperable.",
+1328 "parameters": [
+1329 {
+1330 "name": "Authorization",
+1331 "in": "header",
+1332 "schema": {
+25 ],
+26 "description": "Performs the login. Takes in an plain text email and password, matching the owner's login information for [https://my.teslamotors.com/user/login](https://my.teslamotors.com/user/login).\n\nReturns a `access_token` which is passed along as a header with all future requests to authenticate the user.\n\nYou must provide the `Authorization: Bearer {access_token}` header in all other requests.\n\nThe current client ID and secret are [available here](http://pastebin.com/fX6ejAHd)",
+27 "requestBody": {
+28 "content": {
+29 "application/json": {
+30 "examples": {
+38 },
+39 "responses": {
+40 "200": {
+41 "description": "",
+42 "headers": {},
+43 "content": {
+75 ],
+76 "responses": {
+77 "200": {
+78 "description": "",
+79 "headers": {},
+80 "content": {
+123 ],
+124 "responses": {
+125 "200": {
+126 "description": "",
+127 "headers": {},
+128 "content": {
+171 ],
+172 "responses": {
+173 "200": {
+174 "description": "",
+175 "headers": {},
+176 "content": {
+219 ],
+220 "responses": {
+221 "200": {
+222 "description": "",
+223 "headers": {},
+224 "content": {
+267 ],
+268 "responses": {
+269 "200": {
+270 "description": "",
+271 "headers": {},
+272 "content": {
+315 ],
+316 "responses": {
+317 "200": {
+318 "description": "",
+319 "headers": {},
+320 "content": {
+363 ],
+364 "responses": {
+365 "200": {
+366 "description": "",
+367 "headers": {},
+368 "content": {
+411 ],
+412 "responses": {
+413 "200": {
+414 "description": "",
+415 "headers": {},
+416 "content": {
+459 ],
+460 "responses": {
+461 "200": {
+462 "description": "",
+463 "headers": {},
+464 "content": {
+507 ],
+508 "responses": {
+509 "200": {
+510 "description": "",
+511 "headers": {},
+512 "content": {
+555 ],
+556 "responses": {
+557 "200": {
+558 "description": "",
+559 "headers": {},
+560 "content": {
+603 ],
+604 "responses": {
+605 "200": {
+606 "description": "",
+607 "headers": {},
+608 "content": {
+651 ],
+652 "responses": {
+653 "200": {
+654 "description": "",
+655 "headers": {},
+656 "content": {
+708 ],
+709 "responses": {
+710 "200": {
+711 "description": "",
+712 "headers": {},
+713 "content": {
+756 ],
+757 "responses": {
+758 "200": {
+759 "description": "",
+760 "headers": {},
+761 "content": {
+804 ],
+805 "responses": {
+806 "200": {
+807 "description": "",
+808 "headers": {},
+809 "content": {
+852 ],
+853 "responses": {
+854 "200": {
+855 "description": "",
+856 "headers": {},
+857 "content": {
+900 ],
+901 "responses": {
+902 "200": {
+903 "description": "",
+904 "headers": {},
+905 "content": {
+948 ],
+949 "responses": {
+950 "200": {
+951 "description": "",
+952 "headers": {},
+953 "content": {
+ 996 ],
+ 997 "responses": {
+ 998 "200": {
+ 999 "description": "",
+1000 "headers": {},
+1001 "content": {
+1062 ],
+1063 "responses": {
+1064 "200": {
+1065 "description": "",
+1066 "headers": {},
+1067 "content": {
+1110 ],
+1111 "responses": {
+1112 "200": {
+1113 "description": "",
+1114 "headers": {},
+1115 "content": {
+1158 ],
+1159 "responses": {
+1160 "200": {
+1161 "description": "",
+1162 "headers": {},
+1163 "content": {
+1231 ],
+1232 "responses": {
+1233 "200": {
+1234 "description": "",
+1235 "headers": {},
+1236 "content": {
+1288 ],
+1289 "responses": {
+1290 "200": {
+1291 "description": "",
+1292 "headers": {},
+1293 "content": {
+1336 ],
+1337 "responses": {
+1338 "200": {
+1339 "description": "",
+1340 "headers": {},
+1341 "content": {
+