middleware(['localization'])->group(function () { Route::prefix('api')->group(function () { Route::get('search', [SearchController::class, 'searchAPI']); Route::post('status/view', [StatusController::class, 'storeView']); Route::get('v1/polls/{id}', [PollController::class, 'getPoll']); Route::post('v1/polls/{id}/votes', [PollController::class, 'vote']); Route::prefix('web-admin')->group(function () { Route::get('software-update/check', [SoftwareUpdateController::class, 'getSoftwareUpdateCheck']); }); Route::prefix('compose')->group(function () { Route::prefix('v0')->group(function () { Route::post('/media/upload', [ComposeController::class, 'mediaUpload']); Route::post('/media/update', [ComposeController::class, 'mediaUpdate']); Route::delete('/media/delete', [ComposeController::class, 'mediaDelete']); Route::get('/search/tag', [ComposeController::class, 'searchTag']); Route::get('/search/location', [ComposeController::class, 'searchLocation']); Route::get('/search/mention', [ComposeController::class, 'searchMentionAutocomplete']); Route::get('/search/hashtag', [ComposeController::class, 'searchHashtagAutocomplete']); Route::post('/publish', [ComposeController::class, 'store']); Route::post('/publish/text', [ComposeController::class, 'storeText']); Route::get('/media/processing', [ComposeController::class, 'mediaProcessingCheck']); Route::get('/settings', [ComposeController::class, 'composeSettings']); Route::post('/poll', [ComposeController::class, 'createPoll']); }); }); Route::prefix('direct')->group(function () { Route::get('browse', [DirectMessageController::class, 'browse']); Route::post('create', [DirectMessageController::class, 'create']); Route::get('thread', [DirectMessageController::class, 'thread']); Route::post('mute', [DirectMessageController::class, 'mute']); Route::post('unmute', [DirectMessageController::class, 'unmute']); Route::delete('message', [DirectMessageController::class, 'delete']); Route::post('media', [DirectMessageController::class, 'mediaUpload']); Route::post('lookup', [DirectMessageController::class, 'composeLookup']); Route::post('read', [DirectMessageController::class, 'read']); }); Route::prefix('v2')->group(function () { Route::get('config', [ApiController::class, 'siteConfiguration']); Route::get('discover', [InternalApiController::class, 'discover']); Route::get('discover/posts', [InternalApiController::class, 'discoverPosts'])->middleware('auth:api'); Route::get('profile/{username}/status/{postid}', [PublicApiController::class, 'status']); Route::get('profile/{username}/status/{postid}/state', [PublicApiController::class, 'statusState']); Route::get('comments/{username}/status/{postId}', [PublicApiController::class, 'statusComments']); Route::get('status/{id}/replies', [InternalApiController::class, 'statusReplies']); Route::post('moderator/action', [InternalApiController::class, 'modAction']); Route::get('discover/categories', [InternalApiController::class, 'discoverCategories']); Route::get('discover/tag', [DiscoverController::class, 'getHashtags']); Route::get('statuses/{id}/replies', [ApiV1Controller::class, 'statusReplies']); Route::get('statuses/{id}/state', [ApiV1Controller::class, 'statusState']); }); Route::prefix('pixelfed')->group(function () { Route::prefix('v1')->group(function () { Route::get('accounts/verify_credentials', [ApiController::class, 'verifyCredentials']); Route::get('accounts/relationships', [ApiV1Controller::class, 'accountRelationshipsById']); Route::get('accounts/search', [ApiV1Controller::class, 'accountSearch']); Route::get('accounts/{id}/statuses', [PublicApiController::class, 'accountStatuses']); Route::post('accounts/{id}/block', [ApiV1Controller::class, 'accountBlockById']); Route::post('accounts/{id}/unblock', [ApiV1Controller::class, 'accountUnblockById']); Route::post('accounts/{id}/remove_from_followers', [ApiV1Controller::class, 'accountRemoveFollowById']); Route::get('statuses/{id}', [PublicApiController::class, 'getStatus']); Route::post('statuses/{id}/pin', [PublicApiController::class, 'statusPin']); Route::post('statuses/{id}/unpin', [PublicApiController::class, 'statusUnpin']); Route::get('accounts/{id}', [PublicApiController::class, 'account']); Route::post('avatar/update', [ApiController::class, 'avatarUpdate']); Route::get('custom_emojis', [ApiV1Controller::class, 'customEmojis']); Route::get('notifications', [ApiController::class, 'notifications']); Route::get('timelines/public', [PublicApiController::class, 'publicTimelineApi']); Route::get('timelines/home', [PublicApiController::class, 'homeTimelineApi']); Route::get('timelines/network', [PublicApiController::class, 'networkTimelineApi']); Route::get('newsroom/timeline', [NewsroomController::class, 'timelineApi']); Route::post('newsroom/markasread', [NewsroomController::class, 'markAsRead']); Route::get('favourites', [BaseApiController::class, 'accountLikes']); Route::get('mutes', [AccountController::class, 'accountMutes']); Route::get('blocks', [AccountController::class, 'accountBlocks']); }); Route::prefix('v2')->group(function () { Route::get('config', [ApiController::class, 'siteConfiguration']); Route::get('discover', [InternalApiController::class, 'discover']); Route::get('discover/posts', [InternalApiController::class, 'discoverPosts']); Route::get('discover/profiles', [DiscoverController::class, 'profilesDirectoryApi']); Route::get('profile/{username}/status/{postid}', [PublicApiController::class, 'status']); Route::get('comments/{username}/status/{postId}', [PublicApiController::class, 'statusComments']); Route::post('moderator/action', [InternalApiController::class, 'modAction']); Route::get('discover/categories', [InternalApiController::class, 'discoverCategories']); Route::get('discover/tag', [DiscoverController::class, 'getHashtags']); Route::get('discover/posts/trending', [DiscoverController::class, 'trendingApi']); Route::get('discover/posts/hashtags', [DiscoverController::class, 'trendingHashtags']); Route::get('discover/posts/places', [DiscoverController::class, 'trendingPlaces']); Route::get('seasonal/yir', [SeasonalController::class, 'getData']); Route::post('seasonal/yir', [SeasonalController::class, 'store']); Route::get('mutes', [AccountController::class, 'accountMutesV2']); Route::get('blocks', [AccountController::class, 'accountBlocksV2']); Route::get('filters', [AccountController::class, 'accountFiltersV2']); Route::post('status/compose', [InternalApiController::class, 'composePost']); Route::get('status/{id}/replies', [InternalApiController::class, 'statusReplies']); Route::post('status/{id}/archive', [ApiController::class, 'archive']); Route::post('status/{id}/unarchive', [ApiController::class, 'unarchive']); Route::get('statuses/archives', [ApiController::class, 'archivedPosts']); Route::get('discover/memories', [DiscoverController::class, 'myMemories']); Route::get('discover/account-insights', [DiscoverController::class, 'accountInsightsPopularPosts']); Route::get('discover/server-timeline', [DiscoverController::class, 'serverTimeline']); Route::get('discover/meta', [DiscoverController::class, 'enabledFeatures']); Route::post('discover/admin/features', [DiscoverController::class, 'updateFeatures']); }); Route::get('discover/accounts/popular', [DiscoverController::class, 'discoverAccountsPopular']); Route::post('web/change-language.json', [SpaController::class, 'updateLanguage']); }); Route::prefix('local')->group(function () { // Route::post('status/compose', [InternalApiController::class, 'composePost'])->middleware('throttle:maxPostsPerHour,60')->middleware('throttle:maxPostsPerDay,1440'); Route::post('discover/tag/subscribe', [HashtagFollowController::class, 'store']); Route::get('discover/tag/list', [HashtagFollowController::class, 'getTags']); // Route::get('profile/sponsor/{id}', [ProfileSponsorController::class, 'get']); Route::get('bookmarks', [InternalApiController::class, 'bookmarks']); Route::get('collection/items/{id}', [CollectionController::class, 'getItems']); Route::post('collection/item', [CollectionController::class, 'storeId']); Route::delete('collection/item', [CollectionController::class, 'deleteId']); Route::get('collection/{id}', [CollectionController::class, 'getCollection']); Route::post('collection/{id}', [CollectionController::class, 'store']); Route::delete('collection/{id}', [CollectionController::class, 'delete']); Route::post('collection/{id}/publish', [CollectionController::class, 'publish']); Route::get('profile/collections/{id}', [CollectionController::class, 'getUserCollections']); Route::post('compose/tag/untagme', [MediaTagController::class, 'untagProfile']); Route::post('import/ig', [ImportPostController::class, 'store']); Route::get('import/ig/config', [ImportPostController::class, 'getConfig']); Route::post('import/ig/media', [ImportPostController::class, 'storeMedia']); Route::post('import/ig/existing', [ImportPostController::class, 'getImportedFiles']); Route::post('import/ig/posts', [ImportPostController::class, 'getImportedPosts']); Route::post('import/ig/processing', [ImportPostController::class, 'getProcessingCount']); }); Route::prefix('web/stories')->group(function () { Route::get('v1/recent', [StoryController::class, 'recent']); Route::get('v1/viewers', [StoryController::class, 'viewers']); Route::get('v1/profile/{id}', [StoryController::class, 'profile']); Route::get('v1/exists/{id}', [StoryController::class, 'exists']); Route::get('v1/poll/results', [StoryController::class, 'pollResults']); Route::post('v1/viewed', [StoryController::class, 'viewed']); Route::post('v1/react', [StoryController::class, 'react']); Route::post('v1/comment', [StoryController::class, 'comment']); Route::post('v1/publish/poll', [StoryController::class, 'publishStoryPoll']); Route::post('v1/poll/vote', [StoryController::class, 'storyPollVote']); Route::post('v1/report', [StoryController::class, 'storeReport']); Route::post('v1/add', [StoryController::class, 'apiV1Add']); Route::post('v1/crop', [StoryController::class, 'cropPhoto']); Route::post('v1/publish', [StoryController::class, 'publishStory']); Route::delete('v1/delete/{id}', [StoryController::class, 'apiV1Delete']); }); Route::prefix('portfolio')->group(function () { Route::post('self/curated.json', [PortfolioController::class, 'storeCurated']); Route::post('self/settings.json', [PortfolioController::class, 'getSettings']); Route::get('account/settings.json', [PortfolioController::class, 'getAccountSettings']); Route::post('self/update-settings.json', [PortfolioController::class, 'storeSettings']); Route::get('{username}/feed', [PortfolioController::class, 'getFeed']); }); }); });