declare namespace Mastodon { type Account = { // Base id: string username: string acct: string url: string // Attributes display_name: string note?: string avatar: string avatar_static: string header: string header_static: string locked: boolean emojis?: Emoji[] discoverable: boolean // Statistics created_at: string last_status_at: string statuses_count: number followers_count: number following_count: number // Others moved?: Account fields: Field[] bot: boolean source?: Source suspended?: boolean } type Announcement = { // Base id: string content: string all_day: boolean published_at: string updated_at: string read: boolean // Others scheduled_at?: string starts_at?: string ends_at?: string reactions?: AnnouncementReaction[] mentions?: Mention[] statuses?: Status[] tags?: Tag[] emojis?: Emoji[] } type AnnouncementReaction = { // Base name: string count: number me: boolean url: string static_url: string } type Application = { // Base name: string website?: string vapid_key?: string } type Apps = { id: string name: string website?: string redirect_uri: string client_id: string client_secret: string vapid_key: string } type Attachment = | AttachmentImage | AttachmentVideo | AttachmentGifv | AttachmentAudio | AttachmentUnknown type AttachmentImage = { // Base id: string type: 'image' url: string preview_url: string // Others remote_url?: string text_url?: string meta?: { original?: { width: number; height: number; size: string; aspect: number } small?: { width: number; height: number; size: string; aspect: number } focus?: { x: number; y: number } } description?: string blurhash?: string } type AttachmentVideo = { // Base id: string type: 'video' url: string preview_url: string // Others remote_url?: string text_url?: string meta?: { length: string duration: number fps: number size: string width: number height: number aspect: number audio_encode: string audio_bitrate: string audio_channels: string original: { width: number height: number frame_rate: string duration: number bitrate: number } small: { width: number height: number size: string aspect: number } } description?: string blurhash?: string } type AttachmentGifv = { // Base id: string type: 'gifv' url: string preview_url: string // Others remote_url?: string text_url?: string meta?: { length: string duration: number fps: number size: string width: number height: number aspect: number original: { width: number height: number frame_rate: string duration: number bitrate: number } small: { width: number height: number size: string aspect: number } } description?: string blurhash?: string } type AttachmentAudio = { // Base id: string type: 'audio' url: string preview_url: string // Others remote_url?: string preview_remote_url?: string // undocumented text_url?: string meta: { length: string duration: number audio_encode: string audio_bitrate: string audio_channels: string original: { duration: number bitrate: number } } description?: string blurhash?: string } type AttachmentUnknown = { // Base id: string type: 'unknown' url: string preview_url: string // Others remote_url?: string text_url?: string meta?: any description?: string blurhash?: string } type Card = { // Base url: string title: string description: string type: 'link' | 'photo' | 'video' | 'rich' // Attributes author_name: string author_url: string provider_name: string provider_url: string html: string width: number height: number image: string embed_url: string blurhash: string } type Conversation = { id: string accounts: Account[] unread: boolean last_status?: Status } type Emoji = { // Base shortcode: string url: string static_url: string visible_in_picker: boolean category?: string } type Field = { name: string value: string verified_at: string | null } type Filter = { id: string phrase: string context: ('home' | 'notifications' | 'public' | 'thread' | 'account')[] expires_at?: string irreversible: boolean whole_word: boolean } type List = { id: string title: string replies_policy: 'none' | 'list' | 'followed' } type Instance = { // Base uri: string title: string description: string short_description: string email: string version: string languages: string[] registrations: boolean approval_required: boolean invites_enabled: boolean urls: { streaming_api: string } stats: { user_count: number status_count: number domain_count: number } // Others thumbnail?: string contact_account?: Account configuration?: { statuses: { max_characters: number max_media_attachments: number characters_reserved_per_url: number } media_attachments: { supported_mime_types: string[] image_size_limit: number image_matrix_limit: number video_size_limit: number video_frame_rate_limit: number video_matrix_limit: number } polls: { max_options: number max_characters_per_option: number min_expiration: number max_expiration: number } } } type Mention = { // Base id: string username: string acct: string url: string } type Notification = { // Base id: string type: | 'follow' | 'follow_request' | 'mention' | 'reblog' | 'favourite' | 'poll' | 'status' | 'update' created_at: string account: Account // Others status?: Status } type Poll = { // Base id: string expires_at: string expired: boolean multiple: bool votes_count: number voters_count: number voted?: boolean own_votes?: number[] options: { title: string; votes_count: number }[] emojis: Emoji[] } type Preferences = { 'posting:default:visibility'?: 'public' | 'unlisted' | 'private' | 'direct' 'posting:default:sensitive'?: boolean 'posting:default:language'?: string 'reading:expand:media'?: 'default' | 'show_all' | 'hide_all' 'reading:expand:spoilers'?: boolean } type PushSubscription = { id: string endpoint: string alerts: { follow: boolean follow_request: boolean favourite: boolean reblog: boolean mention: boolean poll: boolean status: boolean } server_key: string } type Relationship = { id: string following: boolean showing_reblogs: boolean followed_by: boolean blocking: boolean blocked_by: boolean muting: boolean muting_notifications: boolean requested: boolean domain_blocking: boolean endorsed: boolean note: string } type Results = { accounts?: Account[] statuses?: Status[] hashtags?: Tag[] } type Status = { // Base id: string uri: string created_at: string account: Account content: string visibility: 'public' | 'unlisted' | 'private' | 'direct' sensitive: boolean spoiler_text?: string media_attachments: Attachment[] application: Application // Attributes mentions: Mention[] tags: Tag[] emojis: Emoji[] // Interaction reblogs_count: number favourites_count: number replies_count: number edited_at?: string // FEATURE edit_post favourited: boolean reblogged: boolean muted: boolean bookmarked: boolean pinned: boolean // Others url?: string in_reply_to_id?: string in_reply_to_account_id?: string reblog?: Status poll?: Poll card?: Card language?: string text?: string } type StatusHistory = { content: Status['content'] spoiler_text: Status['spoiler_text'] sensitive: Status['sensitive'] created_at: Status['created_at'] poll: Status['poll'] account: Status['account'] media_attachments: Status['media_attachments'] emojis: Status['emojis'] } type Source = { // Base note: string fields: Field[] // Others privacy?: 'public' | 'unlisted' | 'private' | 'direct' sensitive?: boolean language?: string follow_requests_count?: number } type Tag = { // Base name: string url: string history: { day: string; accounts: string; uses: string }[] following: boolean // Since v4.0 } type WebSocketStream = | 'user' | 'public' | 'public:local' | 'hashtag' | 'hashtag:local' | 'list' | 'direct' type WebSocket = | { stream: WebSocketStream[] event: 'update' payload: string // Status } | { stream: WebSocketStream[]; event: 'delete'; payload: Status['id'] } | { stream: WebSocketStream[] event: 'notification' payload: string // Notification } }