{"id":16078446,"url":"https://github.com/romanzipp/laravel-twitch","last_synced_at":"2025-04-12T06:02:59.826Z","repository":{"id":28076318,"uuid":"116135617","full_name":"romanzipp/Laravel-Twitch","owner":"romanzipp","description":"Twitch Helix API PHP Wrapper for Laravel","archived":false,"fork":false,"pushed_at":"2025-03-19T05:45:44.000Z","size":435,"stargazers_count":110,"open_issues_count":2,"forks_count":19,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-29T02:01:10.715Z","etag":null,"topics":["api","hacktoberfest","laravel","oauth","php","php7","showcase","twitch"],"latest_commit_sha":null,"homepage":"https://packagist.org/packages/romanzipp/laravel-twitch","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/romanzipp.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":"romanzipp"}},"created_at":"2018-01-03T12:41:48.000Z","updated_at":"2025-03-19T05:45:36.000Z","dependencies_parsed_at":"2023-12-02T09:27:02.834Z","dependency_job_id":"d72801fa-ba68-4521-a8db-bc6b9536ce6b","html_url":"https://github.com/romanzipp/Laravel-Twitch","commit_stats":{"total_commits":465,"total_committers":19,"mean_commits":"24.473684210526315","dds":"0.17204301075268813","last_synced_commit":"23df5d2402abbd2ed13f9229e970ce22ed4c2620"},"previous_names":[],"tags_count":85,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/romanzipp%2FLaravel-Twitch","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/romanzipp%2FLaravel-Twitch/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/romanzipp%2FLaravel-Twitch/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/romanzipp%2FLaravel-Twitch/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/romanzipp","download_url":"https://codeload.github.com/romanzipp/Laravel-Twitch/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247280190,"owners_count":20912966,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api","hacktoberfest","laravel","oauth","php","php7","showcase","twitch"],"created_at":"2024-10-09T10:12:53.190Z","updated_at":"2025-04-05T03:00:58.312Z","avatar_url":"https://github.com/romanzipp.png","language":"PHP","funding_links":["https://github.com/sponsors/romanzipp"],"categories":[],"sub_categories":[],"readme":"# Laravel Twitch\n\n[![Latest Stable Version](https://img.shields.io/packagist/v/romanzipp/laravel-twitch.svg?style=flat-square)](https://packagist.org/packages/romanzipp/laravel-twitch)\n[![Total Downloads](https://img.shields.io/packagist/dt/romanzipp/laravel-twitch.svg?style=flat-square)](https://packagist.org/packages/romanzipp/laravel-twitch)\n[![License](https://img.shields.io/packagist/l/romanzipp/laravel-twitch.svg?style=flat-square)](https://packagist.org/packages/romanzipp/laravel-twitch)\n[![GitHub Build Status](https://img.shields.io/github/actions/workflow/status/romanzipp/Laravel-Twitch/tests.yml?branch=master\u0026label=tests\u0026style=flat-square)](https://github.com/romanzipp/Laravel-Twitch/actions)\n\nPHP Twitch Helix API Wrapper for Laravel 5+\n\n## ⚠️ Changes on May 01, 2020\n\nSince May 01, 2020, Twitch requires all requests to contain a valid OAuth Access Token.\nThis can be achieved by requesting an OAuth Token using the [Client Credentials Flow](https://dev.twitch.tv/docs/authentication/getting-tokens-oauth#oauth-client-credentials-flow).\n\nIf you don't handle this by yourself, be sure to enable the built-in Access Token generation feature via the `oauth_client_credentials.auto_generate` configuration entry.\n\nYou will need define a valid **Client ID** and **Client Secret** via your config or the available setters! See the [full config](https://github.com/romanzipp/Laravel-Twitch/blob/master/config/twitch-api.php) for more details.\n\n## Table of contents\n\n1. [Installation](#installation)\n2. [Configuration](#configuration)\n3. [Examples](#examples)\n4. [Documentation](#documentation)\n5. [Upgrading](#upgrading)\n6. [Development](#Development)\n\n## Installation\n\n```\ncomposer require romanzipp/laravel-twitch\n```\n\n## Configuration\n\nCopy configuration to project:\n\n```\nphp artisan vendor:publish --provider=\"romanzipp\\Twitch\\Providers\\TwitchServiceProvider\"\n```\n\nAdd environmental variables to your `.env`:\n\n```\nTWITCH_HELIX_KEY=\nTWITCH_HELIX_SECRET=\nTWITCH_HELIX_REDIRECT_URI=http://localhost\n```\n\nIf you want to use the EventSub with the Webhook transport, then you are required to define a secret. This secret is a string between 10 and 100 characters.\n\n```\nTWITCH_HELIX_EVENTSUB_SECRET=\n```\n\n## Examples\n\n### Basic\n\n```php\n$twitch = new romanzipp\\Twitch\\Twitch;\n\n$twitch-\u003esetClientId('abc123');\n\n// Get User by Username\n$result = $twitch-\u003egetUsers(['login' =\u003e 'herrausragend']);\n\n// Check, if the query was successful\nif ( ! $result-\u003esuccess()) {\n    return null;\n}\n\n// Shift result to get single user data\n$user = $result-\u003eshift();\n\nreturn $user-\u003eid;\n```\n\n### Setters\n\n```php\n$twitch = new romanzipp\\Twitch\\Twitch;\n\n$twitch-\u003esetClientId('abc123');\n$twitch-\u003esetClientSecret('abc456');\n$twitch-\u003esetToken('abcdef123456');\n\n$twitch = $twitch-\u003ewithClientId('abc123');\n$twitch = $twitch-\u003ewithClientSecret('abc123');\n$twitch = $twitch-\u003ewithToken('abcdef123456');\n```\n\n### OAuth Tokens\n\n```php\n$twitch = new romanzipp\\Twitch\\Twitch;\n\n$twitch-\u003esetClientId('abc123');\n$twitch-\u003esetToken('abcdef123456');\n\n$result = $twitch-\u003egetUsers(['login' =\u003e 'herrausragend']);\n```\n\n### OAuth Client Credentials Flow\n\nSince May 01, 2020, every request requires an OAuth token which can be issued using the [OAuth Client Credentials Flow](https://dev.twitch.tv/docs/authentication/getting-tokens-oauth/#oauth-client-credentials-flow).\n\n```php\nuse romanzipp\\Twitch\\Enums\\GrantType;\nuse romanzipp\\Twitch\\Twitch;\n\n$twitch = new Twitch;\n\n$twitch-\u003esetClientId('abc123');\n$twitch-\u003esetClientSecret('def123');\n$twitch-\u003esetToken('abcdef123456');\n\n$result = $twitch-\u003egetOAuthToken(null, GrantType::CLIENT_CREDENTIALS, ['user:read']);\n\nif ( ! $result-\u003esuccess()) {\n    return;\n}\n\n$accessToken = $result-\u003edata()-\u003eaccess_token;\n```\n\n### Pagination\n\nThe Twitch API returns a `paginator` field with paginated results like `/streams`, `/follows`or `/games`. To jump between pages, the given cursor must be appended to the following query using the direction attributes `after` or `before`.\n\nIn this example, we will fetch a set of streams and use the provided cursor to switch to the next/previous set of data.\n\n❗️ To prevent infinite loops or errors, use the `Result::hasMoreResults()` method to check if there are more results available.\n\n```php\n$twitch = new romanzipp\\Twitch\\Twitch;\n\n// Page 1\n$firstResult = $twitch-\u003egetStreams(['language' =\u003e 'de']);\n\n// Page 2\n$secondResult = $twitch-\u003egetStreams(['language' =\u003e 'de'], $firstResult-\u003enext());\n\n// Page 1 (again)\n$thirdResult = $twitch-\u003egetStreams(['language' =\u003e 'de'], $secondResult-\u003eback());\n```\n\n### Facade\n\n```php\nuse romanzipp\\Twitch\\Facades\\Twitch;\n\nTwitch::withClientId('abc123')-\u003ewithToken('abcdef123456')-\u003egetUsers();\n```\n\n### Pagination Loop Example\n\nThis example fetches all Twitch Games and stores them into a database.\n\n```php\nuse romanzipp\\Twitch\\Twitch;\n\n$twitch = new Twitch;\n\ndo {\n    $nextCursor = null;\n\n    // If this is not the first iteration, get the page cursor to the next set of results\n    if (isset($result)) {\n        $nextCursor = $result-\u003enext();\n    }\n\n    // Query the API with an optional cursor to the next results page\n    $result = $twitch-\u003egetTopGames(['first' =\u003e 100], $nextCursor);\n\n    foreach ($result-\u003edata() as $item) {\n        // Process the games result data\n    }\n\n    // Continue until there are no results left\n} while ($result-\u003ehasMoreResults());\n```\n\n### Insert user objects\n\nThe new API does not include the user objects in endpoints like followers or bits.\n\n```json\n[\n  {\n    \"from_id\": \"123456\",\n    \"to_id\": \"654321\",\n    \"followed_at\": \"2018-01-01 12:00:00\"\n  }\n]\n```\n\nYou can just call the [insertUsers](https://github.com/romanzipp/Laravel-Twitch/blob/master/src/Result.php#L233) method to insert all user data identified by `from_id` into `from_user`\n\n```php\nuse romanzipp\\Twitch\\Twitch;\n\n$twitch = new Twitch;\n\n$result = $twitch-\u003egetUsersFollows(['to_id' =\u003e 654321]);\n\n$result-\u003einsertUsers($twitch, 'from_id', 'from_user');\n```\n\n**New Result data:**\n\n```json\n[\n  {\n    \"from_id\": \"123456\",\n    \"to_id\": \"654321\",\n    \"followed_at\": \"2018-01-01 12:00:00\",\n    \"from_user\": {\n      \"id\": \"123456\",\n      \"display_name\": \"HerrAusragend\",\n      \"login\": \"herrausragend\"\n    }\n  }\n]\n```\n\n### Defining EventSub Handlers\n\nBy default, the EventSub webhook controller will automatically handle all EventSub notification and revocation calls;\nhowever, if you have additional webhook events you would like to handle, you may do so by extending the EventSub webhook\ncontroller.\n\nTo ensure your application can handle EventSub webhooks, be sure to configure the webhook callback url in the transport\npayload.\n\nYour controller's method names should correspond to Laravel Twitch's controller conventions. Specifically, methods\nshould be prefixed with `handle`, suffixed with `Notification` and the \"camel case\" name of the EventSub Type you wish\nto handle. For example, if you wish to handle the `channel.follow` type, you should add a\n`handleChannelFollowNotification` method to the controller:\n\n```php\n\u003c?php\n\nnamespace App\\Http\\Controllers;\n\nuse romanzipp\\Twitch\\Http\\Controllers\\EventSubController as BaseController;\nuse Symfony\\Component\\HttpFoundation\\Response;\n\nclass EventSubController extends BaseController\n{\n    public function handleChannelFollowNotification(array $payload): Response\n    {\n        return $this-\u003esuccessMethod(); // handle the channel follow notification...\n    }\n\n    protected function handleNotification(array $payload): Response\n    {\n        return $this-\u003esuccessMethod(); // handle all other incoming notifications...\n    }\n\n    protected function handleRevocation(array $payload): Response\n    {\n        return $this-\u003esuccessMethod(); // handle the subscription revocation...\n    }\n}\n```\n\nNext, define a route to your EventSub webhook controller within your application's `routes/api.php` file.\n\n```php\nuse App\\Http\\Controllers\\EventSubController;\n\nRoute::post(\n    'twitch/eventsub/webhook',\n    [EventSubController::class, 'handleWebhook']\n);\n```\n\n### Create EventSub Subscription\n\n\u003e **Important**: When creating a subscription, you must specify a secret for purposes of verification, described above in “Configuration”. This secret is automatically attached to the webhook transport if it is not explicitly defined.\n\n```php\nuse romanzipp\\Twitch\\Enums\\EventSubType;\nuse romanzipp\\Twitch\\Twitch;\n\n$twitch = new Twitch;\n\n\n$twitch-\u003esubscribeEventSub([], [\n    'type' =\u003e EventSubType::STREAM_ONLINE,\n    'version' =\u003e '1',\n    'condition' =\u003e [\n        'broadcaster_user_id' =\u003e '1337',\n    ],\n    'transport' =\u003e [\n        'method' =\u003e 'webhook',\n        'callback' =\u003e 'https://example.com/api/twitch/eventsub/webhook',\n    ]\n]);\n```\n\n### List EventSub Subscription\n\n```php\nuse romanzipp\\Twitch\\Twitch;\n\n$twitch = new Twitch;\n\n$result = $twitch-\u003egetEventSubs(['status' =\u003e 'notification_failures_exceeded']);\n\nforeach ($result-\u003edata() as $item) {\n    // process the subscription\n}\n```\n\n### Delete EventSub Subscription\n\n```php\nuse romanzipp\\Twitch\\Twitch;\n\n$twitch = new Twitch;\n\n$twitch-\u003eunsubscribeEventSub([\n    'id' =\u003e '932b34ad-821a-490f-af43-b327187d0f5c'\n]);\n```\n\n### Twitch Extension Guard\n\n#### 1. Create TwitchUserProvider\n\nCreate `app/Auth/TwitchUserProvider.php`:\n\n```php\nnamespace App\\Auth;\n\nuse App\\User;\nuse romanzipp\\Twitch\\Auth\\TwitchUserProvider;\nuse Illuminate\\Contracts\\Auth\\Authenticatable;\n  \nclass TwitchUserProvider extends TwitchUserProvider  \n{  \n\tpublic function retrieveById($identifier): ?Authenticatable  \n\t{\n\t\t/** @var User $user */  \n\t\t$user = User::query()-\u003ewhereKey($identifier)-\u003efirst();  \n\n\t\treturn $user;  \n\t}  \n\n    // This method is optional, if you don't want automatic user creation on request.\n\tpublic function createFromTwitchToken($decoded): ?Authenticatable  \n\t{\n\t\treturn User::createFromTwitchToken($decoded);  \n\t}  \n}\n```\n\n#### 2. Register TwitchUserProvider \u0026 TwitchExtensionGuard\n\nEdit `app/Providers/AuthServiceProvider.php`:\n\n```php\nuse App\\Auth\\TwitchUserProvider;\nuse romanzipp\\Twitch\\Auth\\TwitchExtensionGuard;\nuse romanzipp\\Twitch\\Auth\\TwitchUserProvider;\n\npublic function boot()  \n{  \n\t...\n\t\n\t$this-\u003eapp-\u003ebind(TwitchUserProvider::class, Auth\\TwitchUserProvider::class);\n\tTwitchExtensionGuard::register(config('twitch-api.ext_secret'));  \n}\n```\n\n#### 3. Make guard available in Laravel\n\nEdit `config/auth.php`:\n\n```php\n\u003c?php\n\nreturn [\n    ...\n    'guards' =\u003e [\n        ...\n        'twitch-extension' =\u003e [\n            'driver' =\u003e 'laravel-twitch',\n            'provider' =\u003e 'laravel-twitch',\n        ],\n    ],\n    ...\n];\n```\n\n## Documentation\n\n**Twitch Helix API Documentation: https://dev.twitch.tv/docs/api/reference**\n\n### Ads\n\n```php\npublic function startCommercial(array $parameters = [])\n```\n\n### Analytics\n\n```php\npublic function getExtensionAnalytics(array $parameters = [])\npublic function getGameAnalytics(array $parameters = [])\n```\n\n### Bits\n\n```php\npublic function getCheermotes(array $parameters = [])\npublic function getBitsLeaderboard(array $parameters = [])\npublic function getExtensionTransactions(array $parameters = [])\n```\n\n### ChannelPoints\n\n```php\npublic function createCustomRewards(array $parameters = [], array $body = [])\npublic function deleteCustomReward(array $parameters = [])\npublic function getCustomReward(array $parameters = [])\npublic function getCustomRewardRedemption(array $parameters = [], ?Paginator $paginator = NULL)\npublic function updateCustomReward(array $parameters = [], array $body = [])\npublic function updateRedemptionStatus(array $parameters = [], array $body = [])\n```\n\n### Channels\n\n```php\npublic function getChannels(array $parameters = [])\npublic function updateChannels(array $parameters = [], array $body = [])\npublic function getChannelEditors(array $parameters = [])\npublic function getChannelFollowers(array $parameters = [], ?Paginator $paginator = NULL)\npublic function getChannelsFollowed(array $parameters = [], ?Paginator $paginator = NULL)\n```\n\n### Charity\n\n```php\npublic function getCharityCampaign(array $parameters = [])\n```\n\n### Chat\n\n```php\npublic function getChannelChatEmotes(array $parameters = [])\npublic function getGlobalChatEmotes()\npublic function getChatEmoteSets(array $parameters = [])\npublic function getChannelChatBadges(array $parameters = [])\npublic function getGlobalChatBadges()\npublic function getChatSettings(array $parameters = [])\npublic function updateChatSettings(array $parameters, array $body = [])\npublic function sendChatAnnouncement(array $parameters = [], array $body = [])\npublic function getUserChatColor(array $parameters = [])\npublic function updateUserChatColor(array $parameters = [])\npublic function getChatters(array $parameters = [], ?Paginator $paginator = NULL)\npublic function sendShoutout(array $parameters = [])\n```\n\n### Clips\n\n```php\npublic function createClip(array $parameters = [])\npublic function getClips(array $parameters = [], ?Paginator $paginator = NULL)\n```\n\n### Entitlements\n\n```php\npublic function createEntitlementUrl(array $parameters = []) // DEPRECATED\npublic function getEntitlementsCodeStatus(array $parameters = [])\npublic function getDropsEntitlements(array $parameters = [])\npublic function redeemEntitlementsCode(array $parameters = [])\npublic function updateDropsEntitlements(array $parameters = [], array $body = [])\n```\n\n### EventSub\n\n```php\npublic function subscribeEventSub(array $parameters = [], array $body = [])\npublic function unsubscribeEventSub(array $parameters = [])\npublic function getEventSubs(array $parameters = [], ?Paginator $paginator = NULL)\n```\n\n### Extensions\n\n```php\npublic function getAuthedUserExtensions()\npublic function getAuthedUserActiveExtensions()\npublic function disableAllExtensions()\npublic function disableUserExtensionById(?string $parameter = NULL)\npublic function disableUserExtensionByName(?string $parameter = NULL)\npublic function updateUserExtensions(?string $method = NULL, ?string $parameter = NULL, bool $disabled = false)\npublic function getExtensionConfigurationSegment(array $parameters = [])\npublic function setExtensionConfigurationSegment(array $body = [])\npublic function setExtensionRequiredConfiguration(array $parameters = [], array $body = [])\npublic function sendExtensionPubSubMessage(array $body = [])\npublic function getExtensionLiveChannels(array $parameters = [], ?Paginator $paginator = NULL)\npublic function getExtensionSecrets(array $parameters = [])\npublic function createExtensionSecret(array $parameters = [])\npublic function sendExtensionChatMessage(array $parameters = [], array $body = [])\npublic function getExtensions(array $parameters = [])\npublic function getReleasedExtensions(array $parameters = [])\npublic function getExtensionBitsProducts(array $parameters = [])\npublic function updateExtensionBitsProduct(array $parameters = [], array $body = [])\n```\n\n### Games\n\n```php\npublic function getTopGames(array $parameters = [], ?Paginator $paginator = NULL)\npublic function getGames(array $parameters = [])\n```\n\n### Goals\n\n```php\npublic function getCreatorGoals(array $parameters = [])\n```\n\n### HypeTrain\n\n```php\npublic function getHypeTrainEvents(array $parameters = [])\n```\n\n### Moderation\n\n```php\npublic function checkAutoModStatus(array $parameters = [], array $body = [])\npublic function getBannedUsers(array $parameters = [], ?Paginator $paginator = NULL)\npublic function getBannedEvents(array $parameters = [], ?Paginator $paginator = NULL) // DEPRECATED\npublic function getModerators(array $parameters = [], ?Paginator $paginator = NULL)\npublic function getModeratorEvents(array $parameters = [], ?Paginator $paginator = NULL) // DEPRECATED\npublic function manageHeldAutoModMessages(array $parameters = [], array $body = [])\npublic function getAutoModSettings(array $parameters = [])\npublic function updateAutoModSettings(array $parameters = [], array $body = [])\npublic function banUser(array $parameters = [], array $body = [])\npublic function unbanUser(array $parameters = [])\npublic function getBlockedTerms(array $parameters = [], ?Paginator $paginator = NULL)\npublic function addBlockedTerm(array $parameters = [], array $body = [])\npublic function removeBlockedTerm(array $parameters = [])\npublic function deleteChatMessages(array $parameters = [])\npublic function addChannelModerator(array $parameters = [])\npublic function removeChannelModerator(array $parameters = [])\npublic function getVIPs(array $parameters = [], ?Paginator $paginator = NULL)\npublic function addChannelVIP(array $parameters = [])\npublic function removeChannelVIP(array $parameters = [])\npublic function getShieldModeStatus(array $parameters = [])\npublic function updateShieldModeStatus(array $parameters = [], array $body = [])\n```\n\n### Music\n\n```php\npublic function getSoundtrackCurrentTrack(array $parameters = [])\npublic function getSoundtrackPlaylist(array $parameters = [], ?Paginator $paginator = NULL)\npublic function getSoundtrackPlaylists(array $parameters = [])\n```\n\n### OAuth\n\n```php\npublic function getOAuthAuthorizeUrl(string $responseType = 'code', array $scopes = [], ?string $state = NULL, bool $forceVerify = false)\npublic function getOAuthToken(?string $code = NULL, string $grantType = 'authorization_code', array $scopes = [])\npublic function validateOAuthToken()\n```\n\n### Polls\n\n```php\npublic function getPolls(array $parameters = [], ?Paginator $paginator = NULL)\npublic function createPoll(array $parameters = [], array $body = [])\npublic function endPoll(array $parameters = [], array $body = [])\n```\n\n### Predictions\n\n```php\npublic function getPredictions(array $parameters = [], ?Paginator $paginator = NULL)\npublic function createPrediction(array $parameters = [], array $body = [])\npublic function endPrediction(array $parameters = [], array $body = [])\n```\n\n### Raids\n\n```php\npublic function startRaid(array $parameters = [])\npublic function cancelRaid(array $parameters = [])\n```\n\n### Schedule\n\n```php\npublic function getChannelStreamSchedule(array $parameters = [], ?Paginator $paginator = NULL)\npublic function getChanneliCalendar(array $parameters = [])\npublic function updateChannelStreamSchedule(array $parameters = [])\npublic function createChannelStreamScheduleSegment(array $parameters = [], array $body = [])\npublic function updateChannelStreamScheduleSegment(array $parameters = [], array $body = [])\npublic function deleteChannelStreamScheduleSegment(array $parameters = [], array $body = [])\n```\n\n### Search\n\n```php\npublic function searchCategories(array $parameters = [])\npublic function searchChannels(array $parameters = [])\n```\n\n### Streams\n\n```php\npublic function getStreamKey(array $parameters = [])\npublic function getStreams(array $parameters = [], ?Paginator $paginator = NULL)\npublic function getFollowedStreams(array $parameters = [], ?Paginator $paginator = NULL)\npublic function createStreamMarker(array $parameters = [], array $body = [])\npublic function getStreamMarkers(array $parameters = [], ?Paginator $paginator = NULL)\n```\n\n### Subscriptions\n\n```php\npublic function getSubscriptions(array $parameters = [], ?Paginator $paginator = NULL)\npublic function getUserSubscription(array $parameters = [])\n```\n\n### Tags\n\n```php\npublic function getStreamTags(array $parameters = [])\npublic function getAllStreamTags(array $parameters = [], ?Paginator $paginator = NULL)\npublic function replaceStreamTags(array $parameters = [], array $body = [])\n```\n\n### Teams\n\n```php\npublic function getChannelTeams(array $parameters = [])\npublic function getTeams(array $parameters = [])\n```\n\n### Users\n\n```php\npublic function createUserFollows(array $parameters = [], array $body = [])\npublic function deleteUserFollows(array $parameters = [])\npublic function getUsers(array $parameters = [])\npublic function getUsersFollows(array $parameters = [], ?Paginator $paginator = NULL) // DEPRECATED\npublic function updateUser(array $parameters = [])\npublic function getUserExtensions(array $parameters = [])\npublic function getUserActiveExtensions(array $parameters = [])\npublic function updateUserExtension(array $parameters = [], array $body = [])\npublic function getUserBlockList(array $parameters = [], ?Paginator $paginator = NULL)\npublic function blockUser(array $parameters = [])\npublic function unblockUser(array $parameters = [])\n```\n\n### Videos\n\n```php\npublic function getVideos(array $parameters = [], ?Paginator $paginator = NULL)\npublic function deleteVideos(array $parameters = [])\n```\n\n### Webhooks\n\n```php\npublic function getWebhookSubscriptions(array $parameters = []) // DEPRECATED\npublic function subscribeWebhook(array $parameters = [], array $body = []) // DEPRECATED\npublic function unsubscribeWebhook(array $parameters = [], array $body = []) // DEPRECATED\npublic function buildWebhookTopic(string $path, array $parameters = []) // DEPRECATED\n```\n\n### Whispers\n\n```php\npublic function sendWhisper(array $parameters = [], array $body = [])\n```\n\n[**OAuth Scopes Enums**](https://github.com/romanzipp/Laravel-Twitch/blob/master/src/Enums/Scope.php)\n\n## Upgrading\n\n- [**Upgrade from 2.0 to 3.0**](https://github.com/romanzipp/Laravel-Twitch/releases/tag/3.0.0)\n- [Upgrade from 1.0 to 2.0](https://github.com/romanzipp/Laravel-Twitch/releases/tag/2.0.0)\n\n## Development\n\n#### Run Tests\n\n```shell\ncomposer test\n```\n\n```shell\nCLIENT_ID=xxxx composer test\n```\n\n```shell\nCLIENT_ID=xxxx CLIENT_SECRET=xxxx composer test\n```\n\n#### Generate Documentation\n\n```shell\ncomposer docs\n```\n\n---\n\nJoin the Twitch Dev Discord!\n\n[![Discord](https://discordapp.com/api/guilds/504015559252377601/embed.png?style=banner2)](https://discord.gg/YAMGgZT)\n\n[![Discord](https://discordapp.com/api/guilds/325552783787032576/embed.png?style=banner2)](https://discord.gg/8NXaEyV)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fromanzipp%2Flaravel-twitch","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fromanzipp%2Flaravel-twitch","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fromanzipp%2Flaravel-twitch/lists"}