Request
Method:POST
Endpoint: /oauth/token
Request Body
Device Code Grant
| Field | Type | Required | Description |
|---|---|---|---|
grant_type | string | Yes | Must be urn:ietf:params:oauth:grant-type:device_code |
device_code | string | Yes | Device code from /device/authorize |
client_id | string | Yes | OAuth client ID |
Refresh Token Grant
| Field | Type | Required | Description |
|---|---|---|---|
grant_type | string | Yes | Must be refresh_token |
refresh_token | string | Yes | Refresh token from previous response |
client_id | string | Yes | OAuth client ID |
Client Credentials Grant
| Field | Type | Required | Description |
|---|---|---|---|
grant_type | string | Yes | Must be client_credentials |
client_id | string | Yes | Service account client ID |
client_secret | string | Yes | Service account secret |
Response
| Field | Type | Description |
|---|---|---|
access_token | string | Bearer token for API requests |
token_type | string | Always “Bearer” |
expires_in | integer | Seconds until token expires (typically 1 hour) |
refresh_token | string | Token to refresh access_token |
scope | string | Granted scopes |
Status Codes
| Code | Meaning |
|---|---|
| 200 | Success, token returned |
| 400 | Invalid request parameters |
| 401 | Invalid credentials |
| 429 | Rate limited |
Pending Responses
Authorization Pending
User hasn’t approved yet. Keep polling:interval seconds.
Slow Down
Server request too many polls. Increase interval:Access Denied
User rejected the request:Expired Token
Device code or refresh token expired:/device/authorize again.
Examples
Device Code to Token
Refresh Token
Service Account
Token Handling
Store Token Securely
Refresh Before Expiry
Use Bearer Token
Token Lifetime
- Access token: 1 hour
- Refresh token: 30 days
- Device code: 30 minutes
- Use refresh_token to get new access_token
- If refresh_token expired, start device flow again