# Build with Micro.blog Site: https://microblog.dev/ Micro.blog API base URL: https://micro.blog This full document includes site pages, public API endpoint details, and example project flows. ## Site Pages ### Home URL: https://microblog.dev/ Unofficial API docs, examples, and app showcases for the Micro.blog platform. Micro.blog supports multiple APIs and open-source apps. Use these docs to explore the API, learn from working examples, and build your own integrations. ### Micro.blog API Documentation URL: https://microblog.dev/api/ Explore Micro.blog API endpoints for authentication, timelines, posting, bookmarks, notes, books, feeds, discovery, account settings, and IndieWeb protocols. ### Example Apps URL: https://microblog.dev/example-apps/ Trace real app flows back to the API docs. Each example links to its source repository and the Micro.blog endpoints it uses. ## API Reference The API base URL for Micro.blog endpoints is `https://micro.blog`. Use bearer token authentication where an endpoint lists an `Authorization` header. ## Authentication URL: https://microblog.dev/api/authentication/ Sign in, registration, and token verification endpoints. ### POST /account/signin URL: `https://micro.blog/account/signin` Sends a sign-in email for an existing account. App sign-in requests must include a registered app name and redirect URL. Notes: - Apps that use this sign-in flow must be registered with Micro.blog before sending `app_name` and `redirect_url`. Email [help@micro.blog](mailto:help@micro.blog) with the app name and redirect URL to request registration. Query parameters: - `email` (string, required): Email address for the account. Example: `example@example.com` - `app_name` (string, optional): Name of the app requesting access. Example: `Micro.blog for Android` - `redirect_url` (string, optional): Registered redirect URL for the app sign-in flow. Example: `microblog://signin/` - `is_mobile` (integer, optional): Set to `1` for the mobile sign-in email flow. Example: `1` Example request: ```sh curl -X POST "https://micro.blog/account/signin?email=example%40example.com" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns an empty object on success. Example response: ```json {} ``` ### POST /account/verify URL: `https://micro.blog/account/verify` Verifies an emailed sign-in or app token and returns account information plus the API token to use on authenticated requests. Query parameters: - `token` (string, required): Verification or access token. Example: `EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X POST "https://micro.blog/account/verify?token=Bearer+EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns user information and authentication token upon successful verification. Response properties: - `token` (string): Authentication token for subsequent API requests. Example: `EF7BBXXXXXX..` Important: Include this value in the `Authorization` header as `Bearer {token}` for authenticated API requests. - `name` (string): The user's display name. Example: `Vincent` - `username` (string): The user's username. Example: `vincent` - `avatar` (string): URL to the user's avatar image. Example: `https://avatars.micro.blog/avatars/2025/39/3008.jpg` - `bio` (string): The user's bio or description. - `default_site` (string): The user's default Micro.blog site. Example: `vincent-social.micro.blog` - `full_name` (string): The user's full name. Example: `Vincent` - `gravatar_url` (string): URL to the user's Gravatar image. Example: `https://avatars.micro.blog/avatars/2025/39/3008.jpg` - `has_site` (boolean): Whether the user has a Micro.blog site. Example: `true` - `plan` (string): The user's current subscription plan. Example: `premium` - `plans` (array of string): Array of subscription plans the user has access to. Example: `[premium]` - `is_fullaccess` (boolean): Whether the user has full access features. Example: `true` - `is_premium` (boolean): Whether the user has a premium subscription. Example: `true` - `is_using_ai` (boolean): Whether the user is using AI features. Example response: ```json { "token": "EF7BBXXXXXX..", "name": "Vincent", "username": "vincent", "avatar": "https://avatars.micro.blog/avatars/2025/39/3008.jpg", "bio": "", "default_site": "vincent-social.micro.blog", "full_name": "Vincent", "gravatar_url": "https://avatars.micro.blog/avatars/2025/39/3008.jpg", "has_site": true, "plan": "premium", "plans": [ "premium" ], "is_fullaccess": true, "is_premium": true, "is_using_ai": false } ``` ### POST /account/apple URL: `https://micro.blog/account/apple` Verifies a Sign in with Apple identity token and returns a temporary Micro.blog verification token. Query parameters: - `identity_token` (string, required): Apple identity token. Example: `APPLE_IDENTITY_TOKEN` - `user_id` (string, required): Apple user identifier. Example: `001234.apple` - `email` (string, optional): Email address. Example: `example@example.com` - `full_name` (string, optional): Full display name. Example: `Vincent` - `username` (string, optional): Micro.blog username. Example: `vincent` Example request: ```sh curl -X POST "https://micro.blog/account/apple?identity_token=APPLE_IDENTITY_TOKEN&user_id=001234.apple" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON response. Example response: ```json { "username": "vincent", "token": "EF7BB9BCAC1F6D561C93" } ``` ### POST /indieauth/approve URL: `https://micro.blog/indieauth/approve` Approves an IndieAuth authorization request and redirects to the client with a code. Query parameters: - `scope` (string, optional): Requested or granted scope string. Example: `profile read create update` Example request: ```sh curl -X POST "https://micro.blog/indieauth/approve" ``` Response: - Status: 302 - Content-Type: `text/html` - Description: Redirects to the registered redirect URI with `code` and `state`. Example response: ```html HTTP/1.1 302 Found Location: https://example-app.com/callback?code=AUTHCODE&state=state123 ``` ### GET /indieauth/auth URL: `https://micro.blog/indieauth/auth` Starts the IndieAuth authorization flow and renders the authorization screen. Query parameters: - `me` (string, optional): Canonical user URL. Example: `https://example.micro.blog/` - `client_id` (string, required): IndieAuth client ID URL. Example: `https://example-app.com/` - `redirect_uri` (string, required): IndieAuth redirect URI. Example: `https://example-app.com/callback` - `state` (string, optional): Opaque client state returned to the redirect URI. Example: `state123` - `response_type` (string, optional): IndieAuth response type. Example: `code` - `scope` (string, optional): Requested or granted scope string. Example: `profile read create update` - `inkwell` (integer, optional): Set to `1` for Inkwell-specific authorization. Example: `1` Example request: ```sh curl -X GET "https://micro.blog/indieauth/auth?client_id=https%3A%2F%2Fexample-app.com%2F&redirect_uri=https%3A%2F%2Fexample-app.com%2Fcallback" ``` Response: - Status: 200 - Content-Type: `text/html` - Description: Returns the authorization screen. Example response: ```html IndieAuth authorization screen ``` ### POST /indieauth/auth URL: `https://micro.blog/indieauth/auth` Verifies an IndieAuth authorization code for clients that only need identity information. Query parameters: - `code` (string, required): Authorization code. Example: `AUTHCODE` - `redirect_uri` (string, required): IndieAuth redirect URI. Example: `https://example-app.com/callback` - `client_id` (string, required): IndieAuth client ID URL. Example: `https://example-app.com/` Example request: ```sh curl -X POST "https://micro.blog/indieauth/auth?code=AUTHCODE&redirect_uri=https%3A%2F%2Fexample-app.com%2Fcallback&client_id=https%3A%2F%2Fexample-app.com%2F" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON response. Example response: ```json { "me": "https://vincent.micro.blog/", "profile": { "name": "Vincent", "url": "https://vincent.micro.blog/", "photo": "https://avatars.micro.blog/avatars/2025/39/3008.jpg", "nickname": "vincent" } } ``` ### GET /indieauth/token URL: `https://micro.blog/indieauth/token` Introspects an IndieAuth bearer token and returns profile and scope information. Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X GET "https://micro.blog/indieauth/token" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON response. Example response: ```json { "me": "https://vincent.micro.blog/", "client_id": "Example App", "scope": "profile read create update", "profile": { "name": "Vincent", "url": "https://vincent.micro.blog/", "photo": "https://avatars.micro.blog/avatars/2025/39/3008.jpg", "nickname": "vincent" } } ``` ### POST /indieauth/token URL: `https://micro.blog/indieauth/token` Exchanges an IndieAuth authorization code for profile information and, when requested, an access token. Query parameters: - `code` (string, required): Authorization code. Example: `AUTHCODE` - `redirect_uri` (string, required): IndieAuth redirect URI. Example: `https://example-app.com/callback` - `client_id` (string, required): IndieAuth client ID URL. Example: `https://example-app.com/` Example request: ```sh curl -X POST "https://micro.blog/indieauth/token?code=AUTHCODE&redirect_uri=https%3A%2F%2Fexample-app.com%2Fcallback&client_id=https%3A%2F%2Fexample-app.com%2F" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON response. Example response: ```json { "scope": "profile read create update", "me": "https://vincent.micro.blog/", "profile": { "name": "Vincent", "url": "https://vincent.micro.blog/", "photo": "https://avatars.micro.blog/avatars/2025/39/3008.jpg", "nickname": "vincent" }, "token_type": "Bearer", "access_token": "EF7BB9BCAC1F6D561C93" } ``` ## Account URL: https://microblog.dev/api/account/ Endpoints for account preferences and account-level API settings. ### POST /account/feeds URL: `https://micro.blog/account/feeds` Adds a feed source to the account. Query parameters: - `url` (string, required): URL for the target resource. Example: `https://example.com/post` - `add_feed_option` (string, optional): Optional add mode, for example `import`. Example: `import` - `site_id` (integer, optional): Site identifier. Example: `123` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X POST "https://micro.blog/account/feeds?url=https%3A%2F%2Fexample.com%2Fpost" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns an empty JSON object on success. Example response: ```json {} ``` ### GET /account/info/domains URL: `https://micro.blog/account/info/domains` Returns hosted site and domain status information. Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X GET "https://micro.blog/account/info/domains" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON response. Example response: ```json [ { "id": 789, "guid": "vincent", "hostname": "vincent.micro.blog", "cname": "www.example.com", "url": "https://vincent.micro.blog/", "status": "paid", "has_cname": true, "is_paid": true, "is_expired": false, "ssl_status": "ready", "created_at": "Apr 26, 2026" } ] ``` ### GET /account/info/feeds URL: `https://micro.blog/account/info/feeds` Returns account feed and cross-posting source information. Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X GET "https://micro.blog/account/info/feeds" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON response. Example response: ```json { "rss_feeds": [ { "id": 123, "url": "https://vincent.example.com/feed.json", "twitter_username": "", "medium_username": "", "mastodon_username": "vincent", "mastodon_hostname": "mastodon.social", "tumblr_hostname": "", "flickr_username": "", "facebook_name": "", "facebook_page": "", "linkedin_name": "", "bluesky_handle": "vincent.example.com", "nostr_pubkey": "", "youtube_channel_title": "", "pixelfed_username": "", "pixelfed_hostname": "", "peertube_username": "", "peertube_hostname": "", "has_crosspost_mastodon": true, "has_crosspost_bluesky": true, "has_crosspost_any": true, "has_bot": false, "has_error": false, "refresh_error": "", "is_disabled_crossposting": false, "is_importer": false, "import_feed_hostname": "vincent.example.com", "import_blog_hostname": "" } ], "new_feed": { "id": 0, "url": "" } } ``` ### GET /account/settings URL: `https://micro.blog/account/settings` Returns account-level API settings for the authenticated user. Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X GET "https://micro.blog/account/settings" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns account settings. Example response: ```json { "timeline": 0 } ``` ### POST /account/settings URL: `https://micro.blog/account/settings` Updates account-level API settings for the authenticated user. Query parameters: - `timeline` (integer, required): Timeline mention setting. `0` includes all posts, `1` limits mentions, and `2` hides mentions. Example: `2` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X POST "https://micro.blog/account/settings?timeline=2" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns an empty JSON object on success. Example response: ```json {} ``` ## Posts URL: https://microblog.dev/api/posts/ Endpoints for timeline posts, user posts, replies, media, conversations, search, and post deletion. ### GET /posts/all URL: `https://micro.blog/posts/all` Retrieves the user's timeline feed. Returns posts in JSON Feed format with Micro.blog extensions. Supports pagination via query parameters. Query parameters: - `count` (integer, optional): Maximum number of items to return. Example: `150` - `since_id` (integer, optional): Only return posts newer than this post ID. Example: `1` - `before_id` (integer, optional): Only return posts older than this post ID. Example: `117` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X GET "https://micro.blog/posts/all" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON Feed object containing an array of posts with Micro.blog extensions. Response properties: - `version` (string): JSON Feed version identifier. Example: `https://jsonfeed.org/version/1` - `title` (string): Title of the feed. Example: `Micro.blog - Timeline` - `home_page_url` (string): URL of the home page for this feed. Example: `https://micro.blog` - `feed_url` (string): URL of this feed. Example: `https://micro.blog/posts/all` - `_microblog` (object): Micro.blog-specific extensions to the JSON Feed format. Properties: - `about` (string): URL to API documentation. Example: `https://micro.blog/about/api` - `items` (array of object): Array of post items. Item properties: - `id` (string): Unique post identifier (64-bit). Example: `77494371` - `content_html` (string): HTML content of the post. Example: `

Post content...

` - `summary` (string): Summary or excerpt of the post. - `url` (string): URL to the post. Example: `https://www.manton.org/2025/11/07/if-you-are-on-the.html` - `date_published` (string): ISO 8601 timestamp of when the post was published. Example: `2025-11-07T18:00:00+00:00` - `author` (object): Author information. Properties: - `name` (string): Author's display name. Example: `Manton Reece` - `url` (string): URL to author's profile or website. Example: `https://manton.org` - `avatar` (string): URL to author's avatar image. Example: `https://avatars.micro.blog/avatars/2025/22/3.jpg` - `_microblog` (object): Micro.blog-specific author fields. Properties: - `username` (string): Author's Micro.blog username. Example: `manton` - `_microblog` (object): Micro.blog-specific post fields. Properties: - `date_relative` (string): Human-readable relative date/time. Example: `19:00` - `date_timestamp` (integer): Unix timestamp of the post. Example: `1762538400` - `is_favorite` (boolean): Whether the post is favorited by the authenticated user. - `is_bookmark` (boolean): Whether the post is bookmarked by the authenticated user. - `is_deletable` (boolean): Whether the authenticated user can delete this post. - `is_conversation` (boolean): Whether this post is part of a conversation thread. - `is_linkpost` (boolean): Whether this post is a link post. - `is_mention` (boolean): Whether this post mentions the authenticated user. - `note` (string): Additional note or context for the post. - `syndication` (array of string): Array of syndication URLs where this post was shared. Example: `[https://example.com/syndication/url]` Example response: ```json { "version": "https://jsonfeed.org/version/1", "title": "Micro.blog - Timeline", "home_page_url": "https://micro.blog", "feed_url": "https://micro.blog/posts/all", "_microblog": { "about": "https://micro.blog/about/api" }, "items": [ { "id": "77494371", "content_html": "

If you are on the TestFlight beta for Micro.blog iOS, you will have seen our experiments to enable Liquid Glass. I'm admitting defeat today, going to opt out of the new UI for the next version. There are too many little glitches.

\n", "summary": "", "url": "https://www.manton.org/2025/11/07/if-you-are-on-the.html", "date_published": "2025-11-07T18:00:00+00:00", "author": { "name": "Manton Reece", "url": "https://manton.org", "avatar": "https://avatars.micro.blog/avatars/2025/22/3.jpg", "_microblog": { "username": "manton" } }, "_microblog": { "date_relative": "19:00", "date_timestamp": 1762538400, "is_favorite": false, "is_bookmark": false, "is_deletable": false, "is_conversation": false, "is_linkpost": false, "is_mention": false, "note": "", "syndication": [ "https://example.com/syndication/url" ] } } ] } ``` ### GET /posts/all/by_id URL: `https://micro.blog/posts/all/by_id` Returns one timeline post by query ID. Query parameters: - `id` (integer, required): Resource identifier. Example: `12345` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X GET "https://micro.blog/posts/all/by_id?id=12345" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a single timeline post object. Example response: ```json { "version": "https://jsonfeed.org/version/1.1", "items": [] } ``` ### GET /posts/conversation URL: `https://micro.blog/posts/conversation` Returns the conversation thread for a post, mention, favourite, or thread ID. Query parameters: - `id` (integer, required): Identifier for the resource. Example: `88924898` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X GET "https://micro.blog/posts/conversation?id=88924898" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON Feed response. Example response: ```json { "version": "https://jsonfeed.org/version/1.1", "title": "Micro.blog", "home_page_url": "https://micro.blog", "feed_url": "https://micro.blog/posts/conversation", "items": [] } ``` ### GET /posts/links/search URL: `https://micro.blog/posts/links/search` Searches indexed links and returns JSON Feed. Query parameters: - `q` (string, required): Search query. Example: `search term` Example request: ```sh curl -X GET "https://micro.blog/posts/links/search?q=search+term" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON Feed response. Example response: ```json { "version": "https://jsonfeed.org/version/1.1", "items": [] } ``` ### GET /posts/links/{prefix} URL: `https://micro.blog/posts/links/{prefix}` Returns indexed links matching a host/path prefix in JSON Feed format. Path parameters: - `prefix` (string, required): Hostname and optional path prefix. Example: `example.com/path` Example request: ```sh curl -X GET "https://micro.blog/posts/links/{prefix}" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON Feed response. Example response: ```json { "version": "https://jsonfeed.org/version/1.1", "items": [] } ``` ### GET /posts/media URL: `https://micro.blog/posts/media` Retrieves media posts from the authenticated user timeline in JSON Feed format. Query parameters: - `count` (integer, optional): Maximum number of items to return. Example: `25` - `since_id` (integer, optional): Only return posts newer than this post ID. Example: `77479242` - `before_id` (integer, optional): Only return posts older than this post ID. Example: `9853826` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X GET "https://micro.blog/posts/media" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON Feed response. Example response: ```json { "version": "https://jsonfeed.org/version/1.1", "title": "Micro.blog", "home_page_url": "https://micro.blog", "feed_url": "https://micro.blog/posts/media", "items": [] } ``` ### GET /posts/photos URL: `https://micro.blog/posts/photos` Retrieves photo posts from the authenticated user timeline in JSON Feed format. Query parameters: - `count` (integer, optional): Maximum number of items to return. Example: `25` - `since_id` (integer, optional): Only return posts newer than this post ID. Example: `77479242` - `before_id` (integer, optional): Only return posts older than this post ID. Example: `9853826` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X GET "https://micro.blog/posts/photos" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON Feed response. Example response: ```json { "version": "https://jsonfeed.org/version/1.1", "title": "Micro.blog", "home_page_url": "https://micro.blog", "feed_url": "https://micro.blog/posts/photos", "items": [] } ``` ### GET /posts/replies URL: `https://micro.blog/posts/replies` Returns replies for the authenticated user. Query parameters: - `count` (integer, optional): Maximum number of items to return. Example: `25` - `q` (string, optional): Search query or Micropub query type. Example: `search term` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X GET "https://micro.blog/posts/replies" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON Feed response. Example response: ```json { "version": "https://jsonfeed.org/version/1.1", "title": "Micro.blog", "home_page_url": "https://micro.blog", "feed_url": "https://micro.blog/posts/replies", "items": [] } ``` ### GET /posts/search URL: `https://micro.blog/posts/search` Searches posts visible to the authenticated user. Query parameters: - `q` (string, required): Search query or Micropub query type. Example: `vincent` - `count` (integer, optional): Maximum number of items to return. Example: `25` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X GET "https://micro.blog/posts/search?q=vincent" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON Feed response. Example response: ```json { "version": "https://jsonfeed.org/version/1.1", "title": "Micro.blog", "home_page_url": "https://micro.blog", "feed_url": "https://micro.blog/posts/search", "items": [] } ``` ### GET /posts/timeline URL: `https://micro.blog/posts/timeline` Retrieves the authenticated user timeline in JSON Feed format. Query parameters: - `count` (integer, optional): count parameter. Example: `example` - `since_id` (string, optional): Only return posts newer than this post ID. Example: `77479242` - `before_id` (string, optional): Only return posts older than this post ID. Example: `9853826` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X GET "https://micro.blog/posts/timeline" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON Feed response. Example response: ```json { "version": "https://jsonfeed.org/version/1.1", "items": [] } ``` ### GET /posts/timeline/{id} URL: `https://micro.blog/posts/timeline/{id}` Returns one timeline post by ID. Path parameters: - `id` (integer, required): Identifier for the resource. Example: `12345` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X GET "https://micro.blog/posts/timeline/{id}?id=2" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON Feed response. Example response: ```json { "version": "https://jsonfeed.org/version/1.1", "title": "Micro.blog", "home_page_url": "https://micro.blog", "feed_url": "https://micro.blog/posts/timeline/{id}", "items": [] } ``` ### DELETE /posts/{id} URL: `https://micro.blog/posts/{id}` Deletes one of the authenticated user's posts by ID. Path parameters: - `id` (integer, required): Identifier for the resource. Example: `12345` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X DELETE "https://micro.blog/posts/{id}" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns an empty JSON object on success. Example response: ```json {} ``` ### GET /posts/{username} URL: `https://micro.blog/posts/{username}` Returns a user profile and recent posts for the given username. Path parameters: - `username` (string, required): Micro.blog username. Example: `vincent` Query parameters: - `count` (integer, optional): Maximum number of items to return. Example: `0` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X GET "https://micro.blog/posts/{username}" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON Feed response. Example response: ```json { "version": "https://jsonfeed.org/version/1.1", "title": "Micro.blog", "home_page_url": "https://micro.blog", "feed_url": "https://micro.blog/posts/{username}", "items": [] } ``` ### GET /posts/{username}/photos URL: `https://micro.blog/posts/{username}/photos` Returns public photo posts for a user in JSON Feed format. Path parameters: - `username` (string, required): Micro.blog username. Example: `vincent` Query parameters: - `count` (integer, optional): count parameter. Example: `example` Example request: ```sh curl -X GET "https://micro.blog/posts/{username}/photos" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON Feed response. Example response: ```json { "version": "https://jsonfeed.org/version/1.1", "items": [] } ``` ## Posting and Micropub URL: https://microblog.dev/api/posting/ Endpoints for publishing, replying, uploading media, and querying Micropub resources. ### GET /micropub URL: `https://micro.blog/micropub` Handles Micropub configuration, source, category, contact, and syndication queries. Query parameters: - `q` (string, required): Search query or Micropub query type. Example: `source` - `mp-destination` (string, optional): Micropub destination site URL or hostname. Example: `vincent-test.micro.blog` - `mp-channel` (string, optional): Micropub source channel, for example `pages`. Example: `pages` - `filter` (string, optional): Text filter for Micropub source or contact queries. Example: `Vincent` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X GET "https://micro.blog/micropub" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON response for the requested resource. Example response: ```json { "media-endpoint": "https://micro.blog/micropub/media", "destination": [ { "uid": "https://vincent.micro.blog/", "name": "vincent.micro.blog", "microblog-audio": true, "microblog-default": true, "microblog-title": "Vincent's Blog" } ], "post-types": [ { "type": "note", "name": "Post", "properties": [ "content", "published", "post-status", "category" ] } ], "channels": [ { "uid": "default", "name": "Posts" } ], "syndicate-to": [] } ``` ### POST /micropub URL: `https://micro.blog/micropub` Creates, updates, or deletes content through Micropub. Query parameters: - `action` (string, optional): Micropub action, for example `delete`. Example: `delete` - `url` (string, optional): URL to look up or modify. Example: `http://gluon.micro.blog/2019/12/16/hello-world.html` - `h` (string, optional): Micropub object type. Use `entry` for posts. Example: `entry` - `content` (string, optional): Reply text. Example: `@vincent Thanks for the update.` - `name` (string, optional): Title or notebook name, depending on the endpoint. Example: `This is a title` - `photo` (string, optional): Photo URL for a Micropub post. Example: `https://gluon.micro.blog/uploads/2019/9931898b67.jpg` - `bookmark-of` (string, optional): URL being bookmarked. Example: `https://micro.blog/rom/21700756` - `mp-destination` (string, optional): Micropub destination site URL or hostname. Example: `https://example.micro.blog/` - `mp-channel` (string, optional): Micropub source channel, for example `pages`. Example: `pages` - `site_id` (string, optional): Site URL or identifier for the destination site. Example: `https://gluon-the-second.micro.blog/` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X POST "https://micro.blog/micropub" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns an empty JSON object on success. Example response: ```json {} ``` ### GET /micropub/media URL: `https://micro.blog/micropub/media` Returns Micropub media endpoint configuration or uploaded media. Query parameters: - `q` (string, required): Search query or Micropub query type. Example: `config` - `mp-destination` (string, optional): Micropub destination site URL or hostname. Example: `https://vincent.micro.blog/` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X GET "https://micro.blog/micropub/media" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON response for the requested resource. Example response: ```json { "items": [ { "url": "https://vincent.micro.blog/uploads/2026/photo.jpg", "published": "2026-04-26T12:00:00+00:00", "alt": "Photo description", "microblog-ai": false, "microblog-id": 12345, "sizes": { "large": "https://vincent.micro.blog/uploads/2026/photo.jpg" }, "cdn": { "large": "https://cdn.uploads.micro.blog/12345/photo.jpg" } } ] } ``` ### POST /micropub/media URL: `https://micro.blog/micropub/media` Uploads media or deletes an uploaded media file through the Micropub media endpoint. Query parameters: - `action` (string, optional): Micropub action, for example `delete`. Example: `delete` - `mp-destination` (string, optional): Micropub destination site URL or hostname. Example: `https://vincent.micro.blog/` - `url` (string, optional): URL to look up or modify. Example: `https://vincent.micro.blog/uploads/2023/dd2f2731d0.jpg` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` - `Content-Type` (string, required): Request content type. Example: `multipart/form-data` Body parameters: - `file` (string, optional): File upload field for media uploads. Example: `@/path/to/file.jpg` Example request: ```sh curl -X POST "https://micro.blog/micropub/media" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" \ --header "Content-Type: multipart/form-data" \ --form "file=@/path/to/file.jpg" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON response for the requested resource. Example response: ```json { "url": "https://vincent.micro.blog/uploads/2026/photo.jpg", "poster": "" } ``` ### POST /micropub/media/append URL: `https://micro.blog/micropub/media/append` Appends a base64-encoded chunk to a large media upload. Micro.blog clients use this before marking the upload as finished. Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` - `Content-Type` (string, required): Request content type. Example: `multipart/form-data` Body parameters: - `file_id` (integer, required): Client-generated upload identifier shared by all chunks for the same file. Example: `12345` - `file_name` (string, optional): Original file name. The Micro.blog app includes this with chunk requests. Example: `video.mov` - `file_type` (string, optional): MIME type for the uploaded file. Example: `video/quicktime` - `file_data` (string, required): Base64-encoded chunk data, optionally prefixed with a data URL header. Example: `data:;base64,AAAA` - `mp-destination` (string, optional): Micropub destination site URL or hostname. Example: `https://example.micro.blog/` Example request: ```sh curl -X POST "https://micro.blog/micropub/media/append" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" \ --form "file_id=12345" \ --form "file_name=video.mov" \ --form "file_type=video/quicktime" \ --form "file_data=data:;base64,AAAA" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns an empty JSON object on success. Example response: ```json {} ``` ### POST /micropub/media/finished URL: `https://micro.blog/micropub/media/finished` Marks a chunked media upload as finished and queues server-side processing. Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` - `Content-Type` (string, required): Request content type. Example: `multipart/form-data` Body parameters: - `file_id` (integer, required): Client-generated upload identifier used for the appended chunks. Example: `12345` - `file_name` (string, required): Original file name. Example: `video.mov` - `mp-destination` (string, optional): Micropub destination site URL or hostname. Example: `https://example.micro.blog/` Example request: ```sh curl -X POST "https://micro.blog/micropub/media/finished" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" \ --form "file_id=12345" \ --form "file_name=video.mov" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns an empty JSON object on success. Example response: ```json {} ``` ### GET /micropub/media/waiting URL: `https://micro.blog/micropub/media/waiting` Returns processing state and the final URL for a chunked media upload. Query parameters: - `file_id` (integer, required): Upload file identifier. Example: `12345` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X GET "https://micro.blog/micropub/media/waiting?file_id=12345" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns whether processing is still running and, when available, the uploaded media URL. Example response: ```json { "is_processing": false, "url": "https://vincent.micro.blog/uploads/2026/video.mp4" } ``` ### POST /posts/reply URL: `https://micro.blog/posts/reply` Creates a reply to a Micro.blog post or mention. Query parameters: - `id` (integer, required): Identifier for the resource. Example: `28150987` - `content` (string, required): Reply text. Example: `@vincent testing a reply with a [link](https://gluon.app)` - `text` (string, optional): Text content. Example: `Draft note text` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X POST "https://micro.blog/posts/reply?id=28150987&content=%40vincent+testing+a+reply+with+a+%5Blink%5D%28https%3A%2F%2Fgluon.app%29" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns an empty JSON object on success. Example response: ```json {} ``` ## Microsub URL: https://microblog.dev/api/microsub/ Microsub endpoints for channels, timelines, and follow actions. ### GET /microsub URL: `https://micro.blog/microsub` Handles Microsub channel and timeline queries. Query parameters: - `action` (string, required): Microsub action. Example: `timeline` - `channel` (string, optional): Microsub channel identifier. Example: `default` - `before` (string, optional): Microsub pagination cursor for older items. Example: `12345` - `after` (string, optional): Microsub pagination cursor for newer items. Example: `67890` Example request: ```sh curl -X GET "https://micro.blog/microsub?action=timeline" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON response. Example response: ```json { "items": [ { "type": "entry", "published": "2026-04-26T12:00:00+00:00", "content": { "html": "

Hello from Micro.blog.

" }, "url": "https://example.com/post", "author": { "type": "card", "name": "Vincent", "url": "https://vincent.micro.blog/", "photo": "https://avatars.micro.blog/avatars/2025/39/3008.jpg" }, "_id": "12345" } ], "paging": { "before": "12345" } } ``` ### POST /microsub URL: `https://micro.blog/microsub` Handles Microsub write actions such as follow. Query parameters: - `action` (string, required): Microsub action. Example: `timeline` - `channel` (string, optional): Microsub channel identifier. Example: `default` - `url` (string, optional): URL for the target resource. Example: `https://example.com/post` - `username` (string, optional): Micro.blog username. Example: `vincent` Example request: ```sh curl -X POST "https://micro.blog/microsub?action=timeline" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns an empty JSON object on success. Example response: ```json {} ``` ## Discover URL: https://microblog.dev/api/discover/ Endpoints for curated Discover timelines and topic feeds. ### GET /posts/discover URL: `https://micro.blog/posts/discover` Returns the Discover timeline feed. Query parameters: - `before_id` (integer, optional): Only return posts older than this post ID. Example: `9853826` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X GET "https://micro.blog/posts/discover" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON Feed response. Example response: ```json { "version": "https://jsonfeed.org/version/1.1", "title": "Micro.blog", "home_page_url": "https://micro.blog", "feed_url": "https://micro.blog/posts/discover", "items": [] } ``` ### GET /posts/discover/books URL: `https://micro.blog/posts/discover/books` Returns the Discover books feed in JSON Feed format. Example request: ```sh curl -X GET "https://micro.blog/posts/discover/books" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON Feed response. Example response: ```json { "version": "https://jsonfeed.org/version/1.1", "items": [] } ``` ### GET /posts/discover/photos URL: `https://micro.blog/posts/discover/photos` Returns the Discover photos feed. Query parameters: - `before_id` (integer, optional): Only return posts older than this post ID. Example: `19321821` - `count` (integer, optional): Maximum number of items to return. Example: `60` - `since_id` (integer, optional): Only return posts newer than this post ID. Example: `19388108` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X GET "https://micro.blog/posts/discover/photos" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON Feed response. Example response: ```json { "version": "https://jsonfeed.org/version/1.1", "title": "Micro.blog", "home_page_url": "https://micro.blog", "feed_url": "https://micro.blog/posts/discover/photos", "items": [] } ``` ### GET /posts/discover/slowreads URL: `https://micro.blog/posts/discover/slowreads` Returns the Discover slow reads feed in JSON Feed format. Query parameters: - `before_id` (string, optional): Only return items older than this ID. Example: `12345` Example request: ```sh curl -X GET "https://micro.blog/posts/discover/slowreads" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON Feed response. Example response: ```json { "version": "https://jsonfeed.org/version/1.1", "items": [] } ``` ### GET /posts/discover/{topic} URL: `https://micro.blog/posts/discover/{topic}` Returns a Discover topic feed in JSON Feed format. Path parameters: - `topic` (string, required): topic parameter. Example: `example` Query parameters: - `before_id` (string, optional): Only return items older than this ID. Example: `12345` Example request: ```sh curl -X GET "https://micro.blog/posts/discover/{topic}" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON Feed response. Example response: ```json { "version": "https://jsonfeed.org/version/1.1", "items": [] } ``` ## Mentions URL: https://microblog.dev/api/mentions/ Endpoints for mentions and blocked mention feeds. ### GET /posts/mentions URL: `https://micro.blog/posts/mentions` Returns mentions for the authenticated user. Query parameters: - `since_id` (integer, optional): Only return posts newer than this post ID. Example: `10203852` - `before_id` (integer, optional): Only return posts older than this post ID. Example: `9853826` - `count` (integer, optional): Maximum number of items to return. Example: `5` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X GET "https://micro.blog/posts/mentions" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON Feed response. Example response: ```json { "version": "https://jsonfeed.org/version/1.1", "title": "Micro.blog", "home_page_url": "https://micro.blog", "feed_url": "https://micro.blog/posts/mentions", "items": [] } ``` ### GET /posts/mentions/blocked URL: `https://micro.blog/posts/mentions/blocked` Returns blocked or hidden mentions for the authenticated user. Query parameters: - `since_id` (integer, optional): Only return posts newer than this post ID. Example: `10203852` - `before_id` (integer, optional): Only return posts older than this post ID. Example: `9853826` - `count` (integer, optional): Maximum number of items to return. Example: `5` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X GET "https://micro.blog/posts/mentions/blocked" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON Feed response. Example response: ```json { "version": "https://jsonfeed.org/version/1.1", "title": "Micro.blog", "home_page_url": "https://micro.blog", "feed_url": "https://micro.blog/posts/mentions/blocked", "items": [] } ``` ### GET /posts/mentions/bluesky URL: `https://micro.blog/posts/mentions/bluesky` Returns Bluesky mentions in JSON Feed format. Query parameters: - `count` (integer, optional): count parameter. Example: `example` - `since_id` (string, optional): Only return posts newer than this post ID. Example: `77479242` - `before_id` (string, optional): Only return posts older than this post ID. Example: `9853826` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X GET "https://micro.blog/posts/mentions/bluesky" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON Feed response. Example response: ```json { "version": "https://jsonfeed.org/version/1.1", "items": [] } ``` ### GET /posts/mentions/mastodon URL: `https://micro.blog/posts/mentions/mastodon` Returns Mastodon mentions in JSON Feed format. Query parameters: - `count` (integer, optional): count parameter. Example: `example` - `since_id` (string, optional): Only return posts newer than this post ID. Example: `77479242` - `before_id` (string, optional): Only return posts older than this post ID. Example: `9853826` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X GET "https://micro.blog/posts/mentions/mastodon" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON Feed response. Example response: ```json { "version": "https://jsonfeed.org/version/1.1", "items": [] } ``` ### GET /posts/mentions/mb URL: `https://micro.blog/posts/mentions/mb` Returns Micro.blog mentions in JSON Feed format. Query parameters: - `count` (integer, optional): count parameter. Example: `example` - `since_id` (string, optional): Only return posts newer than this post ID. Example: `77479242` - `before_id` (string, optional): Only return posts older than this post ID. Example: `9853826` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X GET "https://micro.blog/posts/mentions/mb" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON Feed response. Example response: ```json { "version": "https://jsonfeed.org/version/1.1", "items": [] } ``` ### POST /posts/mentions/{id} URL: `https://micro.blog/posts/mentions/{id}` Updates mention visibility metadata. Path parameters: - `id` (integer, required): Resource identifier. Example: `12345` Query parameters: - `is_hidden_for_blog` (integer, optional): Whether a mention should be hidden from the blog. Example: `1` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X POST "https://micro.blog/posts/mentions/{id}" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns an empty JSON object on success. Example response: ```json {} ``` ## Bookmarks URL: https://microblog.dev/api/bookmarks/ Endpoints for bookmarks, bookmark tags, bookmark highlights, and reader web views. ### GET /posts/bookmarks URL: `https://micro.blog/posts/bookmarks` Returns the authenticated user's bookmarks in JSON Feed format. Query parameters: - `before_id` (integer, optional): Only return posts older than this post ID. Example: `15563191` - `tag` (string, optional): Bookmark tag name. Example: `life` - `q` (string, optional): Search query or Micropub query type. Example: `search term` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X GET "https://micro.blog/posts/bookmarks" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON Feed response. Example response: ```json { "version": "https://jsonfeed.org/version/1", "title": "Micro.blog - Bookmarks", "home_page_url": "https://micro.blog", "feed_url": "https://micro.blog/posts/bookmarks", "_microblog": { "about": "https://micro.blog/about/api", "is_showing_summaries": true }, "items": [ { "id": "12345", "content_html": "

Saved bookmark text.

", "summary": "Saved bookmark summary.", "url": "https://example.com/article", "date_published": "2026-04-26T12:00:00+00:00", "tags": "reading, reference", "author": { "name": "Vincent", "url": "https://vincent.micro.blog/", "avatar": "https://avatars.micro.blog/avatars/2026/123.jpg", "_microblog": { "username": "vincent" } }, "_microblog": { "date_relative": "12:00", "date_favorited": "2026-04-26T12:05:00+00:00", "date_timestamp": 1777204800, "links": [ { "id": 987, "url": "https://example.com/article", "archived_url": "https://micro.blog/archives/987" } ], "is_bookmark": true, "is_favorite": true, "is_deletable": false, "is_conversation": false } } ] } ``` ### POST /posts/bookmarks URL: `https://micro.blog/posts/bookmarks` Adds a timeline post to the authenticated user's bookmarks. Query parameters: - `id` (integer, required): Identifier for the resource. Example: `1760000` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X POST "https://micro.blog/posts/bookmarks?id=1760000" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns an empty JSON object on success. Example response: ```json {} ``` ### GET /posts/bookmarks/highlights URL: `https://micro.blog/posts/bookmarks/highlights` Returns saved bookmark highlights in JSON Feed format. Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X GET "https://micro.blog/posts/bookmarks/highlights" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON Feed response. Example response: ```json { "version": "https://jsonfeed.org/version/1", "title": "Micro.blog - Highlights", "home_page_url": "https://micro.blog", "feed_url": "https://micro.blog/posts/bookmarks/highlights", "_microblog": { "about": "https://micro.blog/about/api", "count": 1 }, "items": [ { "id": 456, "title": "Saved article title", "content_text": "Highlighted passage from the saved article.", "url": "https://example.com/article", "date_published": "2026-04-26T12:00:00+00:00" } ] } ``` ### DELETE /posts/bookmarks/highlights/{id} URL: `https://micro.blog/posts/bookmarks/highlights/{id}` Deletes a bookmark highlight. Path parameters: - `id` (integer, required): Resource identifier. Example: `12345` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X DELETE "https://micro.blog/posts/bookmarks/highlights/{id}" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns an empty JSON object on success. Example response: ```json {} ``` ### GET /posts/bookmarks/tags URL: `https://micro.blog/posts/bookmarks/tags` Returns bookmark tag names for the authenticated user. Query parameters: - `recent` (boolean, optional): Set to `1` to return recent tags first. Example: `1` - `count` (integer, optional): Maximum number of items to return. Example: `10` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X GET "https://micro.blog/posts/bookmarks/tags" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns an array of bookmark tag names. Example response: ```json [ "reading", "reference" ] ``` ### DELETE /posts/bookmarks/tags/{id} URL: `https://micro.blog/posts/bookmarks/tags/{id}` Deletes a bookmark tag and clears it from bookmarks. Path parameters: - `id` (integer, required): Resource identifier. Example: `12345` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X DELETE "https://micro.blog/posts/bookmarks/tags/{id}" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns an empty JSON object on success. Example response: ```json {} ``` ### DELETE /posts/bookmarks/{id} URL: `https://micro.blog/posts/bookmarks/{id}` Removes a bookmark by bookmark ID or original post ID. Path parameters: - `id` (integer, required): Identifier for the resource. Example: `12345` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X DELETE "https://micro.blog/posts/bookmarks/{id}" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns an empty JSON object on success. Example response: ```json {} ``` ### GET /posts/bookmarks/{id} URL: `https://micro.blog/posts/bookmarks/{id}` Returns a single bookmark by bookmark ID or original post ID. Path parameters: - `id` (integer, required): Identifier for the resource. Example: `12345` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X GET "https://micro.blog/posts/bookmarks/{id}" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON Feed response. Example response: ```json { "version": "https://jsonfeed.org/version/1.1", "title": "Micro.blog - Bookmark", "home_page_url": "https://micro.blog", "feed_url": "https://micro.blog/posts/bookmarks/12345", "icon": "https://micro.blog/images/icons/favicon_256.png", "favicon": "https://micro.blog/images/icons/favicon_32.png", "_microblog": { "about": "https://micro.blog/about/api" }, "items": [ { "id": "12345", "content_html": "

Saved bookmark text.

", "url": "https://example.com/article", "date_published": "2026-04-26T12:00:00+00:00", "tags": "reading, reference" } ] } ``` ### POST /posts/bookmarks/{id} URL: `https://micro.blog/posts/bookmarks/{id}` Updates tags for an existing bookmark. Path parameters: - `id` (integer, required): Identifier for the resource. Example: `12345` Query parameters: - `tags` (string, required): Comma-separated bookmark tags. Example: `html, robots, something` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X POST "https://micro.blog/posts/bookmarks/{id}?tags=html%2C+robots%2C+something" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns an empty JSON object on success. Example response: ```json {} ``` ## Blocking and Reporting URL: https://microblog.dev/api/blocking-reporting/ Endpoints for reporting users and managing muted users. ### POST /users/block URL: `https://micro.blog/users/block` Blocks and mutes a user. Query parameters: - `username` (string, required): Micro.blog username. Example: `vincent` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X POST "https://micro.blog/users/block?username=vincent" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON response. Example response: ```json { "id": 12345, "username": "vincent" } ``` ### GET /users/blocking URL: `https://micro.blog/users/blocking` Returns blocked users. Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X GET "https://micro.blog/users/blocking" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON response. Example response: ```json [ { "id": 12345, "username": "vincent" } ] ``` ### DELETE /users/blocking/{id} URL: `https://micro.blog/users/blocking/{id}` Deletes a blocked user by ID. Path parameters: - `id` (integer, required): Resource identifier. Example: `12345` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X DELETE "https://micro.blog/users/blocking/{id}" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns an empty JSON object on success. Example response: ```json {} ``` ### POST /users/mute URL: `https://micro.blog/users/mute` Mutes a user or keyword for the authenticated user. Query parameters: - `username` (string, optional): Micro.blog username. Example: `gluon` - `keyword` (string, optional): Keyword to mute. Example: `spoiler` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X POST "https://micro.blog/users/mute?username=gluon" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns an empty JSON object on success. Example response: ```json {} ``` ### GET /users/muting URL: `https://micro.blog/users/muting` Returns muted users and keywords for the authenticated user. Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X GET "https://micro.blog/users/muting" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON response for the requested resource. Example response: ```json [ { "id": 12345, "username": "gluon", "domain": "", "keyword": "spoiler", "is_hiding_other_replies": true } ] ``` ### DELETE /users/muting/{id} URL: `https://micro.blog/users/muting/{id}` Deletes a muted user or keyword by ID. Path parameters: - `id` (integer, required): Identifier for the resource. Example: `12345` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X DELETE "https://micro.blog/users/muting/{id}" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns an empty JSON object on success. Example response: ```json {} ``` ### POST /users/muting/{id} URL: `https://micro.blog/users/muting/{id}` Updates a muted user or keyword setting. Path parameters: - `id` (integer, required): Resource identifier. Example: `12345` Query parameters: - `is_hiding_other_replies` (integer, optional): Whether muted-user replies from other people should be hidden. Example: `1` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X POST "https://micro.blog/users/muting/{id}" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns an empty JSON object on success. Example response: ```json {} ``` ### POST /users/report URL: `https://micro.blog/users/report` Reports a user for review. Query parameters: - `username` (string, required): Micro.blog username. Example: `vincent` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X POST "https://micro.blog/users/report?username=vincent" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns an empty JSON object on success. Example response: ```json {} ``` ## Users and Relationships URL: https://microblog.dev/api/users/ Endpoints for user search, following, relationship checks, discovery suggestions, and user logs. ### POST /users/follow URL: `https://micro.blog/users/follow` Follows a Micro.blog user or feed URL. Query parameters: - `username` (string, optional): Micro.blog username. Example: `vincent` - `feed_url` (string, optional): Feed URL. Example: `https://example.com/feed.json` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X POST "https://micro.blog/users/follow" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns an empty JSON object on success. Example response: ```json {} ``` ### GET /users/is_following URL: `https://micro.blog/users/is_following` Checks whether the authenticated user follows another user. Query parameters: - `username` (string, required): Micro.blog username. Example: `vincent` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X GET "https://micro.blog/users/is_following?username=vincent" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON response. Example response: ```json { "is_following": true, "is_you": false } ``` ### GET /users/discover/{username} URL: `https://micro.blog/users/discover/{username}` Returns suggested users based on a user's follows. Path parameters: - `username` (string, required): Micro.blog username. Example: `vincent` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X GET "https://micro.blog/users/discover/{username}" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns an array of suggested users. Example response: ```json [ { "name": "Vincent", "url": "https://vincent.micro.blog/", "avatar": "https://avatars.micro.blog/avatars/2026/123.jpg", "username": "vincent", "is_following": true, "is_you": false } ] ``` ### GET /users/following/{username} URL: `https://micro.blog/users/following/{username}` Returns users followed by the given username. Path parameters: - `username` (string, required): Micro.blog username. Example: `vincent` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X GET "https://micro.blog/users/following/{username}" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns an array of followed users. Example response: ```json [ { "name": "Vincent", "url": "https://vincent.micro.blog/", "avatar": "https://avatars.micro.blog/avatars/2026/123.jpg", "username": "vincent", "is_following": true, "is_you": false } ] ``` ### GET /users/search URL: `https://micro.blog/users/search` Searches Micro.blog users. Query parameters: - `q` (string, required): Search query or Micropub query type. Example: `Vincent` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X GET "https://micro.blog/users/search?q=Vincent" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns an array of matching users. Example response: ```json [ { "name": "Vincent", "url": "https://vincent.micro.blog/", "avatar": "https://avatars.micro.blog/avatars/2026/123.jpg", "username": "vincent", "bio": "Writing about Micro.blog and the web.", "is_following": true, "is_you": false } ] ``` ### GET /users/logs URL: `https://micro.blog/users/logs` Returns recent account log messages. Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X GET "https://micro.blog/users/logs" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON response. Example response: ```json [ { "date": "2026-04-26T12:00:00+00:00", "message": "Publishing complete", "is_error": false } ] ``` ### GET /users/logs/errors URL: `https://micro.blog/users/logs/errors` Returns recent account error log messages. Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X GET "https://micro.blog/users/logs/errors" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON response. Example response: ```json [ { "date": "2026-04-26T12:00:00+00:00", "message": "Could not refresh feed", "is_error": true } ] ``` ### POST /users/unfollow URL: `https://micro.blog/users/unfollow` Unfollows a Micro.blog user. Query parameters: - `username` (string, required): Micro.blog username. Example: `vincent` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X POST "https://micro.blog/users/unfollow?username=vincent" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns an empty JSON object on success. Example response: ```json {} ``` ## Profile URL: https://microblog.dev/api/profile/ Endpoints for profile-related metadata such as user pins. ### GET /users/pins/{username} URL: `https://micro.blog/users/pins/{username}` Returns profile pins for the given username. Path parameters: - `username` (string, required): Micro.blog username. Example: `vincent` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X GET "https://micro.blog/users/pins/{username}" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON response for the requested resource. Example response: ```json [ { "title": "Welcome", "description": "Created your Micro.blog account.", "icon": "https://micro.blog/images/pins/welcome.png", "is_unlocked": true } ] ``` ## Markers URL: https://microblog.dev/api/markers/ Endpoints for reading and updating timeline marker positions. ### GET /posts/check URL: `https://micro.blog/posts/check` Checks for new timeline posts, publishing state, media processing state, and saved marker positions. Query parameters: - `since_id` (integer, optional): Only return posts newer than this post ID. Example: `77479242` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X GET "https://micro.blog/posts/check" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns marker and publishing state. Example response: ```json { "count": 0, "check_seconds": 20, "markers": {}, "is_publishing": false, "is_processing": false, "publishing_progress": 0, "publishing_status": "", "latest_url": "" } ``` ### POST /posts/markers URL: `https://micro.blog/posts/markers` Stores a marker position for a timeline channel. Query parameters: - `channel` (string, required): Marker channel name. Example: `timeline` - `id` (integer, required): Identifier for the resource. Example: `12345` - `date_marked` (string, required): ISO 8601 timestamp for the marker position. Example: `2026-04-26T12:00:00Z` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X POST "https://micro.blog/posts/markers?channel=timeline&id=example&date_marked=2026-04-26T12%3A00%3A00Z" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns an empty JSON object on success. Example response: ```json {} ``` ## Conversations URL: https://microblog.dev/api/conversations/ Endpoints for resolving and reading Micro.blog conversation threads. ### GET /conversation.js URL: `https://micro.blog/conversation.js` Looks up a conversation for a post URL and returns it in the requested format. Query parameters: - `url` (string, required): URL to look up or modify. Example: `https://vincentritter.com/2022/03/29/16-09-31` - `format` (string, optional): Response format. Example: `jsonfeed` Example request: ```sh curl -X GET "https://micro.blog/conversation.js?url=https%3A%2F%2Fvincentritter.com%2F2022%2F03%2F29%2F16-09-31&format=jsonfeed" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns conversation data in the requested format. Example response: ```json { "version": "https://jsonfeed.org/version/1", "title": "Conversation", "home_page_url": "https://micro.blog/vincent/12345", "feed_url": "https://micro.blog/conversation.js?url=https%3A%2F%2Fexample.com%2Fpost&format=jsonfeed", "items": [ { "id": "98765", "content_html": "

@vincent Thanks!

", "url": "https://example.org/reply", "date_published": "2026-04-26T12:00:00+00:00", "author": { "name": "Manton Reece", "url": "https://manton.org/", "avatar": "https://avatars.micro.blog/avatars/2025/22/3.jpg", "_microblog": { "username": "manton" } } } ] } ``` ### GET /posts/conversation URL: `https://micro.blog/posts/conversation` Returns the conversation thread for a post, mention, favourite, or thread ID. Query parameters: - `id` (integer, required): Identifier for the resource. Example: `88924898` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X GET "https://micro.blog/posts/conversation?id=88924898" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON Feed response. Example response: ```json { "version": "https://jsonfeed.org/version/1.1", "title": "Micro.blog", "home_page_url": "https://micro.blog", "feed_url": "https://micro.blog/posts/conversation", "items": [] } ``` ## Books and Bookshelves URL: https://microblog.dev/api/books/ Endpoints for book search, bookshelves, bookshelf assignments, and reading goals. ### GET /books/search URL: `https://micro.blog/books/search` Searches books for discovery and bookshelf workflows. Query parameters: - `q` (string, required): Search query or Micropub query type. Example: `Less is more` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X GET "https://micro.blog/books/search?q=Less+is+more" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON Feed response. Example response: ```json { "version": "https://jsonfeed.org/version/1.1", "title": "Micro.blog", "home_page_url": "https://micro.blog", "feed_url": "https://micro.blog/books/search?q=Less+is+more", "_microblog": { "about": "https://micro.blog/about/api" }, "items": [ { "id": 321, "title": "Book title", "content_text": "Description text", "url": "https://micro.blog/books/9780143127796", "image": "https://example.com/cover.jpg", "date_published": "2026-04-26T12:00:00+00:00", "authors": [ { "name": "Author Name" } ], "_microblog": { "isbn": "9780143127796" } } ] } ``` ### POST /books URL: `https://micro.blog/books` Creates a book and assigns it to a bookshelf. Query parameters: - `title` (string, required): Title value. Example: `Book title` - `author` (string, optional): Author name. Example: `Author Name` - `isbn` (string, required): Book ISBN. Example: `9780143127796` - `bookshelf_id` (integer, required): Bookshelf identifier. Example: `654` - `cover_url` (string, optional): Cover image URL. Example: `https://example.com/cover.jpg` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X POST "https://micro.blog/books?title=Book+title&isbn=9780143127796&bookshelf_id=654" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns an empty JSON object on success. Example response: ```json {} ``` ### GET /books/bookshelves URL: `https://micro.blog/books/bookshelves` Returns bookshelves in JSON Feed format. Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X GET "https://micro.blog/books/bookshelves" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON Feed response. Example response: ```json { "version": "https://jsonfeed.org/version/1.1", "title": "Micro.blog - Bookshelves", "home_page_url": "https://micro.blog", "feed_url": "https://micro.blog/books/bookshelves", "_microblog": { "about": "https://micro.blog/about/api" }, "items": [ { "id": 654, "title": "Currently reading", "content_text": "", "url": "https://micro.blog/account/bookshelves/654", "date_published": "2026-04-26T12:00:00+00:00", "_microblog": { "type": "reading", "books_count": 3 } } ] } ``` ### POST /books/bookshelves URL: `https://micro.blog/books/bookshelves` Creates a bookshelf. Query parameters: - `name` (string, required): Name value. Example: `Reading` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X POST "https://micro.blog/books/bookshelves?name=Reading" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns an empty JSON object on success. Example response: ```json {} ``` ### POST /books/bookshelves/{bookshelf_id}/assign URL: `https://micro.blog/books/bookshelves/{bookshelf_id}/assign` Assigns an existing or resolved book to a bookshelf. Path parameters: - `bookshelf_id` (integer, required): Bookshelf identifier. Example: `654` Query parameters: - `book_id` (integer, optional): Book identifier. Example: `321` - `isbn` (string, optional): Book ISBN. Example: `9780143127796` - `title` (string, optional): Title value. Example: `Book title` - `author` (string, optional): Author name. Example: `Author Name` - `description` (string, optional): Description text. Example: `Description text` - `cover_url` (string, optional): Cover image URL. Example: `https://example.com/cover.jpg` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X POST "https://micro.blog/books/bookshelves/{bookshelf_id}/assign" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns an empty JSON object on success. Example response: ```json {} ``` ### POST /books/bookshelves/{bookshelf_id}/cover/{book_id} URL: `https://micro.blog/books/bookshelves/{bookshelf_id}/cover/{book_id}` Updates a book cover URL. Path parameters: - `bookshelf_id` (integer, required): Bookshelf identifier. Example: `654` - `book_id` (integer, required): Book identifier. Example: `321` Query parameters: - `cover_url` (string, required): Cover image URL. Example: `https://example.com/cover.jpg` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X POST "https://micro.blog/books/bookshelves/{bookshelf_id}/cover/{book_id}?cover_url=https%3A%2F%2Fexample.com%2Fcover.jpg" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns an empty JSON object on success. Example response: ```json {} ``` ### DELETE /books/bookshelves/{bookshelf_id}/remove/{book_id} URL: `https://micro.blog/books/bookshelves/{bookshelf_id}/remove/{book_id}` Removes a book from a bookshelf. Path parameters: - `bookshelf_id` (integer, required): Bookshelf identifier. Example: `654` - `book_id` (integer, required): Book identifier. Example: `321` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X DELETE "https://micro.blog/books/bookshelves/{bookshelf_id}/remove/{book_id}" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns an empty JSON object on success. Example response: ```json {} ``` ### POST /books/bookshelves/{bookshelf_id}/save/{book_id} URL: `https://micro.blog/books/bookshelves/{bookshelf_id}/save/{book_id}` Updates the finished date for a book on a bookshelf. Path parameters: - `bookshelf_id` (integer, required): Bookshelf identifier. Example: `654` - `book_id` (integer, required): Book identifier. Example: `321` Query parameters: - `date_finished` (string, required): Date the book was finished. Example: `2026-04-26` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X POST "https://micro.blog/books/bookshelves/{bookshelf_id}/save/{book_id}?date_finished=2026-04-26" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns an empty JSON object on success. Example response: ```json {} ``` ### GET /books/bookshelves/{id} URL: `https://micro.blog/books/bookshelves/{id}` Returns books in a bookshelf in JSON Feed format. Path parameters: - `id` (integer, required): Resource identifier. Example: `12345` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X GET "https://micro.blog/books/bookshelves/{id}" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON Feed response. Example response: ```json { "version": "https://jsonfeed.org/version/1.1", "title": "Micro.blog - Currently reading", "home_page_url": "https://micro.blog", "feed_url": "https://micro.blog/books/bookshelves/654", "_microblog": { "about": "https://micro.blog/about/api" }, "items": [ { "id": 321, "title": "Book title", "content_text": "Description text", "url": "https://micro.blog/books/9780143127796", "image": "https://example.com/cover.jpg", "date_published": "2026-04-26T12:00:00+00:00", "authors": [ { "name": "Author Name" } ], "_microblog": { "isbn": "9780143127796" } } ] } ``` ### POST /books/bookshelves/{id} URL: `https://micro.blog/books/bookshelves/{id}` Renames a bookshelf. Path parameters: - `id` (integer, required): Resource identifier. Example: `12345` Query parameters: - `name` (string, required): Name value. Example: `Reading` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X POST "https://micro.blog/books/bookshelves/{id}?name=Reading" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns an empty JSON object on success. Example response: ```json {} ``` ### GET /books/goals URL: `https://micro.blog/books/goals` Returns reading goals in JSON Feed format. Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X GET "https://micro.blog/books/goals" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON Feed response. Example response: ```json { "version": "https://jsonfeed.org/version/1.1", "title": "Micro.blog - Goals", "home_page_url": "https://micro.blog", "feed_url": "https://micro.blog/books/goals", "_microblog": { "about": "https://micro.blog/about/api" }, "items": [ { "id": 123, "title": "Reading 2026", "content_text": "6 of 24 books", "_microblog": { "goal_year": 2026, "goal_value": 24, "goal_progress": 6, "isbns": [ "9780143127796" ] } } ] } ``` ### GET /books/goals/{id} URL: `https://micro.blog/books/goals/{id}` Returns books for one reading goal in JSON Feed format. Path parameters: - `id` (integer, required): Resource identifier. Example: `12345` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X GET "https://micro.blog/books/goals/{id}" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON Feed response. Example response: ```json { "version": "https://jsonfeed.org/version/1.1", "title": "Micro.blog - Reading 2026", "home_page_url": "https://micro.blog", "feed_url": "https://micro.blog/books/goals/123", "_microblog": { "about": "https://micro.blog/about/api" }, "items": [ { "id": 321, "title": "Book title", "content_text": "", "url": "https://micro.blog/books/9780143127796", "image": "https://example.com/cover.jpg", "date_published": "2026-04-26T12:00:00+00:00", "authors": [ { "name": "Author Name" } ], "_microblog": { "isbn": "9780143127796" } } ] } ``` ### POST /books/goals/{id} URL: `https://micro.blog/books/goals/{id}` Updates a reading goal target or progress. Path parameters: - `id` (integer, required): Resource identifier. Example: `12345` Query parameters: - `value` (integer, optional): Goal target value. Example: `24` - `progress` (integer, optional): Goal progress value. Example: `5` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X POST "https://micro.blog/books/goals/{id}" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON response. Example response: ```json { "id": 123, "name": "Reading goal", "year": 2026, "value": 24, "progress": 6 } ``` ### POST /books/openlibrary/signin URL: `https://micro.blog/books/openlibrary/signin` Signs in to Open Library and returns the session value used by book cover workflows. Query parameters: - `username` (string, required): Open Library username. Example: `openlibrary-user` - `password` (string, required): Open Library password. Example: `openlibrary-password` Example request: ```sh curl -X POST "https://micro.blog/books/openlibrary/signin?username=openlibrary-user&password=openlibrary-password" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns the Open Library session path when sign-in succeeds, or an empty string when no session is available. Example response: ```json { "session": "/people/openlibrary-user-ABCDEFGH123456789" } ``` ## Push Notifications URL: https://microblog.dev/api/push/ Endpoints for registering, unregistering, and inspecting push notification devices. Notes: - Push notifications require additional setup on the Micro.blog side for your app's push credentials. Email [help@micro.blog](mailto:help@micro.blog) before using these endpoints with a custom `app_name`. ### GET /users/push/info URL: `https://micro.blog/users/push/info` Returns registered push devices for the authenticated user and push environment. Query parameters: - `push_env` (string, required): Push environment, for example `production` or `sandbox`. Example: `production` - `app_name` (string, optional): Name of the app requesting access. Example: `Micro.blog for Android` - `device_token` (string, optional): Push notification device token. Example: `TEST` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X GET "https://micro.blog/users/push/info?push_env=production" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON response for the requested resource. Example response: ```json [ { "token": "DEVICE_TOKEN", "app_name": "Micro.blog for iOS", "push_env": "production", "created_at": "2026-04-26T12:00:00+00:00" } ] ``` ### POST /users/push/register URL: `https://micro.blog/users/push/register` Registers a device token for push notifications. Query parameters: - `device_token` (string, required): Push notification device token. Example: `TEST` - `push_env` (string, required): Push environment, for example `production` or `sandbox`. Example: `production` - `app_name` (string, optional): Name of the app requesting access. Example: `Micro.blog for Android` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X POST "https://micro.blog/users/push/register?device_token=TEST&push_env=production" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 201 - Content-Type: `application/json` - Description: Returns registration status and device metadata. Already-registered devices return 200 with the same shape. Example response: ```json { "status": "success", "message": "Device registered", "device": { "token": "DEVICE_TOKEN", "app_name": "Micro.blog for Android", "push_env": "production", "created_at": "2026-04-26T12:00:00+00:00" } } ``` ### POST /users/push/unregister URL: `https://micro.blog/users/push/unregister` Unregisters a device token for push notifications. Query parameters: - `device_token` (string, required): Push notification device token. Example: `TEST` - `push_env` (string, required): Push environment, for example `production` or `sandbox`. Example: `production` - `app_name` (string, optional): Name of the app requesting access. Example: `Micro.blog for Android` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X POST "https://micro.blog/users/push/unregister?device_token=TEST&push_env=production" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns unregister status. Example response: ```json { "status": "success", "message": "Device unregistered" } ``` ## Feeds and Reader URL: https://microblog.dev/api/feeds/ Feedbin-compatible reader endpoints, feed highlights, recap settings, public JSON feeds, and feed discovery helpers. ### GET /blogroll.org.json URL: `https://micro.blog/blogroll.org.json` Returns the public blogroll.org JSON feed. Example request: ```sh curl -X GET "https://micro.blog/blogroll.org.json" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON Feed response. Example response: ```json { "version": "https://jsonfeed.org/version/1.1", "items": [] } ``` ### GET /feeds/highlights URL: `https://micro.blog/feeds/highlights` Returns reader highlights in JSON Feed format. Query parameters: - `limit` (integer, optional): Maximum number of items to return. Example: `25` - `offset` (integer, optional): Number of items to skip before returning results. Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X GET "https://micro.blog/feeds/highlights" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON Feed response. Example response: ```json { "version": "https://jsonfeed.org/version/1.1", "items": [] } ``` ### GET /feeds/photos.json URL: `https://micro.blog/feeds/photos.json` Returns the public photos feed in JSON Feed format. Example request: ```sh curl -X GET "https://micro.blog/feeds/photos.json" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON Feed response. Example response: ```json { "version": "https://jsonfeed.org/version/1.1", "items": [] } ``` ### POST /feeds/recap URL: `https://micro.blog/feeds/recap` Builds or queues an HTML recap for reader entries. Query parameters: - `reset` (integer, optional): Set to `1` to reset cached recap output. Example: `1` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Body parameters: - `ids` (array, required): Array of entry IDs to include in the recap. Example: `[123 456]` Example request: ```sh curl -X POST "https://micro.blog/feeds/recap" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 202 - Content-Type: `text/html` - Description: Returns cached recap HTML when ready, otherwise queues work and returns 202. Example response: ```html

Today in your feeds

Summary HTML for the requested entries.

``` ### GET /feeds/recap/email URL: `https://micro.blog/feeds/recap/email` Returns reader recap email settings. Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X GET "https://micro.blog/feeds/recap/email" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON response. Example response: ```json { "dayofweek": "monday" } ``` ### POST /feeds/recap/email URL: `https://micro.blog/feeds/recap/email` Updates reader recap email settings. Query parameters: - `dayofweek` (string, required): Recap email day of week. Example: `monday` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X POST "https://micro.blog/feeds/recap/email?dayofweek=monday" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON response. Example response: ```json { "dayofweek": "monday" } ``` ### GET /feeds/v2/entries.json URL: `https://micro.blog/feeds/v2/entries.json` Returns Feedbin-compatible entries. Query parameters: - `ids` (string, optional): Comma-separated entry IDs. Example: `123,456` - `read` (string, optional): Filter by read state. Use `false` for unread and `true` for read. Example: `false` - `since` (string, optional): ISO 8601 timestamp used to return newer records. Example: `2026-04-26T12:00:00Z` - `starred` (boolean, optional): Filter starred entries. Example: `true` - `per_page` (integer, optional): Number of entries per page. Example: `25` - `page` (integer, optional): Page number. Example: `1` - `mode` (string, optional): Response mode. Use `extended` to include extended fields. Example: `extended` - `include_enclosure` (boolean, optional): Set to `true` to include enclosure data. Example: `true` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X GET "https://micro.blog/feeds/v2/entries.json" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON response. Example response: ```json [ { "id": 1001, "feed_id": 123, "title": "Example post", "url": "https://example.com/post", "extracted_content_url": null, "author": "Example Author", "content": "

Entry HTML.

", "summary": "Entry summary.", "published": "2026-04-26T12:00:00.000000Z", "created_at": "2026-04-26T12:05:00.000000Z" } ] ``` ### GET /feeds/v2/entries/{id}.json URL: `https://micro.blog/feeds/v2/entries/{id}.json` Returns one Feedbin-compatible entry. Path parameters: - `id` (integer, required): Resource identifier. Example: `12345` Query parameters: - `mode` (string, optional): Response mode. Use `extended` to include extended fields. Example: `extended` - `include_enclosure` (boolean, optional): Set to `true` to include enclosure data. Example: `true` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X GET "https://micro.blog/feeds/v2/entries/{id}.json" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON response. Example response: ```json { "id": 1001, "feed_id": 123, "title": "Example post", "url": "https://example.com/post", "extracted_content_url": null, "author": "Example Author", "content": "

Entry HTML.

", "summary": "Entry summary.", "published": "2026-04-26T12:00:00.000000Z", "created_at": "2026-04-26T12:05:00.000000Z" } ``` ### GET /feeds/v2/feeds/{id}/entries.json URL: `https://micro.blog/feeds/v2/feeds/{id}/entries.json` Returns entries for a single feed source. Path parameters: - `id` (integer, required): Resource identifier. Example: `12345` Query parameters: - `read` (string, optional): Filter by read state. Use `false` for unread and `true` for read. Example: `false` - `starred` (boolean, optional): Filter starred entries. Example: `true` - `since` (string, optional): ISO 8601 timestamp used to return newer records. Example: `2026-04-26T12:00:00Z` - `per_page` (integer, optional): Number of entries per page. Example: `25` - `page` (integer, optional): Page number. Example: `1` - `mode` (string, optional): Response mode. Use `extended` to include extended fields. Example: `extended` - `include_enclosure` (boolean, optional): Set to `true` to include enclosure data. Example: `true` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X GET "https://micro.blog/feeds/v2/feeds/{id}/entries.json" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON response. Example response: ```json [ { "id": 1001, "feed_id": 123, "title": "Example post", "url": "https://example.com/post", "extracted_content_url": null, "author": "Example Author", "content": "

Entry HTML.

", "summary": "Entry summary.", "published": "2026-04-26T12:00:00.000000Z", "created_at": "2026-04-26T12:05:00.000000Z" } ] ``` ### GET /feeds/v2/icons.json URL: `https://micro.blog/feeds/v2/icons.json` Returns feed icon URLs for subscribed feeds. Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X GET "https://micro.blog/feeds/v2/icons.json" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON response. Example response: ```json [ { "host": "example.com", "url": "https://example.com/favicon.png" } ] ``` ### DELETE /feeds/v2/starred_entries.json URL: `https://micro.blog/feeds/v2/starred_entries.json` Unstars entries. Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Body parameters: - `starred_entries` (array, required): Array of entry IDs to star or unstar. Example: `[123 456]` Example request: ```sh curl -X DELETE "https://micro.blog/feeds/v2/starred_entries.json" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON response. Example response: ```json [ 1001, 1002 ] ``` ### GET /feeds/v2/starred_entries.json URL: `https://micro.blog/feeds/v2/starred_entries.json` Returns starred entry IDs. Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X GET "https://micro.blog/feeds/v2/starred_entries.json" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON response. Example response: ```json [ 1001, 1002 ] ``` ### POST /feeds/v2/starred_entries.json URL: `https://micro.blog/feeds/v2/starred_entries.json` Stars entries. Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Body parameters: - `starred_entries` (array, required): Array of entry IDs to star or unstar. Example: `[123 456]` Example request: ```sh curl -X POST "https://micro.blog/feeds/v2/starred_entries.json" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON response. Example response: ```json [ 1001, 1002 ] ``` ### GET /feeds/v2/subscriptions.json URL: `https://micro.blog/feeds/v2/subscriptions.json` Returns Feedbin-compatible subscriptions. Query parameters: - `since` (string, optional): ISO 8601 timestamp used to return newer records. Example: `2026-04-26T12:00:00Z` - `mode` (string, optional): Response mode. Use `extended` to include extended fields. Example: `extended` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X GET "https://micro.blog/feeds/v2/subscriptions.json" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON response. Example response: ```json [ { "id": 456, "created_at": "2026-04-26T12:00:00.000000Z", "feed_id": 123, "title": "Example Feed", "feed_url": "https://example.com/feed.json", "site_url": "https://example.com/" } ] ``` ### POST /feeds/v2/subscriptions.json URL: `https://micro.blog/feeds/v2/subscriptions.json` Creates a subscription from a feed URL. Query parameters: - `feed_url` (string, required): Feed URL. Example: `https://example.com/feed.json` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X POST "https://micro.blog/feeds/v2/subscriptions.json?feed_url=https%3A%2F%2Fexample.com%2Ffeed.json" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON response. Example response: ```json { "id": 456, "created_at": "2026-04-26T12:00:00.000000Z", "feed_id": 123, "title": "Example Feed", "feed_url": "https://example.com/feed.json", "site_url": "https://example.com/" } ``` ### DELETE /feeds/v2/subscriptions/{id}.json URL: `https://micro.blog/feeds/v2/subscriptions/{id}.json` Deletes a subscription. Path parameters: - `id` (integer, required): Resource identifier. Example: `12345` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X DELETE "https://micro.blog/feeds/v2/subscriptions/{id}.json" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 204 - Content-Type: `text/plain` - Description: Returns no content on success. Example response: ```text (empty response body) ``` ### GET /feeds/v2/subscriptions/{id}.json URL: `https://micro.blog/feeds/v2/subscriptions/{id}.json` Returns one Feedbin-compatible subscription. Path parameters: - `id` (integer, required): Resource identifier. Example: `12345` Query parameters: - `mode` (string, optional): Response mode. Use `extended` to include extended fields. Example: `extended` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X GET "https://micro.blog/feeds/v2/subscriptions/{id}.json" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON response. Example response: ```json { "id": 456, "created_at": "2026-04-26T12:00:00.000000Z", "feed_id": 123, "title": "Example Feed", "feed_url": "https://example.com/feed.json", "site_url": "https://example.com/" } ``` ### PATCH /feeds/v2/subscriptions/{id}.json URL: `https://micro.blog/feeds/v2/subscriptions/{id}.json` Updates a subscription title. Path parameters: - `id` (integer, required): Resource identifier. Example: `12345` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Body parameters: - `title` (string, required): Title value. Example: `Book title` Example request: ```sh curl -X PATCH "https://micro.blog/feeds/v2/subscriptions/{id}.json" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" \ --data "title=Book title" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON response. Example response: ```json { "id": 456, "created_at": "2026-04-26T12:00:00.000000Z", "feed_id": 123, "title": "Renamed Feed", "feed_url": "https://example.com/feed.json", "site_url": "https://example.com/" } ``` ### POST /feeds/v2/subscriptions/{id}/update.json URL: `https://micro.blog/feeds/v2/subscriptions/{id}/update.json` Queues a refresh for a subscription. Path parameters: - `id` (integer, required): Resource identifier. Example: `12345` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X POST "https://micro.blog/feeds/v2/subscriptions/{id}/update.json" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON response. Example response: ```json { "id": 456, "created_at": "2026-04-26T12:00:00.000000Z", "feed_id": 123, "title": "Example Feed", "feed_url": "https://example.com/feed.json", "site_url": "https://example.com/" } ``` ### DELETE /feeds/v2/unread_entries.json URL: `https://micro.blog/feeds/v2/unread_entries.json` Marks entries as read. Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Body parameters: - `unread_entries` (array, required): Array of entry IDs to mark unread or read. Example: `[123 456]` Example request: ```sh curl -X DELETE "https://micro.blog/feeds/v2/unread_entries.json" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns the entry IDs that were marked read. Example response: ```json [ 1001, 1002 ] ``` ### GET /feeds/v2/unread_entries.json URL: `https://micro.blog/feeds/v2/unread_entries.json` Returns unread entry IDs. Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X GET "https://micro.blog/feeds/v2/unread_entries.json" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON response. Example response: ```json [ 1001, 1002 ] ``` ### POST /feeds/v2/unread_entries.json URL: `https://micro.blog/feeds/v2/unread_entries.json` Marks entries as unread. Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Body parameters: - `unread_entries` (array, required): Array of entry IDs to mark unread or read. Example: `[123 456]` Example request: ```sh curl -X POST "https://micro.blog/feeds/v2/unread_entries.json" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns the entry IDs that were marked unread. Example response: ```json [ 1001, 1002 ] ``` ### POST /feeds/v2/unread_entries/delete.json URL: `https://micro.blog/feeds/v2/unread_entries/delete.json` Marks entries as read using Feedbin-compatible POST semantics. Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Body parameters: - `unread_entries` (array, required): Array of entry IDs to mark unread or read. Example: `[123 456]` Example request: ```sh curl -X POST "https://micro.blog/feeds/v2/unread_entries/delete.json" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON response. Example response: ```json [ 1001, 1002 ] ``` ### GET /feeds/{entry_id}/highlights URL: `https://micro.blog/feeds/{entry_id}/highlights` Returns highlights for one reader entry in JSON Feed format. Path parameters: - `entry_id` (integer, required): Reader entry identifier. Example: `789` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X GET "https://micro.blog/feeds/{entry_id}/highlights" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON Feed response. Example response: ```json { "version": "https://jsonfeed.org/version/1.1", "items": [] } ``` ### POST /feeds/{entry_id}/highlights URL: `https://micro.blog/feeds/{entry_id}/highlights` Creates a highlight for a reader entry. Path parameters: - `entry_id` (integer, required): Reader entry identifier. Example: `789` Query parameters: - `text` (string, required): Text content. Example: `Highlighted text` - `start` (integer, optional): Selection start offset. Example: `10` - `end` (integer, optional): Selection end offset. Example: `40` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X POST "https://micro.blog/feeds/{entry_id}/highlights?text=Highlighted+text" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON response. Example response: ```json { "id": 987, "count": 3 } ``` ### DELETE /feeds/{entry_id}/highlights/{highlight_id} URL: `https://micro.blog/feeds/{entry_id}/highlights/{highlight_id}` Deletes a reader highlight. Path parameters: - `entry_id` (integer, required): Reader entry identifier. Example: `789` - `highlight_id` (integer, required): Highlight identifier. Example: `987` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X DELETE "https://micro.blog/feeds/{entry_id}/highlights/{highlight_id}" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns an empty JSON object on success. Example response: ```json {} ``` ### GET /feeds/{username}.json URL: `https://micro.blog/feeds/{username}.json` Returns a public user feed in JSON Feed format. Path parameters: - `username` (string, required): Micro.blog username. Example: `vincent` Query parameters: - `count` (integer, optional): count parameter. Example: `example` Example request: ```sh curl -X GET "https://micro.blog/feeds/{username}.json" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON Feed response. Example response: ```json { "version": "https://jsonfeed.org/version/1.1", "items": [] } ``` ### GET /feeds/{username}/bookmarks/{readlater_queue}.json URL: `https://micro.blog/feeds/{username}/bookmarks/{readlater_queue}.json` Returns a private JSON Feed of bookmark and archived read-later links for a user queue. Path parameters: - `username` (string, required): Micro.blog username. Example: `vincent` - `readlater_queue` (string, required): Private read-later queue token for the user. Example: `QUEUE_TOKEN` Example request: ```sh curl -X GET "https://micro.blog/feeds/{username}/bookmarks/{readlater_queue}.json" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON Feed response. Example response: ```json { "version": "https://jsonfeed.org/version/1", "items": [] } ``` ### GET /feeds/{username}/mentions.json URL: `https://micro.blog/feeds/{username}/mentions.json` Returns public mentions for a user in JSON Feed format. Path parameters: - `username` (string, required): Micro.blog username. Example: `vincent` Query parameters: - `count` (integer, optional): count parameter. Example: `example` Example request: ```sh curl -X GET "https://micro.blog/feeds/{username}/mentions.json" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON Feed response. Example response: ```json { "version": "https://jsonfeed.org/version/1.1", "items": [] } ``` ### GET /feeds/{username}/readlater/{readlater_queue}.json URL: `https://micro.blog/feeds/{username}/readlater/{readlater_queue}.json` Returns a private JSON Feed of read-later articles for a user queue. Path parameters: - `username` (string, required): Micro.blog username. Example: `vincent` - `readlater_queue` (string, required): Private read-later queue token for the user. Example: `QUEUE_TOKEN` Example request: ```sh curl -X GET "https://micro.blog/feeds/{username}/readlater/{readlater_queue}.json" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON Feed response. Example response: ```json { "version": "https://jsonfeed.org/version/1", "items": [] } ``` ### GET /feeds/{username}/webmentions.json URL: `https://micro.blog/feeds/{username}/webmentions.json` Returns public webmentions for a user in JSON Feed format. Path parameters: - `username` (string, required): Micro.blog username. Example: `vincent` Example request: ```sh curl -X GET "https://micro.blog/feeds/{username}/webmentions.json" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON Feed response. Example response: ```json { "version": "https://jsonfeed.org/version/1.1", "items": [] } ``` ## Notes URL: https://microblog.dev/api/notes/ Endpoints for notes and notebooks. ### POST /notes URL: `https://micro.blog/notes` Creates a note, or updates an existing note when `id` is provided. Query parameters: - `id` (integer, optional): Identifier for the resource. Example: `12345` - `text` (string, required): Text content. Example: `Draft note text` - `attached_post_id` (integer, optional): Post ID to attach to the note. Example: `77479242` - `attached_book_isbn` (string, optional): Book ISBN to attach to the note. Example: `9780143127796` - `notebook_id` (integer, optional): Notebook ID for the note. Example: `2` - `is_encrypted` (boolean, optional): Whether the note is encrypted. Example: `1` - `is_sharing` (boolean, optional): Set to share the note publicly. Example: `1` - `is_unsharing` (boolean, optional): Set to stop sharing a note. Example: `1` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X POST "https://micro.blog/notes?text=Draft+note+text" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns the created or updated note. Example response: ```json { "id": 12345, "title": "", "content_text": "Draft note text", "content_html": "", "url": "https://micro.blog/notes/12345", "date_published": "2026-04-26T12:00:00+00:00", "date_modified": "2026-04-26T12:00:00+00:00", "_microblog": { "is_encrypted": true, "is_shared": false, "shared_url": "", "attached_book_isbn": "9780143127796", "attached_book_title": "Book title" } } ``` ### GET /notes/for_book URL: `https://micro.blog/notes/for_book` Returns notes attached to a book ISBN in JSON Feed format. Query parameters: - `isbn` (string, required): Book ISBN. Example: `9780143127796` - `count` (integer, optional): count parameter. Example: `example` - `offset` (integer, optional): Number of items to skip before returning results. Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X GET "https://micro.blog/notes/for_book?isbn=9780143127796" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON Feed response. Example response: ```json { "version": "https://jsonfeed.org/version/1.1", "title": "Micro.blog - Notes for Book", "home_page_url": "https://micro.blog", "feed_url": "https://micro.blog/notes/for_book?isbn=9780143127796", "items": [ { "id": 12345, "title": "", "content_text": "Notes about this chapter.", "content_html": "", "url": "https://micro.blog/notes/12345", "date_published": "2026-04-26T12:00:00+00:00", "date_modified": "2026-04-26T12:30:00+00:00", "_microblog": { "is_encrypted": true, "is_shared": false, "shared_url": "", "attached_book_isbn": "9780143127796", "attached_book_title": "Book title" } } ] } ``` ### GET /notes/notebooks URL: `https://micro.blog/notes/notebooks` Returns notebooks for the authenticated user in JSON Feed format. Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X GET "https://micro.blog/notes/notebooks" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON Feed response. Example response: ```json { "version": "https://jsonfeed.org/version/1.1", "title": "Micro.blog", "home_page_url": "https://micro.blog", "feed_url": "https://micro.blog/notes/notebooks", "_microblog": { "about": "https://micro.blog/about/api" }, "items": [ { "id": 2, "title": "Reading", "content_text": "", "url": "https://micro.blog/notes/notebooks/2", "date_published": "2026-04-26T12:00:00+00:00", "_microblog": { "type": "reading", "colors": { "light": "#ffffff", "dark": "#111827" } } } ] } ``` ### POST /notes/notebooks URL: `https://micro.blog/notes/notebooks` Creates a notebook or updates an existing notebook when `id` is provided. Query parameters: - `name` (string, optional): Title or notebook name, depending on the endpoint. Example: `Test Notebook` - `id` (integer, optional): Identifier for the resource. Example: `33` - `color_light` (string, optional): Light-mode notebook colour. Example: `#ffffff` - `color_dark` (string, optional): Dark-mode notebook colour. Example: `#111827` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X POST "https://micro.blog/notes/notebooks" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns the created or updated notebook. Example response: ```json { "id": 33, "name": "Test Notebook", "colors": { "light": "#ffffff", "dark": "#111827" } } ``` ### DELETE /notes/notebooks/{id} URL: `https://micro.blog/notes/notebooks/{id}` Deletes a notebook and its notes. Path parameters: - `id` (integer, required): Resource identifier. Example: `12345` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X DELETE "https://micro.blog/notes/notebooks/{id}" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns an empty JSON object on success. Example response: ```json {} ``` ### GET /notes/notebooks/{id} URL: `https://micro.blog/notes/notebooks/{id}` Returns notes in a notebook in JSON Feed format. Path parameters: - `id` (integer, required): Identifier for the resource. Example: `12345` Query parameters: - `count` (integer, optional): Maximum number of items to return. Example: `60` - `offset` (integer, optional): Number of items to skip before returning results. Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X GET "https://micro.blog/notes/notebooks/{id}" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON Feed response. Example response: ```json { "version": "https://jsonfeed.org/version/1.1", "title": "Micro.blog", "home_page_url": "https://micro.blog", "feed_url": "https://micro.blog/notes/notebooks/{id}", "_microblog": { "about": "https://micro.blog/about/api", "notebook": { "id": 2, "name": "Reading", "colors": { "light": "#ffffff", "dark": "#111827" } } }, "items": [ { "id": 12345, "title": "", "content_text": "Notes about this chapter.", "content_html": "", "url": "https://micro.blog/notes/12345", "date_published": "2026-04-26T12:00:00+00:00", "date_modified": "2026-04-26T12:30:00+00:00", "_microblog": { "is_encrypted": true, "is_shared": false, "shared_url": "", "attached_book_isbn": "9780143127796", "attached_book_title": "Book title" } } ] } ``` ### DELETE /notes/{note_id} URL: `https://micro.blog/notes/{note_id}` Deletes a note by ID. Path parameters: - `note_id` (integer, required): Note identifier. Example: `12345` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X DELETE "https://micro.blog/notes/{note_id}" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns an empty JSON object on success. Example response: ```json {} ``` ### GET /notes/{note_id} URL: `https://micro.blog/notes/{note_id}` Returns a single note by ID. Path parameters: - `note_id` (integer, required): Note identifier. Example: `12345` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X GET "https://micro.blog/notes/{note_id}" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a single note object. Example response: ```json { "id": 12345, "title": "", "content_text": "Draft note text", "content_html": "", "url": "https://micro.blog/notes/12345", "date_published": "2026-04-26T12:00:00+00:00", "date_modified": "2026-04-26T12:30:00+00:00", "_microblog": { "is_encrypted": true, "is_shared": false, "shared_url": "", "attached_book_isbn": "9780143127796", "attached_book_title": "Book title" } } ``` ### GET /notes/{note_id}/versions URL: `https://micro.blog/notes/{note_id}/versions` Returns note versions in JSON Feed format. Path parameters: - `note_id` (string, required): note id parameter. Example: `example` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X GET "https://micro.blog/notes/{note_id}/versions" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON Feed response. Example response: ```json { "version": "https://jsonfeed.org/version/1.1", "title": "Micro.blog - Versions", "home_page_url": "https://micro.blog", "feed_url": "https://micro.blog/notes/12345/versions", "items": [ { "id": 987, "title": "", "content_text": "Earlier note text", "content_html": "", "url": "https://micro.blog/notes/12345", "date_published": "2026-04-26T11:30:00+00:00", "_microblog": { "is_encrypted": true, "is_shared": false, "shared_url": "" } } ] } ``` ## Movies URL: https://microblog.dev/api/movies/ Endpoints for movie and TV discovery, search, and posting helpers. ### GET /movies/discover URL: `https://micro.blog/movies/discover` Returns recent movie and TV activity in JSON Feed format. Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X GET "https://micro.blog/movies/discover" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON Feed response. Example response: ```json { "version": "https://jsonfeed.org/version/1.1", "title": "Micro.blog - Discover Movies", "home_page_url": "https://micro.blog", "feed_url": "https://micro.blog/movies/discover", "_microblog": { "about": "https://micro.blog/about/api" }, "items": [ { "id": "12345", "title": "Dune: Part Two", "content_text": "Paul Atreides unites with Chani and the Fremen.", "url": "https://www.themoviedb.org/movie/693134", "image": "https://image.tmdb.org/t/p/w500/example.jpg", "date_published": "2026-04-26T12:00:00+00:00", "authors": [ { "name": "Vincent", "url": "https://vincent.micro.blog/", "avatar": "https://avatars.micro.blog/avatars/2026/123.jpg", "_microblog": { "username": "vincent", "user_id": 123 } } ], "_microblog": { "tmdb_id": "693134", "tmdb_url": "https://www.themoviedb.org/movie/693134", "poster_url": "https://image.tmdb.org/t/p/w500/example.jpg", "username": "vincent", "user_id": 123, "user_avatar_url": "https://avatars.micro.blog/avatars/2026/123.jpg", "date_timestamp": 1777204800 } } ] } ``` ### GET /movies/discover/{id} URL: `https://micro.blog/movies/discover/{id}` Returns TV season posting helpers for a TMDB show. Path parameters: - `id` (integer, required): TMDB show identifier. Example: `1399` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X GET "https://micro.blog/movies/discover/{id}" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON Feed response. Example response: ```json { "version": "https://jsonfeed.org/version/1.1", "title": "Micro.blog - Discover Movies - Severance", "home_page_url": "https://micro.blog", "feed_url": "https://micro.blog/movies/discover/95396", "_microblog": { "about": "https://micro.blog/about/api", "tmdb_id": "95396", "tmdb_url": "https://www.themoviedb.org/tv/95396", "movies_prefix": "Watched:", "movies_emoji_movie": "", "movies_emoji_tv": "", "title": "Severance", "overview": "Mark leads a team of office workers whose memories have been surgically divided.", "poster_url": "https://image.tmdb.org/t/p/w500/example.jpg", "number_of_seasons": 2, "number_of_episodes": 19, "type": "tv", "first_air_date": "2022-02-17", "post_text": "Watched: [Severance](https://www.themoviedb.org/tv/95396)" }, "items": [ { "id": "tv-95396-season-1", "title": "Season 1", "content_text": "The Macrodata Refinement team begins to question Lumon Industries.", "url": "https://www.themoviedb.org/tv/95396/season/1", "image": "https://micro.blog/photos/100x/https%3A%2F%2Fimage.tmdb.org%2Ft%2Fp%2Fw500%2Fexample.jpg", "_microblog": { "tmdb_id": "95396", "season_number": 1, "tmdb_url": "https://www.themoviedb.org/tv/95396/season/1", "post_text": "Watched: [Severance Season 1](https://www.themoviedb.org/tv/95396/season/1)", "movies_prefix": "Watched:", "movies_emoji_tv": "", "series_title": "Severance", "season_title": "Season 1", "overview": "The Macrodata Refinement team begins to question Lumon Industries.", "air_date": "2022-02-17", "episode_count": 9, "poster_url": "https://image.tmdb.org/t/p/w500/example.jpg" } } ] } ``` ### GET /movies/discover/{id}/seasons/{number} URL: `https://micro.blog/movies/discover/{id}/seasons/{number}` Returns TV episode posting helpers for a TMDB show season. Path parameters: - `id` (integer, required): TMDB show identifier. Example: `1399` - `number` (integer, required): Season number. Example: `1` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X GET "https://micro.blog/movies/discover/{id}/seasons/{number}" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON Feed response. Example response: ```json { "version": "https://jsonfeed.org/version/1.1", "title": "Micro.blog - Discover Movies - Severance Season 1", "home_page_url": "https://micro.blog", "feed_url": "https://micro.blog/movies/discover/95396/seasons/1", "_microblog": { "about": "https://micro.blog/about/api", "tmdb_id": "95396", "tmdb_url": "https://www.themoviedb.org/tv/95396/season/1", "season_number": "1", "movies_prefix": "Watched:", "movies_emoji_tv": "", "series_title": "Severance", "title": "Season 1", "overview": "The Macrodata Refinement team begins to question Lumon Industries.", "poster_url": "https://image.tmdb.org/t/p/w500/example.jpg", "episode_count": 9 }, "items": [ { "id": "tv-95396-season-1-episode-1", "title": "Severance S1E1: Good News About Hell", "content_text": "Mark is promoted to lead a team whose memories are divided between work and home.", "url": "https://www.themoviedb.org/tv/95396/season/1/episode/1", "image": "https://micro.blog/photos/100x/https%3A%2F%2Fimage.tmdb.org%2Ft%2Fp%2Fw500%2Fstill.jpg", "_microblog": { "tmdb_id": "95396", "season_number": "1", "episode_number": "1", "tmdb_url": "https://www.themoviedb.org/tv/95396/season/1/episode/1", "post_text": "Watched: [Severance S1E1, Good News About Hell](https://www.themoviedb.org/tv/95396/season/1/episode/1)", "movies_prefix": "Watched:", "movies_emoji_tv": "", "series_title": "Severance", "episode_title": "Good News About Hell", "overview": "Mark is promoted to lead a team whose memories are divided between work and home.", "still_url": "https://image.tmdb.org/t/p/w500/still.jpg", "large_still_url": "https://image.tmdb.org/t/p/w500/still.jpg", "runtime": 57, "air_date": "2022-02-17" } } ] } ``` ### GET /movies/search URL: `https://micro.blog/movies/search` Searches TMDB movies and TV shows. Query parameters: - `q` (string, required): Search query. Example: `search term` - `limit` (integer, optional): Maximum number of items to return. Example: `25` Header parameters: - `Authorization` (string, required): Bearer token for authentication. Format: `Bearer {token}`. Example: `Bearer EF7BB9BCAC1F6D561C93` Example request: ```sh curl -X GET "https://micro.blog/movies/search?q=search+term" \ --header "Authorization: Bearer EF7BB9BCAC1F6D561C93" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON Feed response. Example response: ```json { "version": "https://jsonfeed.org/version/1.1", "title": "Micro.blog - Movies Search", "home_page_url": "https://micro.blog", "feed_url": "https://micro.blog/movies/search", "_microblog": { "about": "https://micro.blog/about/api", "movies_prefix": "Watched:", "movies_emoji_movie": "", "movies_emoji_tv": "" }, "items": [ { "id": "movie-693134", "title": "Dune: Part Two", "content_text": "", "url": "https://www.themoviedb.org/movie/693134", "image": "https://image.tmdb.org/t/p/w500/example.jpg", "_microblog": { "tmdb_id": "693134", "type": "movie", "title": "Dune: Part Two", "tmdb_url": "https://www.themoviedb.org/movie/693134", "year": "2024", "director": "Denis Villeneuve", "poster_url": "https://image.tmdb.org/t/p/w500/example.jpg", "overview": "Paul Atreides unites with Chani and the Fremen.", "post_text": "Watched: [Dune: Part Two](https://www.themoviedb.org/movie/693134)", "movies_prefix": "Watched:", "movies_emoji_movie": "", "movies_emoji_tv": "" } } ] } ``` ## Status URL: https://microblog.dev/api/status/ Health check endpoint for Micro.blog. ### GET /status URL: `https://micro.blog/status` Runs service health checks and returns a status page with a smiley face. Example request: ```sh curl -X GET "https://micro.blog/status" ``` Response: - Status: 200 - Content-Type: `text/html` - Description: Returns an HTML status page with a smiley face after database, Redis, and queue health checks pass. Example response: ```html Micro.blog Status 🙂 ``` ## Twitter Archive URL: https://microblog.dev/api/twitter-archive/ Endpoints for reading imported Twitter archive data. ### GET /twitter/archive/{site_id}/recent.json URL: `https://micro.blog/twitter/archive/{site_id}/recent.json` Returns recent imported Twitter archive posts in JSON Feed format. Path parameters: - `site_id` (integer, required): Site identifier. Example: `123` Query parameters: - `offset` (integer, optional): Number of items to skip before returning results. Example request: ```sh curl -X GET "https://micro.blog/twitter/archive/{site_id}/recent.json" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON Feed response. Example response: ```json { "version": "https://jsonfeed.org/version/1.1", "items": [] } ``` ### GET /twitter/archive/{site_id}/search.json URL: `https://micro.blog/twitter/archive/{site_id}/search.json` Searches imported Twitter archive posts in JSON Feed format. Path parameters: - `site_id` (integer, required): Site identifier. Example: `123` Query parameters: - `q` (string, required): Search query. Example: `search term` Example request: ```sh curl -X GET "https://micro.blog/twitter/archive/{site_id}/search.json?q=search+term" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON Feed response. Example response: ```json { "version": "https://jsonfeed.org/version/1.1", "items": [] } ``` ### GET /twitter/archive/{site_id}/years.json URL: `https://micro.blog/twitter/archive/{site_id}/years.json` Returns years available in an imported Twitter archive. Path parameters: - `site_id` (integer, required): Site identifier. Example: `123` Example request: ```sh curl -X GET "https://micro.blog/twitter/archive/{site_id}/years.json" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON response. Example response: ```json [ 2024, 2025, 2026 ] ``` ### GET /twitter/archive/{site_id}/{year}/{month}.json URL: `https://micro.blog/twitter/archive/{site_id}/{year}/{month}.json` Returns imported Twitter archive posts for a year and month in JSON Feed format. Path parameters: - `site_id` (integer, required): Site identifier. Example: `123` - `year` (integer, required): Four-digit year. Example: `2024` - `month` (integer, required): Month number. Example: `4` Example request: ```sh curl -X GET "https://micro.blog/twitter/archive/{site_id}/{year}/{month}.json" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON Feed response. Example response: ```json { "version": "https://jsonfeed.org/version/1.1", "items": [] } ``` ## Webmention URL: https://microblog.dev/api/webmention/ Endpoints for receiving webmentions and reading conversation webmentions. ### GET /webmention URL: `https://micro.blog/webmention` Returns webmentions for a target URL as JSON Feed, JF2, or Microformats data. Query parameters: - `target` (string, required): Target URL. Example: `https://example.com/post` - `format` (string, optional): Response format. Example: `jsonfeed` Example request: ```sh curl -X GET "https://micro.blog/webmention?target=https%3A%2F%2Fexample.com%2Fpost" ``` Response: - Status: 200 - Content-Type: `application/json` - Description: Returns a JSON Feed response. Example response: ```json { "version": "https://jsonfeed.org/version/1.1", "items": [] } ``` ### POST /webmention URL: `https://micro.blog/webmention` Receives a Webmention and queues processing. Query parameters: - `source` (string, required): Source URL. Example: `https://example.org/reply` - `target` (string, required): Target URL. Example: `https://example.com/post` Example request: ```sh curl -X POST "https://micro.blog/webmention?source=https%3A%2F%2Fexample.org%2Freply&target=https%3A%2F%2Fexample.com%2Fpost" ``` Response: - Status: 202 - Content-Type: `text/plain` - Description: Returns 202 when the Webmention is accepted for processing. Example response: ```text (empty response body) ``` ## XML-RPC URL: https://microblog.dev/api/xml-rpc/ XML-RPC endpoint for MetaWeblog and Micro.blog-compatible clients. Use your Micro.blog username or email address with an app token as the password. Supported methods: Supported methods ### POST /xmlrpc URL: `https://micro.blog/xmlrpc` Accepts XML-RPC MetaWeblog and Micro.blog API method calls. Header parameters: - `Content-Type` (string, required): Request content type. Example: `text/xml` Body parameters: - `xml` (string, required): Raw XML-RPC request body. Example: `...` Example request: ```sh curl -X POST "https://micro.blog/xmlrpc" \ --header "Content-Type: text/xml" \ --data-binary @request.xml ``` Request examples: #### Create a published post Call `metaWeblog.newPost` with a site ID, username, app token, and content struct. Use `0` for the site ID to post to the user's default site. ```sh curl -X POST "https://micro.blog/xmlrpc" \ --header "Content-Type: text/xml" \ --data-binary @- <<'XML' metaWeblog.newPost 0 USERNAME APP_TOKEN title Hello from XML-RPC description This post was published with the MetaWeblog API. categories API post_status publish XML ``` #### Create a draft post Set `post_status` to `draft`. Other values are treated as published posts. ```sh curl -X POST "https://micro.blog/xmlrpc" \ --header "Content-Type: text/xml" \ --data-binary @- <<'XML' microblog.newPost 0 USERNAME APP_TOKEN description Draft text for later. post_status draft XML ``` #### Schedule a post Include `dateCreated` or `date_created` in the content struct to set the post date. Future dates are scheduled. ```sh curl -X POST "https://micro.blog/xmlrpc" \ --header "Content-Type: text/xml" \ --data-binary @- <<'XML' metaWeblog.newPost 0 USERNAME APP_TOKEN description This post will publish in the future. dateCreated 20260501T09:00:00 XML ``` #### Edit an existing post Call `metaWeblog.editPost` or `microblog.editPost` with the post ID, username, app token, and replacement content. ```sh curl -X POST "https://micro.blog/xmlrpc" \ --header "Content-Type: text/xml" \ --data-binary @- <<'XML' metaWeblog.editPost 12345 USERNAME APP_TOKEN title Updated title description Updated post text. XML ``` #### Delete a post Use `microblog.deletePost` with the post ID, username, and app token. ```sh curl -X POST "https://micro.blog/xmlrpc" \ --header "Content-Type: text/xml" \ --data-binary @- <<'XML' microblog.deletePost 12345 USERNAME APP_TOKEN XML ``` #### Upload media for a post Upload bytes with `metaWeblog.newMediaObject` or `microblog.newMediaObject`. The response includes a `url` that can be inserted into a later post. ```sh curl -X POST "https://micro.blog/xmlrpc" \ --header "Content-Type: text/xml" \ --data-binary @- <<'XML' metaWeblog.newMediaObject 0 USERNAME APP_TOKEN name photo.jpg type image/jpeg bits /9j/4AAQSkZJRgABAQAAAQABAAD... XML ``` Response: - Status: 200 - Content-Type: `text/xml` - Description: Returns an XML-RPC method response or fault. Example response: ```xml 12345 ``` ## Example Apps ### Micro.blog App URL: https://microblog.dev/example-apps/#microblog Source: https://github.com/microdotblog/microblog-react Stack: React Native, Axios, Micropub, IndieAuth, XML-RPC Official iOS and Android client The Micro.blog mobile app is a React Native client that signs in with Micro.blog tokens, reads timelines, posts through Micropub, uploads media, manages bookmarks, and registers for push notifications. Source files: - `src/api/MicroBlogApi.js`: Native Micro.blog REST endpoints for sign-in, timelines, replies, muting, push, bookmarks, and progress checks. - `src/api/MicroPubApi.js`: Micropub, IndieAuth, media upload, editing, drafts, pages, uploads, and collections. - `src/api/XMLRPCApi.js`: XML-RPC discovery and posting support for configured external blogs. Flows: #### Sign in and token verification The app can verify an existing app token or request an email sign-in link that returns to the custom mobile URL scheme. Source references: - `src/api/MicroBlogApi.js:25` (login_with_token) - `src/api/MicroBlogApi.js:47` (login_with_email) Related endpoints: - `POST /account/signin` in `authentication`: Sends the email sign-in link and mobile redirect metadata. - `POST /account/verify` in `authentication`: Verifies an app token and returns the signed-in account profile. Example: ```js await axios.post("/account/signin", "", { params: { email, redirect_url: "microblog://signin/", app_name: "Micro.blog for Android" } }) ``` #### Profile, timelines, and discovery Timeline screens use the posts APIs for profile lookups, discovery, conversations, and the signed-in user's replies. Source references: - `src/api/MicroBlogApi.js:77` (get_profile) - `src/api/MicroBlogApi.js:129` (get_discover_timeline) - `src/api/MicroBlogApi.js:145` (get_conversation) - `src/api/MicroBlogApi.js:346` (get_replies) Related endpoints: - `GET /posts/{username}` in `posts`: Loads a user's profile feed; the app passes count=0 when it only needs profile metadata. - `GET /posts/discover` in `discover`: Loads the Discover feed and tagmoji metadata. - `GET /posts/conversation` in `conversations`: Loads conversation context for a timeline item. - `GET /posts/replies` in `posts`: Loads the signed-in user's replies timeline. Example: ```js const profile = await axios.get(`/posts/${username}`, { headers: { Authorization: `Bearer ${token}` }, params: { count: 0 } }) ``` #### Conversations and replies Conversation screens fetch the reply thread, then post a reply with form data to avoid duplicate submissions. Source references: - `src/api/MicroBlogApi.js:145` (get_conversation) - `src/api/MicroBlogApi.js:162` (send_reply) Related endpoints: - `GET /posts/conversation` in `conversations`: Fetches replies and context for a post ID. - `POST /posts/reply` in `posting`: Publishes a reply to an existing Micro.blog post. Example: ```js const body = new FormData() body.append("id", postId) body.append("content", markdown) await axios.post("/posts/reply", body, { headers: { Authorization: `Bearer ${token}` } }) ``` #### Posting, editing, drafts, and media The composer uses Micropub for configuration, categories, syndication targets, source queries, post creation, updates, deletion, and media uploads. Source references: - `src/api/MicroPubApi.js:152` (get_config) - `src/api/MicroPubApi.js:169` (send_post) - `src/api/MicroPubApi.js:292` (upload_image) - `src/api/MicroPubApi.js:396` (upload_chunk) - `src/api/MicroPubApi.js:558` (post_update) - `src/api/MicroBlogApi.js:554` (check_publishing_progress) Related endpoints: - `GET /micropub` in `posting`: Reads Micropub config, categories, syndication targets, contacts, posts, pages, drafts, and collections with q parameters. - `POST /micropub` in `posting`: Creates posts, updates posts, publishes drafts, deletes posts, and manages collections. - `GET /micropub/media` in `posting`: Searches and lists uploaded media. - `POST /micropub/media` in `posting`: Uploads images, videos, audio, and other media. - `POST /micropub/media/append` in `posting`: Uploads a large media file in chunks. - `POST /micropub/media/finished` in `posting`: Marks a chunked upload as ready for server processing. - `GET /micropub/media/waiting` in `posting`: Polls for media processing status. - `DELETE /posts/{id}` in `posts`: Deletes an existing Micro.blog post by ID. - `GET /posts/check` in `markers`: Checks whether publishing has completed and whether new posts are available. Example: ```js const body = new FormData() body.append("h", "entry") body.append("content", markdown) body.append("mp-destination", destination) body.append("mp-syndicate-to[]", syndicationTarget) await axios.post("https://micro.blog/micropub", body, { headers: { Authorization: `Bearer ${token}` } }) ``` #### Relationships, muting, and reporting Profile and safety controls use relationship endpoints for follow state, reports, muted users, muted keywords, and hiding other replies. Source references: - `src/api/MicroBlogApi.js:95` (follow_user) - `src/api/MicroBlogApi.js:112` (unfollow_user) - `src/api/MicroBlogApi.js:187` (report_user) - `src/api/MicroBlogApi.js:204` (get_muted_users) - `src/api/MicroBlogApi.js:220` (mute_user) Related endpoints: - `POST /users/follow` in `users`: Follows a user from profile and discovery screens. - `POST /users/unfollow` in `users`: Unfollows a user. - `POST /users/report` in `blocking-reporting`: Reports a user from the profile actions menu. - `GET /users/muting` in `blocking-reporting`: Lists muted users and keywords for settings. - `POST /users/mute` in `blocking-reporting`: Mutes a user, keyword, or hides other replies. - `DELETE /users/muting/{id}` in `blocking-reporting`: Removes a muted user or keyword. Example: ```js await axios.post("/users/mute", "", { headers: { Authorization: `Bearer ${token}` }, params: { username, is_hiding_other_replies: true } }) ``` #### Push notifications Device registration keeps push settings in sync with the signed-in Micro.blog account and the current platform environment. Source references: - `src/api/MicroBlogApi.js:275` (register_push) - `src/api/MicroBlogApi.js:300` (unregister_push) - `src/api/MicroBlogApi.js:325` (get_push_info) Related endpoints: - `GET /users/push/info` in `push`: Reads notification registration state for a device. - `POST /users/push/register` in `push`: Registers a device token for push notifications. - `POST /users/push/unregister` in `push`: Removes a device token when notifications are disabled or the user signs out. Example: ```js await axios.post("/users/push/register", "", { headers: { Authorization: `Bearer ${token}` }, params: { device_token: pushToken, push_env: "production", app_name: "Micro.blog for Android" } }) ``` #### Bookmarks and highlights Bookmark screens load saved links, tags, recent tags, highlights, and per-bookmark metadata, then save tag changes back to Micro.blog. Source references: - `src/api/MicroBlogApi.js:438` (bookmark_highlights) - `src/api/MicroBlogApi.js:473` (bookmark_tags) - `src/api/MicroBlogApi.js:513` (bookmark_by_id) - `src/api/MicroBlogApi.js:532` (save_tags_for_bookmark_by_id) Related endpoints: - `GET /posts/bookmarks/highlights` in `bookmarks`: Lists saved highlights from bookmarked pages. - `DELETE /posts/bookmarks/highlights/{id}` in `bookmarks`: Deletes a saved highlight. - `GET /posts/bookmarks/tags` in `bookmarks`: Lists all bookmark tags and recent tags. - `GET /posts/bookmarks/{id}` in `bookmarks`: Loads one bookmark and its metadata. - `POST /posts/bookmarks/{id}` in `bookmarks`: Saves tag changes for one bookmark. Example: ```js await axios.post(`/posts/bookmarks/${bookmarkId}`, "", { headers: { Authorization: `Bearer ${token}` }, params: { tags: "api, mobile" } }) ``` #### IndieAuth and external blog protocols The app can add external Micropub and XML-RPC services. For Micro.blog-hosted blogs, these same protocol endpoints are exposed by Micro.blog. Source references: - `src/api/MicroPubApi.js:28` (discover_micropub_endpoints) - `src/api/MicroPubApi.js:92` (make_auth_url) - `src/api/MicroPubApi.js:114` (verify_code) - `src/api/XMLRPCApi.js:17` (xmlRpcCall) Related endpoints: - `GET /indieauth/auth` in `authentication`: Starts the IndieAuth authorization flow for Micro.blog-hosted blogs. - `POST /indieauth/token` in `authentication`: Exchanges an authorization code for an access token. - `POST /xmlrpc` in `xml-rpc`: Handles MetaWeblog-compatible XML-RPC calls for Micro.blog-hosted blogs. Example: ```js const authUrl = `${authorizationEndpoint}?` + new URLSearchParams({ me, client_id: "https://micro.blog/", redirect_uri: "https://micro.blog/indieauth/redirect", response_type: "code", scope: "create" }) ``` ### Strata URL: https://microblog.dev/example-apps/#strata Source: https://github.com/microdotblog/strata Stack: React Native, Fetch API, Notes, Bookmarks, Micropub Notes and read-later client Strata is a React Native app for Micro.blog notes, notebooks, bookmarks, highlights, and lightweight posting. It uses the Micro.blog notes APIs for encrypted note storage and Micropub for publishing and saving bookmark entries. Source files: - `src/api/MicroBlogApi.js`: Micro.blog REST endpoints for sign-in, encrypted notes, notebooks, bookmarks, tags, and highlights. - `src/api/MicroPubApi.js`: Micropub configuration, category and syndication queries, publishing, post updates, and bookmark entries. Flows: #### Sign in and token verification Strata signs in through the Micro.blog account endpoints, using a custom redirect URL and app name for email sign-in. Source references: - `src/api/MicroBlogApi.js:17` (login_with_token) - `src/api/MicroBlogApi.js:38` (login_with_email) Related endpoints: - `POST /account/signin` in `authentication`: Sends the email sign-in link for Strata's custom URL scheme. - `POST /account/verify` in `authentication`: Verifies a Micro.blog app token and returns account information. Example: ```js const params = new URLSearchParams({ email, redirect_url: "strata://signin/", app_name: "Strata" }) await fetch(`https://micro.blog/account/signin?${params}`, { method: "POST" }) ``` #### Encrypted notes and notebooks The notes screens list notebooks, fetch notebook feeds, create or rename notebooks, save encrypted note text, share or unshare notes, and delete notes. Source references: - `src/api/MicroBlogApi.js:71` (fetch_notebooks) - `src/api/MicroBlogApi.js:113` (fetch_notes_paginated) - `src/api/MicroBlogApi.js:159` (post_note) - `src/api/MicroBlogApi.js:215` (create_or_rename_notebook) Related endpoints: - `GET /notes/notebooks` in `notes`: Lists notebooks for the signed-in user. - `POST /notes/notebooks` in `notes`: Creates a notebook or renames an existing notebook. - `GET /notes/notebooks/{id}` in `notes`: Loads notes in a notebook, including paginated fetches with count and offset. - `DELETE /notes/notebooks/{id}` in `notes`: Deletes a notebook. - `POST /notes` in `notes`: Creates, edits, shares, unshares, or encrypts a note. - `DELETE /notes/{note_id}` in `notes`: Deletes a note by ID. Example: ```js const form = new FormData() form.append("text", encryptedText) form.append("notebook_id", notebookId) form.append("is_encrypted", true) await fetch("https://micro.blog/notes", { method: "POST", headers: { Authorization: `Bearer ${token}` }, body: form }) ``` #### Bookmarks, tags, and highlights Strata's read-later views load bookmark feeds, filter by tag, update bookmark tags, delete bookmarks, fetch recent tags, list highlights, and delete highlights. Source references: - `src/api/MicroBlogApi.js:289` (get_bookmarks) - `src/api/MicroBlogApi.js:313` (delete_bookmark) - `src/api/MicroBlogApi.js:354` (get_highlights) - `src/api/MicroBlogApi.js:371` (delete_highlight) - `src/api/MicroBlogApi.js:409` (save_tags_for_bookmark) Related endpoints: - `GET /posts/bookmarks` in `bookmarks`: Loads saved bookmarks, optionally filtered by tag or before_id. - `DELETE /posts/bookmarks/{id}` in `bookmarks`: Deletes a saved bookmark. - `GET /posts/bookmarks/tags` in `bookmarks`: Lists all tags or recent tags for bookmark filtering. - `POST /posts/bookmarks/{id}` in `bookmarks`: Saves tag changes for one bookmark. - `GET /posts/bookmarks/highlights` in `bookmarks`: Lists highlights extracted from bookmarked pages. - `DELETE /posts/bookmarks/highlights/{id}` in `bookmarks`: Deletes a saved highlight. Example: ```js await fetch(`https://micro.blog/posts/bookmarks/${bookmarkId}?tags=${tags}`, { method: "POST", headers: { Authorization: `Bearer ${token}`, "Content-Type": "application/json" } }) ``` #### Micropub posting and bookmark creation Strata uses Micropub to read posting configuration, categories, and syndication targets, publish posts, update posts, and create bookmark entries from URLs. Source references: - `src/api/MicroPubApi.js:12` (get_config) - `src/api/MicroPubApi.js:30` (send_post) - `src/api/MicroPubApi.js:95` (get_categories) - `src/api/MicroPubApi.js:116` (get_syndicate_to) - `src/api/MicroPubApi.js:137` (send_entry) - `src/api/MicroPubApi.js:183` (post_update) Related endpoints: - `GET /micropub` in `posting`: Reads Micropub config, categories, and syndication targets. - `POST /micropub` in `posting`: Publishes posts, updates posts, and saves bookmark-of entries. Example: ```js const form = new FormData() form.append("h", "entry") form.append("bookmark-of", url) form.append("mp-destination", destination) await fetch("https://micro.blog/micropub", { method: "POST", headers: { Authorization: `Bearer ${token}` }, body: form }) ``` ### Inkwell URL: https://microblog.dev/example-apps/#inkwell Source: https://github.com/microdotblog/inkwell-react Stack: React Native, Expo AuthSession, MobX State Tree, Feeds, IndieAuth Reader and read-later client Inkwell is a React Native reader app for Micro.blog feeds, subscriptions, read state, bookmarks, highlights, conversations, and AI-powered recaps. It uses IndieAuth for sign-in and the Feedbin-compatible Micro.blog reader APIs for timeline and subscription workflows. Source files: - `src/api/MicroBlogAuth.js`: IndieAuth URL construction, code exchange, token verification, and session normalization. - `src/api/MicroBlogFeeds.js`: Feed subscriptions, entries, unread/starred state, bookmarks, highlights, conversation replies, and reader recaps. Flows: #### IndieAuth sign in and token verification Inkwell starts with an IndieAuth authorization URL, exchanges the callback code for an access token, then verifies that token with Micro.blog account metadata. Source references: - `src/api/MicroBlogAuth.js:17` (build_micro_blog_auth_url) - `src/api/MicroBlogAuth.js:72` (exchange_micro_blog_code) - `src/api/MicroBlogAuth.js:100` (verify_micro_blog_token) Related endpoints: - `GET /indieauth/auth` in `authentication`: Opens the authorization screen with Inkwell's client ID, redirect URL, scope, and state. - `POST /indieauth/token` in `authentication`: Exchanges the IndieAuth callback code for a Micro.blog access token. - `POST /account/verify` in `authentication`: Verifies the access token and reads profile, plan, and Inkwell capability fields. Example: ```js const tokenPayload = await exchange_micro_blog_code({ code, redirect_uri: "inkwell://auth/callback", client_id: "https://micro.ink/client.json" }) const profile = await verify_micro_blog_token(tokenPayload.access_token) ``` #### Subscriptions and feed timeline The main feed loads subscriptions, feed icons, timeline pages, and entries for a single subscription, while subscription management creates, renames, and deletes followed feeds. Source references: - `src/api/MicroBlogFeeds.js:13` (fetch_micro_blog_feed_subscriptions) - `src/api/MicroBlogFeeds.js:22` (create_micro_blog_feed_subscription) - `src/api/MicroBlogFeeds.js:95` (fetch_micro_blog_feed_entries) - `src/api/MicroBlogFeeds.js:149` (fetch_micro_blog_feed_entries_for_feed) - `src/api/MicroBlogFeeds.js:214` (update_micro_blog_feed_subscription) - `src/api/MicroBlogFeeds.js:243` (delete_micro_blog_feed_subscription) Related endpoints: - `GET /feeds/v2/subscriptions.json` in `feeds`: Lists subscriptions, including the extended mode used by Inkwell. - `POST /feeds/v2/subscriptions.json` in `feeds`: Adds a feed URL to the reader subscriptions. - `PATCH /feeds/v2/subscriptions/{id}.json` in `feeds`: Renames an existing subscription. - `DELETE /feeds/v2/subscriptions/{id}.json` in `feeds`: Removes a subscription. - `GET /feeds/v2/entries.json` in `feeds`: Loads paginated timeline entries for the main reader feed. - `GET /feeds/v2/feeds/{id}/entries.json` in `feeds`: Loads paginated entries for one feed subscription. - `GET /feeds/v2/icons.json` in `feeds`: Fetches feed icons used in subscription and timeline UI. Example: ```js const params = new URLSearchParams({ per_page: "50", page: String(page) }) const response = await fetch(`https://micro.blog/feeds/v2/entries.json?${params}`, { headers: { Accept: "application/json", Authorization: `Bearer ${token}` } }) const entries = await response.json() ``` #### Read state and saved reader entries Inkwell keeps reader state in sync by loading unread and starred entry IDs, marking entries read or unread, and starring or unstarring entries from the timeline. Source references: - `src/api/MicroBlogFeeds.js:192` (fetch_micro_blog_feed_unread_entry_ids) - `src/api/MicroBlogFeeds.js:200` (fetch_micro_blog_feed_starred_entry_ids) - `src/api/MicroBlogFeeds.js:520` (mark_micro_blog_feed_entries_read) - `src/api/MicroBlogFeeds.js:549` (mark_micro_blog_feed_entries_unread) - `src/api/MicroBlogFeeds.js:578` (bookmark_micro_blog_feed_entries) - `src/api/MicroBlogFeeds.js:607` (unbookmark_micro_blog_feed_entries) Related endpoints: - `GET /feeds/v2/unread_entries.json` in `feeds`: Loads IDs for unread entries. - `POST /feeds/v2/unread_entries.json` in `feeds`: Marks entries unread. - `DELETE /feeds/v2/unread_entries.json` in `feeds`: Marks entries read. - `GET /feeds/v2/starred_entries.json` in `feeds`: Loads IDs for starred reader entries. - `POST /feeds/v2/starred_entries.json` in `feeds`: Stars reader entries. - `DELETE /feeds/v2/starred_entries.json` in `feeds`: Unstars reader entries. Example: ```js await fetch("https://micro.blog/feeds/v2/unread_entries.json", { method: "DELETE", headers: { Accept: "application/json", Authorization: `Bearer ${token}`, "Content-Type": "application/json" }, body: JSON.stringify({ unread_entries: entryIds }) }) ``` #### Bookmarks and highlights The bookmark and highlight views load saved items, create new bookmark entries through Micropub, delete saved bookmarks, and create or delete reader highlights tied to feed entries. Source references: - `src/api/MicroBlogFeeds.js:295` (fetch_micro_blog_bookmarks) - `src/api/MicroBlogFeeds.js:301` (fetch_micro_blog_highlights) - `src/api/MicroBlogFeeds.js:307` (create_micro_blog_highlight) - `src/api/MicroBlogFeeds.js:382` (delete_micro_blog_highlight) - `src/api/MicroBlogFeeds.js:757` (create_micro_blog_bookmark) - `src/api/MicroBlogFeeds.js:806` (delete_micro_blog_bookmark) Related endpoints: - `GET /posts/bookmarks` in `bookmarks`: Loads saved bookmark entries. - `POST /micropub` in `posting`: Creates bookmark-of Micropub entries for new saved links. - `DELETE /posts/bookmarks/{id}` in `bookmarks`: Deletes saved bookmarks. - `GET /feeds/highlights` in `feeds`: Lists reader highlights across saved feed entries. - `POST /feeds/{entry_id}/highlights` in `feeds`: Creates a highlight for a reader entry, with optional text offsets. - `DELETE /feeds/{entry_id}/highlights/{highlight_id}` in `feeds`: Deletes one reader highlight. Example: ```js const body = new URLSearchParams({ "bookmark-of": bookmarkUrl }) await fetch("https://micro.blog/micropub", { method: "POST", headers: { Authorization: `Bearer ${token}`, "Content-Type": "application/x-www-form-urlencoded" }, body: body.toString() }) ``` #### Reader detail, replies, and recaps Entry detail screens can load Micro.blog conversation replies, request a generated reader recap, and read or update the weekly recap email setting. Source references: - `src/api/MicroBlogFeeds.js:440` (fetch_micro_blog_conversation_replies) - `src/api/MicroBlogFeeds.js:636` (summarize_micro_blog_feed_entries) - `src/api/MicroBlogFeeds.js:691` (fetch_recap_email_settings) - `src/api/MicroBlogFeeds.js:701` (update_recap_email_settings) Related endpoints: - `GET /conversation.js` in `conversations`: Loads Micro.blog conversation replies for a source URL. - `POST /feeds/recap` in `feeds`: Queues or returns an HTML recap for selected reader entries. - `GET /feeds/recap/email` in `feeds`: Reads the weekly recap email setting. - `POST /feeds/recap/email` in `feeds`: Updates the weekly recap email day. Example: ```js const response = await fetch("https://micro.blog/feeds/recap", { method: "POST", headers: { Accept: "text/html", Authorization: `Bearer ${token}`, "Content-Type": "application/json" }, body: JSON.stringify(entryIds) }) ``` ### Epilogue URL: https://microblog.dev/example-apps/#epilogue Source: https://github.com/microdotblog/epilogue Stack: React Native, Bookshelves, Notes, Micropub, Movies Books and reading companion Epilogue is a React Native companion app for Micro.blog bookshelves. It signs in with Micro.blog, manages books and reading goals, saves encrypted notes for books, publishes book posts through Micropub, and explores movie and TV posting helpers. Source files: - `src/screens/SignInScreen.js`: Email sign-in, token paste-in, and Sign in with Apple. - `src/screens/HomeScreen.js`: Token verification, Micropub configuration, bookshelf loading, and book removal. - `src/screens/BookDetailsScreen.js`: Book notes, bookshelf assignment, and copying search results into a bookshelf. - `src/screens/PostScreen.js`: Micropub post creation and update requests for book posts and reading goals. - `src/models/Book.js`: Micro.blog book search and Open Library fallback search. - `src/screens/MoviesScreen.js`: Movie and TV discovery plus search results for posting. Flows: #### Sign in and external blog authorization Epilogue supports Micro.blog email sign-in, Sign in with Apple, pasted app tokens, and IndieAuth authorization for external Micropub blogs. Source references: - `src/screens/SignInScreen.js:65` (sign_in_with_apple) - `src/screens/SignInScreen.js:121` (send_email_sign_in) - `src/screens/HomeScreen.js:151` (redeem_auth_code) - `src/screens/HomeScreen.js:188` (verify_token) - `src/screens/ExternalScreen.js:117` (start_authorization) Related endpoints: - `POST /account/signin` in `authentication`: Sends an email sign-in link that returns to Epilogue's custom URL scheme. - `POST /account/apple` in `authentication`: Verifies the Apple identity token and returns account or setup information. - `POST /account/verify` in `authentication`: Verifies pasted or redirected Micro.blog app tokens before loading app data. - `GET /indieauth/auth` in `authentication`: Starts the IndieAuth flow for Micro.blog-hosted blogs when adding an external blog. - `POST /indieauth/token` in `authentication`: Exchanges the IndieAuth callback code for a Micropub access token. Example: ```js const form = new FormData() form.append("email", email) form.append("app_name", "Epilogue") form.append("redirect_url", "epilogue://signin/") await fetch("https://micro.blog/account/signin", { method: "POST", body: form }) ``` #### Bookshelves and reading progress The main bookshelf UI lists shelves and books, copies search results into a shelf, moves existing books, removes books, saves finished dates, and updates custom covers. Source references: - `src/screens/HomeScreen.js:283` (load_books) - `src/screens/HomeScreen.js:316` (load_bookshelves) - `src/screens/HomeScreen.js:497` (remove_from_bookshelf) - `src/screens/BookDetailsScreen.js:193` (assign_to_bookshelf) - `src/screens/BookDetailsScreen.js:218` (copy_to_bookshelf) - `src/screens/DateScreen.js:83` (save_finished_date) - `src/screens/OpenCoversScreen.js:102` (update_cover) Related endpoints: - `GET /books/bookshelves` in `books`: Lists the signed-in user's bookshelves and shelf counts. - `GET /books/bookshelves/{id}` in `books`: Loads the books in the selected bookshelf. - `POST /books` in `books`: Creates a book from search or discovery metadata and adds it to a bookshelf. - `POST /books/bookshelves/{bookshelf_id}/assign` in `books`: Moves or assigns an existing book to another bookshelf. - `DELETE /books/bookshelves/{bookshelf_id}/remove/{book_id}` in `books`: Removes a book from the current bookshelf. - `POST /books/bookshelves/{bookshelf_id}/save/{book_id}` in `books`: Saves the finished date for a book. - `POST /books/bookshelves/{bookshelf_id}/cover/{book_id}` in `books`: Updates a book's cover URL from the Open Library cover picker. Example: ```js const form = new FormData() form.append("book_id", bookId) await fetch(`https://micro.blog/books/bookshelves/${bookshelfId}/assign`, { method: "POST", headers: { Authorization: `Bearer ${token}` }, body: form }) ``` #### Book discovery, goals, and Open Library Epilogue searches Micro.blog's book index, shows recently discovered book posts, loads reading goals, edits goal targets, and requests an Open Library session for cover browsing. Source references: - `src/models/Book.js:173` (search_micro_books) - `src/screens/DiscoverScreen.js:114` (load_discovered_books) - `src/screens/GoalsScreen.js:45` (load_goals) - `src/screens/EditGoalScreen.js:37` (load_goal_books) - `src/screens/EditGoalScreen.js:107` (update_goal) - `src/screens/OpenLibraryScreen.js:74` (open_library_sign_in) Related endpoints: - `GET /books/search` in `books`: Searches Micro.blog's book index and returns JSON Feed results. - `GET /posts/discover/books` in `discover`: Loads the public book discovery feed. - `GET /books/goals` in `books`: Lists the user's reading goals. - `GET /books/goals/{id}` in `books`: Loads the books counted toward one reading goal. - `POST /books/goals/{id}` in `books`: Updates the target value or progress for a reading goal. - `POST /books/openlibrary/signin` in `books`: Returns an Open Library session value for cover browsing. Example: ```js const response = await fetch( `https://micro.blog/books/search?q=${encodeURIComponent(query)}&format=jsonfeed`, { headers: { Authorization: `Bearer ${token}` } } ) const books = await response.json() ``` #### Book notes Book detail screens fetch encrypted notes attached to an ISBN, decrypt them locally, and save new or edited encrypted notes back to Micro.blog. Source references: - `src/screens/BookDetailsScreen.js:117` (fetch_notes_for_book) - `src/screens/NoteScreen.js:50` (save_note) Related endpoints: - `GET /notes/for_book` in `notes`: Fetches notes attached to a specific ISBN. - `POST /notes` in `notes`: Creates or updates an encrypted note attached to a book. Example: ```js const form = new FormData() form.append("text", encryptedText) form.append("is_encrypted", "1") form.append("attached_book_isbn", isbn) await fetch("https://micro.blog/notes", { method: "POST", headers: { Authorization: `Bearer ${token}` }, body: form }) ``` #### Micropub book posts Epilogue reads Micropub configuration and source posts, then publishes new book posts, updates existing posts, and posts yearly reading-goal drafts. Source references: - `src/screens/HomeScreen.js:247` (load_blogs) - `src/screens/ProfileScreen.js:119` (load_posts) - `src/screens/PostScreen.js:206` (send_post) - `src/screens/EditGoalScreen.js:81` (setup_post_draft) Related endpoints: - `GET /micropub` in `posting`: Reads Micropub config and source posts for the selected blog. - `POST /micropub` in `posting`: Publishes new book posts, updates existing posts, and posts reading-goal drafts. Example: ```js const form = new FormData() form.append("h", "entry") form.append("content", markdown) form.append("mp-destination", blogId) await fetch("https://micro.blog/micropub", { method: "POST", headers: { Authorization: `Bearer ${token}` }, body: form }) ``` #### Movies and TV discovery Movie screens load recent movie activity, search TMDB-backed movie helpers, and expand TV shows into season and episode posting helpers. Source references: - `src/screens/MoviesScreen.js:87` (fetch_discover) - `src/screens/MoviesScreen.js:124` (fetch_search) - `src/screens/TVSeasonsScreen.js:43` (fetch_seasons) - `src/screens/TVEpisodesScreen.js:44` (fetch_episodes) Related endpoints: - `GET /movies/discover` in `movies`: Loads recent movie and TV activity in JSON Feed format. - `GET /movies/search` in `movies`: Searches for movie and TV posting helpers. - `GET /movies/discover/{id}` in `movies`: Lists seasons for a TMDB show. - `GET /movies/discover/{id}/seasons/{number}` in `movies`: Lists episodes for a TV season. Example: ```js const params = new URLSearchParams({ q: query }) const response = await fetch(`https://micro.blog/movies/search?${params}`, { headers: { Authorization: `Bearer ${token}` } }) const movies = await response.json() ```