Mastodon
  • What is Mastodon?
  • Using Mastodon
    • Signing up for an account
    • Setting up your profile
    • Posting toots
    • Using the network features
    • Dealing with unwanted content
    • Promoting yourself and others
    • Set your preferences
    • More settings
    • Using Mastodon externally
    • Moving or leaving accounts
    • Running your own server
  • Running Mastodon
    • Preparing your machine
    • Installing from source
    • Configuring your environment
    • Installing optional features
      • Full-text search
      • Hidden services
      • Single Sign On
    • Setting up your new instance
    • Using the admin CLI
    • Upgrading to a new release
    • Backing up your server
    • Migrating to a new machine
    • Scaling up your server
    • Moderation actions
    • Troubleshooting errors
      • Database index corruption
  • Developing Mastodon apps
    • Getting started with the API
    • Playing with public data
    • Obtaining client app access
    • Logging in with an account
    • Guidelines and best practices
    • Libraries and implementations
  • Contributing to Mastodon
    • Technical overview
    • Setting up a dev environment
    • Code structure
    • Routes
    • Bug bounties and responsible disclosure
  • Spec compliance
    • ActivityPub
    • WebFinger
    • Security
    • Microformats
    • OAuth
    • Bearcaps
  • REST API
    • OAuth Scopes
    • Rate limits
  • API Methods
    • apps
      • oauth
    • accounts
      • bookmarks
      • favourites
      • mutes
      • blocks
      • domain_blocks
      • filters
      • reports
      • follow_requests
      • endorsements
      • featured_tags
      • preferences
      • suggestions
    • statuses
      • media
      • polls
      • scheduled_statuses
    • timelines
      • conversations
      • lists
      • markers
      • streaming
    • notifications
      • push
    • search
    • instance
      • trends
      • directory
      • custom_emojis
    • admin
    • announcements
    • proofs
    • oembed
  • API Entities
    • Account
    • Activity
    • Admin::Account
    • Admin::Report
    • Announcement
    • AnnouncementReaction
    • Application
    • Attachment
    • Card
    • Context
    • Conversation
    • Emoji
    • Error
    • FeaturedTag
    • Field
    • Filter
    • History
    • IdentityProof
    • Instance
    • List
    • Marker
    • Mention
    • Notification
    • Poll
    • Preferences
    • PushSubscription
    • Relationship
    • Report
    • Results
    • ScheduledStatus
    • Source
    • Status
    • Tag
    • Token

Routes

How HTTP methods map to controllers and actions.

    • Explanation of routes
    • .well-known
    • Public URIs
    • API
config/routes.rb

Explanation of routes

Mastodon uses Ruby on Rails, which defines its router configuration at config/routes.rb. You may view the Ruby on Rails routing guide for more detailed information, but this page will explain the basics of how Mastodon handles routing.

How routes are constructed

namespace is a prefix for routes mapped to a certain controller directory. resources are mapped to controllers within that namespace directory. scope passes to the module’s controller. For example, consider the following abbreviated code:

namespace :api do
    namespace :v1 do
        resources :statuses, only [:create, :show, :destroy] do
            scope module: :statuses do
                resource :favourite, only: :create
                resource :unfavourite, to: 'favourites#destroy'
                member do
                    get :context
                end
            end
        end
    end
end

config/routes.rb excerpt

The first available resource is :statuses, which is nested under the :api and :v1 namespaces. Thus, the resulting HTTP route will be /api/v1/statuses. The only defines certain allowed methods, which are to be defined in the controller at app/controllers/api/v1/statuses_controller.rb.

Within /api/v1/statuses, there is a scope for a module :statuses, where additional resources are defined. The controllers for these resources live in app/controllers/api/v1/statuses/. For example, :favourite will be handled by the #create action within app/controllers/api/v1/statuses/favourites_controller.rb and :unfavourite will be handled within the same controller, but by the #destroy action.

There is also a custom method defined for any member within this scope, or in other words, for any status to be controlled by app/controllers/api/v1/statuses_controller.rb, which is mapped to GET /api/v1/statuses/:id/context and handled by the :context action defined within that controller.

Available methods

:index

Maps to HTTP GET, for a list. Handled by the #index action in a controller.

:show

Maps to HTTP GET, for a single view. Handled by the #show action in a controller.

:create

Maps to HTTP POST. Handled by the #create action in a controller.

:update

Maps to HTTP PUT. Handled by the #update action in a controller.

:destroy

Maps to HTTP DELETE. Handled by the #destroy action in a controller.

.well-known

/.well-known/host-meta

Extensible Resource Descriptor (XRD). Advertises existence of Webfinger.

/.well-known/nodeinfo

Maps to NodeInfo 2.0 endpoint at /nodeinfo/2.0, used for advertising software name and version, protocols, usage statistics, and whether registrations are open.

/.well-know/webfinger

Used for discovering ActivityPub actor id. See Spec compliance > WebFinger for more information.

/.well-known/change-password

Maps to account settings page.

/.well-known/keybase-proof-config

Used for integration with Keybase, defining which usernames are acceptable and where proofs may be checked.

The sections below this point are under construction.

Public URIs

  • /users/username = user URI
  • /users/username/remote_follow = remote follow dialog
  • /users/username/statuses/id = status URI
  • /@username = “toots” tab
  • /@username/with_replies = “toots and replies” tab
  • /@username/media = “media” tab
  • /@username/tagged/:hashtag = tagged statuses by user
  • /@username/:status_id = status permalink
  • /@username/:status_id/embed = embeddable version
  • /interact/:status_id = remote interaction dialog
  • /explore = profile directory
  • /explore/:hashtag = profiles with this hashtag in bio
  • /public = public timeline preview
  • /about = landing page
  • /about/more = extended description
  • /terms = terms of service

API

  • /api/oembed
  • /api/proofs
  • /api/v1
    • statuses [create, show, destroy]
      • reblogged_by [index]
      • favourited_by [index]
      • reblog [create]
      • unreblog [POST reblog#destroy]
      • favourite [create]
      • unfavourite [POST favourites#destroy]
      • bookmark [create]
      • unbookmark [POST bookmarks#destroy]
      • mute [create]
      • unmute [POST mutes#destroy]
      • pin [create]
      • unpin [POST pins#destroy]
      • context [GET]
    • timelines
      • home [show]
      • public [show]
      • tag [show]
      • list [show]
    • streaming [index]
    • custom_emojis [index]
    • suggestions [index, destroy]
    • scheduled_statuses [index, show, update, destroy]
    • preferences [index]
    • conversations [index, destroy]
      • read [POST]
    • media [create, update]
    • blocks [index]
    • mutes [index]
    • favourites [index]
    • bookmarks [index]
    • reports [create]
    • trends [index]
    • filters [index, create, show, update, destroy]
    • endorsements [index]
    • markers [index, create]
    • apps [create]
      • verify_credentials [credentials#show]
    • instance [show]
      • peers [index]
      • activity [show]
    • domain_blocks [show, create, destroy]
    • directory [show]
    • follow_requests [index]
      • authorize [POST]
      • reject [POST]
    • notifications [index, show]
      • clear [POST]
      • dismiss [POST]
    • accounts
      • verify_credentials [GET credentials#show]
      • update_credentials [PATCH credentials#update]
      • search [show (search#index)]
      • relationships [index]
    • accounts [create, show]
      • statuses [index accounts/statuses]
      • followers [index accounts/follower_accounts]
      • following [index accounts/following_accounts]
      • lists [index accounts/lists]
      • identity_proofs [index accounts/identity_proofs]
      • follow [POST]
      • unfollow [POST]
      • block [POST]
      • unblock [POST]
      • mute [POST]
      • unmute [POST]
      • pin [POST]
      • unpin [POST]
    • lists [index, create, show, update, destroy]
      • accounts [POST accounts/pins#destroy]
    • featured_tags [index, create, destroy]
      • suggestions [GET suggestions#index]
    • polls [create, show]
      • votes [create polls/votes]
    • push
      • subscription [create, show, update, destroy]
    • admin
      • accounts [index, show]
        • enable [POST]
        • unsilence [POST]
        • unsuspend [POST]
        • approve [POST]
        • reject [POST]
        • action [create account_actions]
      • reports [index, show]
        • assign_to_self [POST]
        • unassign [POST]
        • reopen [POST]
        • resolve [POST]
  • /api/v2
    • search [GET search#index]

Last updated January 12, 2020 · Improve this page

Sponsored by

Dotcom-Monitor LoadView Stephen Tures Swayable

Join Mastodon · Blog · ·

View source · CC BY-SA 4.0 · Imprint