tesla_api 3.0.7 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/test.yml +36 -0
- data/docs/api-basics/authentication.md +163 -36
- data/docs/vehicle/optioncodes.md +82 -42
- data/docs/vehicle/state/data.md +42 -37
- data/lib/tesla_api/client.rb +76 -11
- data/lib/tesla_api/version.rb +1 -1
- data/spec/cassettes/client-login.yml +254 -46
- data/spec/cassettes/client-refresh.yml +109 -49
- data/spec/lib/tesla_api/client_spec.rb +20 -38
- metadata +6 -8
- data/.travis.yml +0 -16
- data/spec/cassettes/client-login_timeout.yml +0 -83
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5b774bab2f43b76262fa9c4ab04ae250f9f325955f028d3c8bd44416f5a015f5
|
4
|
+
data.tar.gz: 157c7c913712cd7bc3e7412aead4225c5502b26399f7dcf2243a3f522c72cec9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1354ad7bf60037cf9e09541d7122aed4448946262177e0c6a535f303fde5e5a479f15b2bda193102e305ec2f0743e9d4499aff27cbc2a452add543d64ee1157c
|
7
|
+
data.tar.gz: 980f1b1d752b674ab29ab82982c4ff687f3f22b62dc0c1d5aa138ef5fdd458393a7cea7177f67ae15ae64635154cd45eb7b70cf1bab12affa2c33ad9e622b32e
|
@@ -0,0 +1,36 @@
|
|
1
|
+
name: Tests
|
2
|
+
|
3
|
+
on:
|
4
|
+
push:
|
5
|
+
branches: [master]
|
6
|
+
pull_request:
|
7
|
+
branches: [master]
|
8
|
+
|
9
|
+
jobs:
|
10
|
+
test:
|
11
|
+
name: Test Suite
|
12
|
+
runs-on: ubuntu-latest
|
13
|
+
|
14
|
+
env:
|
15
|
+
TESLA_EMAIL: elon.musk@teslamotors.com
|
16
|
+
TESLA_PASS: oilLOL
|
17
|
+
TESLA_CLIENT_ID: 1
|
18
|
+
TESLA_CLIENT_SECRET: 2
|
19
|
+
TESLA_ACCESS_TOKEN: 3
|
20
|
+
TESLA_REFRESH_TOKEN: 4
|
21
|
+
|
22
|
+
strategy:
|
23
|
+
matrix:
|
24
|
+
ruby-version: ['2.7', '3.0']
|
25
|
+
|
26
|
+
steps:
|
27
|
+
- uses: actions/checkout@v2
|
28
|
+
|
29
|
+
- name: Set up Ruby
|
30
|
+
uses: ruby/setup-ruby@v1
|
31
|
+
with:
|
32
|
+
ruby-version: ${{ matrix.ruby-version }}
|
33
|
+
bundler-cache: true
|
34
|
+
|
35
|
+
- name: Run test suite
|
36
|
+
run: bundle exec rake
|
@@ -4,9 +4,129 @@ description: The authentication process for the Tesla API
|
|
4
4
|
|
5
5
|
# Authentication
|
6
6
|
|
7
|
-
##
|
7
|
+
> ## ⚠ This is a work in progress ⚠
|
8
|
+
>
|
9
|
+
> Tesla has deprecated the `/oauth/token` endpoint in favor of using `auth.tesla.com`. I'm working on updating the documentation as soon as possible. This documentation is still missing handling for MFA users. Feel free to discuss this in [issue #260](https://github.com/timdorr/tesla-api/issues/260).
|
8
10
|
|
9
|
-
|
11
|
+
Tesla uses a separate SSO service (auth.tesla.com) for authentication across their app and website. This service is designed around a browser-based flow using OAuth 2.0, but also appears to have support for Open ID Connect. This supports both obtaining an access token and refreshing it as it expires.
|
12
|
+
|
13
|
+
## Logging in
|
14
|
+
|
15
|
+
### Step 1: Obtain the login page
|
16
|
+
|
17
|
+
Subsequent requests to the SSO service will require a "code challenge" and "code verifier". These are just a random 86-character string and its SHA-256 hash. Both must be encoded in base64 with url-safe encoding (base64url). Here is an example of generating them in Ruby, but you can apply this same process to other languages.
|
18
|
+
|
19
|
+
```ruby
|
20
|
+
code_verifier = random_string(86)
|
21
|
+
code_challenge = Base64.urlsafe_encode64(Digest::SHA256.hexdigest(code_verifier))
|
22
|
+
code_verifier = Base64.urlsafe_encode64(code_verifier)
|
23
|
+
```
|
24
|
+
|
25
|
+
You will also need a stable `state` value for requests, which is a random string of any length.
|
26
|
+
|
27
|
+
#### GET `https://auth.tesla.com/oauth2/v3/authorize`
|
28
|
+
|
29
|
+
The first request returns HTML intended for display in the browser. You will need to parse this HTML for hidden input fields.
|
30
|
+
|
31
|
+
The request is made with a `redirect_url` of "https://auth.tesla.com/void/callback", which is a non-existent page. The Tesla app intercepts the request to this page to capture the authorization code.
|
32
|
+
|
33
|
+
##### Request parameters
|
34
|
+
|
35
|
+
| Field | Type | Example | Description |
|
36
|
+
| :---------------------- | :--------------- | :------------------------------------- | :-------------------------------------------------------------- |
|
37
|
+
| `client_id` | String, required | `ownerapi` | The OAuth client ID. Always "ownerapi" |
|
38
|
+
| `code_challenge` | String, required | `123` | The "code challenge" |
|
39
|
+
| `code_challenge_method` | String, required | `S256` | The code challenge hash method. Always "S256" (SHA-256) |
|
40
|
+
| `redirect_uri` | String, required | `https://auth.tesla.com/void/callback` | The redirect URL. Always "https://auth.tesla.com/void/callback" |
|
41
|
+
| `response_type` | String, required | `code` | The type of expected response. Always "code" |
|
42
|
+
| `scope` | String, required | `openid email offline_access` | The authentication scope. Always "openid email offline_access" |
|
43
|
+
| `state` | String, required | `123` | The OAuth state value. Any random string. |
|
44
|
+
|
45
|
+
##### Response
|
46
|
+
|
47
|
+
This returns an HTML response body. There will be a `<form>` with hidden `<input>` elements that contain session-based information to prevent CSRF attacks. At the moment, they appear to be `_csrf`, `_phase`, `_process`, `transaction_id`, and `cancel`, but they may change due to server-side changes by Tesla. These must be provided in the POST body to validate the following request.
|
48
|
+
|
49
|
+
The response will also include a `set-cookie` header that includes a session ID cookie. This should be provided to the following request as a `Cookie` header so that the SSO service can match up your request with private data it has in that session.
|
50
|
+
|
51
|
+
### Step 2: Obtain an authorization code
|
52
|
+
|
53
|
+
This will simulate a user submitting the form from the previous request in their browser. Ensure that the hidden `<input>`s are provided as POST body parameters and the `Cookie` header is set.
|
54
|
+
|
55
|
+
#### POST `https://auth.tesla.com/oauth2/v3/authorize`
|
56
|
+
|
57
|
+
```http
|
58
|
+
Cookie: {cookie value from set-cookie header}
|
59
|
+
```
|
60
|
+
|
61
|
+
##### Request parameters
|
62
|
+
|
63
|
+
> Note: These are query parameters, not part of the POST body
|
64
|
+
|
65
|
+
| Field | Type | Example | Description |
|
66
|
+
| :---------------------- | :--------------- | :------------------------------------- | :-------------------------------------------------------------- |
|
67
|
+
| `client_id` | String, required | `ownerapi` | The OAuth client ID. Always "ownerapi" |
|
68
|
+
| `code_challenge` | String, required | `123` | The "code challenge" |
|
69
|
+
| `code_challenge_method` | String, required | `S256` | The code challenge hash method. Always "S256" (SHA-256) |
|
70
|
+
| `redirect_uri` | String, required | `https://auth.tesla.com/void/callback` | The redirect URL. Always "https://auth.tesla.com/void/callback" |
|
71
|
+
| `response_type` | String, required | `code` | The type of expected response. Always "code" |
|
72
|
+
| `scope` | String, required | `openid email offline_access` | The authentication scope. Always "openid email offline_access" |
|
73
|
+
| `state` | String, required | `123` | The OAuth state value. Any random string. |
|
74
|
+
|
75
|
+
> Note: This is the contents of the POST body. These should be form encoded (`application/x-www-form-urlencoded`).
|
76
|
+
|
77
|
+
| Field | Type | Example | Description |
|
78
|
+
| :----------------- | :----------------- | :------------------ | :------------------------------------------------ |
|
79
|
+
| hidden input names | String[], required | hidden input values | The fields from the HTML's hidden `<input>`s |
|
80
|
+
| `identity` | String, required | `elon@tesla.com` | The email for the authenticating Tesla account |
|
81
|
+
| `credential` | String, required | `brbgoingtomars` | The password for the authenticating Tesla account |
|
82
|
+
|
83
|
+
##### Response
|
84
|
+
|
85
|
+
This will respond with a 302 HTTP response code, which will attempt to redirect to the redirect_uri with additional query parameters added. This new URL is located in the `location` header. You should not follow it, as it is non-existent. Instead, you should parse this URL and extract the `code` query parameter, which is your authorization code.
|
86
|
+
|
87
|
+
### Step 3: Exchange authorization code for bearer token
|
88
|
+
|
89
|
+
#### POST `https://auth.tesla.com/oauth2/v3/token`
|
90
|
+
|
91
|
+
This is a standard [OAuth 2.0 Authorization Code exchange](https://oauth.net/2/grant-types/authorization-code/). This endpoint uses JSON for the request and response bodies.
|
92
|
+
|
93
|
+
##### Request parameters
|
94
|
+
|
95
|
+
| Field | Type | Example | Description |
|
96
|
+
| :-------------- | :--------------- | :------------------------------------- | :-------------------------------------------------------------- |
|
97
|
+
| `grant_type` | String, required | `authorization_code` | TThe type of OAuth grant. Always "authorization_code" |
|
98
|
+
| `client_id` | String, required | `ownerapi` | The OAuth client ID. Always "ownerapi" |
|
99
|
+
| `code` | String, required | `123` | The authorization code from the last request. |
|
100
|
+
| `code_verifier` | String, required | `123` | The code verifier string generated previously. |
|
101
|
+
| `redirect_uri` | String, required | `https://auth.tesla.com/void/callback` | The redirect URL. Always "https://auth.tesla.com/void/callback" |
|
102
|
+
|
103
|
+
```json
|
104
|
+
{
|
105
|
+
"grant_type": "authorization_code",
|
106
|
+
"client_id": "ownerapi",
|
107
|
+
"code": "123",
|
108
|
+
"code_verifier": "123",
|
109
|
+
"redirect_uri": "https://auth.tesla.com/void/callback"
|
110
|
+
}
|
111
|
+
```
|
112
|
+
|
113
|
+
##### Response
|
114
|
+
|
115
|
+
```json
|
116
|
+
{
|
117
|
+
"access_token": "eyJaccess",
|
118
|
+
"refresh_token": "eyJrefresh",
|
119
|
+
"expires_in": 300,
|
120
|
+
"state": "of the union",
|
121
|
+
"token_type": "Bearer"
|
122
|
+
}
|
123
|
+
```
|
124
|
+
|
125
|
+
### Step 4: Exchange bearer token for access token
|
126
|
+
|
127
|
+
#### POST `https://owner-api.teslamotors.com/oauth/token`
|
128
|
+
|
129
|
+
This endpoint follows [RFC 7523](https://tools.ietf.org/html/rfc7523) to exchange a JWT access token from the SSO service for an access token usable by the Owner API.
|
10
130
|
|
11
131
|
The current client ID and secret are [available here](https://pastebin.com/pS7Z6yyP).
|
12
132
|
|
@@ -18,29 +138,30 @@ Authorization: Bearer {access_token}
|
|
18
138
|
|
19
139
|
The access token has a 45 day expiration.
|
20
140
|
|
21
|
-
|
141
|
+
##### Request parameters
|
22
142
|
|
23
|
-
|
24
|
-
| :-------------- | :--------------- | :--------------------- | :------------------------------------------------ |
|
25
|
-
| `grant_type` | String, required | `password` | The type of OAuth grant. Always "password" |
|
26
|
-
| `client_id` | String, required | `abc` | The OAuth client ID |
|
27
|
-
| `client_secret` | String, required | `123` | The OAuth client secret |
|
28
|
-
| `email` | String, required | `elon@teslamotors.com` | The email for the authenticating Tesla account |
|
29
|
-
| `password` | String, required | `edisonsux` | The password for the authenticating Tesla account |
|
143
|
+
> Important: Ensure you are using the `access_token` from the SSO service here. The returned access_token is for all other requests to the Owner API.
|
30
144
|
|
31
|
-
|
145
|
+
```http
|
146
|
+
Authorization: Bearer {access_token}
|
147
|
+
```
|
148
|
+
|
149
|
+
| Field | Type | Example | Description |
|
150
|
+
| :-------------- | :--------------- | :-------------------------------------------- | :---------------------------------------------------------------------------- |
|
151
|
+
| `grant_type` | String, required | `urn:ietf:params:oauth:grant-type:jwt-bearer` | The type of OAuth grant. Always "urn:ietf:params:oauth:grant-type:jwt-bearer" |
|
152
|
+
| `client_id` | String, required | `abc` | The OAuth client ID |
|
153
|
+
| `client_secret` | String, required | `123` | The OAuth client secret |
|
154
|
+
|
155
|
+
##### Request
|
32
156
|
|
33
157
|
```json
|
34
158
|
{
|
35
|
-
"grant_type": "
|
159
|
+
"grant_type": "urn:ietf:params:oauth:grant-type:jwt-bearer",
|
36
160
|
"client_id": "abc",
|
37
|
-
"client_secret": "123"
|
38
|
-
"email": "elon@teslamotors.com",
|
39
|
-
"password": "edisonsux"
|
40
|
-
}
|
161
|
+
"client_secret": "123"
|
41
162
|
```
|
42
163
|
|
43
|
-
|
164
|
+
##### Response
|
44
165
|
|
45
166
|
```json
|
46
167
|
{
|
@@ -52,38 +173,44 @@ The access token has a 45 day expiration.
|
|
52
173
|
}
|
53
174
|
```
|
54
175
|
|
55
|
-
##
|
176
|
+
## Refreshing an access token
|
177
|
+
|
178
|
+
#### POST `https://auth.tesla.com/oauth2/v3/token`
|
56
179
|
|
57
|
-
|
180
|
+
This uses the SSO `refresh_token` from Step 3 above to do an [OAuth 2.0 Refresh Token Grant](https://oauth.net/2/grant-types/refresh-token/). _This does not work with the `refresh_token` provided by the Owner API._ Those have no use currently and should be discarded.
|
58
181
|
|
59
|
-
|
182
|
+
This refreshed access token can be used with the Owner API to obtain a new access token for that service using the exact same request as Step 4 above.
|
60
183
|
|
61
|
-
|
62
|
-
| :-------------- | :--------------- | :-------------- | :-------------------------------------------------------- |
|
63
|
-
| `grant_type` | String, required | `refresh_token` | The type of OAuth grant. Always "refresh_token" |
|
64
|
-
| `client_id` | String, required | `abc` | The OAuth client ID |
|
65
|
-
| `client_secret` | String, required | `123` | The OAuth client secret |
|
66
|
-
| `refresh_token` | String, required | `cba321` | The refresh token returned from a previous token request. |
|
184
|
+
This endpoint uses JSON for the request and response bodies.
|
67
185
|
|
68
|
-
|
186
|
+
##### Request parameters
|
187
|
+
|
188
|
+
| Field | Type | Example | Description |
|
189
|
+
| :-------------- | :--------------- | :---------------------------- | :------------------------------------------------------------- |
|
190
|
+
| `grant_type` | String, required | `refresh_token` | TThe type of OAuth grant. Always "refresh_token" |
|
191
|
+
| `client_id` | String, required | `ownerapi` | The OAuth client ID. Always "ownerapi" |
|
192
|
+
| `client_secret` | String, required | `123` | The OAuth client ID. |
|
193
|
+
| `refresh_token` | String, required | `123` | The refresh token from a prior authentication. |
|
194
|
+
| `scope` | String, required | `openid email offline_access` | The authentication scope. Always "openid email offline_access" |
|
69
195
|
|
70
196
|
```json
|
71
197
|
{
|
72
|
-
"grant_type": "
|
73
|
-
"client_id": "
|
198
|
+
"grant_type": "authorization_code",
|
199
|
+
"client_id": "ownerapi",
|
74
200
|
"client_secret": "123",
|
75
|
-
"refresh_token": "
|
201
|
+
"refresh_token": "eyJrefresh",
|
202
|
+
"scope": "openid email offline_access"
|
76
203
|
}
|
77
204
|
```
|
78
205
|
|
79
|
-
|
206
|
+
##### Response
|
80
207
|
|
81
208
|
```json
|
82
209
|
{
|
83
|
-
"access_token": "
|
84
|
-
"
|
85
|
-
"
|
86
|
-
"
|
87
|
-
"
|
210
|
+
"access_token": "eyJaccess",
|
211
|
+
"refresh_token": "eyJrefresh",
|
212
|
+
"id_token": "id",
|
213
|
+
"expires_in": 300,
|
214
|
+
"token_type": "Bearer"
|
88
215
|
}
|
89
216
|
```
|
data/docs/vehicle/optioncodes.md
CHANGED
@@ -24,6 +24,7 @@ return a generic set of codes related to a Model 3.
|
|
24
24
|
| RENA | Region: North America | |
|
25
25
|
| RENC | Region: Canada | |
|
26
26
|
| REEU | Region: Europe | |
|
27
|
+
| ACL1 | Ludicrous Mode | Model X |
|
27
28
|
| AD02 | NEMA 14-50 | |
|
28
29
|
| AD04 | European 3-Phase | |
|
29
30
|
| AD05 | European 3-Phase, IT | |
|
@@ -68,7 +69,7 @@ return a generic set of codes related to a Model 3.
|
|
68
69
|
| BG32 | Performance AWD Badge | Model 3 |
|
69
70
|
| BP00 | No Ludicrous | |
|
70
71
|
| BP01 | Ludicrous Speed Upgrade | |
|
71
|
-
| BP02 |
|
72
|
+
| BP02 | Uncorked Acceleration | Non-Performance |
|
72
73
|
| BR00 | No Battery Firmware Limit | |
|
73
74
|
| BR03 | Battery Firmware Limit (60kWh) | |
|
74
75
|
| BR05 | Battery Firmware Limit (75kWh) | |
|
@@ -86,6 +87,7 @@ return a generic set of codes related to a Model 3.
|
|
86
87
|
| BTX8 | 85 kWh | |
|
87
88
|
| CC01 | Five Seat Interior | |
|
88
89
|
| CC02 | Six Seat Interior | |
|
90
|
+
| CC03 | Seven Seat Interior | |
|
89
91
|
| CC04 | Seven Seat Interior | |
|
90
92
|
| CC12 | Six Seat Interior with Center Console | |
|
91
93
|
| CDM0 | No CHAdeMO Charging Adaptor | |
|
@@ -109,7 +111,7 @@ return a generic set of codes related to a Model 3.
|
|
109
111
|
| CPF0 | Standard Connectivity | |
|
110
112
|
| CPF1 | Premium Connectivity | |
|
111
113
|
| CPW1 | 20" Performance Wheels | |
|
112
|
-
| CW00 | Weather Package | No Cold Weather Package |
|
114
|
+
| CW00 | No Weather Package | No Cold Weather Package |
|
113
115
|
| CW02 | Weather Package | Subzero Weather Package |
|
114
116
|
| DA00 | No Autopilot | |
|
115
117
|
| DA01 | Active Safety (ACC,LDW,SA) | Drivers Assistance Package |
|
@@ -129,9 +131,10 @@ return a generic set of codes related to a Model 3.
|
|
129
131
|
| FG00 | No Exterior Lighting Package | |
|
130
132
|
| FG01 | Fog Lamps | Exterior Lighting Package |
|
131
133
|
| FG02 | Fog Lamps | Fog Lamps |
|
132
|
-
| FG31 | Fog Lamps | Premium Fog Lights
|
133
|
-
| FM3B | Performance Package
|
134
|
-
|
|
134
|
+
| FG31 | Fog Lamps | Premium Fog Lights | Model 3
|
135
|
+
| FM3B | Performance Package | Model 3 |
|
136
|
+
| FM3U | Acceleration Boost | Model 3 Long Range All-Wheel Drive |
|
137
|
+
| FMP6 | Performance Firmware | |
|
135
138
|
| FR01 | Base Front Row | |
|
136
139
|
| FR02 | Ventilated Front Seats | |
|
137
140
|
| FR03 | FR03 | |
|
@@ -140,10 +143,10 @@ return a generic set of codes related to a Model 3.
|
|
140
143
|
| HC00 | No Home Charging installation | |
|
141
144
|
| HC01 | Home Charging Installation | |
|
142
145
|
| HM31 | Teck Package - Homelink | Homelink |
|
143
|
-
| HL31 | Head Lamp
|
146
|
+
| HL31 | Head Lamp | Model 3 Uplevel Headlamps |
|
144
147
|
| HP00 | No HPWC Ordered | |
|
145
148
|
| HP01 | HPWC Ordered | |
|
146
|
-
| ID3W |
|
149
|
+
| ID3W | Wood Decor | Model 3 |
|
147
150
|
| IDBA | Dark Ash Wood Decor | |
|
148
151
|
| IDBO | Figured Ash Wood Decor | |
|
149
152
|
| IDCF | Carbon Fiber Decor | |
|
@@ -154,24 +157,27 @@ return a generic set of codes related to a Model 3.
|
|
154
157
|
| IDLW | Lacewood Decor | |
|
155
158
|
| IDPB | Piano Black Decor | |
|
156
159
|
| IN3BB | All Black Partial Premium Interior | |
|
160
|
+
| IN3BW | Black and White Interior | Model 3 Interior |
|
157
161
|
| IN3PB | All Black Premium Interior | Model 3 Interior |
|
158
162
|
| IN3PW | All White Premium Interior | Model 3 Interior |
|
159
|
-
| INBBW | White | |
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
163
|
+
| INBBW | White Interior | |
|
164
|
+
| INB3C | Premium beige interior with oak wood finishes | Model X |
|
165
|
+
| INBC3W | Premium black and white interior with Carbon Fiber decor | Model X |
|
166
|
+
| INBFP | Classic Black Interior | |
|
167
|
+
| INBPP | Black Interior | |
|
168
|
+
| INBPW | White Seats Interior | |
|
169
|
+
| INBTB | Multi-Pattern Black Interior | |
|
170
|
+
| INFBP | Black Premium Interior | |
|
171
|
+
| INLPC | Cream Interior | |
|
172
|
+
| INLPP | Black / Light Headliner Interior | |
|
167
173
|
| INWPT | Tan Interior | |
|
168
174
|
| INYPB | All Black Premium Interior | |
|
169
175
|
| INYPW | Black and White Premium Interior | |
|
170
|
-
| IL31 | Interior Ambient Lighting | |
|
176
|
+
| IL31 | Interior Ambient Lighting Interior | |
|
171
177
|
| IVBPP | All Black Interior | |
|
172
178
|
| IVBSW | Ultra White Interior | |
|
173
179
|
| IVBTB | All Black Interior | |
|
174
|
-
| IVLPC | Vegan Cream | |
|
180
|
+
| IVLPC | Vegan Cream Interior | |
|
175
181
|
| IX00 | No Extended Nappa Leather Trim | |
|
176
182
|
| IX01 | Extended Nappa Leather Trim | |
|
177
183
|
| LLP1 | LLP1 | |
|
@@ -193,23 +199,52 @@ return a generic set of codes related to a Model 3.
|
|
193
199
|
| LTPW | Lower Trim PUR White | |
|
194
200
|
| ME01 | Memory Seats | |
|
195
201
|
| ME02 | Seat Memory | Seat Memory LHD Driver |
|
196
|
-
| MI00 |
|
197
|
-
| MI01 |
|
198
|
-
| MI02 |
|
199
|
-
| MI03 |
|
202
|
+
| MI00 | 1st Generation Production| Model 3 (2019), Model S (Nosecone), Model X (2016) |
|
203
|
+
| MI01 | 2nd Generation Production | Model 3 (2020), Model S (2016 Facelit), Model X (2017) |
|
204
|
+
| MI02 | 3rd Generation Production | Model 3 (2021), Model X (2017) |
|
205
|
+
| MI03 | 4th Generation Production | Model S (2018), Model X (2018) |
|
206
|
+
| MI04 | 5th Generation Production | Model S (2019/2020), Model X (2020/2021) |
|
200
207
|
| MR31 | Tech Package - Mirror -YES | Uplevel Mirrors |
|
201
|
-
| MT300 | Standard Range Rear-Wheel Drive | |
|
202
|
-
| MT301 | Standard Range Plus Rear-Wheel Drive | |
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
208
|
+
| MT300 | Standard Range Rear-Wheel Drive | Model 3 |
|
209
|
+
| MT301 | Standard Range Plus Rear-Wheel Drive | Model 3 |
|
210
|
+
| MT302 | Long Range Rear-Wheel Drive | Model 3 |
|
211
|
+
| MT303 | Long Range All-Wheel Drive | Model 3 |
|
212
|
+
| MT304 | Long Range All-Wheel Drive Performance | Model 3 |
|
213
|
+
| MT305 | Mid Range Rear-Wheel Drive | Model 3 |
|
214
|
+
| MT307 | Mid Range Rear-Wheel Drive | Model 3 |
|
215
|
+
| MT308 | Standard Range Plus Rear-Wheel Drive | Model 3 2019 Refresh |
|
216
|
+
| MT309 | Standard Range Plus Rear-Wheel Drive | Model 3 2019 Refresh |
|
217
|
+
| MT314 | Standard Range Plus Rear-Wheel Drive | Model 3 2021 Refresh |
|
218
|
+
| MT320 | Standard Range Plus Rear-Wheel Drive | Model 3 2021 Refresh |
|
219
|
+
| MT336 | Standard Range Plus Rear-Wheel Drive | Model 3 2020 Refresh |
|
220
|
+
| MT337 | Standard Range Plus Rear-Wheel Drive | Model 3 2021 Refresh |
|
221
|
+
| MT310 | Long Range All-Wheel Drive | Model 3 |
|
222
|
+
| MT311 | Long Range All-Wheel Drive Performance | Model 3 |
|
223
|
+
| MT315 | Long Range All-Wheel Drive | Model 3 2021 Refresh |
|
224
|
+
| MT316 | Long Range All-Wheel Drive | Model 3 2021 Refresh |
|
225
|
+
| MT317 | Long Range All-Wheel Drive Performance | Model 3 2021 Refresh |
|
226
|
+
| MTS01 | Standard Range | Model S |
|
227
|
+
| MTS03 | Long Range | Model S |
|
228
|
+
| MTS04 | Performance | Model S |
|
229
|
+
| MTS05 | Long Range | Model S |
|
230
|
+
| MTS06 | Performance | Model S |
|
231
|
+
| MTS07 | Long Range Plus | Model S |
|
232
|
+
| MTS08 | Performance | Model S |
|
233
|
+
| MTS09 | Plaid+ | Model S Refresh 2021 |
|
234
|
+
| MTS10 | Long Range | Model S Refresh 2021 |
|
235
|
+
| MTS11 | Plaid | Model S Refresh 2021 |
|
236
|
+
| MTX01 | Standard Range | Model X |
|
237
|
+
| MTX03 | Long Range | Model X |
|
238
|
+
| MTX04 | Performance | Model X |
|
239
|
+
| MTX05 | Long Range Plus | Model X |
|
240
|
+
| MTX06 | Performance | Model X |
|
241
|
+
| MTX07 | Long Range Plus | Model X |
|
242
|
+
| MTX08 | Performance | Model X |
|
243
|
+
| MTX10 | Long Range | Model X Refresh 2021 |
|
244
|
+
| MTX11 | Plaid | Model X Refresh 2021 |
|
245
|
+
| MTY02 | Long Range Rear-Wheel Drive | Model Y |
|
246
|
+
| MTY03 | Long Range All-Wheel Drive | Model Y |
|
247
|
+
| MTY04 | Long Range All-Wheel Drive Performance | Model Y |
|
213
248
|
| OSSB | Safety CA Black | |
|
214
249
|
| OSSW | Safety CA White | |
|
215
250
|
| PA00 | No Paint Armor | |
|
@@ -276,13 +311,13 @@ return a generic set of codes related to a Model 3.
|
|
276
311
|
| QXMB | Black Leather Seat | |
|
277
312
|
| RCX0 | No Rear Console | |
|
278
313
|
| RCX1 | Rear Console | |
|
279
|
-
| RF3G |
|
280
|
-
| RFBK | Black Roof | |
|
281
|
-
| RFBC | Body Color Roof |
|
282
|
-
| RFFG | Glass Roof | 2017 Production Refresh |
|
283
|
-
| RFPO | All Glass Panoramic Roof | 2015 Production Refresh |
|
284
|
-
| RFP2 | Sunroof | 2016 Production Refresh |
|
285
|
-
| RFPX |
|
314
|
+
| RF3G | Glass Roof | Model 3 |
|
315
|
+
| RFBK | Black Roof | Model S |
|
316
|
+
| RFBC | Body Color Roof | Model S |
|
317
|
+
| RFFG | Glass Roof | Model S 2017 Production Refresh |
|
318
|
+
| RFPO | All Glass Panoramic Roof | Model S 2015 Production Refresh |
|
319
|
+
| RFP2 | Sunroof | Model S 2016 Production Refresh |
|
320
|
+
| RFPX | Glass Roof | Model X |
|
286
321
|
| RSF1 | Rear Heated Seats | |
|
287
322
|
| RU00 | No Range Upgrade | |
|
288
323
|
| S01B | Black Textile Seats | |
|
@@ -316,7 +351,7 @@ return a generic set of codes related to a Model 3.
|
|
316
351
|
| SU00 | Standard Suspension | |
|
317
352
|
| SU01 | Smart Air Suspension | |
|
318
353
|
| SU03 | Suspension Update | Model X 2020 |
|
319
|
-
| SU3C |
|
354
|
+
| SU3C | Coil Spring Suspension | |
|
320
355
|
| T3MA | Tires M3 | 18 Michelin All Season, Square |
|
321
356
|
| TIC4 | Tires | All-Season Tires |
|
322
357
|
| TIG2 | Summer Tires | |
|
@@ -355,7 +390,9 @@ return a generic set of codes related to a Model 3.
|
|
355
390
|
| W38B | 18" Aero Wheels | For the Model 3 and Model Y |
|
356
391
|
| W39B | 19" Sport Wheels | |
|
357
392
|
| WR00 | No Wrap | |
|
393
|
+
| WS90 | 19" Tempest Wheels | Model S Refresh 2021 |
|
358
394
|
| WT19 | 19" Wheels | |
|
395
|
+
| WS10 | 21" Arachnid Wheels | Model S Refresh 2021 |
|
359
396
|
| WT20 | 20" Silver Slipstream Wheels | |
|
360
397
|
| WT22 | 22" Silver Turbine Wheels | |
|
361
398
|
| WTAB | 21" Black Arachnid Wheels | |
|
@@ -365,6 +402,7 @@ return a generic set of codes related to a Model 3.
|
|
365
402
|
| WTNS | 20" Nokian Winter Tires (studded) | |
|
366
403
|
| WTP2 | 20" Pirelli Winter Tires | |
|
367
404
|
| WTSC | 20" Sonic Carbon Wheels | |
|
405
|
+
| WTSD | 20" Two-Tone Slipstream Wheels | |
|
368
406
|
| WTSG | 21" Turbine Wheels | |
|
369
407
|
| WTSP | 21" Turbine Wheels | |
|
370
408
|
| WTSS | 21" Turbine Wheels | |
|
@@ -381,6 +419,8 @@ return a generic set of codes related to a Model 3.
|
|
381
419
|
| WTW7 | 19" Nokian Winter Tires (non-studded) | |
|
382
420
|
| WTW8 | 19" Pirelli Winter Tires | |
|
383
421
|
| WTX1 | 19" Michelin Primacy Tire Upgrade | |
|
422
|
+
| WX00 | 20" Cyberstream Wheels | Model X Refresh 2021 |
|
423
|
+
| WX20 | 22" Turbine Wheels | Model X Refresh 2021 |
|
384
424
|
| WXNN | No 20" Nokian Winter Tires (non-studded) | |
|
385
425
|
| WXNS | No 20" Nokian Winter Tires (studded) | |
|
386
426
|
| WXP2 | No 20" Pirelli Winter Tires | |
|
@@ -408,7 +448,7 @@ return a generic set of codes related to a Model 3.
|
|
408
448
|
| X020 | No Performance Exterior | |
|
409
449
|
| X021 | No Rear Carbon Fiber Spoiler | |
|
410
450
|
| X024 | Performance Package | |
|
411
|
-
| X025 | Performance Powertrain | |
|
451
|
+
| X025 | No Performance Powertrain | |
|
412
452
|
| X026 | Door handle | No light handle |
|
413
453
|
| X027 | Lighted Door Handles | Light handle |
|
414
454
|
| X028 | Battery Badge | Normal Badging |
|