AT Protocol feed API

Feed, post, timeline, and content operations

OpenAPI Specification

atproto-feed-api-openapi.yml Raw ↑
openapi: 3.0.3
info:
  title: Bluesky Application API (app.bsky) actor feed API
  description: The Bluesky application-layer Lexicon API providing feed, actor, graph, notification, and video endpoints for the microblogging application built on AT Protocol. The AppView is accessible unauthenticated at public.api.bsky.app for read operations, and at api.bsky.app for authenticated write operations. Schemas are defined using Lexicon, AT Protocol's schema definition language.
  version: 1.0.0
  contact:
    name: Bluesky
    url: https://docs.bsky.app/
  license:
    name: MIT / Apache-2.0
    url: https://github.com/bluesky-social/atproto/blob/main/LICENSE.txt
servers:
- url: https://public.api.bsky.app/xrpc
  description: Public AppView (unauthenticated read operations)
- url: https://api.bsky.app/xrpc
  description: Authenticated AppView (write operations)
security:
- bearerAuth: []
- {}
tags:
- name: feed
  description: Feed, post, timeline, and content operations
paths:
  /app.bsky.feed.getTimeline:
    get:
      operationId: app_bsky_feed_getTimeline
      summary: Get Timeline
      description: Get a view of the requesting account's home timeline. This is expected to be some form of reverse-chronological feed.
      tags:
      - feed
      parameters:
      - name: algorithm
        in: query
        required: false
        description: Variant algorithm for timeline. Implementation-specific.
        schema:
          type: string
      - name: limit
        in: query
        required: false
        schema:
          type: integer
          minimum: 1
          maximum: 100
          default: 50
      - name: cursor
        in: query
        required: false
        schema:
          type: string
      responses:
        '200':
          description: Timeline feed
          content:
            application/json:
              schema:
                type: object
                required:
                - feed
                properties:
                  cursor:
                    type: string
                  feed:
                    type: array
                    items:
                      $ref: '#/components/schemas/FeedViewPost'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /app.bsky.feed.getAuthorFeed:
    get:
      operationId: app_bsky_feed_getAuthorFeed
      summary: Get Author Feed
      description: Get a view of an actor's 'author feed' (a.k.a. profile feed). Does not require auth.
      tags:
      - feed
      security:
      - {}
      - bearerAuth: []
      parameters:
      - name: actor
        in: query
        required: true
        description: Handle or DID of account to fetch feed of.
        schema:
          type: string
      - name: limit
        in: query
        required: false
        schema:
          type: integer
          minimum: 1
          maximum: 100
          default: 50
      - name: cursor
        in: query
        required: false
        schema:
          type: string
      - name: filter
        in: query
        required: false
        description: Combinations of post/repost types to include in response.
        schema:
          type: string
          enum:
          - posts_with_replies
          - posts_no_replies
          - posts_with_media
          - posts_and_author_threads
          default: posts_with_replies
      - name: includePins
        in: query
        required: false
        schema:
          type: boolean
      responses:
        '200':
          description: Author feed
          content:
            application/json:
              schema:
                type: object
                required:
                - feed
                properties:
                  cursor:
                    type: string
                  feed:
                    type: array
                    items:
                      $ref: '#/components/schemas/FeedViewPost'
        '400':
          $ref: '#/components/responses/BadRequest'
  /app.bsky.feed.getPosts:
    get:
      operationId: app_bsky_feed_getPosts
      summary: Get Posts
      description: Gets post views for a specified list of posts (by AT-URI). Does not require auth.
      tags:
      - feed
      security:
      - {}
      - bearerAuth: []
      parameters:
      - name: uris
        in: query
        required: true
        description: List of post AT-URIs to fetch. Maximum 25.
        schema:
          type: array
          items:
            type: string
          maxItems: 25
        style: form
        explode: true
      responses:
        '200':
          description: Post views
          content:
            application/json:
              schema:
                type: object
                required:
                - posts
                properties:
                  posts:
                    type: array
                    items:
                      $ref: '#/components/schemas/PostView'
        '400':
          $ref: '#/components/responses/BadRequest'
  /app.bsky.feed.getPostThread:
    get:
      operationId: app_bsky_feed_getPostThread
      summary: Get Post Thread
      description: Get posts in a thread. Does not require auth, but additional metadata and filtering will be applied for authed requests.
      tags:
      - feed
      security:
      - {}
      - bearerAuth: []
      parameters:
      - name: uri
        in: query
        required: true
        description: Reference (AT-URI) to post record.
        schema:
          type: string
      - name: depth
        in: query
        required: false
        description: How many levels of reply depth should be included in response.
        schema:
          type: integer
          minimum: 0
          maximum: 1000
          default: 6
      - name: parentHeight
        in: query
        required: false
        description: How many levels of parent (and grandparent, etc) post to include.
        schema:
          type: integer
          minimum: 0
          maximum: 1000
          default: 80
      responses:
        '200':
          description: Thread view
          content:
            application/json:
              schema:
                type: object
                required:
                - thread
                properties:
                  thread:
                    type: object
                    description: ThreadViewPost or NotFoundPost or BlockedPost
                    additionalProperties: true
                  threadgate:
                    type: object
                    additionalProperties: true
        '400':
          $ref: '#/components/responses/BadRequest'
  /app.bsky.feed.searchPosts:
    get:
      operationId: app_bsky_feed_searchPosts
      summary: Search Posts
      description: Find posts matching search criteria, returning views of those posts.
      tags:
      - feed
      security:
      - {}
      - bearerAuth: []
      parameters:
      - name: q
        in: query
        required: true
        description: Search query string; syntax, operators, and ranking of results subject to change.
        schema:
          type: string
      - name: sort
        in: query
        required: false
        schema:
          type: string
          enum:
          - top
          - latest
          default: latest
      - name: since
        in: query
        required: false
        description: Filter results for posts after the indicated datetime (inclusive). Expected to use 'sortAt' timestamp, which may not match 'createdAt'.
        schema:
          type: string
          format: date-time
      - name: until
        in: query
        required: false
        description: Filter results for posts before the indicated datetime (not inclusive).
        schema:
          type: string
          format: date-time
      - name: mentions
        in: query
        required: false
        description: Filter to posts which mention the given account. Handles are resolved to DID before query. Only matches rich-text facet mentions.
        schema:
          type: string
      - name: author
        in: query
        required: false
        description: Filter to posts by the given account.
        schema:
          type: string
      - name: lang
        in: query
        required: false
        description: Filter to posts in the given language.
        schema:
          type: string
      - name: tag
        in: query
        required: false
        description: Filter to posts with the given tag (hashtag), based on rich-text facet or tag field. Do not include the '#' prefix.
        schema:
          type: array
          items:
            type: string
        style: form
        explode: true
      - name: limit
        in: query
        required: false
        schema:
          type: integer
          minimum: 1
          maximum: 100
          default: 25
      - name: cursor
        in: query
        required: false
        schema:
          type: string
      responses:
        '200':
          description: Matching posts
          content:
            application/json:
              schema:
                type: object
                required:
                - posts
                properties:
                  cursor:
                    type: string
                  hitsTotal:
                    type: integer
                    description: Count of search hits. Optional, may be rounded/truncated, and may not be possible to paginate through all hits.
                  posts:
                    type: array
                    items:
                      $ref: '#/components/schemas/PostView'
        '400':
          $ref: '#/components/responses/BadRequest'
  /app.bsky.feed.getLikes:
    get:
      operationId: app_bsky_feed_getLikes
      summary: Get Likes
      description: Get like records which reference a subject (by AT-URI with optional CID).
      tags:
      - feed
      security:
      - {}
      - bearerAuth: []
      parameters:
      - name: uri
        in: query
        required: true
        description: AT-URI of the subject (eg, a post record).
        schema:
          type: string
      - name: cid
        in: query
        required: false
        description: CID of the subject record (optional, to align with a specific version of the record).
        schema:
          type: string
      - name: limit
        in: query
        required: false
        schema:
          type: integer
          minimum: 1
          maximum: 100
          default: 50
      - name: cursor
        in: query
        required: false
        schema:
          type: string
      responses:
        '200':
          description: Like records
          content:
            application/json:
              schema:
                type: object
                required:
                - uri
                - likes
                properties:
                  uri:
                    type: string
                  cid:
                    type: string
                  cursor:
                    type: string
                  likes:
                    type: array
                    items:
                      $ref: '#/components/schemas/Like'
        '400':
          $ref: '#/components/responses/BadRequest'
components:
  schemas:
    Like:
      type: object
      required:
      - indexedAt
      - createdAt
      - actor
      properties:
        indexedAt:
          type: string
          format: date-time
        createdAt:
          type: string
          format: date-time
        actor:
          $ref: '#/components/schemas/ProfileView'
    Label:
      type: object
      required:
      - src
      - uri
      - val
      - cts
      properties:
        ver:
          type: integer
        src:
          type: string
          description: DID of the actor who created this label
        uri:
          type: string
          description: AT URI of the record, repository (account), or other resource this label applies to
        cid:
          type: string
          description: Optionally constrains label to specific version of record/blob
        val:
          type: string
          description: The short string name of the value or type of this label
          maxLength: 128
        neg:
          type: boolean
          description: If true, this is a negation label, overwriting a previous label
        cts:
          type: string
          format: date-time
          description: Timestamp when this label was created
        exp:
          type: string
          format: date-time
          description: Timestamp at which this label expires
    PostView:
      type: object
      required:
      - uri
      - cid
      - author
      - record
      - indexedAt
      properties:
        uri:
          type: string
          description: AT-URI of the post
        cid:
          type: string
        author:
          $ref: '#/components/schemas/ProfileView'
        record:
          type: object
          description: The post record
          additionalProperties: true
        embed:
          type: object
          description: Embedded content (images, external links, etc.)
          additionalProperties: true
        replyCount:
          type: integer
        repostCount:
          type: integer
        likeCount:
          type: integer
        quoteCount:
          type: integer
        indexedAt:
          type: string
          format: date-time
        viewer:
          type: object
          description: Viewer relationship to this post
          additionalProperties: true
        labels:
          type: array
          items:
            $ref: '#/components/schemas/Label'
        threadgate:
          type: object
          additionalProperties: true
    Error:
      type: object
      required:
      - error
      - message
      properties:
        error:
          type: string
        message:
          type: string
    ViewerState:
      type: object
      description: Metadata about the relationship between the requesting account and the subject account.
      properties:
        muted:
          type: boolean
        mutedByList:
          type: object
          additionalProperties: true
        blockedBy:
          type: boolean
        blocking:
          type: string
          description: AT-URI of the blocking record, if present
        blockingByList:
          type: object
          additionalProperties: true
        following:
          type: string
          description: AT-URI of the follow record, if present
        followedBy:
          type: string
          description: AT-URI of the follow record from the subject to the requester
        knownFollowers:
          type: object
          additionalProperties: true
    ProfileView:
      type: object
      required:
      - did
      - handle
      properties:
        did:
          type: string
        handle:
          type: string
        displayName:
          type: string
        description:
          type: string
        avatar:
          type: string
          format: uri
        associated:
          type: object
          additionalProperties: true
        indexedAt:
          type: string
          format: date-time
        createdAt:
          type: string
          format: date-time
        viewer:
          $ref: '#/components/schemas/ViewerState'
        labels:
          type: array
          items:
            $ref: '#/components/schemas/Label'
    FeedViewPost:
      type: object
      required:
      - post
      properties:
        post:
          $ref: '#/components/schemas/PostView'
        reply:
          type: object
          description: Reply threading information
          properties:
            root:
              type: object
              additionalProperties: true
            parent:
              type: object
              additionalProperties: true
            grandparentAuthor:
              $ref: '#/components/schemas/ProfileView'
        reason:
          type: object
          description: Reason for appearing in feed (repost, pin, etc.)
          additionalProperties: true
        feedContext:
          type: string
          description: Context provided by feed generator
  responses:
    Unauthorized:
      description: Authentication required
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    BadRequest:
      description: Bad request or validation error
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: Access JWT obtained from com.atproto.server.createSession
externalDocs:
  description: Bluesky HTTP API Reference
  url: https://docs.bsky.app/docs/advanced-guides/atproto