This guide describes how to use Twitch Authentication to enable your application to take actions on behalf of a Twitch account or access certain data about users’ accounts. The preferred method of authentication is OAuth. We use parts of the OAuth 2.0 protocol.

In addition to OAuth, Twitch supports OIDC (OpenID Connect) for a more secure OAuth 2.0 flow. OIDC tokens are compatible with services built for OIDC compliance, such as Cognito by Amazon Web Services.

Authentication involves:

  1. Registering your app to obtain a client ID and client secret.
  2. Getting a token. This includes specifying scopes, the permissions your app requires.
  3. Sending the token in your API request, to authenticate API requests.

Code samples are available for Go and Node.js.

Warning: Treat your token like a password. For example, never use access tokens in any public URL, and never display tokens on any web page without requiring a click to de-obfuscate.

Validating requests

If you use Twitch authentication for login purposes only, access tokens should be validated on a recurring interval. Periodic validation of previously issued OAuth tokens ensures that users who authorized your application have not decided to disconnect the integration.

You must validate access tokens before making API requests which perform mutations on or access sensitive information of users, if it has been more than one hour since the last validation.

Twitch periodically conducts audits. If we discover an application that is not re-validating access tokens (that is, an application that validates only for login and not thereafter), we will reach out and work with developers to resolve the issue. If the issue is not resolved, we may take punitive action, such as revoking the developer’s API key or throttling the application’s performance.

Validation is important because of how OAuth access tokens work and the end user’s expectation of OAuth session control. For example, users who opt to disconnect your integration from their Twitch accounts can do so from their account settings on Twitch. When a user disconnects from an integration, all OAuth tokens between that user and that integration are invalidated. In this scenario, the expectation is that OAuth tokens are tied to sessions on third-party services; as such, any existing sessions between the disconnected user and those services also should be invalidated.

When validating each of your requests, submit a request to the validation endpoint ( with your OAuth token in the header. If you are authenticated, the response includes the status of your token. A successful response indicates that your access token is valid.

Here is a sample request:

curl -X GET '' \
-H 'Authorization: Bearer <access token goes here>'

And here is a sample response:

  "client_id": "wbmytr93xzw8zbg0p1izqyzzc5mbiz",
  "login": "twitchdev",
  "scopes": [
  "user_id": "141981764",
  "expires_in": 5520838


To make an application that uses the Twitch API, you first need to register your application on the Twitch developer site. When creating this app, enter your redirect URI, which is where your users are redirected after being authorized. You can provide several redirect URIs, for example, if you wish to use the same client for different environments.

Once you create a developer application, you are assigned a client ID. Some authentication flows also require a client secret, which you can generate on the same page as the client ID.

Because your client secret is confidential, we cannot show it to you once you leave the page, so make sure to record it somewhere safe. Also, generating a new client secret immediately invalidates the current one, which might make your API requests fail until your app is updated.

Warning: Client IDs should be unique for each application: do not re-use client IDs across multiple applications. Also, applications should request the appropriate scopes for the intended target APIs. Failure to adhere to these guidelines may result in the suspension of your application’s access to the Twitch API.

Types of tokens

Twitch supports several types of tokens:

Token Type Description
ID tokens (OIDC) A set of claims about the end user, for a given authorization. Using OIDC ID tokens (JWT) enables you to get details about your user (such as email address) for a particular authorization. These details are represented by claims in the ID token’s payload.

Our discovery endpoint is at It can be used with standard OIDC clients like AWS Cognito.
User access tokens Authenticate users and allow your app to make requests on their behalf. If your application uses Twitch for login or makes requests in the context of an authenticated user, you need to generate a user access token.
App access tokens Authenticate your app and allow it to access resources that it owns. Since app access tokens are not associated with a user, they cannot be used with endpoints that require user authentication.

Some Twitch API endpoints require application authentication (not user authentication). If your application uses these endpoints, you need to generate an app access token. App access tokens get client credentials (not user credentials). They enable you to make secure API requests that are not on behalf of a specific user. Client credentials also may be used in place of client ID headers to securely identify your application.

App access tokens expire after about 60 days, so you should check that your app access token is valid by submitting a request to the validation endpoint (see Validating Requests). If your token has expired, generate a new one.

App access tokens are meant only for server-to-server API requests and should never be included in client code.

User access tokens and app access tokens are both bearer tokens. “Bearer” comes from the authorization header; see Sending User Access and App Access Tokens.

Getting tokens

The domain dedicated to Twitch authentication is

Note: URLs have been updated to replace with Code that uses the old kraken domain for Twitch authentication will continue to work until the removal of Twitch API v. 5 functionality. Twitch API v. 5 is currently deprecated.

We support several authentication flows:

Flow Type Description
Implicit code flow Your app does not use a server, such as a client-side JavaScript app or mobile app. This approach does not require a server that must make requests to the API.
Authorization code flow Your application uses a server, can securely store a client secret, and can make server-to-server requests.
Client credentials flow You need an app access token.

The procedure you should use to get tokens depends on the type(s) of tokens you want:

Procedure User Access Token ID Token App Access Token
OIDC Implicit Code Flow  
OAuth Implicit Code Flow    
OIDC Authorization Code Flow  
OAuth Authorization Code Flow    
OAuth Client Credentials Flow    

For security purposes, examples in these sections use a fake access token, 0123456789abcdefghijABCDEFGHIJ.

Sending user access and app access tokens

When an API request requires authentication, send the access token as a header. The header differs, depending on which API you use:

In the Twitch API:
curl -H "Authorization: Bearer <access token>"

In Twitch API v5 (deprecated ):
curl -H "Authorization: OAuth <access token>"

Revoking access tokens

To clean up previously obtained access tokens, use the Twitch OAuth token-revocation endpoint. The implementation follows the OAuth standard.

The following example shows how to revoke a user or app access token:

curl -X POST '' \
-d 'client_id=<client id goes here>&token=<access token goes here>'

Successful requests return 200 OK with no body.

Malformed requests return 400 Bad Request, along with information about how to fix the request. For example, the client_id is missing or invalid, or the token is missing or invalid.

Refreshing access tokens

New OAuth2 access tokens have expirations. Token-expiration periods vary in length, based on how the token was acquired. Tokens return an expires_in field indicating how long the token should last. However, you should build your applications in such a way that they are resilient to token authentication failures. In other words, an application capable of refreshing tokens should not need to know how long a token will live. Rather, it should be prepared to deal with the token becoming invalid at any time.

To allow for applications to remain authenticated for long periods in a world of expiring tokens, we allow for sessions to be refreshed, in accordance with the guidelines in “Refreshing an Access Token” in the OAuth2 RFC. Generally, refresh tokens are used to extend the lifetime of a given authorization.

Note: App access tokens and ID tokens cannot be refreshed.

How to refresh

To refresh a token, you need an access token/refresh token pair coming from a body. For example:

  "access_token": "0123456789abcdefghijABCDEFGHIJ",
  "refresh_token": "eyJfaWQmNzMtNGCJ9%6VFV5LNrZFUj8oU231/3Aj",
  "expires_in": 3600,
  "scope": "channel:read:subscriptions",
  "token_type": "bearer"

You also need the client_id and client_secret used to generate the above access token/refresh token pair

To refresh, use this request:

    &refresh_token=<your refresh token>
    &client_id=<your client ID>
    &client_secret=<your client secret>

There are several required parameters and one optional parameter:

Required Parameters Type Description
client_id string Your client ID.
client_secret string Your client secret.
grant_type string Must be refresh_token.
refresh_token string Refresh token issued to the client.

Your refresh token may contain characters that are not URL safe, so be sure to URL encode the characters of your refresh token before inserting it into the body of the refresh request. Otherwise, you may get an error (“Invalid refresh token”) when you try to refresh.
Optional Parameter Type Description
scope string Space-separated list of scopes. This must be the entire set or any subset of the scopes assigned to the original token grant. It cannot include any scope not originally granted by the resource owner. Default: the entire set of scopes originally granted.



Here is a sample response on success. It contains the new access token, refresh token, and scopes associated with the new grant. Your application should then update its record of the refresh token to be the value provided in this response, as the refresh token may change between requests.

  "access_token": "1ssjqsqfy6badst1ws7m03gras79zfr",
  "refresh_token": "eyJfMzUtNDU0OC04MWYwLTQ5MDY5ODY4NGNlMSJ9%asdfasdf=",
  "scope": [
  "token_type": "bearer"

Here is the body of an unsuccessful response:

  "error": "Bad Request",
  "status": 400,
  "message": "Invalid refresh token"

When a user changes their password or disconnects an app, we delete all tokens for that user. Both refresh and access tokens for that user will return 401 Unauth.

Refresh in response to server rejection for bad authentication

We recommend that you refresh your tokens in response to being rejected by the server for bad authentication. It is good practice to assume that your access token can expire or be revoked at any time, and refreshing reactively ensures that your application is prepared to deal with such situations as gracefully as possible. For this reason, refreshing in response to server rejection is preferable to refreshing proactively, on a fixed schedule.

When you make a request with expired or incorrect authorization credentials, the API returns a 401 Unauthorized status:

DELETE /kraken/users/test_user1/follows/channels/test_channel HTTP/1.1
User-Agent: curl/7.43.0
Accept: application/vnd.twitchtv.v3+json
Authorization: OAuth <access_token>
Client-ID: retgzhvpsxjwun0rvrb1rfwheegu1yw

HTTP/1.1 401 Unauthorized
Accept-Ranges: bytes
Access-Control-Allow-Origin: *
Age: 0
Cache-Control: max-age=0, private, must-revalidate
Content-Type: application/json; charset=utf-8
Date: Wed, 12 Oct 2016 22:25:10 GMT
Server: nginx
Status: 401 Unauthorized
Vary: Accept-Encoding
Via: 1.1 varnish
Content-Length: 89
Connection: keep-alive

    "error": "Unauthorized",
    "message": "Token invalid or missing required scope",
    "status": 401

On seeing a 401 error, an application should try to refresh the session if a refresh token is present. If the refresh fails, the application should re-prompt the end user with another authentication dialog via the standard OAuth 2 flow.

Handling token refreshes in an application

We recommend that you do access-token refreshes synchronously with respect to all consumers of a given access token. That is, do not send multiple, simultaneous refresh requests for the same token. Send one refresh request, then redistribute the new token that is returned from that request to all consumers, as appropriate.

The API limits the number of active access tokens associated with a given refresh token. The limit is 50 token per client/user (that is, a user can only have 50 tokens live at a time per client ID). If multiple threads sharing the same authorization were to simultaneously refresh, some of them might not have working credentials at the end of the refresh. Synchronizing on the refresh operation prevents the application from inadvertently overrunning its limit.


As mentioned above, when you request authorization from users, the URL scope parameter allows you to specify which permissions your app requires. These scopes are tied to the access token you receive on successful authorization. Multiple scopes can be specified when requesting an OAuth or OIDC token. Without specifying scopes, your app can access only basic information about the authenticated user.

Scopes are specified as a space-separated list in the URL scope parameter, when requesting authorization:


Ask only for the permissions you need, as users can view each requested permission when authorizing your app.

No scopes are needed when requesting app access tokens.

Twitch API

The table below is a comprehensive list of the available scopes for the Twitch API. To see a comprehensive list of all Twitch API endpoints, including those that do not require scopes, refer to the Twitch API reference.

Scope Name Type of Access and Associated Endpoints
analytics:read:extensions View analytics data for the Twitch Extensions owned by the authenticated account.

Get Extension Analytics
analytics:read:games View analytics data for the games owned by the authenticated account.

Get Game Analytics
bits:read View Bits information for a channel.

Get Bits Leaderboard
channel:edit:commercial Run commercials on a channel.

Start Commercial
channel:manage:broadcast Manage a channel’s broadcast configuration, including updating channel configuration and managing stream markers and stream tags.

Modify Channel Information
Create Stream Marker
Replace Stream Tags
channel:manage:extensions Manage a channel’s Extension configuration, including activating Extensions.

Get User Active Extensions
Update User Extensions
channel:manage:polls Manage a channel’s polls.

Create Poll
End Poll
channel:manage:predictions Manage of channel’s Channel Points Predictions

Create Channel Points Prediction
End Channel Points Prediction
channel:manage:redemptions Manage Channel Points custom rewards and their redemptions on a channel.

Create Custom Rewards
Delete Custom Reward
Update Custom Reward
Update Redemption Status
channel:manage:schedule Manage a channel’s stream schedule.

Update Channel Stream Schedule
Create Channel Stream Schedule Segment
Update Channel Stream Schedule Segment
Delete Channel Stream Schedule Segment
channel:manage:videos Manage a channel’s videos, including deleting videos.

Delete Videos
channel:read:editors View a list of users with the editor role for a channel.

Get Channel Editors
channel:read:goals View Creator Goals for a channel.

Get Creator Goals
channel:read:hype_train View Hype Train information for a channel.

Get Hype Train Events
channel:read:polls View a channel’s polls.

Get Polls
channel:read:predictions View a channel’s Channel Points Predictions.

Get Channel Points Predictions
channel:read:redemptions View Channel Points custom rewards and their redemptions on a channel.

Get Custom Reward
Get Custom Reward Redemption
channel:read:stream_key View an authorized user’s stream key.

Get Stream Key
channel:read:subscriptions View a list of all subscribers to a channel and check if a user is subscribed to a channel.

Get Broadcaster Subscriptions
clips:edit Manage Clips for a channel.

Create Clip
moderation:read View a channel’s moderation data including Moderators, Bans, Timeouts, and Automod settings.

Check AutoMod Status
Get Banned Events
Get Banned Users
Get Moderators
Get Moderator Events
moderator:manage:banned_users Ban and unban users.

Ban users
Unban user
moderator:read:blocked_terms View a broadcaster’s list of blocked terms.

Get Blocked Terms
moderator:manage:blocked_terms Manage a broadcaster’s list of blocked terms.

Add Blocked Term
Remove Blocked Term
moderator:manage:automod Manage messages held for review by AutoMod in channels where you are a moderator.

Manage Held AutoMod Messages
moderator:read:automod_settings View a broadcaster’s AutoMod settings.

Get AutoMod Settings
moderator:manage:automod_settings Manage a broadcaster’s AutoMod settings.

Update AutoMod Settings
moderator:read:chat_settings View a broadcaster’s chat room settings.

Get Chat Settings
moderator:manage:chat_settings Manage a broadcaster’s chat room settings.

Update Chat Settings
user:edit Manage a user object.

Update User
user:edit:follows Deprecated. Was previously used for “Create User Follows” and “Delete User Follows.” See Deprecation of Create and Delete Follows API Endpoints.
user:manage:blocked_users Manage the block list of a user.

Block User
Unblock User
user:read:blocked_users View the block list of a user.

Get User Block List
user:read:broadcast View a user’s broadcasting configuration, including Extension configurations.

Get Stream Markers
Get User Extensions
Get User Active Extensions
user:read:email View a user’s email address.

Get Users (optional)
user:read:follows View the list of channels a user follows.
Get Followed Streams
user:read:subscriptions View if an authorized user is subscribed to specific channels.

Check User Subscription

Legacy Twitch API v5

With the deprecation of Twitch API v5, the scopes below have been mapped to Twitch API scopes for an easier migration between versions. You can find this mapping and information about equivalent endpoints on the Twitch API Migration Guide.

Scope Name Type of Access
channel_subscriptions Read all subscribers to a channel.
channel_commercial Trigger commercials on a channel.
channel_editor Write channel metadata (game, status, etc).
user_follows_edit Manage a user’s followed channels.
channel_read View a channel’s email address and stream key.
user_read View a user’s information.
user_blocks_read Read a user’s block list.
user_blocks_edit Manage a user’s block list.

Chat and PubSub

Scope Name Type of Access
channel:moderate Perform moderation actions in a channel. The user requesting the scope must be a moderator in the channel.
chat:edit Send live stream chat and rooms messages.
chat:read View live stream chat and rooms messages.
whispers:read View your whisper messages.
whispers:edit Send whisper messages.