openapi: 3.0.1 info: title: Mitra API description: Mitra API spec version: 1.0.0 paths: /oauth/token: post: summary: Returns an access token, to be used during API calls that are not public. description: EIP-4361 auth doesn't require blockchain integration. requestBody: content: application/json: schema: type: object properties: grant_type: type: string enum: - password - eip4361 example: eip4361 username: description: User name (required if grant type is "password"). type: string message: description: EIP-4361 message (required if grant type is "eip4361"). type: string example: "example.com wants you to sign in with your Ethereum account:" signature: description: EIP-4361 signature (required if grant type is "eip4361"). type: string example: 0x905... password: description: Password (required if grant type is "password"). type: string example: null required: - grant_type responses: 200: description: Successful operation content: application/json: schema: type: object properties: access_token: type: string token_type: type: string example: Bearer scope: type: string example: read write follow created_at: type: integer example: 1639747526 400: description: Invalid token request /oauth/revoke: post: summary: Revoke an access token to make it no longer valid for use. security: - tokenAuth: [] requestBody: content: application/json: schema: type: object properties: token: description: The previously obtained token, to be invalidated. type: string responses: 200: description: Successful operation 403: description: Token doesn't belong to user. /api/v1/accounts: post: summary: Creates a user and profile records. requestBody: content: application/json: schema: type: object properties: username: description: The desired username for the account. type: string password: description: The password to be used for login. Either password or EIP-4361 message must be provided. type: string example: null message: description: EIP-4361 message type: string example: "example.com wants you to sign in with your Ethereum account:" signature: description: EIP-4361 signature (required if message is present) type: string example: 0x905... invite_code: description: Invite code type: string example: 9b288bfa7dc75fff53e98aa4d76e77d5 required: - username responses: 201: description: Successful operation content: application/json: schema: $ref: '#/components/schemas/AccountWithSource' 400: description: Invalid user data /api/v1/accounts/verify_credentials: get: summary: Test to make sure that the user token works. security: - tokenAuth: [] responses: 200: description: Successful operation content: application/json: schema: $ref: '#/components/schemas/AccountWithSource' /api/v1/accounts/update_credentials: patch: summary: Update the user's display and preferences. security: - tokenAuth: [] requestBody: content: application/json: schema: type: object properties: display_name: description: The display name to use for the profile. type: string nullable: true note: description: The account bio (markdown). type: string nullable: true avatar: description: Avatar image encoded as base64. type: string nullable: true avatar_media_type: description: The media type of avatar image. type: string nullable: true header: description: Header image encoded as base64. type: string nullable: true header_media_type: description: The media type of header image. type: string nullable: true fields_attributes: description: The profile fields to be set. type: array nullable: true items: type: object properties: name: description: Name of the field. type: string value: description: Value of the field (markdown). type: string responses: 200: description: Successful operation. content: application/json: schema: $ref: '#/components/schemas/AccountWithSource' 400: description: Invalid user data. /api/v1/accounts/signed_update: get: summary: Build Update(Person) activity for signing (experimental). responses: 200: description: Successful operation content: application/json: schema: type: object properties: params: description: Activity parameters $ref: '#/components/schemas/ActivityParameters' message: description: Canonical representation of activity. type: string example: '{"type":"Update"}' /api/v1/accounts/send_activity: post: summary: Send signed activity (experimental). requestBody: content: application/json: schema: type: object properties: params: description: Activity parameters $ref: '#/components/schemas/ActivityParameters' signer: description: Signer's identifier (DID) type: string example: 'did:pkh:eip155:1:0xb9c5714089478a327f09197987f16f9e5d936e8a' signature: description: Signature value. type: string example: '3312dacd...' responses: 200: description: Successful operation content: application/json: schema: $ref: '#/components/schemas/Account' 400: description: Invalid signature data. /api/v1/accounts/identity_proof: get: summary: Get unsigned data for identity proof. parameters: - name: proof_type in: query description: Type of identity proof. required: true schema: type: string enum: - ethereum - minisign - name: signer in: query description: Information about the signer. required: true schema: type: string example: '0xb9c5714089478a327f09197987f16f9e5d936e8a' responses: 200: description: Successful operation content: application/json: schema: type: object properties: did: description: Signer ID (DID). type: string example: did:pkh:eip155:1:0xb9c5714089478a327f09197987f16f9e5d936e8a claim: description: Identity claim serialized as compact JSON. type: string example: '{"id":"https://example.com/users/1","ownerOf":"did:pkh:eip155:1:0xb9c5714089478a327f09197987f16f9e5d936e8a"}' 400: description: Invalid request parameters post: summary: Submit identity proof. requestBody: content: application/json: schema: type: object properties: did: description: Signer (DID). type: string example: 'did:pkh:eip155:1:0xb9c5714089478a327f09197987f16f9e5d936e8a' signature: description: Signature value. type: string example: '3312dacd...' responses: 200: description: Successful operation content: application/json: schema: $ref: '#/components/schemas/Account' 400: description: Invalid proof data. /api/v1/accounts/relationships: get: summary: Find out whether a given actor is followed, blocked, muted, etc. parameters: - name: 'id[]' in: query description: Actor IDs to check required: true schema: type: string format: uuid responses: 200: description: Successful operation content: application/json: schema: description: Relationship list type: array items: $ref: '#/components/schemas/Relationship' /api/v1/accounts/lookup: get: summary: Lookup webfinger address. parameters: - name: acct in: query description: The username or Webfinger address to lookup. required: true schema: type: string responses: 200: description: Successful operation content: application/json: schema: $ref: '#/components/schemas/Account' 404: description: Profile not found /api/v1/accounts/search: get: summary: Search for matching profiles by username. parameters: - name: q in: query description: What to search for required: true schema: type: string - name: limit in: query description: Maximum number of results. Defaults to 40. required: false schema: type: number responses: 200: description: Successful operation content: application/json: schema: description: Profile list type: array items: $ref: '#/components/schemas/Account' /api/v1/accounts/search_did: get: summary: Search profile by DID parameters: - name: did in: query description: Decentralized identifier (DID) required: true schema: type: string responses: 200: description: Successful operation content: application/json: schema: description: Profile list type: array items: $ref: '#/components/schemas/Account' 400: description: Invalid DID /api/v1/accounts/{account_id}: get: summary: View information about a profile. parameters: - $ref: '#/components/parameters/account_id' responses: 200: description: Successful operation content: application/json: schema: $ref: '#/components/schemas/Account' 404: description: Profile not found /api/v1/accounts/{account_id}/statuses: get: summary: Posts created by the given actor. parameters: - $ref: '#/components/parameters/account_id' - name: exclude_replies in: query description: Exclude replies from results. required: false schema: type: boolean default: true - name: max_id in: query description: Return results older than this ID. required: false schema: type: string format: uuid - name: limit in: query description: Maximum number of results to return. required: false schema: type: integer default: 20 responses: 200: description: Successful operation content: application/json: schema: description: Post list type: array items: $ref: '#/components/schemas/Status' 404: description: Profile not found /api/v1/accounts/{account_id}/followers: get: summary: Actors which follow the given actor. parameters: - $ref: '#/components/parameters/account_id' - name: max_id in: query description: Return results with relationship ID older than this value. required: false schema: type: integer - name: limit in: query description: Maximum number of results to return. required: false schema: type: integer default: 40 responses: 200: description: Successful operation content: application/json: schema: description: Profile list type: array items: $ref: '#/components/schemas/Account' headers: Link: description: Link to the next page schema: type: string example: '; rel="next"' 404: description: Profile not found /api/v1/accounts/{account_id}/following: get: summary: Actors which the given actor is following. parameters: - $ref: '#/components/parameters/account_id' - name: max_id in: query description: Return results with relationship ID older than this value. required: false schema: type: integer - name: limit in: query description: Maximum number of results to return. required: false schema: type: integer default: 40 responses: 200: description: Successful operation content: application/json: schema: description: Profile list type: array items: $ref: '#/components/schemas/Account' headers: Link: description: Link to the next page schema: type: string example: '; rel="next"' 404: description: Profile not found /api/v1/accounts/{account_id}/subscribers: get: summary: Subscriptions to the given actor. parameters: - $ref: '#/components/parameters/account_id' - name: max_id in: query description: Return results with subscription ID older than this value. required: false schema: type: integer - name: limit in: query description: Maximum number of results to return. required: false schema: type: integer default: 40 responses: 200: description: Successful operation content: application/json: schema: description: Subscription list type: array items: $ref: '#/components/schemas/Subscription' 404: description: Profile not found /api/v1/accounts/{account_id}/follow: post: summary: Follow the given actor. security: - tokenAuth: [] parameters: - $ref: '#/components/parameters/account_id' requestBody: content: application/json: schema: type: object properties: reblogs: description: Receive this actor's reposts in home timeline? type: boolean default: true replies: description: Receive this actor's replies in home timeline? type: boolean default: true responses: 200: description: Successfully followed, or actor was already followed content: application/json: schema: $ref: '#/components/schemas/Relationship' 404: description: Profile not found /api/v1/accounts/{account_id}/unfollow: post: summary: Unfollow the given actor. security: - tokenAuth: [] parameters: - $ref: '#/components/parameters/account_id' responses: 200: description: Successfully unfollowed, or actor was already not followed content: application/json: schema: $ref: '#/components/schemas/Relationship' 404: description: Profile not found /api/v1/directory: get: summary: List profiles visible in the directory. parameters: - name: offset in: query description: How many profiles to skip before returning results. required: false schema: type: integer default: 0 - name: limit in: query description: How many profiles to load. required: false schema: type: integer default: 40 - name: local in: query description: Only return local profiles. required: false schema: type: boolean default: true responses: 200: description: Successful operation content: application/json: schema: description: Profile list type: array items: $ref: '#/components/schemas/Account' /api/v1/instance: get: summary: Information about the instance. security: [] responses: 200: description: Successful operation content: application/json: schema: $ref: '#/components/schemas/Instance' /api/v1/media: post: summary: Create an attachment to be used with a new post. security: - tokenAuth: [] requestBody: content: application/json: schema: type: object properties: file: description: File encoded as base64. type: string media_type: description: Media type. type: string nullable: true example: image/jpeg responses: 200: description: Successful operation content: application/json: schema: $ref: '#/components/schemas/Attachment' /api/v1/notifications: get: summary: Notifications concerning the user. parameters: - name: max_id in: query description: Return results older than this ID. required: false schema: type: integer - name: limit in: query description: Maximum number of results to return. required: false schema: type: integer default: 20 responses: 200: description: Successful operation content: application/json: schema: description: Notification list type: array items: $ref: '#/components/schemas/Notification' /api/v1/settings/change_password: post: summary: Set or change user's password. security: - tokenAuth: [] requestBody: content: application/json: schema: type: object properties: new_password: description: New password. type: string responses: 200: description: Successful operation. content: application/json: schema: $ref: '#/components/schemas/AccountWithSource' 400: description: Invalid request data. /api/v1/settings/export_followers: get: summary: Export followers to CSV file security: - tokenAuth: [] responses: 200: description: Successful operation content: text/csv: schema: type: string example: | user1@example.org user2@example.org /api/v1/settings/export_follows: get: summary: Export follows to CSV file security: - tokenAuth: [] responses: 200: description: Successful operation content: text/csv: schema: type: string example: | user1@example.org user2@example.org /api/v1/settings/import_follows: post: summary: Import follows from CSV file. security: - tokenAuth: [] requestBody: content: application/json: schema: type: object properties: follows_csv: description: The list of followers in CSV format. type: string responses: 204: description: Successful operation 400: description: Invalid data. /api/v1/settings/move_followers: post: summary: Move followers from remote alias. requestBody: content: application/json: schema: type: object properties: from_actor_id: description: The actor ID to move from. type: string example: 'https://xyz.com/users/test' followers_csv: description: The list of followers in CSV format. type: string example: | user1@example.org user2@test.com responses: 200: description: Successful operation content: application/json: schema: $ref: '#/components/schemas/AccountWithSource' 400: description: Invalid data. /api/v1/statuses: post: summary: Create new post. security: - tokenAuth: [] requestBody: content: application/json: schema: type: object properties: status: description: Text content of the post. type: string content_type: description: Media type of the post content. type: string default: text/html enum: - text/html - text/markdown 'media_ids[]': description: Array of Attachment ids to be attached as media. type: array items: type: string format: uuid in_reply_to_id: description: ID of the post being replied to, if post is a reply. type: string format: uuid visibility: description: Visibility of the post. $ref: '#/components/schemas/Visibility' mentions: description: Array of profile IDs to be mentioned type: array items: type: string format: uuid required: - status responses: 201: description: Post created content: application/json: schema: $ref: '#/components/schemas/Status' 400: description: Invalid post data /api/v1/statuses/preview: post: summary: Preview new post. security: - tokenAuth: [] requestBody: content: application/json: schema: type: object properties: status: description: Text content of the post. type: string content_type: description: Media type of the post content. type: string default: text/html enum: - text/html - text/markdown required: - status responses: 200: description: Preview generated. content: application/json: schema: type: object properties: content: description: HTML-encoded post content. type: string 400: description: Invalid post data. /api/v1/statuses/{status_id}: delete: summary: Delete post parameters: - $ref: '#/components/parameters/status_id' responses: 204: description: Successful operation content: {} 403: description: Post does not belong to user 404: description: Post not found /api/v1/statuses/{status_id}/favourite: post: summary: Add post to your favourites list parameters: - $ref: '#/components/parameters/status_id' responses: 200: description: Successful operation content: application/json: schema: $ref: '#/components/schemas/Status' 404: description: Post does not exist or is not public /api/v1/statuses/{status_id}/reblog: post: summary: Repost a post parameters: - $ref: '#/components/parameters/status_id' responses: 200: description: Successful operation. Returns repost info. content: application/json: schema: $ref: '#/components/schemas/Status' 404: description: Post does not exist or is not public /api/v1/statuses/{status_id}/unreblog: post: summary: Undo repost parameters: - $ref: '#/components/parameters/status_id' responses: 200: description: Post no longer resposted. content: application/json: schema: $ref: '#/components/schemas/Status' 404: description: Post does not exist or no repost exists /api/v1/statuses/{status_id}/make_permanent: post: summary: Save post to IPFS parameters: - $ref: '#/components/parameters/status_id' responses: 200: description: Successful operation content: application/json: schema: $ref: '#/components/schemas/Status' 403: description: Post does not belong to user or is not public 404: description: Post not found 418: description: IPFS integration is not enabled 422: description: Post already saved to IPFS /api/v1/statuses/{status_id}/signature: get: summary: Sign post data with instance key parameters: - $ref: '#/components/parameters/status_id' responses: 200: description: Signature created content: application/json: schema: $ref: '#/components/schemas/Signature' 403: description: Post does not belong to user, is not public or not saved to IPFS, or user's wallet address is not known or not verified 404: description: Post not found 418: description: Blockchain integration is not enabled /api/v1/statuses/{status_id}/token_minted: post: summary: Register transaction that mints a token parameters: - $ref: '#/components/parameters/status_id' requestBody: content: application/json: schema: properties: transaction_id: type: string description: Transaction ID example: '581186ab56765aed64a3e73172872a6454c604c6b4e08a8ed03eabad94e74d64' responses: 200: description: Successful operation content: application/json: schema: $ref: '#/components/schemas/Status' 403: description: Post does not belong to user or is not public 404: description: Post not found 422: description: Transaction already registered /api/v1/subscriptions/authorize: get: summary: Get authorization for setting up Ethereum subscription. security: - tokenAuth: [] parameters: - name: price in: query description: Subscription price required: true schema: type: number responses: 200: description: Signature created content: application/json: schema: $ref: '#/components/schemas/Signature' 403: description: User's wallet address is not known or not verified 418: description: Blockchain integration is not enabled /api/v1/subscriptions/options: get: summary: Get list of subscription options security: - tokenAuth: [] responses: 200: description: Successful operation content: application/json: schema: type: array items: $ref: '#/components/schemas/SubscriptionOption' post: summary: Enable subscriptions or update subscription settings security: - tokenAuth: [] requestBody: content: application/json: schema: $ref: '#/components/schemas/SubscriptionOption' responses: 200: description: Successful operation content: application/json: schema: $ref: '#/components/schemas/Account' 400: description: User hasn't enabled subscriptions 403: description: User's wallet address is not known or not verified 418: description: Blockchain integration is not enabled /api/v1/subscriptions/find: get: summary: Find subscription by sender and recipient parameters: - name: sender_id in: query description: Sender ID. required: true schema: type: string format: uuid - name: recipient_id in: query description: Recipient ID. required: true schema: type: string format: uuid responses: 200: description: Successful operation content: application/json: schema: type: object properties: id: description: Subscription ID. type: number example: 1 expires_at: description: The date when subscription expires. type: string format: date-time 404: description: Subscription not found /api/v1/subscriptions/invoices: post: summary: Create invoice requestBody: content: application/json: schema: type: object properties: sender_id: description: Sender ID. type: string format: uuid recipient_id: description: Recipient ID. type: string format: uuid amount: description: Requested payment amount (in atomic units). type: integer example: 100000000 responses: 200: description: Invoice created. content: application/json: schema: $ref: '#/components/schemas/Invoice' 400: description: Invalid request. 404: description: Sender or recipient not found. 418: description: Blockchain integration is not enabled. /api/v1/subscriptions/invoices/{invoice_id}: get: summary: View information about an invoice. parameters: - name: invoice_id in: path description: Invoice ID required: true schema: type: string format: uuid responses: 200: description: Successful operation content: application/json: schema: $ref: '#/components/schemas/Invoice' 404: description: Invoice not found /api/v1/timelines/public: get: summary: View local public posts. parameters: - name: max_id in: query description: Return results older than this ID. required: false schema: type: string format: uuid - name: limit in: query description: Maximum number of results to return. required: false schema: type: integer default: 20 responses: 200: description: Successful operation content: application/json: schema: description: Post list type: array items: $ref: '#/components/schemas/Status' /api/v1/timelines/tag/{hashtag}: get: summary: View public posts containing the given hashtag parameters: - name: hashtag in: path description: Hashtag name required: true schema: type: string - name: max_id in: query description: Return results older than this ID. required: false schema: type: string format: uuid - name: limit in: query description: Maximum number of results to return. required: false schema: type: integer default: 20 responses: 200: description: Successful operation content: application/json: schema: description: Post list type: array items: $ref: '#/components/schemas/Status' /api/v2/search: get: summary: Search for profiles or posts parameters: - name: q in: query description: The search query required: true schema: type: string responses: 200: description: Successful operation content: application/json: schema: description: Search results type: object properties: accounts: type: array items: $ref: '#/components/schemas/Account' statuses: type: array items: $ref: '#/components/schemas/Status' hashtags: type: array items: $ref: '#/components/schemas/Tag' components: securitySchemes: tokenAuth: type: http scheme: bearer parameters: account_id: name: account_id in: path description: Profile ID required: true schema: type: string format: uuid status_id: name: status_id in: path description: Post ID required: true schema: type: string format: uuid schemas: Account: type: object properties: id: description: The account id. type: string format: uuid username: description: The username of the actor, not including domain. type: string example: user acct: description: The Webfinger account URI. Equal to username for local actors, or username@domain for remote actors. type: string example: user@example.com url: description: The location of the user's profile page. type: string example: https://example.com/@user locked: description: Whether the actor manually approves follow requests. type: boolean example: false identity_proofs: description: Identity proofs. type: array items: $ref: '#/components/schemas/Field' payment_options: description: Payment options. type: array items: type: object properties: type: description: Payment type. type: string enum: - link - ethereum-subscription - monero-subscription name: description: Link name (only for link type). type: string nullable: true href: description: Link URL (only for link type). type: string nullable: true price: description: Subscription price (only for ethereum-subscription and monero-subscription types). type: number nullable: true example: null fields: description: Additional metadata attached to a profile as name-value pairs. type: array items: $ref: '#/components/schemas/Field' followers_count: description: The reported followers of this profile. type: number following_count: description: The reported follows of this profile. type: number subscribers_count: description: The reported subscribers of this profile. type: number AccountWithSource: allOf: - $ref: '#/components/schemas/Account' - type: object properties: source: description: Additional information about the user. type: object properties: note: description: Profile bio. type: string ActivityParameters: type: object properties: type: description: Activity type type: string enum: - update Attachment: type: object properties: id: description: The ID of the attachment in the database. type: string format: uuid type: description: The type of the attachment. type: string enum: - unknown - image - video url: description: The location of the original full-size attachment. type: string CustomEmoji: type: object properties: shortcode: description: The name of the custom emoji. type: string url: description: A link to the custom emoji. type: string visible_in_picker: description: Whether this Emoji should be visible in the picker or unlisted. type: boolean Field: type: object properties: name: description: The key of a given field's key-value pair. type: string value: description: The value associated with the name key. type: string verified_at: description: Timestamp of when the server verified the field value. type: string format: date-time Instance: type: object properties: uri: description: The host name of the instance. type: string title: description: The title of the website. type: string short_description: description: A short description defined by the admin. type: string description: description: Admin-defined description of the site (HTML). type: string description_source: description: Admin-defined description of the site (Markdown source). type: string version: description: Mastodon API compatibility version and the version of Mitra server. type: string example: '3.0.0 (compatible; Mitra 0.4.0)' registrations: description: Whether registrations are enabled. type: boolean approval_required: description: Whether registrations require moderator approval. type: boolean invites_enabled: description: Whether invites are enabled. type: boolean stats: description: Statistics about how much information the instance contains. type: object properties: user_count: description: Users registered on this instance type: integer status_count: description: Statuses authored by users on instance. type: integer domain_count: description: Domains federated with this instance. type: integer configuration: description: Configured values and limits for this instance. type: object properties: statuses: description: Limits related to authoring posts. type: object properties: max_characters: description: The maximum number of allowed characters per post. type: integer example: 5000 max_media_attachments: description: The maximum number of media attachments that can be added to a post. type: integer example: 15 media_attachments: description: Limits realted to uploading attachments. type: object properties: supported_mime_types: description: Contains MIME types that can be uploaded. type: array items: type: string example: 'image/png' image_size_limit: description: The maximum size of any uploaded image, in bytes. type: integer example: 5242880 login_message: description: Login message for signer. type: string post_character_limit: description: Post character limit. type: integer example: 5000 blockchains: description: Information about blockchain integrations. type: array items: type: object properties: chain_id: description: CAIP-2 chain ID. type: string example: 'eip155:1' chain_metadata: description: Additional information about blockchain type: object nullable: true contract_address: description: Blockchain contract address. type: string nullable: true features: description: Blockchain features. type: object properties: gate: description: Token gate feature flag. type: boolean example: true minter: description: Minter feature flag. type: boolean example: true subscriptions: description: Subscriptions feature flag. type: boolean example: true ipfs_gateway_url: description: IPFS gateway URL. type: string nullable: true Invoice: type: object properties: id: description: Invoice ID. type: string format: uuid sender_id: description: The profile ID of the sender. type: string format: uuid recipient_id: description: The profile ID of the recipient. type: string format: uuid payment_address: description: Payment address. type: string amount: description: Requested payment amount (in atomic units). type: integer example: 100000000 status: description: Invoice status. type: string enum: - open - paid - forwarded - timeout expires_at: description: The date when invoice times out. type: string format: date-time Mention: type: object properties: id: description: The profile ID of the mentioned user. type: string format: uuid username: description: The username of the mentioned user. type: string acct: type: string url: description: The location of the mentioned user's profile. type: string Notification: type: object properties: id: description: The id of the notification in the database. type: string type: description: The type of event that resulted in the notification. type: string enum: - follow - follow_request - reply - favourite - mention - reblog - subscription - subscription_expiration - move example: reply created_at: description: The timestamp of the notification. type: string format: date-time account: $ref: '#/components/schemas/Account' status: $ref: '#/components/schemas/Account' Relationship: type: object properties: id: description: Target profile id. type: string format: uuid following: description: Are you following this user? type: boolean default: false followed_by: description: Are you followed by this user? type: boolean default: false requested: description: Do you have a pending follow request for this user? type: boolean default: false subscription_to: description: Are you sending subscription payments to this user? type: boolean default: false subscription_from: description: Are you receiving subscription payments from this user? type: boolean default: false showing_reblogs: description: Are you receiving this user's reposts in your home timeline? type: boolean default: true showing_replies: description: Are you receiving this user's replies in your home timeline? type: boolean default: true Signature: type: object properties: v: type: integer format: int64 example: 27 r: type: string example: '6f61670e67bf72...' s: type: string example: '6a5cb313907cd3...' Status: type: object properties: id: type: string format: uuid uri: description: URI of the post used for federation. type: string created_at: description: The date when this post was created. type: string format: date-time edited_at: description: The date when this post was edited. type: string format: date-time nullable: true account: description: The profile that authored this post. $ref: '#/components/schemas/Account' content: description: HTML-encoded post content. type: string visibility: description: Visibility of this post. $ref: '#/components/schemas/Visibility' media_attachments: description: Media that is attached to this post. type: array items: $ref: '#/components/schemas/Attachment' mentions: description: Mentions of users within the post. type: array items: $ref: '#/components/schemas/Mention' tags: description: Hashtags used within the post content. type: array items: $ref: '#/components/schemas/Tag' emojis: description: Custom emoji to be used when rendering post content. type: array items: $ref: '#/components/schemas/CustomEmoji' reblog: description: The post being reposted. type: object ipfs_cid: type: string nullable: true example: 'bafkr...' token_tx_id: type: string nullable: true example: '0x5fe80cdea7f...' links: description: Posts linked to this post. type: array items: type: object Subscription: type: object properties: id: description: Subscription ID. type: number sender: $ref: '#/components/schemas/Account' sender_address: description: Sender address. type: string nullable: true example: '0xd8da6bf...' expires_at: description: The date when subscription expires. type: string format: date-time SubscriptionOption: type: object properties: type: description: Subscription type type: string enum: - ethereum - monero price: description: Subscription price (only for Monero) type: number payout_address: description: Payout address (only for Monero) type: string required: - type Tag: type: object properties: name: description: 'The value of the hashtag after the # sign.' type: string url: description: A link to the hashtag on the instance. Visibility: type: string enum: - public - private - subscribers - direct