diff --git a/lexicons/app/bsky/actor/getSuggestions.json b/lexicons/app/bsky/actor/getSuggestions.json index 2004ae6f2..31e526520 100644 --- a/lexicons/app/bsky/actor/getSuggestions.json +++ b/lexicons/app/bsky/actor/getSuggestions.json @@ -30,6 +30,10 @@ "type": "ref", "ref": "app.bsky.actor.defs#profileView" } + }, + "recId": { + "type": "integer", + "description": "Snowflake for this recommendation, use when submitting recommendation events." } } } diff --git a/lexicons/app/bsky/feed/defs.json b/lexicons/app/bsky/feed/defs.json index 341f7fbd0..4f92c4019 100644 --- a/lexicons/app/bsky/feed/defs.json +++ b/lexicons/app/bsky/feed/defs.json @@ -48,6 +48,13 @@ "pinned": { "type": "boolean" } } }, + "threadContext": { + "type": "object", + "description": "Metadata about this post within the context of the thread it is in.", + "properties": { + "rootAuthorLike": { "type": "string", "format": "at-uri" } + } + }, "feedViewPost": { "type": "object", "required": ["post"], @@ -108,7 +115,8 @@ "type": "union", "refs": ["#threadViewPost", "#notFoundPost", "#blockedPost"] } - } + }, + "threadContext": { "type": "ref", "ref": "#threadContext" } } }, "notFoundPost": { @@ -162,6 +170,13 @@ "items": { "type": "ref", "ref": "com.atproto.label.defs#label" } }, "viewer": { "type": "ref", "ref": "#generatorViewerState" }, + "contentMode": { + "type": "string", + "knownValues": [ + "app.bsky.feed.defs#contentModeUnspecified", + "app.bsky.feed.defs#contentModeVideo" + ] + }, "indexedAt": { "type": "string", "format": "datetime" } } }, @@ -262,6 +277,14 @@ "type": "token", "description": "User clicked through to the embedded content of the feed item" }, + "contentModeUnspecified": { + "type": "token", + "description": "Declares the feed generator returns any types of posts." + }, + "contentModeVideo": { + "type": "token", + "description": "Declares the feed generator returns posts containing app.bsky.embed.video embeds." + }, "interactionSeen": { "type": "token", "description": "Feed item was seen by user" diff --git a/lexicons/app/bsky/feed/generator.json b/lexicons/app/bsky/feed/generator.json index 1406d542f..fec0c0faf 100644 --- a/lexicons/app/bsky/feed/generator.json +++ b/lexicons/app/bsky/feed/generator.json @@ -39,6 +39,13 @@ "description": "Self-label values", "refs": ["com.atproto.label.defs#selfLabels"] }, + "contentMode": { + "type": "string", + "knownValues": [ + "app.bsky.feed.defs#contentModeUnspecified", + "app.bsky.feed.defs#contentModeVideo" + ] + }, "createdAt": { "type": "string", "format": "datetime" } } } diff --git a/lexicons/app/bsky/feed/getAuthorFeed.json b/lexicons/app/bsky/feed/getAuthorFeed.json index 19e99b174..c9ef8c507 100644 --- a/lexicons/app/bsky/feed/getAuthorFeed.json +++ b/lexicons/app/bsky/feed/getAuthorFeed.json @@ -24,7 +24,8 @@ "posts_with_replies", "posts_no_replies", "posts_with_media", - "posts_and_author_threads" + "posts_and_author_threads", + "posts_with_video" ], "default": "posts_with_replies" }, diff --git a/lexicons/app/bsky/graph/getSuggestedFollowsByActor.json b/lexicons/app/bsky/graph/getSuggestedFollowsByActor.json index 49d6a0b2e..454de1545 100644 --- a/lexicons/app/bsky/graph/getSuggestedFollowsByActor.json +++ b/lexicons/app/bsky/graph/getSuggestedFollowsByActor.json @@ -29,6 +29,10 @@ "type": "boolean", "description": "If true, response has fallen-back to generic results, and is not scoped using relativeToDid", "default": false + }, + "recId": { + "type": "integer", + "description": "Snowflake for this recommendation, use when submitting recommendation events." } } } diff --git a/lexicons/app/bsky/unspecced/getSuggestionsSkeleton.json b/lexicons/app/bsky/unspecced/getSuggestionsSkeleton.json index 42edf3af0..658f2a11b 100644 --- a/lexicons/app/bsky/unspecced/getSuggestionsSkeleton.json +++ b/lexicons/app/bsky/unspecced/getSuggestionsSkeleton.json @@ -45,6 +45,10 @@ "type": "string", "format": "did", "description": "DID of the account these suggestions are relative to. If this is returned undefined, suggestions are based on the viewer." + }, + "recId": { + "type": "integer", + "description": "Snowflake for this recommendation, use when submitting recommendation events." } } } diff --git a/lexicons/com/atproto/lexicon/schema.json b/lexicons/com/atproto/lexicon/schema.json new file mode 100644 index 000000000..e79337ba6 --- /dev/null +++ b/lexicons/com/atproto/lexicon/schema.json @@ -0,0 +1,21 @@ +{ + "lexicon": 1, + "id": "com.atproto.lexicon.schema", + "defs": { + "main": { + "type": "record", + "description": "Representation of Lexicon schemas themselves, when published as atproto records. Note that the schema language is not defined in Lexicon; this meta schema currently only includes a single version field ('lexicon'). See the atproto specifications for description of the other expected top-level fields ('id', 'defs', etc).", + "key": "nsid", + "record": { + "type": "object", + "required": ["lexicon"], + "properties": { + "lexicon": { + "type": "integer", + "description": "Indicates the 'version' of the Lexicon language. Must be '1' for the current atproto/Lexicon schema system." + } + } + } + } + } +} diff --git a/lexicons/tools/ozone/moderation/defs.json b/lexicons/tools/ozone/moderation/defs.json index 7c590cddb..23bba198f 100644 --- a/lexicons/tools/ozone/moderation/defs.json +++ b/lexicons/tools/ozone/moderation/defs.json @@ -182,6 +182,80 @@ "tags": { "type": "array", "items": { "type": "string" } + }, + "accountStats": { + "description": "Statistics related to the account subject", + "type": "ref", + "ref": "#accountStats" + }, + "recordsStats": { + "description": "Statistics related to the record subjects authored by the subject's account", + "type": "ref", + "ref": "#recordsStats" + } + } + }, + "accountStats": { + "description": "Statistics about a particular account subject", + "type": "object", + "properties": { + "reportCount": { + "description": "Total number of reports on the account", + "type": "integer" + }, + "appealCount": { + "description": "Total number of appeals against a moderation action on the account", + "type": "integer" + }, + "suspendCount": { + "description": "Number of times the account was suspended", + "type": "integer" + }, + "escalateCount": { + "description": "Number of times the account was escalated", + "type": "integer" + }, + "takedownCount": { + "description": "Number of times the account was taken down", + "type": "integer" + } + } + }, + "recordsStats": { + "description": "Statistics about a set of record subject items", + "type": "object", + "properties": { + "totalReports": { + "description": "Cumulative sum of the number of reports on the items in the set", + "type": "integer" + }, + "reportedCount": { + "description": "Number of items that were reported at least once", + "type": "integer" + }, + "escalatedCount": { + "description": "Number of items that were escalated at least once", + "type": "integer" + }, + "appealedCount": { + "description": "Number of items that were appealed at least once", + "type": "integer" + }, + "subjectCount": { + "description": "Total number of item in the set", + "type": "integer" + }, + "pendingCount": { + "description": "Number of item currently in \"reviewOpen\" or \"reviewEscalated\" state", + "type": "integer" + }, + "processedCount": { + "description": "Number of item currently in \"reviewNone\" or \"reviewClosed\" state", + "type": "integer" + }, + "takendownCount": { + "description": "Number of item currently taken down", + "type": "integer" } } }, diff --git a/lexicons/tools/ozone/moderation/queryStatuses.json b/lexicons/tools/ozone/moderation/queryStatuses.json index a8ff110db..c280b2ed6 100644 --- a/lexicons/tools/ozone/moderation/queryStatuses.json +++ b/lexicons/tools/ozone/moderation/queryStatuses.json @@ -107,7 +107,12 @@ "sortField": { "type": "string", "default": "lastReportedAt", - "enum": ["lastReviewedAt", "lastReportedAt"] + "enum": [ + "lastReviewedAt", + "lastReportedAt", + "reportedRecordsCount", + "takendownRecordsCount" + ] }, "sortDirection": { "type": "string", @@ -158,6 +163,18 @@ "type": "string", "description": "If specified, subjects of the given type (account or record) will be returned. When this is set to 'account' the 'collections' parameter will be ignored. When includeAllUserRecords or subject is set, this will be ignored.", "knownValues": ["account", "record"] + }, + "minAccountSuspendCount": { + "type": "integer", + "description": "If specified, only subjects that belong to an account that has at least this many suspensions will be returned." + }, + "minReportedRecordsCount": { + "type": "integer", + "description": "If specified, only subjects that belong to an account that has at least this many reported records will be returned." + }, + "minTakendownRecordsCount": { + "type": "integer", + "description": "If specified, only subjects that belong to an account that has at least this many taken down records will be returned." } } }, diff --git a/packages/atproto/lib/src/ids.g.dart b/packages/atproto/lib/src/ids.g.dart index bb0ac4757..37e8298ce 100644 --- a/packages/atproto/lib/src/ids.g.dart +++ b/packages/atproto/lib/src/ids.g.dart @@ -133,6 +133,9 @@ const comAtprotoLabelSubscribeLabelsInfo = const comAtprotoLabelSubscribeLabelsLabels = 'com.atproto.label.subscribeLabels#labels'; +/// `com.atproto.lexicon.schema` +const comAtprotoLexiconSchema = 'com.atproto.lexicon.schema'; + /// `com.atproto.moderation.createReport` const comAtprotoModerationCreateReport = 'com.atproto.moderation.createReport'; diff --git a/packages/atproto/lib/src/nsids.g.dart b/packages/atproto/lib/src/nsids.g.dart index 3073c1a46..46c430605 100644 --- a/packages/atproto/lib/src/nsids.g.dart +++ b/packages/atproto/lib/src/nsids.g.dart @@ -99,6 +99,9 @@ const comAtprotoLabelSubscribeLabelsInfo = const comAtprotoLabelSubscribeLabelsLabels = NSID(ids.comAtprotoLabelSubscribeLabelsLabels); +/// `com.atproto.lexicon.schema` +const comAtprotoLexiconSchema = NSID(ids.comAtprotoLexiconSchema); + /// `com.atproto.moderation.createReport` const comAtprotoModerationCreateReport = NSID(ids.comAtprotoModerationCreateReport); diff --git a/packages/bluesky/lib/src/ids.g.dart b/packages/bluesky/lib/src/ids.g.dart index 1b23d8ebb..000faaaa0 100644 --- a/packages/bluesky/lib/src/ids.g.dart +++ b/packages/bluesky/lib/src/ids.g.dart @@ -203,6 +203,13 @@ const appBskyFeedDefsClickthroughItem = 'app.bsky.feed.defs#clickthroughItem'; const appBskyFeedDefsClickthroughReposter = 'app.bsky.feed.defs#clickthroughReposter'; +/// `app.bsky.feed.defs#contentModeUnspecified` +const appBskyFeedDefsContentModeUnspecified = + 'app.bsky.feed.defs#contentModeUnspecified'; + +/// `app.bsky.feed.defs#contentModeVideo` +const appBskyFeedDefsContentModeVideo = 'app.bsky.feed.defs#contentModeVideo'; + /// `app.bsky.feed.defs#feedViewPost` const appBskyFeedDefsFeedViewPost = 'app.bsky.feed.defs#feedViewPost'; @@ -265,6 +272,9 @@ const appBskyFeedDefsSkeletonReasonPin = 'app.bsky.feed.defs#skeletonReasonPin'; const appBskyFeedDefsSkeletonReasonRepost = 'app.bsky.feed.defs#skeletonReasonRepost'; +/// `app.bsky.feed.defs#threadContext` +const appBskyFeedDefsThreadContext = 'app.bsky.feed.defs#threadContext'; + /// `app.bsky.feed.defs#threadViewPost` const appBskyFeedDefsThreadViewPost = 'app.bsky.feed.defs#threadViewPost'; diff --git a/packages/lexicon/lib/src/lexicons.g.dart b/packages/lexicon/lib/src/lexicons.g.dart index a888f161b..eff255f2c 100644 --- a/packages/lexicon/lib/src/lexicons.g.dart +++ b/packages/lexicon/lib/src/lexicons.g.dart @@ -6,258 +6,224 @@ // Lexicon Docs Generator // ************************************************************************** -/// `com.atproto.sync.getRepo` -const comAtprotoSyncGetRepo = { +/// `com.atproto.admin.updateAccountEmail` +const comAtprotoAdminUpdateAccountEmail = { "lexicon": 1, - "id": "com.atproto.sync.getRepo", + "id": "com.atproto.admin.updateAccountEmail", "defs": { "main": { - "type": "query", - "description": - "Download a repository export as CAR file. Optionally only a 'diff' since a previous revision. Does not require auth; implemented by PDS.", - "parameters": { - "type": "params", - "required": ["did"], - "properties": { - "did": { - "type": "string", - "format": "did", - "description": "The DID of the repo." - }, - "since": { - "type": "string", - "description": - "The revision ('rev') of the repo to create a diff from." + "type": "procedure", + "description": "Administrative action to update an account's email.", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["account", "email"], + "properties": { + "account": { + "type": "string", + "format": "at-identifier", + "description": "The handle or DID of the repo." + }, + "email": {"type": "string"} } } - }, - "output": {"encoding": "application/vnd.ipld.car"}, - "errors": [ - {"name": "RepoNotFound"}, - {"name": "RepoTakendown"}, - {"name": "RepoSuspended"}, - {"name": "RepoDeactivated"} - ] + } } } }; -/// `com.atproto.sync.getRepoStatus` -const comAtprotoSyncGetRepoStatus = { +/// `com.atproto.admin.getSubjectStatus` +const comAtprotoAdminGetSubjectStatus = { "lexicon": 1, - "id": "com.atproto.sync.getRepoStatus", + "id": "com.atproto.admin.getSubjectStatus", "defs": { "main": { "type": "query", "description": - "Get the hosting status for a repository, on this server. Expected to be implemented by PDS and Relay.", + "Get the service-specific admin status of a subject (account, record, or blob).", "parameters": { "type": "params", - "required": ["did"], "properties": { - "did": { - "type": "string", - "format": "did", - "description": "The DID of the repo." - } + "did": {"type": "string", "format": "did"}, + "uri": {"type": "string", "format": "at-uri"}, + "blob": {"type": "string", "format": "cid"} } }, "output": { "encoding": "application/json", "schema": { "type": "object", - "required": ["did", "active"], + "required": ["subject"], "properties": { - "did": {"type": "string", "format": "did"}, - "active": {"type": "boolean"}, - "status": { - "type": "string", - "description": - "If active=false, this optional field indicates a possible reason for why the account is not active. If active=false and no status is supplied, then the host makes no claim for why the repository is no longer being hosted.", - "knownValues": ["takendown", "suspended", "deactivated"] + "subject": { + "type": "union", + "refs": [ + "com.atproto.admin.defs#repoRef", + "com.atproto.repo.strongRef", + "com.atproto.admin.defs#repoBlobRef" + ] }, - "rev": { - "type": "string", - "description": - "Optional field, the current rev of the repo, if active=true" + "takedown": { + "type": "ref", + "ref": "com.atproto.admin.defs#statusAttr" + }, + "deactivated": { + "type": "ref", + "ref": "com.atproto.admin.defs#statusAttr" } } } - }, - "errors": [ - {"name": "RepoNotFound"} - ] + } } } }; -/// `com.atproto.sync.listRepos` -const comAtprotoSyncListRepos = { +/// `com.atproto.admin.sendEmail` +const comAtprotoAdminSendEmail = { "lexicon": 1, - "id": "com.atproto.sync.listRepos", + "id": "com.atproto.admin.sendEmail", "defs": { "main": { - "type": "query", - "description": - "Enumerates all the DID, rev, and commit CID for all repos hosted by this service. Does not require auth; implemented by PDS and Relay.", - "parameters": { - "type": "params", - "properties": { - "limit": { - "type": "integer", - "default": 500, - "minimum": 1, - "maximum": 1000 - }, - "cursor": {"type": "string"} + "type": "procedure", + "description": "Send email to a user's account email address.", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["recipientDid", "content", "senderDid"], + "properties": { + "recipientDid": {"type": "string", "format": "did"}, + "content": {"type": "string"}, + "subject": {"type": "string"}, + "senderDid": {"type": "string", "format": "did"}, + "comment": { + "type": "string", + "description": + "Additional comment by the sender that won't be used in the email itself but helpful to provide more context for moderators/reviewers" + } + } } }, "output": { "encoding": "application/json", "schema": { "type": "object", - "required": ["repos"], + "required": ["sent"], "properties": { - "cursor": {"type": "string"}, - "repos": { - "type": "array", - "items": {"type": "ref", "ref": "#repo"} - } + "sent": {"type": "boolean"} } } } - }, - "repo": { - "type": "object", - "required": ["did", "head", "rev"], - "properties": { - "did": {"type": "string", "format": "did"}, - "head": { - "type": "string", - "format": "cid", - "description": "Current repo commit CID" - }, - "rev": {"type": "string"}, - "active": {"type": "boolean"}, - "status": { - "type": "string", - "description": - "If active=false, this optional field indicates a possible reason for why the account is not active. If active=false and no status is supplied, then the host makes no claim for why the repository is no longer being hosted.", - "knownValues": ["takendown", "suspended", "deactivated"] - } - } } } }; -/// `com.atproto.sync.listBlobs` -const comAtprotoSyncListBlobs = { +/// `com.atproto.admin.getAccountInfos` +const comAtprotoAdminGetAccountInfos = { "lexicon": 1, - "id": "com.atproto.sync.listBlobs", + "id": "com.atproto.admin.getAccountInfos", "defs": { "main": { "type": "query", - "description": - "List blob CIDs for an account, since some repo revision. Does not require auth; implemented by PDS.", + "description": "Get details about some accounts.", "parameters": { "type": "params", - "required": ["did"], + "required": ["dids"], "properties": { - "did": { - "type": "string", - "format": "did", - "description": "The DID of the repo." - }, - "since": { - "type": "string", - "description": "Optional revision of the repo to list blobs since." - }, - "limit": { - "type": "integer", - "default": 500, - "minimum": 1, - "maximum": 1000 - }, - "cursor": {"type": "string"} + "dids": { + "type": "array", + "items": {"type": "string", "format": "did"} + } } }, "output": { "encoding": "application/json", "schema": { "type": "object", - "required": ["cids"], + "required": ["infos"], "properties": { - "cursor": {"type": "string"}, - "cids": { + "infos": { "type": "array", - "items": {"type": "string", "format": "cid"} + "items": { + "type": "ref", + "ref": "com.atproto.admin.defs#accountView" + } } } } - }, - "errors": [ - {"name": "RepoNotFound"}, - {"name": "RepoTakendown"}, - {"name": "RepoSuspended"}, - {"name": "RepoDeactivated"} - ] + } } } }; -/// `com.atproto.sync.getBlocks` -const comAtprotoSyncGetBlocks = { +/// `com.atproto.admin.disableAccountInvites` +const comAtprotoAdminDisableAccountInvites = { "lexicon": 1, - "id": "com.atproto.sync.getBlocks", + "id": "com.atproto.admin.disableAccountInvites", "defs": { "main": { - "type": "query", + "type": "procedure", "description": - "Get data blocks from a given repo, by CID. For example, intermediate MST nodes, or records. Does not require auth; implemented by PDS.", - "parameters": { - "type": "params", - "required": ["did", "cids"], - "properties": { - "did": { - "type": "string", - "format": "did", - "description": "The DID of the repo." - }, - "cids": { - "type": "array", - "items": {"type": "string", "format": "cid"} + "Disable an account from receiving new invite codes, but does not invalidate existing codes.", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["account"], + "properties": { + "account": {"type": "string", "format": "did"}, + "note": { + "type": "string", + "description": "Optional reason for disabled invites." + } } } - }, - "output": {"encoding": "application/vnd.ipld.car"}, - "errors": [ - {"name": "BlockNotFound"}, - {"name": "RepoNotFound"}, - {"name": "RepoTakendown"}, - {"name": "RepoSuspended"}, - {"name": "RepoDeactivated"} - ] + } } } }; -/// `com.atproto.sync.getHead` -const comAtprotoSyncGetHead = { +/// `com.atproto.admin.deleteAccount` +const comAtprotoAdminDeleteAccount = { "lexicon": 1, - "id": "com.atproto.sync.getHead", + "id": "com.atproto.admin.deleteAccount", + "defs": { + "main": { + "type": "procedure", + "description": "Delete a user account as an administrator.", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["did"], + "properties": { + "did": {"type": "string", "format": "did"} + } + } + } + } + } +}; + +/// `com.atproto.admin.searchAccounts` +const comAtprotoAdminSearchAccounts = { + "lexicon": 1, + "id": "com.atproto.admin.searchAccounts", "defs": { "main": { "type": "query", - "description": - "DEPRECATED - please use com.atproto.sync.getLatestCommit instead", + "description": "Get list of accounts that matches your search query.", "parameters": { "type": "params", - "required": ["did"], "properties": { - "did": { - "type": "string", - "format": "did", - "description": "The DID of the repo." + "email": {"type": "string"}, + "cursor": {"type": "string"}, + "limit": { + "type": "integer", + "default": 50, + "minimum": 1, + "maximum": 100 } } }, @@ -265,437 +231,442 @@ const comAtprotoSyncGetHead = { "encoding": "application/json", "schema": { "type": "object", - "required": ["root"], + "required": ["accounts"], "properties": { - "root": {"type": "string", "format": "cid"} + "cursor": {"type": "string"}, + "accounts": { + "type": "array", + "items": { + "type": "ref", + "ref": "com.atproto.admin.defs#accountView" + } + } } } - }, - "errors": [ - {"name": "HeadNotFound"} - ] + } } } }; -/// `com.atproto.sync.getLatestCommit` -const comAtprotoSyncGetLatestCommit = { +/// `com.atproto.admin.disableInviteCodes` +const comAtprotoAdminDisableInviteCodes = { "lexicon": 1, - "id": "com.atproto.sync.getLatestCommit", + "id": "com.atproto.admin.disableInviteCodes", "defs": { "main": { - "type": "query", + "type": "procedure", "description": - "Get the current commit CID & revision of the specified repo. Does not require auth.", + "Disable some set of codes and/or all codes associated with a set of users.", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "properties": { + "codes": { + "type": "array", + "items": {"type": "string"} + }, + "accounts": { + "type": "array", + "items": {"type": "string"} + } + } + } + } + } + } +}; + +/// `com.atproto.admin.updateAccountHandle` +const comAtprotoAdminUpdateAccountHandle = { + "lexicon": 1, + "id": "com.atproto.admin.updateAccountHandle", + "defs": { + "main": { + "type": "procedure", + "description": "Administrative action to update an account's handle.", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["did", "handle"], + "properties": { + "did": {"type": "string", "format": "did"}, + "handle": {"type": "string", "format": "handle"} + } + } + } + } + } +}; + +/// `com.atproto.admin.getInviteCodes` +const comAtprotoAdminGetInviteCodes = { + "lexicon": 1, + "id": "com.atproto.admin.getInviteCodes", + "defs": { + "main": { + "type": "query", + "description": "Get an admin view of invite codes.", "parameters": { "type": "params", - "required": ["did"], "properties": { - "did": { + "sort": { "type": "string", - "format": "did", - "description": "The DID of the repo." - } + "default": "recent", + "knownValues": ["recent", "usage"] + }, + "limit": { + "type": "integer", + "default": 100, + "minimum": 1, + "maximum": 500 + }, + "cursor": {"type": "string"} } }, "output": { "encoding": "application/json", "schema": { "type": "object", - "required": ["cid", "rev"], + "required": ["codes"], "properties": { - "cid": {"type": "string", "format": "cid"}, - "rev": {"type": "string"} + "cursor": {"type": "string"}, + "codes": { + "type": "array", + "items": { + "type": "ref", + "ref": "com.atproto.server.defs#inviteCode" + } + } } } - }, - "errors": [ - {"name": "RepoNotFound"}, - {"name": "RepoTakendown"}, - {"name": "RepoSuspended"}, - {"name": "RepoDeactivated"} - ] + } } } }; -/// `com.atproto.sync.getBlob` -const comAtprotoSyncGetBlob = { +/// `com.atproto.admin.getAccountInfo` +const comAtprotoAdminGetAccountInfo = { "lexicon": 1, - "id": "com.atproto.sync.getBlob", + "id": "com.atproto.admin.getAccountInfo", "defs": { "main": { "type": "query", - "description": - "Get a blob associated with a given account. Returns the full blob as originally uploaded. Does not require auth; implemented by PDS.", + "description": "Get details about an account.", "parameters": { "type": "params", - "required": ["did", "cid"], + "required": ["did"], "properties": { - "did": { - "type": "string", - "format": "did", - "description": "The DID of the account." - }, - "cid": { - "type": "string", - "format": "cid", - "description": "The CID of the blob to fetch" - } + "did": {"type": "string", "format": "did"} } }, - "output": {"encoding": "*/*"}, - "errors": [ - {"name": "BlobNotFound"}, - {"name": "RepoNotFound"}, - {"name": "RepoTakendown"}, - {"name": "RepoSuspended"}, - {"name": "RepoDeactivated"} - ] + "output": { + "encoding": "application/json", + "schema": {"type": "ref", "ref": "com.atproto.admin.defs#accountView"} + } } } }; -/// `com.atproto.sync.subscribeRepos` -const comAtprotoSyncSubscribeRepos = { +/// `com.atproto.admin.updateSubjectStatus` +const comAtprotoAdminUpdateSubjectStatus = { "lexicon": 1, - "id": "com.atproto.sync.subscribeRepos", + "id": "com.atproto.admin.updateSubjectStatus", "defs": { "main": { - "type": "subscription", + "type": "procedure", "description": - "Repository event stream, aka Firehose endpoint. Outputs repo commits with diff data, and identity update events, for all repositories on the current server. See the atproto specifications for details around stream sequencing, repo versioning, CAR diff format, and more. Public and does not require auth; implemented by PDS and Relay.", - "parameters": { - "type": "params", - "properties": { - "cursor": { - "type": "integer", - "description": "The last known event seq number to backfill from." + "Update the service-specific admin status of a subject (account, record, or blob).", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["subject"], + "properties": { + "subject": { + "type": "union", + "refs": [ + "com.atproto.admin.defs#repoRef", + "com.atproto.repo.strongRef", + "com.atproto.admin.defs#repoBlobRef" + ] + }, + "takedown": { + "type": "ref", + "ref": "com.atproto.admin.defs#statusAttr" + }, + "deactivated": { + "type": "ref", + "ref": "com.atproto.admin.defs#statusAttr" + } } } }, - "message": { + "output": { + "encoding": "application/json", "schema": { - "type": "union", - "refs": [ - "#commit", - "#identity", - "#account", - "#handle", - "#migrate", - "#tombstone", - "#info" - ] + "type": "object", + "required": ["subject"], + "properties": { + "subject": { + "type": "union", + "refs": [ + "com.atproto.admin.defs#repoRef", + "com.atproto.repo.strongRef", + "com.atproto.admin.defs#repoBlobRef" + ] + }, + "takedown": { + "type": "ref", + "ref": "com.atproto.admin.defs#statusAttr" + } + } } - }, - "errors": [ - {"name": "FutureCursor"}, - { - "name": "ConsumerTooSlow", - "description": - "If the consumer of the stream can not keep up with events, and a backlog gets too large, the server will drop the connection." - } - ] - }, - "commit": { - "type": "object", + } + } + } +}; + +/// `com.atproto.admin.updateAccountPassword` +const comAtprotoAdminUpdateAccountPassword = { + "lexicon": 1, + "id": "com.atproto.admin.updateAccountPassword", + "defs": { + "main": { + "type": "procedure", "description": - "Represents an update of repository state. Note that empty commits are allowed, which include no repo data changes, but an update to rev and signature.", - "required": [ - "seq", - "rebase", - "tooBig", - "repo", - "commit", - "rev", - "since", - "blocks", - "ops", - "blobs", - "time" - ], - "nullable": ["prev", "since"], - "properties": { - "seq": { - "type": "integer", - "description": "The stream sequence number of this message." - }, - "rebase": {"type": "boolean", "description": "DEPRECATED -- unused"}, - "tooBig": { - "type": "boolean", - "description": - "Indicates that this commit contained too many ops, or data size was too large. Consumers will need to make a separate request to get missing data." - }, - "repo": { - "type": "string", - "format": "did", - "description": "The repo this event comes from." - }, - "commit": { - "type": "cid-link", - "description": "Repo commit object CID." - }, - "prev": { - "type": "cid-link", - "description": - "DEPRECATED -- unused. WARNING -- nullable and optional; stick with optional to ensure golang interoperability." - }, - "rev": { - "type": "string", - "description": - "The rev of the emitted commit. Note that this information is also in the commit object included in blocks, unless this is a tooBig event." - }, - "since": { - "type": "string", - "description": - "The rev of the last emitted commit from this repo (if any)." - }, - "blocks": { - "type": "bytes", - "description": - "CAR file containing relevant blocks, as a diff since the previous repo state.", - "maxLength": 1000000 - }, - "ops": { - "type": "array", - "items": { - "type": "ref", - "description": - "List of repo mutation operations in this commit (eg, records created, updated, or deleted).", - "ref": "#repoOp" - }, - "maxLength": 200 - }, - "blobs": { - "type": "array", - "items": { - "type": "cid-link", - "description": - "List of new blobs (by CID) referenced by records in this commit." + "Update the password for a user account as an administrator.", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["did", "password"], + "properties": { + "did": {"type": "string", "format": "did"}, + "password": {"type": "string"} } - }, - "time": { - "type": "string", - "format": "datetime", - "description": - "Timestamp of when this message was originally broadcast." } } - }, - "identity": { - "type": "object", - "description": - "Represents a change to an account's identity. Could be an updated handle, signing key, or pds hosting endpoint. Serves as a prod to all downstream services to refresh their identity cache.", - "required": ["seq", "did", "time"], - "properties": { - "seq": {"type": "integer"}, - "did": {"type": "string", "format": "did"}, - "time": {"type": "string", "format": "datetime"}, - "handle": { - "type": "string", - "format": "handle", - "description": - "The current handle for the account, or 'handle.invalid' if validation fails. This field is optional, might have been validated or passed-through from an upstream source. Semantics and behaviors for PDS vs Relay may evolve in the future; see atproto specs for more details." + } + } +}; + +/// `com.atproto.admin.enableAccountInvites` +const comAtprotoAdminEnableAccountInvites = { + "lexicon": 1, + "id": "com.atproto.admin.enableAccountInvites", + "defs": { + "main": { + "type": "procedure", + "description": "Re-enable an account's ability to receive invite codes.", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["account"], + "properties": { + "account": {"type": "string", "format": "did"}, + "note": { + "type": "string", + "description": "Optional reason for enabled invites." + } + } } } - }, - "account": { + } + } +}; + +/// `com.atproto.admin.defs` +const comAtprotoAdminDefs = { + "lexicon": 1, + "id": "com.atproto.admin.defs", + "defs": { + "statusAttr": { "type": "object", - "description": - "Represents a change to an account's status on a host (eg, PDS or Relay). The semantics of this event are that the status is at the host which emitted the event, not necessarily that at the currently active PDS. Eg, a Relay takedown would emit a takedown with active=false, even if the PDS is still active.", - "required": ["seq", "did", "time", "active"], + "required": ["applied"], "properties": { - "seq": {"type": "integer"}, - "did": {"type": "string", "format": "did"}, - "time": {"type": "string", "format": "datetime"}, - "active": { - "type": "boolean", - "description": - "Indicates that the account has a repository which can be fetched from the host that emitted this event." - }, - "status": { - "type": "string", - "description": - "If active=false, this optional field indicates a reason for why the account is not active.", - "knownValues": ["takendown", "suspended", "deleted", "deactivated"] - } + "applied": {"type": "boolean"}, + "ref": {"type": "string"} } }, - "handle": { + "accountView": { "type": "object", - "description": "DEPRECATED -- Use #identity event instead", - "required": ["seq", "did", "handle", "time"], + "required": ["did", "handle", "indexedAt"], "properties": { - "seq": {"type": "integer"}, "did": {"type": "string", "format": "did"}, "handle": {"type": "string", "format": "handle"}, - "time": {"type": "string", "format": "datetime"} + "email": {"type": "string"}, + "relatedRecords": { + "type": "array", + "items": {"type": "unknown"} + }, + "indexedAt": {"type": "string", "format": "datetime"}, + "invitedBy": { + "type": "ref", + "ref": "com.atproto.server.defs#inviteCode" + }, + "invites": { + "type": "array", + "items": {"type": "ref", "ref": "com.atproto.server.defs#inviteCode"} + }, + "invitesDisabled": {"type": "boolean"}, + "emailConfirmedAt": {"type": "string", "format": "datetime"}, + "inviteNote": {"type": "string"}, + "deactivatedAt": {"type": "string", "format": "datetime"}, + "threatSignatures": { + "type": "array", + "items": {"type": "ref", "ref": "#threatSignature"} + } } }, - "migrate": { + "repoRef": { "type": "object", - "description": "DEPRECATED -- Use #account event instead", - "required": ["seq", "did", "migrateTo", "time"], - "nullable": ["migrateTo"], + "required": ["did"], "properties": { - "seq": {"type": "integer"}, - "did": {"type": "string", "format": "did"}, - "migrateTo": {"type": "string"}, - "time": {"type": "string", "format": "datetime"} + "did": {"type": "string", "format": "did"} } }, - "tombstone": { + "repoBlobRef": { "type": "object", - "description": "DEPRECATED -- Use #account event instead", - "required": ["seq", "did", "time"], + "required": ["did", "cid"], "properties": { - "seq": {"type": "integer"}, "did": {"type": "string", "format": "did"}, - "time": {"type": "string", "format": "datetime"} - } - }, - "info": { - "type": "object", - "required": ["name"], - "properties": { - "name": { - "type": "string", - "knownValues": ["OutdatedCursor"] - }, - "message": {"type": "string"} + "cid": {"type": "string", "format": "cid"}, + "recordUri": {"type": "string", "format": "at-uri"} } }, - "repoOp": { + "threatSignature": { "type": "object", - "description": "A repo operation, ie a mutation of a single record.", - "required": ["action", "path", "cid"], - "nullable": ["cid"], + "required": ["property", "value"], "properties": { - "action": { - "type": "string", - "knownValues": ["create", "update", "delete"] - }, - "path": {"type": "string"}, - "cid": { - "type": "cid-link", - "description": - "For creates and updates, the new record CID. For deletions, null." - } + "property": {"type": "string"}, + "value": {"type": "string"} } } } }; -/// `com.atproto.sync.getCheckout` -const comAtprotoSyncGetCheckout = { +/// `com.atproto.server.reserveSigningKey` +const comAtprotoServerReserveSigningKey = { "lexicon": 1, - "id": "com.atproto.sync.getCheckout", + "id": "com.atproto.server.reserveSigningKey", "defs": { "main": { - "type": "query", - "description": "DEPRECATED - please use com.atproto.sync.getRepo instead", - "parameters": { - "type": "params", - "required": ["did"], - "properties": { - "did": { - "type": "string", - "format": "did", - "description": "The DID of the repo." + "type": "procedure", + "description": + "Reserve a repo signing key, for use with account creation. Necessary so that a DID PLC update operation can be constructed during an account migraiton. Public and does not require auth; implemented by PDS. NOTE: this endpoint may change when full account migration is implemented.", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "properties": { + "did": { + "type": "string", + "format": "did", + "description": "The DID to reserve a key for." + } } } }, - "output": {"encoding": "application/vnd.ipld.car"} + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["signingKey"], + "properties": { + "signingKey": { + "type": "string", + "description": + "The public key for the reserved signing key, in did:key serialization." + } + } + } + } } } }; -/// `com.atproto.sync.getRecord` -const comAtprotoSyncGetRecord = { +/// `com.atproto.server.requestEmailUpdate` +const comAtprotoServerRequestEmailUpdate = { "lexicon": 1, - "id": "com.atproto.sync.getRecord", + "id": "com.atproto.server.requestEmailUpdate", "defs": { "main": { - "type": "query", - "description": - "Get data blocks needed to prove the existence or non-existence of record in the current version of repo. Does not require auth.", - "parameters": { - "type": "params", - "required": ["did", "collection", "rkey"], - "properties": { - "did": { - "type": "string", - "format": "did", - "description": "The DID of the repo." - }, - "collection": {"type": "string", "format": "nsid"}, - "rkey": {"type": "string", "description": "Record Key"}, - "commit": { - "type": "string", - "format": "cid", - "description": - "DEPRECATED: referenced a repo commit by CID, and retrieved record as of that commit" + "type": "procedure", + "description": "Request a token in order to update email.", + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["tokenRequired"], + "properties": { + "tokenRequired": {"type": "boolean"} } } - }, - "output": {"encoding": "application/vnd.ipld.car"}, - "errors": [ - {"name": "RecordNotFound"}, - {"name": "RepoNotFound"}, - {"name": "RepoTakendown"}, - {"name": "RepoSuspended"}, - {"name": "RepoDeactivated"} - ] + } } } }; -/// `com.atproto.sync.notifyOfUpdate` -const comAtprotoSyncNotifyOfUpdate = { +/// `com.atproto.server.confirmEmail` +const comAtprotoServerConfirmEmail = { "lexicon": 1, - "id": "com.atproto.sync.notifyOfUpdate", + "id": "com.atproto.server.confirmEmail", "defs": { "main": { "type": "procedure", "description": - "Notify a crawling service of a recent update, and that crawling should resume. Intended use is after a gap between repo stream events caused the crawling service to disconnect. Does not require auth; implemented by Relay.", + "Confirm an email using a token from com.atproto.server.requestEmailConfirmation.", "input": { "encoding": "application/json", "schema": { "type": "object", - "required": ["hostname"], + "required": ["email", "token"], "properties": { - "hostname": { - "type": "string", - "description": - "Hostname of the current service (usually a PDS) that is notifying of update." - } + "email": {"type": "string"}, + "token": {"type": "string"} } } - } + }, + "errors": [ + {"name": "AccountNotFound"}, + {"name": "ExpiredToken"}, + {"name": "InvalidToken"}, + {"name": "InvalidEmail"} + ] } } }; -/// `com.atproto.sync.requestCrawl` -const comAtprotoSyncRequestCrawl = { +/// `com.atproto.server.getSession` +const comAtprotoServerGetSession = { "lexicon": 1, - "id": "com.atproto.sync.requestCrawl", + "id": "com.atproto.server.getSession", "defs": { "main": { - "type": "procedure", + "type": "query", "description": - "Request a service to persistently crawl hosted repos. Expected use is new PDS instances declaring their existence to Relays. Does not require auth.", - "input": { + "Get information about the current auth session. Requires auth.", + "output": { "encoding": "application/json", "schema": { "type": "object", - "required": ["hostname"], + "required": ["handle", "did"], "properties": { - "hostname": { + "handle": {"type": "string", "format": "handle"}, + "did": {"type": "string", "format": "did"}, + "email": {"type": "string"}, + "emailConfirmed": {"type": "boolean"}, + "emailAuthFactor": {"type": "boolean"}, + "didDoc": {"type": "unknown"}, + "active": {"type": "boolean"}, + "status": { "type": "string", "description": - "Hostname of the current service (eg, PDS) that is requesting to be crawled." + "If active=false, this optional field indicates a possible reason for why the account is not active. If active=false and no status is supplied, then the host makes no claim for why the repository is no longer being hosted.", + "knownValues": ["takendown", "suspended", "deactivated"] } } } @@ -704,72 +675,106 @@ const comAtprotoSyncRequestCrawl = { } }; -/// `com.atproto.admin.getSubjectStatus` -const comAtprotoAdminGetSubjectStatus = { +/// `com.atproto.server.describeServer` +const comAtprotoServerDescribeServer = { "lexicon": 1, - "id": "com.atproto.admin.getSubjectStatus", + "id": "com.atproto.server.describeServer", "defs": { "main": { "type": "query", "description": - "Get the service-specific admin status of a subject (account, record, or blob).", - "parameters": { - "type": "params", - "properties": { - "did": {"type": "string", "format": "did"}, - "uri": {"type": "string", "format": "at-uri"}, - "blob": {"type": "string", "format": "cid"} - } - }, + "Describes the server's account creation requirements and capabilities. Implemented by PDS.", "output": { "encoding": "application/json", "schema": { "type": "object", - "required": ["subject"], + "required": ["did", "availableUserDomains"], "properties": { - "subject": { - "type": "union", - "refs": [ - "com.atproto.admin.defs#repoRef", - "com.atproto.repo.strongRef", - "com.atproto.admin.defs#repoBlobRef" - ] + "inviteCodeRequired": { + "type": "boolean", + "description": + "If true, an invite code must be supplied to create an account on this instance." }, - "takedown": { + "phoneVerificationRequired": { + "type": "boolean", + "description": + "If true, a phone verification token must be supplied to create an account on this instance." + }, + "availableUserDomains": { + "type": "array", + "description": + "List of domain suffixes that can be used in account handles.", + "items": {"type": "string"} + }, + "links": { "type": "ref", - "ref": "com.atproto.admin.defs#statusAttr" + "description": "URLs of service policy documents.", + "ref": "#links" }, - "deactivated": { + "contact": { "type": "ref", - "ref": "com.atproto.admin.defs#statusAttr" - } + "description": "Contact information", + "ref": "#contact" + }, + "did": {"type": "string", "format": "did"} } } } + }, + "links": { + "type": "object", + "properties": { + "privacyPolicy": {"type": "string", "format": "uri"}, + "termsOfService": {"type": "string", "format": "uri"} + } + }, + "contact": { + "type": "object", + "properties": { + "email": {"type": "string"} + } } } }; -/// `com.atproto.admin.updateAccountEmail` -const comAtprotoAdminUpdateAccountEmail = { +/// `com.atproto.server.deleteSession` +const comAtprotoServerDeleteSession = { "lexicon": 1, - "id": "com.atproto.admin.updateAccountEmail", + "id": "com.atproto.server.deleteSession", "defs": { "main": { "type": "procedure", - "description": "Administrative action to update an account's email.", + "description": "Delete the current session. Requires auth." + } + } +}; + +/// `com.atproto.server.createInviteCode` +const comAtprotoServerCreateInviteCode = { + "lexicon": 1, + "id": "com.atproto.server.createInviteCode", + "defs": { + "main": { + "type": "procedure", + "description": "Create an invite code.", "input": { "encoding": "application/json", "schema": { "type": "object", - "required": ["account", "email"], + "required": ["useCount"], "properties": { - "account": { - "type": "string", - "format": "at-identifier", - "description": "The handle or DID of the repo." - }, - "email": {"type": "string"} + "useCount": {"type": "integer"}, + "forAccount": {"type": "string", "format": "did"} + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["code"], + "properties": { + "code": {"type": "string"} } } } @@ -777,168 +782,189 @@ const comAtprotoAdminUpdateAccountEmail = { } }; -/// `com.atproto.admin.getAccountInfo` -const comAtprotoAdminGetAccountInfo = { +/// `com.atproto.server.checkAccountStatus` +const comAtprotoServerCheckAccountStatus = { "lexicon": 1, - "id": "com.atproto.admin.getAccountInfo", + "id": "com.atproto.server.checkAccountStatus", "defs": { "main": { "type": "query", - "description": "Get details about an account.", - "parameters": { - "type": "params", - "required": ["did"], - "properties": { - "did": {"type": "string", "format": "did"} - } - }, + "description": + "Returns the status of an account, especially as pertaining to import or recovery. Can be called many times over the course of an account migration. Requires auth and can only be called pertaining to oneself.", "output": { "encoding": "application/json", - "schema": {"type": "ref", "ref": "com.atproto.admin.defs#accountView"} - } - } - } -}; - -/// `com.atproto.admin.defs` -const comAtprotoAdminDefs = { - "lexicon": 1, - "id": "com.atproto.admin.defs", - "defs": { - "statusAttr": { - "type": "object", - "required": ["applied"], - "properties": { - "applied": {"type": "boolean"}, - "ref": {"type": "string"} - } - }, - "accountView": { - "type": "object", - "required": ["did", "handle", "indexedAt"], - "properties": { - "did": {"type": "string", "format": "did"}, - "handle": {"type": "string", "format": "handle"}, - "email": {"type": "string"}, - "relatedRecords": { - "type": "array", - "items": {"type": "unknown"} - }, - "indexedAt": {"type": "string", "format": "datetime"}, - "invitedBy": { - "type": "ref", - "ref": "com.atproto.server.defs#inviteCode" - }, - "invites": { - "type": "array", - "items": {"type": "ref", "ref": "com.atproto.server.defs#inviteCode"} - }, - "invitesDisabled": {"type": "boolean"}, - "emailConfirmedAt": {"type": "string", "format": "datetime"}, - "inviteNote": {"type": "string"}, - "deactivatedAt": {"type": "string", "format": "datetime"}, - "threatSignatures": { - "type": "array", - "items": {"type": "ref", "ref": "#threatSignature"} + "schema": { + "type": "object", + "required": [ + "activated", + "validDid", + "repoCommit", + "repoRev", + "repoBlocks", + "indexedRecords", + "privateStateValues", + "expectedBlobs", + "importedBlobs" + ], + "properties": { + "activated": {"type": "boolean"}, + "validDid": {"type": "boolean"}, + "repoCommit": {"type": "string", "format": "cid"}, + "repoRev": {"type": "string"}, + "repoBlocks": {"type": "integer"}, + "indexedRecords": {"type": "integer"}, + "privateStateValues": {"type": "integer"}, + "expectedBlobs": {"type": "integer"}, + "importedBlobs": {"type": "integer"} + } } } - }, - "repoRef": { - "type": "object", - "required": ["did"], - "properties": { - "did": {"type": "string", "format": "did"} - } - }, - "repoBlobRef": { - "type": "object", - "required": ["did", "cid"], - "properties": { - "did": {"type": "string", "format": "did"}, - "cid": {"type": "string", "format": "cid"}, - "recordUri": {"type": "string", "format": "at-uri"} - } - }, - "threatSignature": { - "type": "object", - "required": ["property", "value"], - "properties": { - "property": {"type": "string"}, - "value": {"type": "string"} - } } } }; -/// `com.atproto.admin.disableAccountInvites` -const comAtprotoAdminDisableAccountInvites = { +/// `com.atproto.server.getAccountInviteCodes` +const comAtprotoServerGetAccountInviteCodes = { "lexicon": 1, - "id": "com.atproto.admin.disableAccountInvites", + "id": "com.atproto.server.getAccountInviteCodes", "defs": { "main": { - "type": "procedure", + "type": "query", "description": - "Disable an account from receiving new invite codes, but does not invalidate existing codes.", - "input": { + "Get all invite codes for the current account. Requires auth.", + "parameters": { + "type": "params", + "properties": { + "includeUsed": {"type": "boolean", "default": true}, + "createAvailable": { + "type": "boolean", + "description": + "Controls whether any new 'earned' but not 'created' invites should be created.", + "default": true + } + } + }, + "output": { "encoding": "application/json", "schema": { "type": "object", - "required": ["account"], + "required": ["codes"], "properties": { - "account": {"type": "string", "format": "did"}, - "note": { - "type": "string", - "description": "Optional reason for disabled invites." + "codes": { + "type": "array", + "items": { + "type": "ref", + "ref": "com.atproto.server.defs#inviteCode" + } } } } - } + }, + "errors": [ + {"name": "DuplicateCreate"} + ] } } }; -/// `com.atproto.admin.enableAccountInvites` -const comAtprotoAdminEnableAccountInvites = { +/// `com.atproto.server.createAccount` +const comAtprotoServerCreateAccount = { "lexicon": 1, - "id": "com.atproto.admin.enableAccountInvites", + "id": "com.atproto.server.createAccount", "defs": { "main": { "type": "procedure", - "description": "Re-enable an account's ability to receive invite codes.", + "description": "Create an account. Implemented by PDS.", "input": { "encoding": "application/json", "schema": { "type": "object", - "required": ["account"], + "required": ["handle"], "properties": { - "account": {"type": "string", "format": "did"}, - "note": { + "email": {"type": "string"}, + "handle": { "type": "string", - "description": "Optional reason for enabled invites." + "format": "handle", + "description": "Requested handle for the account." + }, + "did": { + "type": "string", + "format": "did", + "description": + "Pre-existing atproto DID, being imported to a new account." + }, + "inviteCode": {"type": "string"}, + "verificationCode": {"type": "string"}, + "verificationPhone": {"type": "string"}, + "password": { + "type": "string", + "description": + "Initial account password. May need to meet instance-specific password strength requirements." + }, + "recoveryKey": { + "type": "string", + "description": + "DID PLC rotation key (aka, recovery key) to be included in PLC creation operation." + }, + "plcOp": { + "type": "unknown", + "description": + "A signed DID PLC operation to be submitted as part of importing an existing account to this instance. NOTE: this optional field may be updated when full account migration is implemented." } } } - } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "description": + "Account login session returned on successful account creation.", + "required": ["accessJwt", "refreshJwt", "handle", "did"], + "properties": { + "accessJwt": {"type": "string"}, + "refreshJwt": {"type": "string"}, + "handle": {"type": "string", "format": "handle"}, + "did": { + "type": "string", + "format": "did", + "description": "The DID of the new account." + }, + "didDoc": { + "type": "unknown", + "description": "Complete DID document." + } + } + } + }, + "errors": [ + {"name": "InvalidHandle"}, + {"name": "InvalidPassword"}, + {"name": "InvalidInviteCode"}, + {"name": "HandleNotAvailable"}, + {"name": "UnsupportedDomain"}, + {"name": "UnresolvableDid"}, + {"name": "IncompatibleDidDoc"} + ] } } }; -/// `com.atproto.admin.updateAccountHandle` -const comAtprotoAdminUpdateAccountHandle = { +/// `com.atproto.server.revokeAppPassword` +const comAtprotoServerRevokeAppPassword = { "lexicon": 1, - "id": "com.atproto.admin.updateAccountHandle", + "id": "com.atproto.server.revokeAppPassword", "defs": { "main": { "type": "procedure", - "description": "Administrative action to update an account's handle.", + "description": "Revoke an App Password by name.", "input": { "encoding": "application/json", "schema": { "type": "object", - "required": ["did", "handle"], + "required": ["name"], "properties": { - "did": {"type": "string", "format": "did"}, - "handle": {"type": "string", "format": "handle"} + "name": {"type": "string"} } } } @@ -946,111 +972,99 @@ const comAtprotoAdminUpdateAccountHandle = { } }; -/// `com.atproto.admin.disableInviteCodes` -const comAtprotoAdminDisableInviteCodes = { +/// `com.atproto.server.activateAccount` +const comAtprotoServerActivateAccount = { "lexicon": 1, - "id": "com.atproto.admin.disableInviteCodes", + "id": "com.atproto.server.activateAccount", "defs": { "main": { "type": "procedure", "description": - "Disable some set of codes and/or all codes associated with a set of users.", + "Activates a currently deactivated account. Used to finalize account migration after the account's repo is imported and identity is setup." + } + } +}; + +/// `com.atproto.server.createSession` +const comAtprotoServerCreateSession = { + "lexicon": 1, + "id": "com.atproto.server.createSession", + "defs": { + "main": { + "type": "procedure", + "description": "Create an authentication session.", "input": { "encoding": "application/json", "schema": { "type": "object", + "required": ["identifier", "password"], "properties": { - "codes": { - "type": "array", - "items": {"type": "string"} + "identifier": { + "type": "string", + "description": + "Handle or other identifier supported by the server for the authenticating user." }, - "accounts": { - "type": "array", - "items": {"type": "string"} + "password": {"type": "string"}, + "authFactorToken": {"type": "string"}, + "allowTakendown": { + "type": "boolean", + "description": + "When true, instead of throwing error for takendown accounts, a valid response with a narrow scoped token will be returned" } } } - } - } - } -}; - -/// `com.atproto.admin.getAccountInfos` -const comAtprotoAdminGetAccountInfos = { - "lexicon": 1, - "id": "com.atproto.admin.getAccountInfos", - "defs": { - "main": { - "type": "query", - "description": "Get details about some accounts.", - "parameters": { - "type": "params", - "required": ["dids"], - "properties": { - "dids": { - "type": "array", - "items": {"type": "string", "format": "did"} - } - } }, "output": { "encoding": "application/json", "schema": { "type": "object", - "required": ["infos"], + "required": ["accessJwt", "refreshJwt", "handle", "did"], "properties": { - "infos": { - "type": "array", - "items": { - "type": "ref", - "ref": "com.atproto.admin.defs#accountView" - } + "accessJwt": {"type": "string"}, + "refreshJwt": {"type": "string"}, + "handle": {"type": "string", "format": "handle"}, + "did": {"type": "string", "format": "did"}, + "didDoc": {"type": "unknown"}, + "email": {"type": "string"}, + "emailConfirmed": {"type": "boolean"}, + "emailAuthFactor": {"type": "boolean"}, + "active": {"type": "boolean"}, + "status": { + "type": "string", + "description": + "If active=false, this optional field indicates a possible reason for why the account is not active. If active=false and no status is supplied, then the host makes no claim for why the repository is no longer being hosted.", + "knownValues": ["takendown", "suspended", "deactivated"] } } } - } + }, + "errors": [ + {"name": "AccountTakedown"}, + {"name": "AuthFactorTokenRequired"} + ] } } }; -/// `com.atproto.admin.getInviteCodes` -const comAtprotoAdminGetInviteCodes = { +/// `com.atproto.server.deactivateAccount` +const comAtprotoServerDeactivateAccount = { "lexicon": 1, - "id": "com.atproto.admin.getInviteCodes", + "id": "com.atproto.server.deactivateAccount", "defs": { "main": { - "type": "query", - "description": "Get an admin view of invite codes.", - "parameters": { - "type": "params", - "properties": { - "sort": { - "type": "string", - "default": "recent", - "knownValues": ["recent", "usage"] - }, - "limit": { - "type": "integer", - "default": 100, - "minimum": 1, - "maximum": 500 - }, - "cursor": {"type": "string"} - } - }, - "output": { + "type": "procedure", + "description": + "Deactivates a currently active account. Stops serving of repo, and future writes to repo until reactivated. Used to finalize account migration with the old host after the account has been activated on the new host.", + "input": { "encoding": "application/json", "schema": { "type": "object", - "required": ["codes"], "properties": { - "cursor": {"type": "string"}, - "codes": { - "type": "array", - "items": { - "type": "ref", - "ref": "com.atproto.server.defs#inviteCode" - } + "deleteAfter": { + "type": "string", + "format": "datetime", + "description": + "A recommendation to server as to how long they should hold onto the deactivated account before deleting." } } } @@ -1059,164 +1073,191 @@ const comAtprotoAdminGetInviteCodes = { } }; -/// `com.atproto.admin.updateAccountPassword` -const comAtprotoAdminUpdateAccountPassword = { +/// `com.atproto.server.requestAccountDelete` +const comAtprotoServerRequestAccountDelete = { "lexicon": 1, - "id": "com.atproto.admin.updateAccountPassword", + "id": "com.atproto.server.requestAccountDelete", + "defs": { + "main": { + "type": "procedure", + "description": "Initiate a user account deletion via email." + } + } +}; + +/// `com.atproto.server.requestEmailConfirmation` +const comAtprotoServerRequestEmailConfirmation = { + "lexicon": 1, + "id": "com.atproto.server.requestEmailConfirmation", "defs": { "main": { "type": "procedure", "description": - "Update the password for a user account as an administrator.", - "input": { - "encoding": "application/json", - "schema": { - "type": "object", - "required": ["did", "password"], - "properties": { - "did": {"type": "string", "format": "did"}, - "password": {"type": "string"} - } - } - } + "Request an email with a code to confirm ownership of email." } } }; -/// `com.atproto.admin.deleteAccount` -const comAtprotoAdminDeleteAccount = { +/// `com.atproto.server.deleteAccount` +const comAtprotoServerDeleteAccount = { "lexicon": 1, - "id": "com.atproto.admin.deleteAccount", + "id": "com.atproto.server.deleteAccount", "defs": { "main": { "type": "procedure", - "description": "Delete a user account as an administrator.", + "description": + "Delete an actor's account with a token and password. Can only be called after requesting a deletion token. Requires auth.", "input": { "encoding": "application/json", "schema": { "type": "object", - "required": ["did"], + "required": ["did", "password", "token"], "properties": { - "did": {"type": "string", "format": "did"} + "did": {"type": "string", "format": "did"}, + "password": {"type": "string"}, + "token": {"type": "string"} } } - } + }, + "errors": [ + {"name": "ExpiredToken"}, + {"name": "InvalidToken"} + ] } } }; -/// `com.atproto.admin.sendEmail` -const comAtprotoAdminSendEmail = { +/// `com.atproto.server.createAppPassword` +const comAtprotoServerCreateAppPassword = { "lexicon": 1, - "id": "com.atproto.admin.sendEmail", + "id": "com.atproto.server.createAppPassword", "defs": { "main": { "type": "procedure", - "description": "Send email to a user's account email address.", + "description": "Create an App Password.", "input": { "encoding": "application/json", "schema": { "type": "object", - "required": ["recipientDid", "content", "senderDid"], + "required": ["name"], "properties": { - "recipientDid": {"type": "string", "format": "did"}, - "content": {"type": "string"}, - "subject": {"type": "string"}, - "senderDid": {"type": "string", "format": "did"}, - "comment": { + "name": { "type": "string", "description": - "Additional comment by the sender that won't be used in the email itself but helpful to provide more context for moderators/reviewers" + "A short name for the App Password, to help distinguish them." + }, + "privileged": { + "type": "boolean", + "description": + "If an app password has 'privileged' access to possibly sensitive account state. Meant for use with trusted clients." } } } }, "output": { "encoding": "application/json", - "schema": { - "type": "object", - "required": ["sent"], - "properties": { - "sent": {"type": "boolean"} - } - } + "schema": {"type": "ref", "ref": "#appPassword"} + }, + "errors": [ + {"name": "AccountTakedown"} + ] + }, + "appPassword": { + "type": "object", + "required": ["name", "password", "createdAt"], + "properties": { + "name": {"type": "string"}, + "password": {"type": "string"}, + "createdAt": {"type": "string", "format": "datetime"}, + "privileged": {"type": "boolean"} } } } }; -/// `com.atproto.admin.searchAccounts` -const comAtprotoAdminSearchAccounts = { +/// `com.atproto.server.resetPassword` +const comAtprotoServerResetPassword = { "lexicon": 1, - "id": "com.atproto.admin.searchAccounts", + "id": "com.atproto.server.resetPassword", "defs": { "main": { - "type": "query", - "description": "Get list of accounts that matches your search query.", - "parameters": { - "type": "params", - "properties": { - "email": {"type": "string"}, - "cursor": {"type": "string"}, - "limit": { - "type": "integer", - "default": 50, - "minimum": 1, - "maximum": 100 - } - } - }, - "output": { + "type": "procedure", + "description": "Reset a user account password using a token.", + "input": { "encoding": "application/json", "schema": { "type": "object", - "required": ["accounts"], + "required": ["token", "password"], "properties": { - "cursor": {"type": "string"}, - "accounts": { - "type": "array", - "items": { - "type": "ref", - "ref": "com.atproto.admin.defs#accountView" - } - } + "token": {"type": "string"}, + "password": {"type": "string"} } } - } + }, + "errors": [ + {"name": "ExpiredToken"}, + {"name": "InvalidToken"} + ] } } }; -/// `com.atproto.admin.updateSubjectStatus` -const comAtprotoAdminUpdateSubjectStatus = { +/// `com.atproto.server.refreshSession` +const comAtprotoServerRefreshSession = { "lexicon": 1, - "id": "com.atproto.admin.updateSubjectStatus", + "id": "com.atproto.server.refreshSession", "defs": { "main": { "type": "procedure", "description": - "Update the service-specific admin status of a subject (account, record, or blob).", - "input": { + "Refresh an authentication session. Requires auth using the 'refreshJwt' (not the 'accessJwt').", + "output": { "encoding": "application/json", "schema": { "type": "object", - "required": ["subject"], + "required": ["accessJwt", "refreshJwt", "handle", "did"], "properties": { - "subject": { - "type": "union", - "refs": [ - "com.atproto.admin.defs#repoRef", - "com.atproto.repo.strongRef", - "com.atproto.admin.defs#repoBlobRef" - ] - }, - "takedown": { - "type": "ref", - "ref": "com.atproto.admin.defs#statusAttr" - }, - "deactivated": { - "type": "ref", - "ref": "com.atproto.admin.defs#statusAttr" + "accessJwt": {"type": "string"}, + "refreshJwt": {"type": "string"}, + "handle": {"type": "string", "format": "handle"}, + "did": {"type": "string", "format": "did"}, + "didDoc": {"type": "unknown"}, + "active": {"type": "boolean"}, + "status": { + "type": "string", + "description": + "Hosting status of the account. If not specified, then assume 'active'.", + "knownValues": ["takendown", "suspended", "deactivated"] + } + } + } + }, + "errors": [ + {"name": "AccountTakedown"} + ] + } + } +}; + +/// `com.atproto.server.createInviteCodes` +const comAtprotoServerCreateInviteCodes = { + "lexicon": 1, + "id": "com.atproto.server.createInviteCodes", + "defs": { + "main": { + "type": "procedure", + "description": "Create invite codes.", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["codeCount", "useCount"], + "properties": { + "codeCount": {"type": "integer", "default": 1}, + "useCount": {"type": "integer"}, + "forAccounts": { + "type": "array", + "items": {"type": "string", "format": "did"} } } } @@ -1225,302 +1266,124 @@ const comAtprotoAdminUpdateSubjectStatus = { "encoding": "application/json", "schema": { "type": "object", - "required": ["subject"], + "required": ["codes"], "properties": { - "subject": { - "type": "union", - "refs": [ - "com.atproto.admin.defs#repoRef", - "com.atproto.repo.strongRef", - "com.atproto.admin.defs#repoBlobRef" - ] - }, - "takedown": { - "type": "ref", - "ref": "com.atproto.admin.defs#statusAttr" + "codes": { + "type": "array", + "items": {"type": "ref", "ref": "#accountCodes"} } } } } + }, + "accountCodes": { + "type": "object", + "required": ["account", "codes"], + "properties": { + "account": {"type": "string"}, + "codes": { + "type": "array", + "items": {"type": "string"} + } + } } } }; -/// `com.atproto.label.queryLabels` -const comAtprotoLabelQueryLabels = { +/// `com.atproto.server.listAppPasswords` +const comAtprotoServerListAppPasswords = { "lexicon": 1, - "id": "com.atproto.label.queryLabels", + "id": "com.atproto.server.listAppPasswords", "defs": { "main": { "type": "query", - "description": - "Find labels relevant to the provided AT-URI patterns. Public endpoint for moderation services, though may return different or additional results with auth.", - "parameters": { - "type": "params", - "required": ["uriPatterns"], - "properties": { - "uriPatterns": { - "type": "array", - "description": - "List of AT URI patterns to match (boolean 'OR'). Each may be a prefix (ending with '*'; will match inclusive of the string leading to '*'), or a full URI.", - "items": {"type": "string"} - }, - "sources": { - "type": "array", - "description": - "Optional list of label sources (DIDs) to filter on.", - "items": {"type": "string", "format": "did"} - }, - "limit": { - "type": "integer", - "default": 50, - "minimum": 1, - "maximum": 250 - }, - "cursor": {"type": "string"} - } - }, + "description": "List all App Passwords.", "output": { "encoding": "application/json", "schema": { "type": "object", - "required": ["labels"], + "required": ["passwords"], "properties": { - "cursor": {"type": "string"}, - "labels": { + "passwords": { "type": "array", - "items": {"type": "ref", "ref": "com.atproto.label.defs#label"} + "items": {"type": "ref", "ref": "#appPassword"} } } } + }, + "errors": [ + {"name": "AccountTakedown"} + ] + }, + "appPassword": { + "type": "object", + "required": ["name", "createdAt"], + "properties": { + "name": {"type": "string"}, + "createdAt": {"type": "string", "format": "datetime"}, + "privileged": {"type": "boolean"} } } } }; -/// `com.atproto.label.defs` -const comAtprotoLabelDefs = { +/// `com.atproto.server.requestPasswordReset` +const comAtprotoServerRequestPasswordReset = { "lexicon": 1, - "id": "com.atproto.label.defs", + "id": "com.atproto.server.requestPasswordReset", "defs": { - "label": { - "type": "object", - "description": - "Metadata tag on an atproto resource (eg, repo or record).", - "required": ["src", "uri", "val", "cts"], - "properties": { - "ver": { - "type": "integer", - "description": "The AT Protocol version of the label object." - }, - "src": { - "type": "string", - "format": "did", - "description": "DID of the actor who created this label." - }, - "uri": { - "type": "string", - "format": "uri", - "description": - "AT URI of the record, repository (account), or other resource that this label applies to." - }, - "cid": { - "type": "string", - "format": "cid", - "description": - "Optionally, CID specifying the specific version of 'uri' resource this label applies to." - }, - "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": "datetime", - "description": "Timestamp when this label was created." - }, - "exp": { - "type": "string", - "format": "datetime", - "description": - "Timestamp at which this label expires (no longer applies)." - }, - "sig": { - "type": "bytes", - "description": "Signature of dag-cbor encoded label." + "main": { + "type": "procedure", + "description": "Initiate a user account password reset via email.", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["email"], + "properties": { + "email": {"type": "string"} + } } } - }, - "selfLabels": { + } + } +}; + +/// `com.atproto.server.defs` +const comAtprotoServerDefs = { + "lexicon": 1, + "id": "com.atproto.server.defs", + "defs": { + "inviteCode": { "type": "object", - "description": - "Metadata tags on an atproto record, published by the author within the record.", - "required": ["values"], + "required": [ + "code", + "available", + "disabled", + "forAccount", + "createdBy", + "createdAt", + "uses" + ], "properties": { - "values": { + "code": {"type": "string"}, + "available": {"type": "integer"}, + "disabled": {"type": "boolean"}, + "forAccount": {"type": "string"}, + "createdBy": {"type": "string"}, + "createdAt": {"type": "string", "format": "datetime"}, + "uses": { "type": "array", - "items": {"type": "ref", "ref": "#selfLabel"}, - "maxLength": 10 + "items": {"type": "ref", "ref": "#inviteCodeUse"} } } }, - "selfLabel": { + "inviteCodeUse": { "type": "object", - "description": - "Metadata tag on an atproto record, published by the author within the record. Note that schemas should use #selfLabels, not #selfLabel.", - "required": ["val"], + "required": ["usedBy", "usedAt"], "properties": { - "val": { - "type": "string", - "description": - "The short string name of the value or type of this label.", - "maxLength": 128 - } - } - }, - "labelValueDefinition": { - "type": "object", - "description": - "Declares a label value and its expected interpretations and behaviors.", - "required": ["identifier", "severity", "blurs", "locales"], - "properties": { - "identifier": { - "type": "string", - "description": - "The value of the label being defined. Must only include lowercase ascii and the '-' character ([a-z-]+).", - "maxLength": 100, - "maxGraphemes": 100 - }, - "severity": { - "type": "string", - "description": - "How should a client visually convey this label? 'inform' means neutral and informational; 'alert' means negative and warning; 'none' means show nothing.", - "knownValues": ["inform", "alert", "none"] - }, - "blurs": { - "type": "string", - "description": - "What should this label hide in the UI, if applied? 'content' hides all of the target; 'media' hides the images/video/audio; 'none' hides nothing.", - "knownValues": ["content", "media", "none"] - }, - "defaultSetting": { - "type": "string", - "description": "The default setting for this label.", - "default": "warn", - "knownValues": ["ignore", "warn", "hide"] - }, - "adultOnly": { - "type": "boolean", - "description": - "Does the user need to have adult content enabled in order to configure this label?" - }, - "locales": { - "type": "array", - "items": {"type": "ref", "ref": "#labelValueDefinitionStrings"} - } - } - }, - "labelValueDefinitionStrings": { - "type": "object", - "description": - "Strings which describe the label in the UI, localized into a specific language.", - "required": ["lang", "name", "description"], - "properties": { - "lang": { - "type": "string", - "format": "language", - "description": - "The code of the language these strings are written in." - }, - "name": { - "type": "string", - "description": "A short human-readable name for the label.", - "maxLength": 640, - "maxGraphemes": 64 - }, - "description": { - "type": "string", - "description": - "A longer description of what the label means and why it might be applied.", - "maxLength": 100000, - "maxGraphemes": 10000 - } - } - }, - "labelValue": { - "type": "string", - "knownValues": [ - "!hide", - "!no-promote", - "!warn", - "!no-unauthenticated", - "dmca-violation", - "doxxing", - "porn", - "sexual", - "nudity", - "nsfl", - "gore" - ] - } - } -}; - -/// `com.atproto.label.subscribeLabels` -const comAtprotoLabelSubscribeLabels = { - "lexicon": 1, - "id": "com.atproto.label.subscribeLabels", - "defs": { - "main": { - "type": "subscription", - "description": - "Subscribe to stream of labels (and negations). Public endpoint implemented by mod services. Uses same sequencing scheme as repo event stream.", - "parameters": { - "type": "params", - "properties": { - "cursor": { - "type": "integer", - "description": "The last known event seq number to backfill from." - } - } - }, - "message": { - "schema": { - "type": "union", - "refs": ["#labels", "#info"] - } - }, - "errors": [ - {"name": "FutureCursor"} - ] - }, - "labels": { - "type": "object", - "required": ["seq", "labels"], - "properties": { - "seq": {"type": "integer"}, - "labels": { - "type": "array", - "items": {"type": "ref", "ref": "com.atproto.label.defs#label"} - } - } - }, - "info": { - "type": "object", - "required": ["name"], - "properties": { - "name": { - "type": "string", - "knownValues": ["OutdatedCursor"] - }, - "message": {"type": "string"} + "usedBy": {"type": "string", "format": "did"}, + "usedAt": {"type": "string", "format": "datetime"} } } } @@ -1559,86 +1422,118 @@ const comAtprotoServerUpdateEmail = { } }; -/// `com.atproto.server.listAppPasswords` -const comAtprotoServerListAppPasswords = { +/// `com.atproto.server.getServiceAuth` +const comAtprotoServerGetServiceAuth = { "lexicon": 1, - "id": "com.atproto.server.listAppPasswords", + "id": "com.atproto.server.getServiceAuth", "defs": { "main": { "type": "query", - "description": "List all App Passwords.", + "description": + "Get a signed token on behalf of the requesting DID for the requested service.", + "parameters": { + "type": "params", + "required": ["aud"], + "properties": { + "aud": { + "type": "string", + "format": "did", + "description": + "The DID of the service that the token will be used to authenticate with" + }, + "exp": { + "type": "integer", + "description": + "The time in Unix Epoch seconds that the JWT expires. Defaults to 60 seconds in the future. The service may enforce certain time bounds on tokens depending on the requested scope." + }, + "lxm": { + "type": "string", + "format": "nsid", + "description": + "Lexicon (XRPC) method to bind the requested token to" + } + } + }, "output": { "encoding": "application/json", "schema": { "type": "object", - "required": ["passwords"], + "required": ["token"], "properties": { - "passwords": { - "type": "array", - "items": {"type": "ref", "ref": "#appPassword"} - } + "token": {"type": "string"} } } }, "errors": [ - {"name": "AccountTakedown"} + { + "name": "BadExpiration", + "description": + "Indicates that the requested expiration date is not a valid. May be in the past or may be reliant on the requested scopes." + } ] - }, - "appPassword": { - "type": "object", - "required": ["name", "createdAt"], - "properties": { - "name": {"type": "string"}, - "createdAt": {"type": "string", "format": "datetime"}, - "privileged": {"type": "boolean"} + } + } +}; + +/// `com.atproto.lexicon.schema` +const comAtprotoLexiconSchema = { + "lexicon": 1, + "id": "com.atproto.lexicon.schema", + "defs": { + "main": { + "type": "record", + "description": + "Representation of Lexicon schemas themselves, when published as atproto records. Note that the schema language is not defined in Lexicon; this meta schema currently only includes a single version field ('lexicon'). See the atproto specifications for description of the other expected top-level fields ('id', 'defs', etc).", + "key": "nsid", + "record": { + "type": "object", + "required": ["lexicon"], + "properties": { + "lexicon": { + "type": "integer", + "description": + "Indicates the 'version' of the Lexicon language. Must be '1' for the current atproto/Lexicon schema system." + } + } } } } }; -/// `com.atproto.server.createAccount` -const comAtprotoServerCreateAccount = { +/// `com.atproto.moderation.createReport` +const comAtprotoModerationCreateReport = { "lexicon": 1, - "id": "com.atproto.server.createAccount", + "id": "com.atproto.moderation.createReport", "defs": { "main": { "type": "procedure", - "description": "Create an account. Implemented by PDS.", + "description": + "Submit a moderation report regarding an atproto account or record. Implemented by moderation services (with PDS proxying), and requires auth.", "input": { "encoding": "application/json", "schema": { "type": "object", - "required": ["handle"], + "required": ["reasonType", "subject"], "properties": { - "email": {"type": "string"}, - "handle": { - "type": "string", - "format": "handle", - "description": "Requested handle for the account." - }, - "did": { - "type": "string", - "format": "did", - "description": - "Pre-existing atproto DID, being imported to a new account." - }, - "inviteCode": {"type": "string"}, - "verificationCode": {"type": "string"}, - "verificationPhone": {"type": "string"}, - "password": { - "type": "string", + "reasonType": { + "type": "ref", "description": - "Initial account password. May need to meet instance-specific password strength requirements." + "Indicates the broad category of violation the report is for.", + "ref": "com.atproto.moderation.defs#reasonType" }, - "recoveryKey": { + "reason": { "type": "string", "description": - "DID PLC rotation key (aka, recovery key) to be included in PLC creation operation." + "Additional context about the content and violation.", + "maxLength": 20000, + "maxGraphemes": 2000 }, - "plcOp": { - "type": "unknown", - "description": - "A signed DID PLC operation to be submitted as part of importing an existing account to this instance. NOTE: this optional field may be updated when full account migration is implemented." + "subject": { + "type": "union", + "refs": [ + "com.atproto.admin.defs#repoRef", + "com.atproto.repo.strongRef" + ] } } } @@ -1647,369 +1542,319 @@ const comAtprotoServerCreateAccount = { "encoding": "application/json", "schema": { "type": "object", - "description": - "Account login session returned on successful account creation.", - "required": ["accessJwt", "refreshJwt", "handle", "did"], - "properties": { - "accessJwt": {"type": "string"}, - "refreshJwt": {"type": "string"}, - "handle": {"type": "string", "format": "handle"}, - "did": { + "required": [ + "id", + "reasonType", + "subject", + "reportedBy", + "createdAt" + ], + "properties": { + "id": {"type": "integer"}, + "reasonType": { + "type": "ref", + "ref": "com.atproto.moderation.defs#reasonType" + }, + "reason": { "type": "string", - "format": "did", - "description": "The DID of the new account." + "maxLength": 20000, + "maxGraphemes": 2000 }, - "didDoc": { - "type": "unknown", - "description": "Complete DID document." - } + "subject": { + "type": "union", + "refs": [ + "com.atproto.admin.defs#repoRef", + "com.atproto.repo.strongRef" + ] + }, + "reportedBy": {"type": "string", "format": "did"}, + "createdAt": {"type": "string", "format": "datetime"} } } - }, - "errors": [ - {"name": "InvalidHandle"}, - {"name": "InvalidPassword"}, - {"name": "InvalidInviteCode"}, - {"name": "HandleNotAvailable"}, - {"name": "UnsupportedDomain"}, - {"name": "UnresolvableDid"}, - {"name": "IncompatibleDidDoc"} - ] + } } } }; -/// `com.atproto.server.deleteSession` -const comAtprotoServerDeleteSession = { +/// `com.atproto.moderation.defs` +const comAtprotoModerationDefs = { "lexicon": 1, - "id": "com.atproto.server.deleteSession", + "id": "com.atproto.moderation.defs", "defs": { - "main": { - "type": "procedure", - "description": "Delete the current session. Requires auth." + "reasonType": { + "type": "string", + "knownValues": [ + "com.atproto.moderation.defs#reasonSpam", + "com.atproto.moderation.defs#reasonViolation", + "com.atproto.moderation.defs#reasonMisleading", + "com.atproto.moderation.defs#reasonSexual", + "com.atproto.moderation.defs#reasonRude", + "com.atproto.moderation.defs#reasonOther", + "com.atproto.moderation.defs#reasonAppeal" + ] + }, + "reasonSpam": { + "type": "token", + "description": "Spam: frequent unwanted promotion, replies, mentions" + }, + "reasonViolation": { + "type": "token", + "description": "Direct violation of server rules, laws, terms of service" + }, + "reasonMisleading": { + "type": "token", + "description": "Misleading identity, affiliation, or content" + }, + "reasonSexual": { + "type": "token", + "description": "Unwanted or mislabeled sexual content" + }, + "reasonRude": { + "type": "token", + "description": + "Rude, harassing, explicit, or otherwise unwelcoming behavior" + }, + "reasonOther": { + "type": "token", + "description": "Other: reports not falling under another report category" + }, + "reasonAppeal": { + "type": "token", + "description": "Appeal: appeal a previously taken moderation action" } } }; -/// `com.atproto.server.createAppPassword` -const comAtprotoServerCreateAppPassword = { +/// `com.atproto.sync.getCheckout` +const comAtprotoSyncGetCheckout = { "lexicon": 1, - "id": "com.atproto.server.createAppPassword", + "id": "com.atproto.sync.getCheckout", "defs": { "main": { - "type": "procedure", - "description": "Create an App Password.", - "input": { - "encoding": "application/json", - "schema": { - "type": "object", - "required": ["name"], - "properties": { - "name": { - "type": "string", - "description": - "A short name for the App Password, to help distinguish them." - }, - "privileged": { - "type": "boolean", - "description": - "If an app password has 'privileged' access to possibly sensitive account state. Meant for use with trusted clients." - } + "type": "query", + "description": "DEPRECATED - please use com.atproto.sync.getRepo instead", + "parameters": { + "type": "params", + "required": ["did"], + "properties": { + "did": { + "type": "string", + "format": "did", + "description": "The DID of the repo." } } }, - "output": { - "encoding": "application/json", - "schema": {"type": "ref", "ref": "#appPassword"} - }, - "errors": [ - {"name": "AccountTakedown"} - ] - }, - "appPassword": { - "type": "object", - "required": ["name", "password", "createdAt"], - "properties": { - "name": {"type": "string"}, - "password": {"type": "string"}, - "createdAt": {"type": "string", "format": "datetime"}, - "privileged": {"type": "boolean"} - } + "output": {"encoding": "application/vnd.ipld.car"} } } }; -/// `com.atproto.server.confirmEmail` -const comAtprotoServerConfirmEmail = { +/// `com.atproto.sync.getHead` +const comAtprotoSyncGetHead = { "lexicon": 1, - "id": "com.atproto.server.confirmEmail", + "id": "com.atproto.sync.getHead", "defs": { "main": { - "type": "procedure", + "type": "query", "description": - "Confirm an email using a token from com.atproto.server.requestEmailConfirmation.", - "input": { + "DEPRECATED - please use com.atproto.sync.getLatestCommit instead", + "parameters": { + "type": "params", + "required": ["did"], + "properties": { + "did": { + "type": "string", + "format": "did", + "description": "The DID of the repo." + } + } + }, + "output": { "encoding": "application/json", "schema": { "type": "object", - "required": ["email", "token"], + "required": ["root"], "properties": { - "email": {"type": "string"}, - "token": {"type": "string"} + "root": {"type": "string", "format": "cid"} } } }, "errors": [ - {"name": "AccountNotFound"}, - {"name": "ExpiredToken"}, - {"name": "InvalidToken"}, - {"name": "InvalidEmail"} + {"name": "HeadNotFound"} ] } } }; -/// `com.atproto.server.describeServer` -const comAtprotoServerDescribeServer = { +/// `com.atproto.sync.listRepos` +const comAtprotoSyncListRepos = { "lexicon": 1, - "id": "com.atproto.server.describeServer", + "id": "com.atproto.sync.listRepos", "defs": { "main": { "type": "query", "description": - "Describes the server's account creation requirements and capabilities. Implemented by PDS.", + "Enumerates all the DID, rev, and commit CID for all repos hosted by this service. Does not require auth; implemented by PDS and Relay.", + "parameters": { + "type": "params", + "properties": { + "limit": { + "type": "integer", + "default": 500, + "minimum": 1, + "maximum": 1000 + }, + "cursor": {"type": "string"} + } + }, "output": { "encoding": "application/json", "schema": { "type": "object", - "required": ["did", "availableUserDomains"], + "required": ["repos"], "properties": { - "inviteCodeRequired": { - "type": "boolean", - "description": - "If true, an invite code must be supplied to create an account on this instance." - }, - "phoneVerificationRequired": { - "type": "boolean", - "description": - "If true, a phone verification token must be supplied to create an account on this instance." - }, - "availableUserDomains": { + "cursor": {"type": "string"}, + "repos": { "type": "array", - "description": - "List of domain suffixes that can be used in account handles.", - "items": {"type": "string"} - }, - "links": { - "type": "ref", - "description": "URLs of service policy documents.", - "ref": "#links" - }, - "contact": { - "type": "ref", - "description": "Contact information", - "ref": "#contact" - }, - "did": {"type": "string", "format": "did"} + "items": {"type": "ref", "ref": "#repo"} + } } } } }, - "links": { - "type": "object", - "properties": { - "privacyPolicy": {"type": "string", "format": "uri"}, - "termsOfService": {"type": "string", "format": "uri"} - } - }, - "contact": { + "repo": { "type": "object", + "required": ["did", "head", "rev"], "properties": { - "email": {"type": "string"} + "did": {"type": "string", "format": "did"}, + "head": { + "type": "string", + "format": "cid", + "description": "Current repo commit CID" + }, + "rev": {"type": "string"}, + "active": {"type": "boolean"}, + "status": { + "type": "string", + "description": + "If active=false, this optional field indicates a possible reason for why the account is not active. If active=false and no status is supplied, then the host makes no claim for why the repository is no longer being hosted.", + "knownValues": ["takendown", "suspended", "deactivated"] + } } } } }; -/// `com.atproto.server.defs` -const comAtprotoServerDefs = { - "lexicon": 1, - "id": "com.atproto.server.defs", - "defs": { - "inviteCode": { - "type": "object", - "required": [ - "code", - "available", - "disabled", - "forAccount", - "createdBy", - "createdAt", - "uses" - ], - "properties": { - "code": {"type": "string"}, - "available": {"type": "integer"}, - "disabled": {"type": "boolean"}, - "forAccount": {"type": "string"}, - "createdBy": {"type": "string"}, - "createdAt": {"type": "string", "format": "datetime"}, - "uses": { - "type": "array", - "items": {"type": "ref", "ref": "#inviteCodeUse"} - } - } - }, - "inviteCodeUse": { - "type": "object", - "required": ["usedBy", "usedAt"], - "properties": { - "usedBy": {"type": "string", "format": "did"}, - "usedAt": {"type": "string", "format": "datetime"} - } - } - } -}; - -/// `com.atproto.server.requestPasswordReset` -const comAtprotoServerRequestPasswordReset = { +/// `com.atproto.sync.getBlocks` +const comAtprotoSyncGetBlocks = { "lexicon": 1, - "id": "com.atproto.server.requestPasswordReset", + "id": "com.atproto.sync.getBlocks", "defs": { "main": { - "type": "procedure", - "description": "Initiate a user account password reset via email.", - "input": { - "encoding": "application/json", - "schema": { - "type": "object", - "required": ["email"], - "properties": { - "email": {"type": "string"} + "type": "query", + "description": + "Get data blocks from a given repo, by CID. For example, intermediate MST nodes, or records. Does not require auth; implemented by PDS.", + "parameters": { + "type": "params", + "required": ["did", "cids"], + "properties": { + "did": { + "type": "string", + "format": "did", + "description": "The DID of the repo." + }, + "cids": { + "type": "array", + "items": {"type": "string", "format": "cid"} } } - } - } - } -}; - -/// `com.atproto.server.requestAccountDelete` -const comAtprotoServerRequestAccountDelete = { - "lexicon": 1, - "id": "com.atproto.server.requestAccountDelete", - "defs": { - "main": { - "type": "procedure", - "description": "Initiate a user account deletion via email." + }, + "output": {"encoding": "application/vnd.ipld.car"}, + "errors": [ + {"name": "BlockNotFound"}, + {"name": "RepoNotFound"}, + {"name": "RepoTakendown"}, + {"name": "RepoSuspended"}, + {"name": "RepoDeactivated"} + ] } } }; -/// `com.atproto.server.activateAccount` -const comAtprotoServerActivateAccount = { +/// `com.atproto.sync.listBlobs` +const comAtprotoSyncListBlobs = { "lexicon": 1, - "id": "com.atproto.server.activateAccount", + "id": "com.atproto.sync.listBlobs", "defs": { "main": { - "type": "procedure", + "type": "query", "description": - "Activates a currently deactivated account. Used to finalize account migration after the account's repo is imported and identity is setup." - } - } -}; - -/// `com.atproto.server.createInviteCodes` -const comAtprotoServerCreateInviteCodes = { - "lexicon": 1, - "id": "com.atproto.server.createInviteCodes", - "defs": { - "main": { - "type": "procedure", - "description": "Create invite codes.", - "input": { - "encoding": "application/json", - "schema": { - "type": "object", - "required": ["codeCount", "useCount"], - "properties": { - "codeCount": {"type": "integer", "default": 1}, - "useCount": {"type": "integer"}, - "forAccounts": { - "type": "array", - "items": {"type": "string", "format": "did"} - } - } + "List blob CIDs for an account, since some repo revision. Does not require auth; implemented by PDS.", + "parameters": { + "type": "params", + "required": ["did"], + "properties": { + "did": { + "type": "string", + "format": "did", + "description": "The DID of the repo." + }, + "since": { + "type": "string", + "description": "Optional revision of the repo to list blobs since." + }, + "limit": { + "type": "integer", + "default": 500, + "minimum": 1, + "maximum": 1000 + }, + "cursor": {"type": "string"} } }, "output": { "encoding": "application/json", "schema": { "type": "object", - "required": ["codes"], + "required": ["cids"], "properties": { - "codes": { + "cursor": {"type": "string"}, + "cids": { "type": "array", - "items": {"type": "ref", "ref": "#accountCodes"} + "items": {"type": "string", "format": "cid"} } } } - } - }, - "accountCodes": { - "type": "object", - "required": ["account", "codes"], - "properties": { - "account": {"type": "string"}, - "codes": { - "type": "array", - "items": {"type": "string"} - } - } - } - } -}; - -/// `com.atproto.server.revokeAppPassword` -const comAtprotoServerRevokeAppPassword = { - "lexicon": 1, - "id": "com.atproto.server.revokeAppPassword", - "defs": { - "main": { - "type": "procedure", - "description": "Revoke an App Password by name.", - "input": { - "encoding": "application/json", - "schema": { - "type": "object", - "required": ["name"], - "properties": { - "name": {"type": "string"} - } - } - } + }, + "errors": [ + {"name": "RepoNotFound"}, + {"name": "RepoTakendown"}, + {"name": "RepoSuspended"}, + {"name": "RepoDeactivated"} + ] } } }; -/// `com.atproto.server.deactivateAccount` -const comAtprotoServerDeactivateAccount = { +/// `com.atproto.sync.notifyOfUpdate` +const comAtprotoSyncNotifyOfUpdate = { "lexicon": 1, - "id": "com.atproto.server.deactivateAccount", + "id": "com.atproto.sync.notifyOfUpdate", "defs": { "main": { "type": "procedure", "description": - "Deactivates a currently active account. Stops serving of repo, and future writes to repo until reactivated. Used to finalize account migration with the old host after the account has been activated on the new host.", + "Notify a crawling service of a recent update, and that crawling should resume. Intended use is after a gap between repo stream events caused the crawling service to disconnect. Does not require auth; implemented by Relay.", "input": { "encoding": "application/json", "schema": { "type": "object", + "required": ["hostname"], "properties": { - "deleteAfter": { + "hostname": { "type": "string", - "format": "datetime", "description": - "A recommendation to server as to how long they should hold onto the deactivated account before deleting." + "Hostname of the current service (usually a PDS) that is notifying of update." } } } @@ -2018,190 +1863,142 @@ const comAtprotoServerDeactivateAccount = { } }; -/// `com.atproto.server.requestEmailConfirmation` -const comAtprotoServerRequestEmailConfirmation = { +/// `com.atproto.sync.getRepo` +const comAtprotoSyncGetRepo = { "lexicon": 1, - "id": "com.atproto.server.requestEmailConfirmation", + "id": "com.atproto.sync.getRepo", "defs": { "main": { - "type": "procedure", + "type": "query", "description": - "Request an email with a code to confirm ownership of email." + "Download a repository export as CAR file. Optionally only a 'diff' since a previous revision. Does not require auth; implemented by PDS.", + "parameters": { + "type": "params", + "required": ["did"], + "properties": { + "did": { + "type": "string", + "format": "did", + "description": "The DID of the repo." + }, + "since": { + "type": "string", + "description": + "The revision ('rev') of the repo to create a diff from." + } + } + }, + "output": {"encoding": "application/vnd.ipld.car"}, + "errors": [ + {"name": "RepoNotFound"}, + {"name": "RepoTakendown"}, + {"name": "RepoSuspended"}, + {"name": "RepoDeactivated"} + ] } } }; -/// `com.atproto.server.refreshSession` -const comAtprotoServerRefreshSession = { +/// `com.atproto.sync.getLatestCommit` +const comAtprotoSyncGetLatestCommit = { "lexicon": 1, - "id": "com.atproto.server.refreshSession", + "id": "com.atproto.sync.getLatestCommit", "defs": { "main": { - "type": "procedure", + "type": "query", "description": - "Refresh an authentication session. Requires auth using the 'refreshJwt' (not the 'accessJwt').", - "output": { - "encoding": "application/json", - "schema": { - "type": "object", - "required": ["accessJwt", "refreshJwt", "handle", "did"], - "properties": { - "accessJwt": {"type": "string"}, - "refreshJwt": {"type": "string"}, - "handle": {"type": "string", "format": "handle"}, - "did": {"type": "string", "format": "did"}, - "didDoc": {"type": "unknown"}, - "active": {"type": "boolean"}, - "status": { - "type": "string", - "description": - "Hosting status of the account. If not specified, then assume 'active'.", - "knownValues": ["takendown", "suspended", "deactivated"] - } + "Get the current commit CID & revision of the specified repo. Does not require auth.", + "parameters": { + "type": "params", + "required": ["did"], + "properties": { + "did": { + "type": "string", + "format": "did", + "description": "The DID of the repo." } } }, - "errors": [ - {"name": "AccountTakedown"} - ] - } - } -}; - -/// `com.atproto.server.requestEmailUpdate` -const comAtprotoServerRequestEmailUpdate = { - "lexicon": 1, - "id": "com.atproto.server.requestEmailUpdate", - "defs": { - "main": { - "type": "procedure", - "description": "Request a token in order to update email.", "output": { "encoding": "application/json", "schema": { "type": "object", - "required": ["tokenRequired"], - "properties": { - "tokenRequired": {"type": "boolean"} - } - } - } - } - } -}; - -/// `com.atproto.server.resetPassword` -const comAtprotoServerResetPassword = { - "lexicon": 1, - "id": "com.atproto.server.resetPassword", - "defs": { - "main": { - "type": "procedure", - "description": "Reset a user account password using a token.", - "input": { - "encoding": "application/json", - "schema": { - "type": "object", - "required": ["token", "password"], + "required": ["cid", "rev"], "properties": { - "token": {"type": "string"}, - "password": {"type": "string"} + "cid": {"type": "string", "format": "cid"}, + "rev": {"type": "string"} } } }, "errors": [ - {"name": "ExpiredToken"}, - {"name": "InvalidToken"} + {"name": "RepoNotFound"}, + {"name": "RepoTakendown"}, + {"name": "RepoSuspended"}, + {"name": "RepoDeactivated"} ] } } }; -/// `com.atproto.server.getServiceAuth` -const comAtprotoServerGetServiceAuth = { +/// `com.atproto.sync.getRecord` +const comAtprotoSyncGetRecord = { "lexicon": 1, - "id": "com.atproto.server.getServiceAuth", + "id": "com.atproto.sync.getRecord", "defs": { "main": { "type": "query", "description": - "Get a signed token on behalf of the requesting DID for the requested service.", + "Get data blocks needed to prove the existence or non-existence of record in the current version of repo. Does not require auth.", "parameters": { "type": "params", - "required": ["aud"], + "required": ["did", "collection", "rkey"], "properties": { - "aud": { + "did": { "type": "string", "format": "did", - "description": - "The DID of the service that the token will be used to authenticate with" - }, - "exp": { - "type": "integer", - "description": - "The time in Unix Epoch seconds that the JWT expires. Defaults to 60 seconds in the future. The service may enforce certain time bounds on tokens depending on the requested scope." + "description": "The DID of the repo." }, - "lxm": { + "collection": {"type": "string", "format": "nsid"}, + "rkey": {"type": "string", "description": "Record Key"}, + "commit": { "type": "string", - "format": "nsid", + "format": "cid", "description": - "Lexicon (XRPC) method to bind the requested token to" - } - } - }, - "output": { - "encoding": "application/json", - "schema": { - "type": "object", - "required": ["token"], - "properties": { - "token": {"type": "string"} + "DEPRECATED: referenced a repo commit by CID, and retrieved record as of that commit" } } }, + "output": {"encoding": "application/vnd.ipld.car"}, "errors": [ - { - "name": "BadExpiration", - "description": - "Indicates that the requested expiration date is not a valid. May be in the past or may be reliant on the requested scopes." - } + {"name": "RecordNotFound"}, + {"name": "RepoNotFound"}, + {"name": "RepoTakendown"}, + {"name": "RepoSuspended"}, + {"name": "RepoDeactivated"} ] } } }; -/// `com.atproto.server.reserveSigningKey` -const comAtprotoServerReserveSigningKey = { +/// `com.atproto.sync.requestCrawl` +const comAtprotoSyncRequestCrawl = { "lexicon": 1, - "id": "com.atproto.server.reserveSigningKey", + "id": "com.atproto.sync.requestCrawl", "defs": { "main": { "type": "procedure", "description": - "Reserve a repo signing key, for use with account creation. Necessary so that a DID PLC update operation can be constructed during an account migraiton. Public and does not require auth; implemented by PDS. NOTE: this endpoint may change when full account migration is implemented.", + "Request a service to persistently crawl hosted repos. Expected use is new PDS instances declaring their existence to Relays. Does not require auth.", "input": { "encoding": "application/json", "schema": { "type": "object", + "required": ["hostname"], "properties": { - "did": { - "type": "string", - "format": "did", - "description": "The DID to reserve a key for." - } - } - } - }, - "output": { - "encoding": "application/json", - "schema": { - "type": "object", - "required": ["signingKey"], - "properties": { - "signingKey": { + "hostname": { "type": "string", "description": - "The public key for the reserved signing key, in did:key serialization." + "Hostname of the current service (eg, PDS) that is requesting to be crawled." } } } @@ -2210,214 +2007,384 @@ const comAtprotoServerReserveSigningKey = { } }; -/// `com.atproto.server.getAccountInviteCodes` -const comAtprotoServerGetAccountInviteCodes = { +/// `com.atproto.sync.subscribeRepos` +const comAtprotoSyncSubscribeRepos = { "lexicon": 1, - "id": "com.atproto.server.getAccountInviteCodes", + "id": "com.atproto.sync.subscribeRepos", "defs": { "main": { - "type": "query", + "type": "subscription", "description": - "Get all invite codes for the current account. Requires auth.", + "Repository event stream, aka Firehose endpoint. Outputs repo commits with diff data, and identity update events, for all repositories on the current server. See the atproto specifications for details around stream sequencing, repo versioning, CAR diff format, and more. Public and does not require auth; implemented by PDS and Relay.", "parameters": { "type": "params", "properties": { - "includeUsed": {"type": "boolean", "default": true}, - "createAvailable": { - "type": "boolean", - "description": - "Controls whether any new 'earned' but not 'created' invites should be created.", - "default": true + "cursor": { + "type": "integer", + "description": "The last known event seq number to backfill from." } } }, - "output": { - "encoding": "application/json", + "message": { "schema": { - "type": "object", - "required": ["codes"], - "properties": { - "codes": { - "type": "array", - "items": { - "type": "ref", - "ref": "com.atproto.server.defs#inviteCode" - } - } - } + "type": "union", + "refs": [ + "#commit", + "#identity", + "#account", + "#handle", + "#migrate", + "#tombstone", + "#info" + ] } }, "errors": [ - {"name": "DuplicateCreate"} - ] - } - } -}; - -/// `com.atproto.server.createInviteCode` -const comAtprotoServerCreateInviteCode = { - "lexicon": 1, - "id": "com.atproto.server.createInviteCode", - "defs": { - "main": { - "type": "procedure", - "description": "Create an invite code.", - "input": { - "encoding": "application/json", - "schema": { - "type": "object", - "required": ["useCount"], - "properties": { - "useCount": {"type": "integer"}, - "forAccount": {"type": "string", "format": "did"} - } - } - }, - "output": { - "encoding": "application/json", - "schema": { - "type": "object", - "required": ["code"], - "properties": { - "code": {"type": "string"} - } + {"name": "FutureCursor"}, + { + "name": "ConsumerTooSlow", + "description": + "If the consumer of the stream can not keep up with events, and a backlog gets too large, the server will drop the connection." } - } - } - } -}; - -/// `com.atproto.server.deleteAccount` -const comAtprotoServerDeleteAccount = { - "lexicon": 1, - "id": "com.atproto.server.deleteAccount", - "defs": { - "main": { - "type": "procedure", + ] + }, + "commit": { + "type": "object", "description": - "Delete an actor's account with a token and password. Can only be called after requesting a deletion token. Requires auth.", - "input": { - "encoding": "application/json", - "schema": { - "type": "object", - "required": ["did", "password", "token"], - "properties": { - "did": {"type": "string", "format": "did"}, - "password": {"type": "string"}, - "token": {"type": "string"} - } - } - }, - "errors": [ - {"name": "ExpiredToken"}, - {"name": "InvalidToken"} - ] - } - } -}; - -/// `com.atproto.server.checkAccountStatus` -const comAtprotoServerCheckAccountStatus = { - "lexicon": 1, - "id": "com.atproto.server.checkAccountStatus", - "defs": { - "main": { - "type": "query", - "description": - "Returns the status of an account, especially as pertaining to import or recovery. Can be called many times over the course of an account migration. Requires auth and can only be called pertaining to oneself.", - "output": { - "encoding": "application/json", - "schema": { - "type": "object", - "required": [ - "activated", - "validDid", - "repoCommit", - "repoRev", - "repoBlocks", - "indexedRecords", - "privateStateValues", - "expectedBlobs", - "importedBlobs" - ], - "properties": { - "activated": {"type": "boolean"}, - "validDid": {"type": "boolean"}, - "repoCommit": {"type": "string", "format": "cid"}, - "repoRev": {"type": "string"}, - "repoBlocks": {"type": "integer"}, - "indexedRecords": {"type": "integer"}, - "privateStateValues": {"type": "integer"}, - "expectedBlobs": {"type": "integer"}, - "importedBlobs": {"type": "integer"} + "Represents an update of repository state. Note that empty commits are allowed, which include no repo data changes, but an update to rev and signature.", + "required": [ + "seq", + "rebase", + "tooBig", + "repo", + "commit", + "rev", + "since", + "blocks", + "ops", + "blobs", + "time" + ], + "nullable": ["prev", "since"], + "properties": { + "seq": { + "type": "integer", + "description": "The stream sequence number of this message." + }, + "rebase": {"type": "boolean", "description": "DEPRECATED -- unused"}, + "tooBig": { + "type": "boolean", + "description": + "Indicates that this commit contained too many ops, or data size was too large. Consumers will need to make a separate request to get missing data." + }, + "repo": { + "type": "string", + "format": "did", + "description": "The repo this event comes from." + }, + "commit": { + "type": "cid-link", + "description": "Repo commit object CID." + }, + "prev": { + "type": "cid-link", + "description": + "DEPRECATED -- unused. WARNING -- nullable and optional; stick with optional to ensure golang interoperability." + }, + "rev": { + "type": "string", + "description": + "The rev of the emitted commit. Note that this information is also in the commit object included in blocks, unless this is a tooBig event." + }, + "since": { + "type": "string", + "description": + "The rev of the last emitted commit from this repo (if any)." + }, + "blocks": { + "type": "bytes", + "description": + "CAR file containing relevant blocks, as a diff since the previous repo state.", + "maxLength": 1000000 + }, + "ops": { + "type": "array", + "items": { + "type": "ref", + "description": + "List of repo mutation operations in this commit (eg, records created, updated, or deleted).", + "ref": "#repoOp" + }, + "maxLength": 200 + }, + "blobs": { + "type": "array", + "items": { + "type": "cid-link", + "description": + "List of new blobs (by CID) referenced by records in this commit." } + }, + "time": { + "type": "string", + "format": "datetime", + "description": + "Timestamp of when this message was originally broadcast." + } + } + }, + "identity": { + "type": "object", + "description": + "Represents a change to an account's identity. Could be an updated handle, signing key, or pds hosting endpoint. Serves as a prod to all downstream services to refresh their identity cache.", + "required": ["seq", "did", "time"], + "properties": { + "seq": {"type": "integer"}, + "did": {"type": "string", "format": "did"}, + "time": {"type": "string", "format": "datetime"}, + "handle": { + "type": "string", + "format": "handle", + "description": + "The current handle for the account, or 'handle.invalid' if validation fails. This field is optional, might have been validated or passed-through from an upstream source. Semantics and behaviors for PDS vs Relay may evolve in the future; see atproto specs for more details." + } + } + }, + "account": { + "type": "object", + "description": + "Represents a change to an account's status on a host (eg, PDS or Relay). The semantics of this event are that the status is at the host which emitted the event, not necessarily that at the currently active PDS. Eg, a Relay takedown would emit a takedown with active=false, even if the PDS is still active.", + "required": ["seq", "did", "time", "active"], + "properties": { + "seq": {"type": "integer"}, + "did": {"type": "string", "format": "did"}, + "time": {"type": "string", "format": "datetime"}, + "active": { + "type": "boolean", + "description": + "Indicates that the account has a repository which can be fetched from the host that emitted this event." + }, + "status": { + "type": "string", + "description": + "If active=false, this optional field indicates a reason for why the account is not active.", + "knownValues": ["takendown", "suspended", "deleted", "deactivated"] + } + } + }, + "handle": { + "type": "object", + "description": "DEPRECATED -- Use #identity event instead", + "required": ["seq", "did", "handle", "time"], + "properties": { + "seq": {"type": "integer"}, + "did": {"type": "string", "format": "did"}, + "handle": {"type": "string", "format": "handle"}, + "time": {"type": "string", "format": "datetime"} + } + }, + "migrate": { + "type": "object", + "description": "DEPRECATED -- Use #account event instead", + "required": ["seq", "did", "migrateTo", "time"], + "nullable": ["migrateTo"], + "properties": { + "seq": {"type": "integer"}, + "did": {"type": "string", "format": "did"}, + "migrateTo": {"type": "string"}, + "time": {"type": "string", "format": "datetime"} + } + }, + "tombstone": { + "type": "object", + "description": "DEPRECATED -- Use #account event instead", + "required": ["seq", "did", "time"], + "properties": { + "seq": {"type": "integer"}, + "did": {"type": "string", "format": "did"}, + "time": {"type": "string", "format": "datetime"} + } + }, + "info": { + "type": "object", + "required": ["name"], + "properties": { + "name": { + "type": "string", + "knownValues": ["OutdatedCursor"] + }, + "message": {"type": "string"} + } + }, + "repoOp": { + "type": "object", + "description": "A repo operation, ie a mutation of a single record.", + "required": ["action", "path", "cid"], + "nullable": ["cid"], + "properties": { + "action": { + "type": "string", + "knownValues": ["create", "update", "delete"] + }, + "path": {"type": "string"}, + "cid": { + "type": "cid-link", + "description": + "For creates and updates, the new record CID. For deletions, null." } } } } }; -/// `com.atproto.server.getSession` -const comAtprotoServerGetSession = { +/// `com.atproto.sync.getRepoStatus` +const comAtprotoSyncGetRepoStatus = { "lexicon": 1, - "id": "com.atproto.server.getSession", + "id": "com.atproto.sync.getRepoStatus", "defs": { "main": { "type": "query", "description": - "Get information about the current auth session. Requires auth.", + "Get the hosting status for a repository, on this server. Expected to be implemented by PDS and Relay.", + "parameters": { + "type": "params", + "required": ["did"], + "properties": { + "did": { + "type": "string", + "format": "did", + "description": "The DID of the repo." + } + } + }, "output": { "encoding": "application/json", "schema": { "type": "object", - "required": ["handle", "did"], + "required": ["did", "active"], "properties": { - "handle": {"type": "string", "format": "handle"}, "did": {"type": "string", "format": "did"}, - "email": {"type": "string"}, - "emailConfirmed": {"type": "boolean"}, - "emailAuthFactor": {"type": "boolean"}, - "didDoc": {"type": "unknown"}, "active": {"type": "boolean"}, "status": { "type": "string", "description": "If active=false, this optional field indicates a possible reason for why the account is not active. If active=false and no status is supplied, then the host makes no claim for why the repository is no longer being hosted.", "knownValues": ["takendown", "suspended", "deactivated"] + }, + "rev": { + "type": "string", + "description": + "Optional field, the current rev of the repo, if active=true" } } } - } - } - } + }, + "errors": [ + {"name": "RepoNotFound"} + ] + } + } }; -/// `com.atproto.server.createSession` -const comAtprotoServerCreateSession = { +/// `com.atproto.sync.getBlob` +const comAtprotoSyncGetBlob = { "lexicon": 1, - "id": "com.atproto.server.createSession", + "id": "com.atproto.sync.getBlob", + "defs": { + "main": { + "type": "query", + "description": + "Get a blob associated with a given account. Returns the full blob as originally uploaded. Does not require auth; implemented by PDS.", + "parameters": { + "type": "params", + "required": ["did", "cid"], + "properties": { + "did": { + "type": "string", + "format": "did", + "description": "The DID of the account." + }, + "cid": { + "type": "string", + "format": "cid", + "description": "The CID of the blob to fetch" + } + } + }, + "output": {"encoding": "*/*"}, + "errors": [ + {"name": "BlobNotFound"}, + {"name": "RepoNotFound"}, + {"name": "RepoTakendown"}, + {"name": "RepoSuspended"}, + {"name": "RepoDeactivated"} + ] + } + } +}; + +/// `com.atproto.identity.getRecommendedDidCredentials` +const comAtprotoIdentityGetRecommendedDidCredentials = { + "lexicon": 1, + "id": "com.atproto.identity.getRecommendedDidCredentials", + "defs": { + "main": { + "type": "query", + "description": + "Describe the credentials that should be included in the DID doc of an account that is migrating to this service.", + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "properties": { + "rotationKeys": { + "type": "array", + "description": + "Recommended rotation keys for PLC dids. Should be undefined (or ignored) for did:webs.", + "items": {"type": "string"} + }, + "alsoKnownAs": { + "type": "array", + "items": {"type": "string"} + }, + "verificationMethods": {"type": "unknown"}, + "services": {"type": "unknown"} + } + } + } + } + } +}; + +/// `com.atproto.identity.signPlcOperation` +const comAtprotoIdentitySignPlcOperation = { + "lexicon": 1, + "id": "com.atproto.identity.signPlcOperation", "defs": { "main": { "type": "procedure", - "description": "Create an authentication session.", + "description": + "Signs a PLC operation to update some value(s) in the requesting DID's document.", "input": { "encoding": "application/json", "schema": { "type": "object", - "required": ["identifier", "password"], "properties": { - "identifier": { + "token": { "type": "string", "description": - "Handle or other identifier supported by the server for the authenticating user." + "A token received through com.atproto.identity.requestPlcOperationSignature" }, - "password": {"type": "string"}, - "authFactorToken": {"type": "string"}, - "allowTakendown": { - "type": "boolean", - "description": - "When true, instead of throwing error for takendown accounts, a valid response with a narrow scoped token will be returned" - } + "rotationKeys": { + "type": "array", + "items": {"type": "string"} + }, + "alsoKnownAs": { + "type": "array", + "items": {"type": "string"} + }, + "verificationMethods": {"type": "unknown"}, + "services": {"type": "unknown"} } } }, @@ -2425,175 +2392,256 @@ const comAtprotoServerCreateSession = { "encoding": "application/json", "schema": { "type": "object", - "required": ["accessJwt", "refreshJwt", "handle", "did"], + "required": ["operation"], "properties": { - "accessJwt": {"type": "string"}, - "refreshJwt": {"type": "string"}, - "handle": {"type": "string", "format": "handle"}, - "did": {"type": "string", "format": "did"}, - "didDoc": {"type": "unknown"}, - "email": {"type": "string"}, - "emailConfirmed": {"type": "boolean"}, - "emailAuthFactor": {"type": "boolean"}, - "active": {"type": "boolean"}, - "status": { - "type": "string", - "description": - "If active=false, this optional field indicates a possible reason for why the account is not active. If active=false and no status is supplied, then the host makes no claim for why the repository is no longer being hosted.", - "knownValues": ["takendown", "suspended", "deactivated"] + "operation": { + "type": "unknown", + "description": "A signed DID PLC operation." } } } - }, - "errors": [ - {"name": "AccountTakedown"}, - {"name": "AuthFactorTokenRequired"} - ] + } } } }; -/// `com.atproto.moderation.defs` -const comAtprotoModerationDefs = { +/// `com.atproto.identity.requestPlcOperationSignature` +const comAtprotoIdentityRequestPlcOperationSignature = { "lexicon": 1, - "id": "com.atproto.moderation.defs", + "id": "com.atproto.identity.requestPlcOperationSignature", "defs": { - "reasonType": { - "type": "string", - "knownValues": [ - "com.atproto.moderation.defs#reasonSpam", - "com.atproto.moderation.defs#reasonViolation", - "com.atproto.moderation.defs#reasonMisleading", - "com.atproto.moderation.defs#reasonSexual", - "com.atproto.moderation.defs#reasonRude", - "com.atproto.moderation.defs#reasonOther", - "com.atproto.moderation.defs#reasonAppeal" - ] - }, - "reasonSpam": { - "type": "token", - "description": "Spam: frequent unwanted promotion, replies, mentions" - }, - "reasonViolation": { - "type": "token", - "description": "Direct violation of server rules, laws, terms of service" - }, - "reasonMisleading": { - "type": "token", - "description": "Misleading identity, affiliation, or content" - }, - "reasonSexual": { - "type": "token", - "description": "Unwanted or mislabeled sexual content" - }, - "reasonRude": { - "type": "token", + "main": { + "type": "procedure", "description": - "Rude, harassing, explicit, or otherwise unwelcoming behavior" - }, - "reasonOther": { - "type": "token", - "description": "Other: reports not falling under another report category" - }, - "reasonAppeal": { - "type": "token", - "description": "Appeal: appeal a previously taken moderation action" + "Request an email with a code to in order to request a signed PLC operation. Requires Auth." } } }; -/// `com.atproto.moderation.createReport` -const comAtprotoModerationCreateReport = { +/// `com.atproto.identity.updateHandle` +const comAtprotoIdentityUpdateHandle = { "lexicon": 1, - "id": "com.atproto.moderation.createReport", + "id": "com.atproto.identity.updateHandle", "defs": { "main": { "type": "procedure", "description": - "Submit a moderation report regarding an atproto account or record. Implemented by moderation services (with PDS proxying), and requires auth.", + "Updates the current account's handle. Verifies handle validity, and updates did:plc document if necessary. Implemented by PDS, and requires auth.", "input": { "encoding": "application/json", "schema": { "type": "object", - "required": ["reasonType", "subject"], + "required": ["handle"], "properties": { - "reasonType": { - "type": "ref", - "description": - "Indicates the broad category of violation the report is for.", - "ref": "com.atproto.moderation.defs#reasonType" - }, - "reason": { + "handle": { "type": "string", - "description": - "Additional context about the content and violation.", - "maxLength": 20000, - "maxGraphemes": 2000 - }, - "subject": { - "type": "union", - "refs": [ - "com.atproto.admin.defs#repoRef", - "com.atproto.repo.strongRef" - ] + "format": "handle", + "description": "The new handle." } } } - }, - "output": { - "encoding": "application/json", - "schema": { - "type": "object", - "required": [ - "id", - "reasonType", - "subject", - "reportedBy", - "createdAt" - ], - "properties": { - "id": {"type": "integer"}, - "reasonType": { - "type": "ref", - "ref": "com.atproto.moderation.defs#reasonType" - }, - "reason": { - "type": "string", - "maxLength": 20000, - "maxGraphemes": 2000 - }, - "subject": { - "type": "union", - "refs": [ - "com.atproto.admin.defs#repoRef", - "com.atproto.repo.strongRef" - ] - }, - "reportedBy": {"type": "string", "format": "did"}, - "createdAt": {"type": "string", "format": "datetime"} - } - } } } } }; -/// `com.atproto.repo.createRecord` -const comAtprotoRepoCreateRecord = { +/// `com.atproto.identity.submitPlcOperation` +const comAtprotoIdentitySubmitPlcOperation = { "lexicon": 1, - "id": "com.atproto.repo.createRecord", + "id": "com.atproto.identity.submitPlcOperation", "defs": { "main": { "type": "procedure", "description": - "Create a single new repository record. Requires auth, implemented by PDS.", + "Validates a PLC operation to ensure that it doesn't violate a service's constraints or get the identity into a bad state, then submits it to the PLC registry", "input": { "encoding": "application/json", "schema": { "type": "object", - "required": ["repo", "collection", "record"], + "required": ["operation"], "properties": { - "repo": { + "operation": {"type": "unknown"} + } + } + } + } + } +}; + +/// `com.atproto.identity.resolveHandle` +const comAtprotoIdentityResolveHandle = { + "lexicon": 1, + "id": "com.atproto.identity.resolveHandle", + "defs": { + "main": { + "type": "query", + "description": "Resolves a handle (domain name) to a DID.", + "parameters": { + "type": "params", + "required": ["handle"], + "properties": { + "handle": { + "type": "string", + "format": "handle", + "description": "The handle to resolve." + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["did"], + "properties": { + "did": {"type": "string", "format": "did"} + } + } + } + } + } +}; + +/// `com.atproto.temp.fetchLabels` +const comAtprotoTempFetchLabels = { + "lexicon": 1, + "id": "com.atproto.temp.fetchLabels", + "defs": { + "main": { + "type": "query", + "description": + "DEPRECATED: use queryLabels or subscribeLabels instead -- Fetch all labels from a labeler created after a certain date.", + "parameters": { + "type": "params", + "properties": { + "since": {"type": "integer"}, + "limit": { + "type": "integer", + "default": 50, + "minimum": 1, + "maximum": 250 + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["labels"], + "properties": { + "labels": { + "type": "array", + "items": {"type": "ref", "ref": "com.atproto.label.defs#label"} + } + } + } + } + } + } +}; + +/// `com.atproto.temp.requestPhoneVerification` +const comAtprotoTempRequestPhoneVerification = { + "lexicon": 1, + "id": "com.atproto.temp.requestPhoneVerification", + "defs": { + "main": { + "type": "procedure", + "description": + "Request a verification code to be sent to the supplied phone number", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["phoneNumber"], + "properties": { + "phoneNumber": {"type": "string"} + } + } + } + } + } +}; + +/// `com.atproto.temp.checkSignupQueue` +const comAtprotoTempCheckSignupQueue = { + "lexicon": 1, + "id": "com.atproto.temp.checkSignupQueue", + "defs": { + "main": { + "type": "query", + "description": "Check accounts location in signup queue.", + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["activated"], + "properties": { + "activated": {"type": "boolean"}, + "placeInQueue": {"type": "integer"}, + "estimatedTimeMs": {"type": "integer"} + } + } + } + } + } +}; + +/// `com.atproto.temp.addReservedHandle` +const comAtprotoTempAddReservedHandle = { + "lexicon": 1, + "id": "com.atproto.temp.addReservedHandle", + "defs": { + "main": { + "type": "procedure", + "description": "Add a handle to the set of reserved handles.", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["handle"], + "properties": { + "handle": {"type": "string"} + } + } + }, + "output": { + "encoding": "application/json", + "schema": {"type": "object", "properties": {}} + } + } + } +}; + +/// `com.atproto.repo.importRepo` +const comAtprotoRepoImportRepo = { + "lexicon": 1, + "id": "com.atproto.repo.importRepo", + "defs": { + "main": { + "type": "procedure", + "description": + "Import a repo in the form of a CAR file. Requires Content-Length HTTP header to be set.", + "input": {"encoding": "application/vnd.ipld.car"} + } + } +}; + +/// `com.atproto.repo.createRecord` +const comAtprotoRepoCreateRecord = { + "lexicon": 1, + "id": "com.atproto.repo.createRecord", + "defs": { + "main": { + "type": "procedure", + "description": + "Create a single new repository record. Requires auth, implemented by PDS.", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["repo", "collection", "record"], + "properties": { + "repo": { "type": "string", "format": "at-identifier", "description": @@ -2656,60 +2704,6 @@ const comAtprotoRepoCreateRecord = { } }; -/// `com.atproto.repo.importRepo` -const comAtprotoRepoImportRepo = { - "lexicon": 1, - "id": "com.atproto.repo.importRepo", - "defs": { - "main": { - "type": "procedure", - "description": - "Import a repo in the form of a CAR file. Requires Content-Length HTTP header to be set.", - "input": {"encoding": "application/vnd.ipld.car"} - } - } -}; - -/// `com.atproto.repo.defs` -const comAtprotoRepoDefs = { - "lexicon": 1, - "id": "com.atproto.repo.defs", - "defs": { - "commitMeta": { - "type": "object", - "required": ["cid", "rev"], - "properties": { - "cid": {"type": "string", "format": "cid"}, - "rev": {"type": "string"} - } - } - } -}; - -/// `com.atproto.repo.uploadBlob` -const comAtprotoRepoUploadBlob = { - "lexicon": 1, - "id": "com.atproto.repo.uploadBlob", - "defs": { - "main": { - "type": "procedure", - "description": - "Upload a new blob, to be referenced from a repository record. The blob will be deleted if it is not referenced within a time window (eg, minutes). Blob restrictions (mimetype, size, etc) are enforced when the reference is created. Requires auth, implemented by PDS.", - "input": {"encoding": "*/*"}, - "output": { - "encoding": "application/json", - "schema": { - "type": "object", - "required": ["blob"], - "properties": { - "blob": {"type": "blob"} - } - } - } - } - } -}; - /// `com.atproto.repo.describeRepo` const comAtprotoRepoDescribeRepo = { "lexicon": 1, @@ -2766,32 +2760,96 @@ const comAtprotoRepoDescribeRepo = { } }; -/// `com.atproto.repo.listRecords` -const comAtprotoRepoListRecords = { +/// `com.atproto.repo.listMissingBlobs` +const comAtprotoRepoListMissingBlobs = { "lexicon": 1, - "id": "com.atproto.repo.listRecords", + "id": "com.atproto.repo.listMissingBlobs", "defs": { "main": { "type": "query", "description": - "List a range of records in a repository, matching a specific collection. Does not require auth.", + "Returns a list of missing blobs for the requesting account. Intended to be used in the account migration flow.", "parameters": { "type": "params", - "required": ["repo", "collection"], "properties": { - "repo": { - "type": "string", - "format": "at-identifier", - "description": "The handle or DID of the repo." - }, - "collection": { - "type": "string", - "format": "nsid", - "description": "The NSID of the record type." - }, "limit": { "type": "integer", - "description": "The number of records to return.", + "default": 500, + "minimum": 1, + "maximum": 1000 + }, + "cursor": {"type": "string"} + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["blobs"], + "properties": { + "cursor": {"type": "string"}, + "blobs": { + "type": "array", + "items": {"type": "ref", "ref": "#recordBlob"} + } + } + } + } + }, + "recordBlob": { + "type": "object", + "required": ["cid", "recordUri"], + "properties": { + "cid": {"type": "string", "format": "cid"}, + "recordUri": {"type": "string", "format": "at-uri"} + } + } + } +}; + +/// `com.atproto.repo.strongRef` +const comAtprotoRepoStrongRef = { + "lexicon": 1, + "id": "com.atproto.repo.strongRef", + "description": "A URI with a content-hash fingerprint.", + "defs": { + "main": { + "type": "object", + "required": ["uri", "cid"], + "properties": { + "uri": {"type": "string", "format": "at-uri"}, + "cid": {"type": "string", "format": "cid"} + } + } + } +}; + +/// `com.atproto.repo.listRecords` +const comAtprotoRepoListRecords = { + "lexicon": 1, + "id": "com.atproto.repo.listRecords", + "defs": { + "main": { + "type": "query", + "description": + "List a range of records in a repository, matching a specific collection. Does not require auth.", + "parameters": { + "type": "params", + "required": ["repo", "collection"], + "properties": { + "repo": { + "type": "string", + "format": "at-identifier", + "description": "The handle or DID of the repo." + }, + "collection": { + "type": "string", + "format": "nsid", + "description": "The NSID of the record type." + }, + "limit": { + "type": "integer", + "description": "The number of records to return.", "default": 50, "minimum": 1, "maximum": 100 @@ -2840,6 +2898,138 @@ const comAtprotoRepoListRecords = { } }; +/// `com.atproto.repo.getRecord` +const comAtprotoRepoGetRecord = { + "lexicon": 1, + "id": "com.atproto.repo.getRecord", + "defs": { + "main": { + "type": "query", + "description": + "Get a single record from a repository. Does not require auth.", + "parameters": { + "type": "params", + "required": ["repo", "collection", "rkey"], + "properties": { + "repo": { + "type": "string", + "format": "at-identifier", + "description": "The handle or DID of the repo." + }, + "collection": { + "type": "string", + "format": "nsid", + "description": "The NSID of the record collection." + }, + "rkey": {"type": "string", "description": "The Record Key."}, + "cid": { + "type": "string", + "format": "cid", + "description": + "The CID of the version of the record. If not specified, then return the most recent version." + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["uri", "value"], + "properties": { + "uri": {"type": "string", "format": "at-uri"}, + "cid": {"type": "string", "format": "cid"}, + "value": {"type": "unknown"} + } + } + }, + "errors": [ + {"name": "RecordNotFound"} + ] + } + } +}; + +/// `com.atproto.repo.putRecord` +const comAtprotoRepoPutRecord = { + "lexicon": 1, + "id": "com.atproto.repo.putRecord", + "defs": { + "main": { + "type": "procedure", + "description": + "Write a repository record, creating or updating it as needed. Requires auth, implemented by PDS.", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["repo", "collection", "rkey", "record"], + "nullable": ["swapRecord"], + "properties": { + "repo": { + "type": "string", + "format": "at-identifier", + "description": + "The handle or DID of the repo (aka, current account)." + }, + "collection": { + "type": "string", + "format": "nsid", + "description": "The NSID of the record collection." + }, + "rkey": { + "type": "string", + "description": "The Record Key.", + "maxLength": 512 + }, + "validate": { + "type": "boolean", + "description": + "Can be set to 'false' to skip Lexicon schema validation of record data, 'true' to require it, or leave unset to validate only for known Lexicons." + }, + "record": { + "type": "unknown", + "description": "The record to write." + }, + "swapRecord": { + "type": "string", + "format": "cid", + "description": + "Compare and swap with the previous record by CID. WARNING: nullable and optional field; may cause problems with golang implementation" + }, + "swapCommit": { + "type": "string", + "format": "cid", + "description": "Compare and swap with the previous commit by CID." + } + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["uri", "cid"], + "properties": { + "uri": {"type": "string", "format": "at-uri"}, + "cid": {"type": "string", "format": "cid"}, + "commit": { + "type": "ref", + "ref": "com.atproto.repo.defs#commitMeta" + }, + "validationStatus": { + "type": "string", + "knownValues": ["valid", "unknown"] + } + } + } + }, + "errors": [ + {"name": "InvalidSwap"} + ] + } + } +}; + /// `com.atproto.repo.deleteRecord` const comAtprotoRepoDeleteRecord = { "lexicon": 1, @@ -2896,23 +3086,6 @@ const comAtprotoRepoDeleteRecord = { } }; -/// `com.atproto.repo.strongRef` -const comAtprotoRepoStrongRef = { - "lexicon": 1, - "id": "com.atproto.repo.strongRef", - "description": "A URI with a content-hash fingerprint.", - "defs": { - "main": { - "type": "object", - "required": ["uri", "cid"], - "properties": { - "uri": {"type": "string", "format": "at-uri"}, - "cid": {"type": "string", "format": "cid"} - } - } - } -}; - /// `com.atproto.repo.applyWrites` const comAtprotoRepoApplyWrites = { "lexicon": 1, @@ -3042,253 +3215,131 @@ const comAtprotoRepoApplyWrites = { } }; -/// `com.atproto.repo.listMissingBlobs` -const comAtprotoRepoListMissingBlobs = { +/// `com.atproto.repo.uploadBlob` +const comAtprotoRepoUploadBlob = { "lexicon": 1, - "id": "com.atproto.repo.listMissingBlobs", + "id": "com.atproto.repo.uploadBlob", "defs": { "main": { - "type": "query", + "type": "procedure", "description": - "Returns a list of missing blobs for the requesting account. Intended to be used in the account migration flow.", - "parameters": { - "type": "params", - "properties": { - "limit": { - "type": "integer", - "default": 500, - "minimum": 1, - "maximum": 1000 - }, - "cursor": {"type": "string"} - } - }, + "Upload a new blob, to be referenced from a repository record. The blob will be deleted if it is not referenced within a time window (eg, minutes). Blob restrictions (mimetype, size, etc) are enforced when the reference is created. Requires auth, implemented by PDS.", + "input": {"encoding": "*/*"}, "output": { "encoding": "application/json", "schema": { "type": "object", - "required": ["blobs"], + "required": ["blob"], "properties": { - "cursor": {"type": "string"}, - "blobs": { - "type": "array", - "items": {"type": "ref", "ref": "#recordBlob"} - } + "blob": {"type": "blob"} } } } - }, - "recordBlob": { + } + } +}; + +/// `com.atproto.repo.defs` +const comAtprotoRepoDefs = { + "lexicon": 1, + "id": "com.atproto.repo.defs", + "defs": { + "commitMeta": { "type": "object", - "required": ["cid", "recordUri"], + "required": ["cid", "rev"], "properties": { "cid": {"type": "string", "format": "cid"}, - "recordUri": {"type": "string", "format": "at-uri"} + "rev": {"type": "string"} } } } }; -/// `com.atproto.repo.getRecord` -const comAtprotoRepoGetRecord = { +/// `com.atproto.label.subscribeLabels` +const comAtprotoLabelSubscribeLabels = { "lexicon": 1, - "id": "com.atproto.repo.getRecord", + "id": "com.atproto.label.subscribeLabels", "defs": { "main": { - "type": "query", + "type": "subscription", "description": - "Get a single record from a repository. Does not require auth.", + "Subscribe to stream of labels (and negations). Public endpoint implemented by mod services. Uses same sequencing scheme as repo event stream.", "parameters": { "type": "params", - "required": ["repo", "collection", "rkey"], "properties": { - "repo": { - "type": "string", - "format": "at-identifier", - "description": "The handle or DID of the repo." - }, - "collection": { - "type": "string", - "format": "nsid", - "description": "The NSID of the record collection." - }, - "rkey": {"type": "string", "description": "The Record Key."}, - "cid": { - "type": "string", - "format": "cid", - "description": - "The CID of the version of the record. If not specified, then return the most recent version." - } - } - }, - "output": { - "encoding": "application/json", - "schema": { - "type": "object", - "required": ["uri", "value"], - "properties": { - "uri": {"type": "string", "format": "at-uri"}, - "cid": {"type": "string", "format": "cid"}, - "value": {"type": "unknown"} - } - } - }, - "errors": [ - {"name": "RecordNotFound"} - ] - } - } -}; - -/// `com.atproto.repo.putRecord` -const comAtprotoRepoPutRecord = { - "lexicon": 1, - "id": "com.atproto.repo.putRecord", - "defs": { - "main": { - "type": "procedure", - "description": - "Write a repository record, creating or updating it as needed. Requires auth, implemented by PDS.", - "input": { - "encoding": "application/json", - "schema": { - "type": "object", - "required": ["repo", "collection", "rkey", "record"], - "nullable": ["swapRecord"], - "properties": { - "repo": { - "type": "string", - "format": "at-identifier", - "description": - "The handle or DID of the repo (aka, current account)." - }, - "collection": { - "type": "string", - "format": "nsid", - "description": "The NSID of the record collection." - }, - "rkey": { - "type": "string", - "description": "The Record Key.", - "maxLength": 512 - }, - "validate": { - "type": "boolean", - "description": - "Can be set to 'false' to skip Lexicon schema validation of record data, 'true' to require it, or leave unset to validate only for known Lexicons." - }, - "record": { - "type": "unknown", - "description": "The record to write." - }, - "swapRecord": { - "type": "string", - "format": "cid", - "description": - "Compare and swap with the previous record by CID. WARNING: nullable and optional field; may cause problems with golang implementation" - }, - "swapCommit": { - "type": "string", - "format": "cid", - "description": "Compare and swap with the previous commit by CID." - } + "cursor": { + "type": "integer", + "description": "The last known event seq number to backfill from." } } }, - "output": { - "encoding": "application/json", + "message": { "schema": { - "type": "object", - "required": ["uri", "cid"], - "properties": { - "uri": {"type": "string", "format": "at-uri"}, - "cid": {"type": "string", "format": "cid"}, - "commit": { - "type": "ref", - "ref": "com.atproto.repo.defs#commitMeta" - }, - "validationStatus": { - "type": "string", - "knownValues": ["valid", "unknown"] - } - } + "type": "union", + "refs": ["#labels", "#info"] } }, "errors": [ - {"name": "InvalidSwap"} + {"name": "FutureCursor"} ] - } - } -}; - -/// `com.atproto.temp.addReservedHandle` -const comAtprotoTempAddReservedHandle = { - "lexicon": 1, - "id": "com.atproto.temp.addReservedHandle", - "defs": { - "main": { - "type": "procedure", - "description": "Add a handle to the set of reserved handles.", - "input": { - "encoding": "application/json", - "schema": { - "type": "object", - "required": ["handle"], - "properties": { - "handle": {"type": "string"} - } + }, + "labels": { + "type": "object", + "required": ["seq", "labels"], + "properties": { + "seq": {"type": "integer"}, + "labels": { + "type": "array", + "items": {"type": "ref", "ref": "com.atproto.label.defs#label"} } - }, - "output": { - "encoding": "application/json", - "schema": {"type": "object", "properties": {}} } - } - } -}; - -/// `com.atproto.temp.requestPhoneVerification` -const comAtprotoTempRequestPhoneVerification = { - "lexicon": 1, - "id": "com.atproto.temp.requestPhoneVerification", - "defs": { - "main": { - "type": "procedure", - "description": - "Request a verification code to be sent to the supplied phone number", - "input": { - "encoding": "application/json", - "schema": { - "type": "object", - "required": ["phoneNumber"], - "properties": { - "phoneNumber": {"type": "string"} - } - } + }, + "info": { + "type": "object", + "required": ["name"], + "properties": { + "name": { + "type": "string", + "knownValues": ["OutdatedCursor"] + }, + "message": {"type": "string"} } } } }; -/// `com.atproto.temp.fetchLabels` -const comAtprotoTempFetchLabels = { +/// `com.atproto.label.queryLabels` +const comAtprotoLabelQueryLabels = { "lexicon": 1, - "id": "com.atproto.temp.fetchLabels", + "id": "com.atproto.label.queryLabels", "defs": { "main": { "type": "query", "description": - "DEPRECATED: use queryLabels or subscribeLabels instead -- Fetch all labels from a labeler created after a certain date.", + "Find labels relevant to the provided AT-URI patterns. Public endpoint for moderation services, though may return different or additional results with auth.", "parameters": { "type": "params", + "required": ["uriPatterns"], "properties": { - "since": {"type": "integer"}, + "uriPatterns": { + "type": "array", + "description": + "List of AT URI patterns to match (boolean 'OR'). Each may be a prefix (ending with '*'; will match inclusive of the string leading to '*'), or a full URI.", + "items": {"type": "string"} + }, + "sources": { + "type": "array", + "description": + "Optional list of label sources (DIDs) to filter on.", + "items": {"type": "string", "format": "did"} + }, "limit": { "type": "integer", "default": 50, "minimum": 1, "maximum": 250 - } + }, + "cursor": {"type": "string"} } }, "output": { @@ -3297,6 +3348,7 @@ const comAtprotoTempFetchLabels = { "type": "object", "required": ["labels"], "properties": { + "cursor": {"type": "string"}, "labels": { "type": "array", "items": {"type": "ref", "ref": "com.atproto.label.defs#label"} @@ -3308,73 +3360,203 @@ const comAtprotoTempFetchLabels = { } }; -/// `com.atproto.temp.checkSignupQueue` -const comAtprotoTempCheckSignupQueue = { +/// `com.atproto.label.defs` +const comAtprotoLabelDefs = { "lexicon": 1, - "id": "com.atproto.temp.checkSignupQueue", + "id": "com.atproto.label.defs", "defs": { - "main": { - "type": "query", - "description": "Check accounts location in signup queue.", - "output": { - "encoding": "application/json", - "schema": { - "type": "object", - "required": ["activated"], - "properties": { - "activated": {"type": "boolean"}, - "placeInQueue": {"type": "integer"}, - "estimatedTimeMs": {"type": "integer"} - } - } - } - } - } -}; - -/// `com.atproto.identity.submitPlcOperation` -const comAtprotoIdentitySubmitPlcOperation = { - "lexicon": 1, - "id": "com.atproto.identity.submitPlcOperation", - "defs": { - "main": { - "type": "procedure", + "label": { + "type": "object", "description": - "Validates a PLC operation to ensure that it doesn't violate a service's constraints or get the identity into a bad state, then submits it to the PLC registry", - "input": { - "encoding": "application/json", - "schema": { - "type": "object", - "required": ["operation"], - "properties": { - "operation": {"type": "unknown"} - } + "Metadata tag on an atproto resource (eg, repo or record).", + "required": ["src", "uri", "val", "cts"], + "properties": { + "ver": { + "type": "integer", + "description": "The AT Protocol version of the label object." + }, + "src": { + "type": "string", + "format": "did", + "description": "DID of the actor who created this label." + }, + "uri": { + "type": "string", + "format": "uri", + "description": + "AT URI of the record, repository (account), or other resource that this label applies to." + }, + "cid": { + "type": "string", + "format": "cid", + "description": + "Optionally, CID specifying the specific version of 'uri' resource this label applies to." + }, + "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": "datetime", + "description": "Timestamp when this label was created." + }, + "exp": { + "type": "string", + "format": "datetime", + "description": + "Timestamp at which this label expires (no longer applies)." + }, + "sig": { + "type": "bytes", + "description": "Signature of dag-cbor encoded label." + } + } + }, + "selfLabels": { + "type": "object", + "description": + "Metadata tags on an atproto record, published by the author within the record.", + "required": ["values"], + "properties": { + "values": { + "type": "array", + "items": {"type": "ref", "ref": "#selfLabel"}, + "maxLength": 10 + } + } + }, + "selfLabel": { + "type": "object", + "description": + "Metadata tag on an atproto record, published by the author within the record. Note that schemas should use #selfLabels, not #selfLabel.", + "required": ["val"], + "properties": { + "val": { + "type": "string", + "description": + "The short string name of the value or type of this label.", + "maxLength": 128 + } + } + }, + "labelValueDefinition": { + "type": "object", + "description": + "Declares a label value and its expected interpretations and behaviors.", + "required": ["identifier", "severity", "blurs", "locales"], + "properties": { + "identifier": { + "type": "string", + "description": + "The value of the label being defined. Must only include lowercase ascii and the '-' character ([a-z-]+).", + "maxLength": 100, + "maxGraphemes": 100 + }, + "severity": { + "type": "string", + "description": + "How should a client visually convey this label? 'inform' means neutral and informational; 'alert' means negative and warning; 'none' means show nothing.", + "knownValues": ["inform", "alert", "none"] + }, + "blurs": { + "type": "string", + "description": + "What should this label hide in the UI, if applied? 'content' hides all of the target; 'media' hides the images/video/audio; 'none' hides nothing.", + "knownValues": ["content", "media", "none"] + }, + "defaultSetting": { + "type": "string", + "description": "The default setting for this label.", + "default": "warn", + "knownValues": ["ignore", "warn", "hide"] + }, + "adultOnly": { + "type": "boolean", + "description": + "Does the user need to have adult content enabled in order to configure this label?" + }, + "locales": { + "type": "array", + "items": {"type": "ref", "ref": "#labelValueDefinitionStrings"} + } + } + }, + "labelValueDefinitionStrings": { + "type": "object", + "description": + "Strings which describe the label in the UI, localized into a specific language.", + "required": ["lang", "name", "description"], + "properties": { + "lang": { + "type": "string", + "format": "language", + "description": + "The code of the language these strings are written in." + }, + "name": { + "type": "string", + "description": "A short human-readable name for the label.", + "maxLength": 640, + "maxGraphemes": 64 + }, + "description": { + "type": "string", + "description": + "A longer description of what the label means and why it might be applied.", + "maxLength": 100000, + "maxGraphemes": 10000 } } + }, + "labelValue": { + "type": "string", + "knownValues": [ + "!hide", + "!no-promote", + "!warn", + "!no-unauthenticated", + "dmca-violation", + "doxxing", + "porn", + "sexual", + "nudity", + "nsfl", + "gore" + ] } } }; -/// `com.atproto.identity.updateHandle` -const comAtprotoIdentityUpdateHandle = { +/// `app.bsky.video.getJobStatus` +const appBskyVideoGetJobStatus = { "lexicon": 1, - "id": "com.atproto.identity.updateHandle", + "id": "app.bsky.video.getJobStatus", "defs": { "main": { - "type": "procedure", - "description": - "Updates the current account's handle. Verifies handle validity, and updates did:plc document if necessary. Implemented by PDS, and requires auth.", - "input": { + "type": "query", + "description": "Get status details for a video processing job.", + "parameters": { + "type": "params", + "required": ["jobId"], + "properties": { + "jobId": {"type": "string"} + } + }, + "output": { "encoding": "application/json", "schema": { "type": "object", - "required": ["handle"], + "required": ["jobStatus"], "properties": { - "handle": { - "type": "string", - "format": "handle", - "description": "The new handle." - } + "jobStatus": {"type": "ref", "ref": "app.bsky.video.defs#jobStatus"} } } } @@ -3382,48 +3564,22 @@ const comAtprotoIdentityUpdateHandle = { } }; -/// `com.atproto.identity.signPlcOperation` -const comAtprotoIdentitySignPlcOperation = { +/// `app.bsky.video.uploadVideo` +const appBskyVideoUploadVideo = { "lexicon": 1, - "id": "com.atproto.identity.signPlcOperation", + "id": "app.bsky.video.uploadVideo", "defs": { "main": { "type": "procedure", - "description": - "Signs a PLC operation to update some value(s) in the requesting DID's document.", - "input": { - "encoding": "application/json", - "schema": { - "type": "object", - "properties": { - "token": { - "type": "string", - "description": - "A token received through com.atproto.identity.requestPlcOperationSignature" - }, - "rotationKeys": { - "type": "array", - "items": {"type": "string"} - }, - "alsoKnownAs": { - "type": "array", - "items": {"type": "string"} - }, - "verificationMethods": {"type": "unknown"}, - "services": {"type": "unknown"} - } - } - }, + "description": "Upload a video to be processed then stored on the PDS.", + "input": {"encoding": "video/mp4"}, "output": { "encoding": "application/json", "schema": { "type": "object", - "required": ["operation"], + "required": ["jobStatus"], "properties": { - "operation": { - "type": "unknown", - "description": "A signed DID PLC operation." - } + "jobStatus": {"type": "ref", "ref": "app.bsky.video.defs#jobStatus"} } } } @@ -3431,32 +3587,25 @@ const comAtprotoIdentitySignPlcOperation = { } }; -/// `com.atproto.identity.resolveHandle` -const comAtprotoIdentityResolveHandle = { +/// `app.bsky.video.getUploadLimits` +const appBskyVideoGetUploadLimits = { "lexicon": 1, - "id": "com.atproto.identity.resolveHandle", + "id": "app.bsky.video.getUploadLimits", "defs": { "main": { "type": "query", - "description": "Resolves a handle (domain name) to a DID.", - "parameters": { - "type": "params", - "required": ["handle"], - "properties": { - "handle": { - "type": "string", - "format": "handle", - "description": "The handle to resolve." - } - } - }, + "description": "Get video upload limits for the authenticated user.", "output": { "encoding": "application/json", "schema": { "type": "object", - "required": ["did"], + "required": ["canUpload"], "properties": { - "did": {"type": "string", "format": "did"} + "canUpload": {"type": "boolean"}, + "remainingDailyVideos": {"type": "integer"}, + "remainingDailyBytes": {"type": "integer"}, + "message": {"type": "string"}, + "error": {"type": "string"} } } } @@ -3464,68 +3613,58 @@ const comAtprotoIdentityResolveHandle = { } }; -/// `com.atproto.identity.requestPlcOperationSignature` -const comAtprotoIdentityRequestPlcOperationSignature = { - "lexicon": 1, - "id": "com.atproto.identity.requestPlcOperationSignature", - "defs": { - "main": { - "type": "procedure", - "description": - "Request an email with a code to in order to request a signed PLC operation. Requires Auth." - } - } -}; - -/// `com.atproto.identity.getRecommendedDidCredentials` -const comAtprotoIdentityGetRecommendedDidCredentials = { +/// `app.bsky.video.defs` +const appBskyVideoDefs = { "lexicon": 1, - "id": "com.atproto.identity.getRecommendedDidCredentials", + "id": "app.bsky.video.defs", "defs": { - "main": { - "type": "query", - "description": - "Describe the credentials that should be included in the DID doc of an account that is migrating to this service.", - "output": { - "encoding": "application/json", - "schema": { - "type": "object", - "properties": { - "rotationKeys": { - "type": "array", - "description": - "Recommended rotation keys for PLC dids. Should be undefined (or ignored) for did:webs.", - "items": {"type": "string"} - }, - "alsoKnownAs": { - "type": "array", - "items": {"type": "string"} - }, - "verificationMethods": {"type": "unknown"}, - "services": {"type": "unknown"} - } - } + "jobStatus": { + "type": "object", + "required": ["jobId", "did", "state"], + "properties": { + "jobId": {"type": "string"}, + "did": {"type": "string", "format": "did"}, + "state": { + "type": "string", + "description": + "The state of the video processing job. All values not listed as a known value indicate that the job is in process.", + "knownValues": ["JOB_STATE_COMPLETED", "JOB_STATE_FAILED"] + }, + "progress": { + "type": "integer", + "description": "Progress within the current processing state.", + "minimum": 0, + "maximum": 100 + }, + "blob": {"type": "blob"}, + "error": {"type": "string"}, + "message": {"type": "string"} } } } }; -/// `app.bsky.feed.getFeedGenerators` -const appBskyFeedGetFeedGenerators = { +/// `app.bsky.feed.getActorFeeds` +const appBskyFeedGetActorFeeds = { "lexicon": 1, - "id": "app.bsky.feed.getFeedGenerators", + "id": "app.bsky.feed.getActorFeeds", "defs": { "main": { "type": "query", - "description": "Get information about a list of feed generators.", + "description": + "Get a list of feeds (feed generator records) created by the actor (in the actor's repo).", "parameters": { "type": "params", - "required": ["feeds"], + "required": ["actor"], "properties": { - "feeds": { - "type": "array", - "items": {"type": "string", "format": "at-uri"} - } + "actor": {"type": "string", "format": "at-identifier"}, + "limit": { + "type": "integer", + "default": 50, + "minimum": 1, + "maximum": 100 + }, + "cursor": {"type": "string"} } }, "output": { @@ -3534,6 +3673,7 @@ const appBskyFeedGetFeedGenerators = { "type": "object", "required": ["feeds"], "properties": { + "cursor": {"type": "string"}, "feeds": { "type": "array", "items": { @@ -3548,14 +3688,14 @@ const appBskyFeedGetFeedGenerators = { } }; -/// `app.bsky.feed.getQuotes` -const appBskyFeedGetQuotes = { +/// `app.bsky.feed.getRepostedBy` +const appBskyFeedGetRepostedBy = { "lexicon": 1, - "id": "app.bsky.feed.getQuotes", + "id": "app.bsky.feed.getRepostedBy", "defs": { "main": { "type": "query", - "description": "Get a list of quotes for a given post.", + "description": "Get a list of reposts for a given post.", "parameters": { "type": "params", "required": ["uri"], @@ -3569,7 +3709,7 @@ const appBskyFeedGetQuotes = { "type": "string", "format": "cid", "description": - "If supplied, filters to quotes of specific version (by CID) of the post record." + "If supplied, filters to reposts of specific version (by CID) of the post record." }, "limit": { "type": "integer", @@ -3584,14 +3724,14 @@ const appBskyFeedGetQuotes = { "encoding": "application/json", "schema": { "type": "object", - "required": ["uri", "posts"], + "required": ["uri", "repostedBy"], "properties": { "uri": {"type": "string", "format": "at-uri"}, "cid": {"type": "string", "format": "cid"}, "cursor": {"type": "string"}, - "posts": { + "repostedBy": { "type": "array", - "items": {"type": "ref", "ref": "app.bsky.feed.defs#postView"} + "items": {"type": "ref", "ref": "app.bsky.actor.defs#profileView"} } } } @@ -3600,23 +3740,18 @@ const appBskyFeedGetQuotes = { } }; -/// `app.bsky.feed.getTimeline` -const appBskyFeedGetTimeline = { +/// `app.bsky.feed.getSuggestedFeeds` +const appBskyFeedGetSuggestedFeeds = { "lexicon": 1, - "id": "app.bsky.feed.getTimeline", + "id": "app.bsky.feed.getSuggestedFeeds", "defs": { "main": { "type": "query", "description": - "Get a view of the requesting account's home timeline. This is expected to be some form of reverse-chronological feed.", + "Get a list of suggested feeds (feed generators) for the requesting account.", "parameters": { "type": "params", "properties": { - "algorithm": { - "type": "string", - "description": - "Variant 'algorithm' for timeline. Implementation-specific. NOTE: most feed flexibility has been moved to feed generator mechanism." - }, "limit": { "type": "integer", "default": 50, @@ -3630,12 +3765,15 @@ const appBskyFeedGetTimeline = { "encoding": "application/json", "schema": { "type": "object", - "required": ["feed"], + "required": ["feeds"], "properties": { "cursor": {"type": "string"}, - "feed": { + "feeds": { "type": "array", - "items": {"type": "ref", "ref": "app.bsky.feed.defs#feedViewPost"} + "items": { + "type": "ref", + "ref": "app.bsky.feed.defs#generatorView" + } } } } @@ -3644,532 +3782,263 @@ const appBskyFeedGetTimeline = { } }; -/// `app.bsky.feed.post` -const appBskyFeedPost = { +/// `app.bsky.feed.searchPosts` +const appBskyFeedSearchPosts = { "lexicon": 1, - "id": "app.bsky.feed.post", + "id": "app.bsky.feed.searchPosts", "defs": { "main": { - "type": "record", - "description": "Record containing a Bluesky post.", - "key": "tid", - "record": { - "type": "object", - "required": ["text", "createdAt"], + "type": "query", + "description": + "Find posts matching search criteria, returning views of those posts.", + "parameters": { + "type": "params", + "required": ["q"], "properties": { - "text": { + "q": { "type": "string", "description": - "The primary post content. May be an empty string, if there are embeds.", - "maxLength": 3000, - "maxGraphemes": 300 + "Search query string; syntax, phrase, boolean, and faceting is unspecified, but Lucene query syntax is recommended." }, - "entities": { - "type": "array", - "description": "DEPRECATED: replaced by app.bsky.richtext.facet.", - "items": {"type": "ref", "ref": "#entity"} + "sort": { + "type": "string", + "description": "Specifies the ranking order of results.", + "default": "latest", + "knownValues": ["top", "latest"] }, - "facets": { - "type": "array", + "since": { + "type": "string", "description": - "Annotations of text (mentions, URLs, hashtags, etc)", - "items": {"type": "ref", "ref": "app.bsky.richtext.facet"} + "Filter results for posts after the indicated datetime (inclusive). Expected to use 'sortAt' timestamp, which may not match 'createdAt'. Can be a datetime, or just an ISO date (YYYY-MM-DD)." }, - "reply": {"type": "ref", "ref": "#replyRef"}, - "embed": { - "type": "union", - "refs": [ - "app.bsky.embed.images", - "app.bsky.embed.video", - "app.bsky.embed.external", - "app.bsky.embed.record", - "app.bsky.embed.recordWithMedia" - ] + "until": { + "type": "string", + "description": + "Filter results for posts before the indicated datetime (not inclusive). Expected to use 'sortAt' timestamp, which may not match 'createdAt'. Can be a datetime, or just an ISO date (YYY-MM-DD)." }, - "langs": { - "type": "array", + "mentions": { + "type": "string", + "format": "at-identifier", "description": - "Indicates human language of post primary text content.", - "items": {"type": "string", "format": "language"}, - "maxLength": 3 + "Filter to posts which mention the given account. Handles are resolved to DID before query-time. Only matches rich-text facet mentions." }, - "labels": { - "type": "union", + "author": { + "type": "string", + "format": "at-identifier", "description": - "Self-label values for this post. Effectively content warnings.", - "refs": ["com.atproto.label.defs#selfLabels"] + "Filter to posts by the given account. Handles are resolved to DID before query-time." }, - "tags": { + "lang": { + "type": "string", + "format": "language", + "description": + "Filter to posts in the given language. Expected to be based on post language field, though server may override language detection." + }, + "domain": { + "type": "string", + "description": + "Filter to posts with URLs (facet links or embeds) linking to the given domain (hostname). Server may apply hostname normalization." + }, + "url": { + "type": "string", + "format": "uri", + "description": + "Filter to posts with links (facet links or embeds) pointing to this URL. Server may apply URL normalization or fuzzy matching." + }, + "tag": { "type": "array", "description": - "Additional hashtags, in addition to any included in post text and facets.", - "items": {"type": "string", "maxLength": 640, "maxGraphemes": 64}, - "maxLength": 8 + "Filter to posts with the given tag (hashtag), based on rich-text facet or tag field. Do not include the hash (#) prefix. Multiple tags can be specified, with 'AND' matching.", + "items": {"type": "string", "maxLength": 640, "maxGraphemes": 64} }, - "createdAt": { + "limit": { + "type": "integer", + "default": 25, + "minimum": 1, + "maximum": 100 + }, + "cursor": { "type": "string", - "format": "datetime", "description": - "Client-declared timestamp when this post was originally created." + "Optional pagination mechanism; may not necessarily allow scrolling through entire result set." } } - } - }, - "replyRef": { - "type": "object", - "required": ["root", "parent"], - "properties": { - "root": {"type": "ref", "ref": "com.atproto.repo.strongRef"}, - "parent": {"type": "ref", "ref": "com.atproto.repo.strongRef"} - } - }, - "entity": { - "type": "object", - "description": "Deprecated: use facets instead.", - "required": ["index", "type", "value"], - "properties": { - "index": {"type": "ref", "ref": "#textSlice"}, - "type": { - "type": "string", - "description": "Expected values are 'mention' and 'link'." - }, - "value": {"type": "string"} - } - }, - "textSlice": { - "type": "object", - "description": - "Deprecated. Use app.bsky.richtext instead -- A text segment. Start is inclusive, end is exclusive. Indices are for utf16-encoded strings.", - "required": ["start", "end"], - "properties": { - "start": {"type": "integer", "minimum": 0}, - "end": {"type": "integer", "minimum": 0} - } + }, + "output": { + "encoding": "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": {"type": "ref", "ref": "app.bsky.feed.defs#postView"} + } + } + } + }, + "errors": [ + {"name": "BadQueryString"} + ] } } }; -/// `app.bsky.feed.postgate` -const appBskyFeedPostgate = { +/// `app.bsky.feed.getPostThread` +const appBskyFeedGetPostThread = { "lexicon": 1, - "id": "app.bsky.feed.postgate", + "id": "app.bsky.feed.getPostThread", "defs": { "main": { - "type": "record", + "type": "query", "description": - "Record defining interaction rules for a post. The record key (rkey) of the postgate record must match the record key of the post, and that record must be in the same repository.", - "key": "tid", - "record": { - "type": "object", - "required": ["post", "createdAt"], + "Get posts in a thread. Does not require auth, but additional metadata and filtering will be applied for authed requests.", + "parameters": { + "type": "params", + "required": ["uri"], "properties": { - "createdAt": {"type": "string", "format": "datetime"}, - "post": { + "uri": { "type": "string", "format": "at-uri", - "description": "Reference (AT-URI) to the post record." + "description": "Reference (AT-URI) to post record." }, - "detachedEmbeddingUris": { - "type": "array", + "depth": { + "type": "integer", "description": - "List of AT-URIs embedding this post that the author has detached from.", - "items": {"type": "string", "format": "at-uri"}, - "maxLength": 50 + "How many levels of reply depth should be included in response.", + "default": 6, + "minimum": 0, + "maximum": 1000 }, - "embeddingRules": { - "type": "array", - "items": { + "parentHeight": { + "type": "integer", + "description": + "How many levels of parent (and grandparent, etc) post to include.", + "default": 80, + "minimum": 0, + "maximum": 1000 + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["thread"], + "properties": { + "thread": { "type": "union", - "refs": ["#disableRule"] + "refs": [ + "app.bsky.feed.defs#threadViewPost", + "app.bsky.feed.defs#notFoundPost", + "app.bsky.feed.defs#blockedPost" + ] }, - "maxLength": 5 + "threadgate": { + "type": "ref", + "ref": "app.bsky.feed.defs#threadgateView" + } } } - } - }, - "disableRule": { - "type": "object", - "description": "Disables embedding of this post.", - "properties": {} + }, + "errors": [ + {"name": "NotFound"} + ] } } }; -/// `app.bsky.feed.defs` -const appBskyFeedDefs = { +/// `app.bsky.feed.sendInteractions` +const appBskyFeedSendInteractions = { "lexicon": 1, - "id": "app.bsky.feed.defs", + "id": "app.bsky.feed.sendInteractions", "defs": { - "postView": { - "type": "object", - "required": ["uri", "cid", "author", "record", "indexedAt"], - "properties": { - "uri": {"type": "string", "format": "at-uri"}, - "cid": {"type": "string", "format": "cid"}, - "author": { - "type": "ref", - "ref": "app.bsky.actor.defs#profileViewBasic" - }, - "record": {"type": "unknown"}, - "embed": { - "type": "union", - "refs": [ - "app.bsky.embed.images#view", - "app.bsky.embed.video#view", - "app.bsky.embed.external#view", - "app.bsky.embed.record#view", - "app.bsky.embed.recordWithMedia#view" - ] - }, - "replyCount": {"type": "integer"}, - "repostCount": {"type": "integer"}, - "likeCount": {"type": "integer"}, - "quoteCount": {"type": "integer"}, - "indexedAt": {"type": "string", "format": "datetime"}, - "viewer": {"type": "ref", "ref": "#viewerState"}, - "labels": { - "type": "array", - "items": {"type": "ref", "ref": "com.atproto.label.defs#label"} - }, - "threadgate": {"type": "ref", "ref": "#threadgateView"} - } - }, - "viewerState": { - "type": "object", + "main": { + "type": "procedure", "description": - "Metadata about the requesting account's relationship with the subject content. Only has meaningful content for authed requests.", - "properties": { - "repost": {"type": "string", "format": "at-uri"}, - "like": {"type": "string", "format": "at-uri"}, - "threadMuted": {"type": "boolean"}, - "replyDisabled": {"type": "boolean"}, - "embeddingDisabled": {"type": "boolean"}, - "pinned": {"type": "boolean"} - } - }, - "feedViewPost": { - "type": "object", - "required": ["post"], - "properties": { - "post": {"type": "ref", "ref": "#postView"}, - "reply": {"type": "ref", "ref": "#replyRef"}, - "reason": { - "type": "union", - "refs": ["#reasonRepost", "#reasonPin"] - }, - "feedContext": { - "type": "string", - "description": - "Context provided by feed generator that may be passed back alongside interactions.", - "maxLength": 2000 - } - } - }, - "replyRef": { - "type": "object", - "required": ["root", "parent"], - "properties": { - "root": { - "type": "union", - "refs": ["#postView", "#notFoundPost", "#blockedPost"] - }, - "parent": { - "type": "union", - "refs": ["#postView", "#notFoundPost", "#blockedPost"] - }, - "grandparentAuthor": { - "type": "ref", - "description": - "When parent is a reply to another post, this is the author of that post.", - "ref": "app.bsky.actor.defs#profileViewBasic" - } - } - }, - "reasonRepost": { - "type": "object", - "required": ["by", "indexedAt"], - "properties": { - "by": {"type": "ref", "ref": "app.bsky.actor.defs#profileViewBasic"}, - "indexedAt": {"type": "string", "format": "datetime"} - } - }, - "reasonPin": {"type": "object", "properties": {}}, - "threadViewPost": { - "type": "object", - "required": ["post"], - "properties": { - "post": {"type": "ref", "ref": "#postView"}, - "parent": { - "type": "union", - "refs": ["#threadViewPost", "#notFoundPost", "#blockedPost"] - }, - "replies": { - "type": "array", - "items": { - "type": "union", - "refs": ["#threadViewPost", "#notFoundPost", "#blockedPost"] + "Send information about interactions with feed items back to the feed generator that served them.", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["interactions"], + "properties": { + "interactions": { + "type": "array", + "items": {"type": "ref", "ref": "app.bsky.feed.defs#interaction"} + } } } + }, + "output": { + "encoding": "application/json", + "schema": {"type": "object", "properties": {}} } - }, - "notFoundPost": { - "type": "object", - "required": ["uri", "notFound"], - "properties": { - "uri": {"type": "string", "format": "at-uri"}, - "notFound": {"type": "boolean", "const": true} - } - }, - "blockedPost": { - "type": "object", - "required": ["uri", "blocked", "author"], - "properties": { - "uri": {"type": "string", "format": "at-uri"}, - "blocked": {"type": "boolean", "const": true}, - "author": {"type": "ref", "ref": "#blockedAuthor"} - } - }, - "blockedAuthor": { - "type": "object", - "required": ["did"], - "properties": { - "did": {"type": "string", "format": "did"}, - "viewer": {"type": "ref", "ref": "app.bsky.actor.defs#viewerState"} - } - }, - "generatorView": { - "type": "object", - "required": ["uri", "cid", "did", "creator", "displayName", "indexedAt"], - "properties": { - "uri": {"type": "string", "format": "at-uri"}, - "cid": {"type": "string", "format": "cid"}, - "did": {"type": "string", "format": "did"}, - "creator": {"type": "ref", "ref": "app.bsky.actor.defs#profileView"}, - "displayName": {"type": "string"}, - "description": { - "type": "string", - "maxLength": 3000, - "maxGraphemes": 300 - }, - "descriptionFacets": { - "type": "array", - "items": {"type": "ref", "ref": "app.bsky.richtext.facet"} - }, - "avatar": {"type": "string", "format": "uri"}, - "likeCount": {"type": "integer", "minimum": 0}, - "acceptsInteractions": {"type": "boolean"}, - "labels": { - "type": "array", - "items": {"type": "ref", "ref": "com.atproto.label.defs#label"} - }, - "viewer": {"type": "ref", "ref": "#generatorViewerState"}, - "indexedAt": {"type": "string", "format": "datetime"} - } - }, - "generatorViewerState": { - "type": "object", - "properties": { - "like": {"type": "string", "format": "at-uri"} - } - }, - "skeletonFeedPost": { - "type": "object", - "required": ["post"], - "properties": { - "post": {"type": "string", "format": "at-uri"}, - "reason": { - "type": "union", - "refs": ["#skeletonReasonRepost", "#skeletonReasonPin"] - }, - "feedContext": { - "type": "string", - "description": - "Context that will be passed through to client and may be passed to feed generator back alongside interactions.", - "maxLength": 2000 - } - } - }, - "skeletonReasonRepost": { - "type": "object", - "required": ["repost"], - "properties": { - "repost": {"type": "string", "format": "at-uri"} - } - }, - "skeletonReasonPin": {"type": "object", "properties": {}}, - "threadgateView": { - "type": "object", - "properties": { - "uri": {"type": "string", "format": "at-uri"}, - "cid": {"type": "string", "format": "cid"}, - "record": {"type": "unknown"}, - "lists": { - "type": "array", - "items": {"type": "ref", "ref": "app.bsky.graph.defs#listViewBasic"} - } - } - }, - "interaction": { - "type": "object", - "properties": { - "item": {"type": "string", "format": "at-uri"}, - "event": { - "type": "string", - "knownValues": [ - "app.bsky.feed.defs#requestLess", - "app.bsky.feed.defs#requestMore", - "app.bsky.feed.defs#clickthroughItem", - "app.bsky.feed.defs#clickthroughAuthor", - "app.bsky.feed.defs#clickthroughReposter", - "app.bsky.feed.defs#clickthroughEmbed", - "app.bsky.feed.defs#interactionSeen", - "app.bsky.feed.defs#interactionLike", - "app.bsky.feed.defs#interactionRepost", - "app.bsky.feed.defs#interactionReply", - "app.bsky.feed.defs#interactionQuote", - "app.bsky.feed.defs#interactionShare" - ] - }, - "feedContext": { - "type": "string", - "description": - "Context on a feed item that was originally supplied by the feed generator on getFeedSkeleton.", - "maxLength": 2000 - } - } - }, - "requestLess": { - "type": "token", - "description": - "Request that less content like the given feed item be shown in the feed" - }, - "requestMore": { - "type": "token", - "description": - "Request that more content like the given feed item be shown in the feed" - }, - "clickthroughItem": { - "type": "token", - "description": "User clicked through to the feed item" - }, - "clickthroughAuthor": { - "type": "token", - "description": "User clicked through to the author of the feed item" - }, - "clickthroughReposter": { - "type": "token", - "description": "User clicked through to the reposter of the feed item" - }, - "clickthroughEmbed": { - "type": "token", - "description": - "User clicked through to the embedded content of the feed item" - }, - "interactionSeen": { - "type": "token", - "description": "Feed item was seen by user" - }, - "interactionLike": { - "type": "token", - "description": "User liked the feed item" - }, - "interactionRepost": { - "type": "token", - "description": "User reposted the feed item" - }, - "interactionReply": { - "type": "token", - "description": "User replied to the feed item" - }, - "interactionQuote": { - "type": "token", - "description": "User quoted the feed item" - }, - "interactionShare": { - "type": "token", - "description": "User shared the feed item" } } }; -/// `app.bsky.feed.getActorLikes` -const appBskyFeedGetActorLikes = { +/// `app.bsky.feed.getFeedGenerators` +const appBskyFeedGetFeedGenerators = { "lexicon": 1, - "id": "app.bsky.feed.getActorLikes", + "id": "app.bsky.feed.getFeedGenerators", "defs": { "main": { "type": "query", - "description": - "Get a list of posts liked by an actor. Requires auth, actor must be the requesting account.", + "description": "Get information about a list of feed generators.", "parameters": { "type": "params", - "required": ["actor"], + "required": ["feeds"], "properties": { - "actor": {"type": "string", "format": "at-identifier"}, - "limit": { - "type": "integer", - "default": 50, - "minimum": 1, - "maximum": 100 - }, - "cursor": {"type": "string"} + "feeds": { + "type": "array", + "items": {"type": "string", "format": "at-uri"} + } } }, "output": { "encoding": "application/json", "schema": { "type": "object", - "required": ["feed"], + "required": ["feeds"], "properties": { - "cursor": {"type": "string"}, - "feed": { + "feeds": { "type": "array", - "items": {"type": "ref", "ref": "app.bsky.feed.defs#feedViewPost"} + "items": { + "type": "ref", + "ref": "app.bsky.feed.defs#generatorView" + } } } } - }, - "errors": [ - {"name": "BlockedActor"}, - {"name": "BlockedByActor"} - ] + } } } }; -/// `app.bsky.feed.getPostThread` -const appBskyFeedGetPostThread = { +/// `app.bsky.feed.getFeedGenerator` +const appBskyFeedGetFeedGenerator = { "lexicon": 1, - "id": "app.bsky.feed.getPostThread", + "id": "app.bsky.feed.getFeedGenerator", "defs": { "main": { "type": "query", "description": - "Get posts in a thread. Does not require auth, but additional metadata and filtering will be applied for authed requests.", + "Get information about a feed generator. Implemented by AppView.", "parameters": { "type": "params", - "required": ["uri"], + "required": ["feed"], "properties": { - "uri": { + "feed": { "type": "string", "format": "at-uri", - "description": "Reference (AT-URI) to post record." - }, - "depth": { - "type": "integer", - "description": - "How many levels of reply depth should be included in response.", - "default": 6, - "minimum": 0, - "maximum": 1000 - }, - "parentHeight": { - "type": "integer", - "description": - "How many levels of parent (and grandparent, etc) post to include.", - "default": 80, - "minimum": 0, - "maximum": 1000 + "description": "AT-URI of the feed generator record." } } }, @@ -4177,26 +4046,60 @@ const appBskyFeedGetPostThread = { "encoding": "application/json", "schema": { "type": "object", - "required": ["thread"], + "required": ["view", "isOnline", "isValid"], "properties": { - "thread": { - "type": "union", - "refs": [ - "app.bsky.feed.defs#threadViewPost", - "app.bsky.feed.defs#notFoundPost", - "app.bsky.feed.defs#blockedPost" - ] - }, - "threadgate": { - "type": "ref", - "ref": "app.bsky.feed.defs#threadgateView" + "view": {"type": "ref", "ref": "app.bsky.feed.defs#generatorView"}, + "isOnline": { + "type": "boolean", + "description": + "Indicates whether the feed generator service has been online recently, or else seems to be inactive." + }, + "isValid": { + "type": "boolean", + "description": + "Indicates whether the feed generator service is compatible with the record declaration." } } } + } + } + } +}; + +/// `app.bsky.feed.getPosts` +const appBskyFeedGetPosts = { + "lexicon": 1, + "id": "app.bsky.feed.getPosts", + "defs": { + "main": { + "type": "query", + "description": + "Gets post views for a specified list of posts (by AT-URI). This is sometimes referred to as 'hydrating' a 'feed skeleton'.", + "parameters": { + "type": "params", + "required": ["uris"], + "properties": { + "uris": { + "type": "array", + "description": "List of post AT-URIs to return hydrated views for.", + "items": {"type": "string", "format": "at-uri"}, + "maxLength": 25 + } + } }, - "errors": [ - {"name": "NotFound"} - ] + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["posts"], + "properties": { + "posts": { + "type": "array", + "items": {"type": "ref", "ref": "app.bsky.feed.defs#postView"} + } + } + } + } } } }; @@ -4259,110 +4162,6 @@ const appBskyFeedThreadgate = { } }; -/// `app.bsky.feed.getActorFeeds` -const appBskyFeedGetActorFeeds = { - "lexicon": 1, - "id": "app.bsky.feed.getActorFeeds", - "defs": { - "main": { - "type": "query", - "description": - "Get a list of feeds (feed generator records) created by the actor (in the actor's repo).", - "parameters": { - "type": "params", - "required": ["actor"], - "properties": { - "actor": {"type": "string", "format": "at-identifier"}, - "limit": { - "type": "integer", - "default": 50, - "minimum": 1, - "maximum": 100 - }, - "cursor": {"type": "string"} - } - }, - "output": { - "encoding": "application/json", - "schema": { - "type": "object", - "required": ["feeds"], - "properties": { - "cursor": {"type": "string"}, - "feeds": { - "type": "array", - "items": { - "type": "ref", - "ref": "app.bsky.feed.defs#generatorView" - } - } - } - } - } - } - } -}; - -/// `app.bsky.feed.getPosts` -const appBskyFeedGetPosts = { - "lexicon": 1, - "id": "app.bsky.feed.getPosts", - "defs": { - "main": { - "type": "query", - "description": - "Gets post views for a specified list of posts (by AT-URI). This is sometimes referred to as 'hydrating' a 'feed skeleton'.", - "parameters": { - "type": "params", - "required": ["uris"], - "properties": { - "uris": { - "type": "array", - "description": "List of post AT-URIs to return hydrated views for.", - "items": {"type": "string", "format": "at-uri"}, - "maxLength": 25 - } - } - }, - "output": { - "encoding": "application/json", - "schema": { - "type": "object", - "required": ["posts"], - "properties": { - "posts": { - "type": "array", - "items": {"type": "ref", "ref": "app.bsky.feed.defs#postView"} - } - } - } - } - } - } -}; - -/// `app.bsky.feed.repost` -const appBskyFeedRepost = { - "lexicon": 1, - "id": "app.bsky.feed.repost", - "defs": { - "main": { - "type": "record", - "description": - "Record representing a 'repost' of an existing Bluesky post.", - "key": "tid", - "record": { - "type": "object", - "required": ["subject", "createdAt"], - "properties": { - "subject": {"type": "ref", "ref": "com.atproto.repo.strongRef"}, - "createdAt": {"type": "string", "format": "datetime"} - } - } - } - } -}; - /// `app.bsky.feed.getLikes` const appBskyFeedGetLikes = { "lexicon": 1, @@ -4425,67 +4224,82 @@ const appBskyFeedGetLikes = { } }; -/// `app.bsky.feed.getFeedGenerator` -const appBskyFeedGetFeedGenerator = { +/// `app.bsky.feed.generator` +const appBskyFeedGenerator = { "lexicon": 1, - "id": "app.bsky.feed.getFeedGenerator", + "id": "app.bsky.feed.generator", "defs": { "main": { - "type": "query", + "type": "record", "description": - "Get information about a feed generator. Implemented by AppView.", - "parameters": { - "type": "params", - "required": ["feed"], + "Record declaring of the existence of a feed generator, and containing metadata about it. The record can exist in any repository.", + "key": "any", + "record": { + "type": "object", + "required": ["did", "displayName", "createdAt"], "properties": { - "feed": { + "did": {"type": "string", "format": "did"}, + "displayName": { "type": "string", - "format": "at-uri", - "description": "AT-URI of the feed generator record." - } - } - }, - "output": { - "encoding": "application/json", - "schema": { - "type": "object", - "required": ["view", "isOnline", "isValid"], - "properties": { - "view": {"type": "ref", "ref": "app.bsky.feed.defs#generatorView"}, - "isOnline": { - "type": "boolean", - "description": - "Indicates whether the feed generator service has been online recently, or else seems to be inactive." - }, - "isValid": { - "type": "boolean", - "description": - "Indicates whether the feed generator service is compatible with the record declaration." - } - } + "maxLength": 240, + "maxGraphemes": 24 + }, + "description": { + "type": "string", + "maxLength": 3000, + "maxGraphemes": 300 + }, + "descriptionFacets": { + "type": "array", + "items": {"type": "ref", "ref": "app.bsky.richtext.facet"} + }, + "avatar": { + "type": "blob", + "accept": ["image/png", "image/jpeg"], + "maxSize": 1000000 + }, + "acceptsInteractions": { + "type": "boolean", + "description": + "Declaration that a feed accepts feedback interactions from a client through app.bsky.feed.sendInteractions" + }, + "labels": { + "type": "union", + "description": "Self-label values", + "refs": ["com.atproto.label.defs#selfLabels"] + }, + "contentMode": { + "type": "string", + "knownValues": [ + "app.bsky.feed.defs#contentModeUnspecified", + "app.bsky.feed.defs#contentModeVideo" + ] + }, + "createdAt": {"type": "string", "format": "datetime"} } } } } }; -/// `app.bsky.feed.getListFeed` -const appBskyFeedGetListFeed = { +/// `app.bsky.feed.getFeedSkeleton` +const appBskyFeedGetFeedSkeleton = { "lexicon": 1, - "id": "app.bsky.feed.getListFeed", + "id": "app.bsky.feed.getFeedSkeleton", "defs": { "main": { "type": "query", "description": - "Get a feed of recent posts from a list (posts and reposts from any actors on the list). Does not require auth.", + "Get a skeleton of a feed provided by a feed generator. Auth is optional, depending on provider requirements, and provides the DID of the requester. Implemented by Feed Generator Service.", "parameters": { "type": "params", - "required": ["list"], + "required": ["feed"], "properties": { - "list": { + "feed": { "type": "string", "format": "at-uri", - "description": "Reference (AT-URI) to the list record." + "description": + "Reference to feed generator record describing the specific feed being requested." }, "limit": { "type": "integer", @@ -4505,212 +4319,185 @@ const appBskyFeedGetListFeed = { "cursor": {"type": "string"}, "feed": { "type": "array", - "items": {"type": "ref", "ref": "app.bsky.feed.defs#feedViewPost"} + "items": { + "type": "ref", + "ref": "app.bsky.feed.defs#skeletonFeedPost" + } } } } }, "errors": [ - {"name": "UnknownList"} + {"name": "UnknownFeed"} ] } } }; -/// `app.bsky.feed.describeFeedGenerator` -const appBskyFeedDescribeFeedGenerator = { +/// `app.bsky.feed.getActorLikes` +const appBskyFeedGetActorLikes = { "lexicon": 1, - "id": "app.bsky.feed.describeFeedGenerator", - "defs": { - "main": { - "type": "query", - "description": - "Get information about a feed generator, including policies and offered feed URIs. Does not require auth; implemented by Feed Generator services (not App View).", - "output": { - "encoding": "application/json", - "schema": { - "type": "object", - "required": ["did", "feeds"], - "properties": { - "did": {"type": "string", "format": "did"}, - "feeds": { - "type": "array", - "items": {"type": "ref", "ref": "#feed"} - }, - "links": {"type": "ref", "ref": "#links"} - } - } - } - }, - "feed": { - "type": "object", - "required": ["uri"], - "properties": { - "uri": {"type": "string", "format": "at-uri"} - } - }, - "links": { - "type": "object", - "properties": { - "privacyPolicy": {"type": "string"}, - "termsOfService": {"type": "string"} - } - } - } -}; - -/// `app.bsky.feed.searchPosts` -const appBskyFeedSearchPosts = { - "lexicon": 1, - "id": "app.bsky.feed.searchPosts", + "id": "app.bsky.feed.getActorLikes", "defs": { "main": { "type": "query", "description": - "Find posts matching search criteria, returning views of those posts.", + "Get a list of posts liked by an actor. Requires auth, actor must be the requesting account.", "parameters": { "type": "params", - "required": ["q"], + "required": ["actor"], "properties": { - "q": { - "type": "string", - "description": - "Search query string; syntax, phrase, boolean, and faceting is unspecified, but Lucene query syntax is recommended." - }, - "sort": { - "type": "string", - "description": "Specifies the ranking order of results.", - "default": "latest", - "knownValues": ["top", "latest"] - }, - "since": { - "type": "string", - "description": - "Filter results for posts after the indicated datetime (inclusive). Expected to use 'sortAt' timestamp, which may not match 'createdAt'. Can be a datetime, or just an ISO date (YYYY-MM-DD)." - }, - "until": { - "type": "string", - "description": - "Filter results for posts before the indicated datetime (not inclusive). Expected to use 'sortAt' timestamp, which may not match 'createdAt'. Can be a datetime, or just an ISO date (YYY-MM-DD)." - }, - "mentions": { - "type": "string", - "format": "at-identifier", - "description": - "Filter to posts which mention the given account. Handles are resolved to DID before query-time. Only matches rich-text facet mentions." - }, - "author": { - "type": "string", - "format": "at-identifier", - "description": - "Filter to posts by the given account. Handles are resolved to DID before query-time." - }, - "lang": { - "type": "string", - "format": "language", - "description": - "Filter to posts in the given language. Expected to be based on post language field, though server may override language detection." - }, - "domain": { - "type": "string", - "description": - "Filter to posts with URLs (facet links or embeds) linking to the given domain (hostname). Server may apply hostname normalization." - }, - "url": { - "type": "string", - "format": "uri", - "description": - "Filter to posts with links (facet links or embeds) pointing to this URL. Server may apply URL normalization or fuzzy matching." - }, - "tag": { - "type": "array", - "description": - "Filter to posts with the given tag (hashtag), based on rich-text facet or tag field. Do not include the hash (#) prefix. Multiple tags can be specified, with 'AND' matching.", - "items": {"type": "string", "maxLength": 640, "maxGraphemes": 64} - }, + "actor": {"type": "string", "format": "at-identifier"}, "limit": { "type": "integer", - "default": 25, + "default": 50, "minimum": 1, "maximum": 100 }, - "cursor": { - "type": "string", - "description": - "Optional pagination mechanism; may not necessarily allow scrolling through entire result set." - } + "cursor": {"type": "string"} } }, "output": { "encoding": "application/json", "schema": { "type": "object", - "required": ["posts"], + "required": ["feed"], "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": { + "feed": { "type": "array", - "items": {"type": "ref", "ref": "app.bsky.feed.defs#postView"} + "items": {"type": "ref", "ref": "app.bsky.feed.defs#feedViewPost"} } } } }, "errors": [ - {"name": "BadQueryString"} + {"name": "BlockedActor"}, + {"name": "BlockedByActor"} ] } } }; -/// `app.bsky.feed.generator` -const appBskyFeedGenerator = { +/// `app.bsky.feed.post` +const appBskyFeedPost = { "lexicon": 1, - "id": "app.bsky.feed.generator", + "id": "app.bsky.feed.post", "defs": { "main": { "type": "record", - "description": - "Record declaring of the existence of a feed generator, and containing metadata about it. The record can exist in any repository.", - "key": "any", + "description": "Record containing a Bluesky post.", + "key": "tid", "record": { "type": "object", - "required": ["did", "displayName", "createdAt"], + "required": ["text", "createdAt"], "properties": { - "did": {"type": "string", "format": "did"}, - "displayName": { - "type": "string", - "maxLength": 240, - "maxGraphemes": 24 - }, - "description": { + "text": { "type": "string", + "description": + "The primary post content. May be an empty string, if there are embeds.", "maxLength": 3000, "maxGraphemes": 300 }, - "descriptionFacets": { + "entities": { "type": "array", + "description": "DEPRECATED: replaced by app.bsky.richtext.facet.", + "items": {"type": "ref", "ref": "#entity"} + }, + "facets": { + "type": "array", + "description": + "Annotations of text (mentions, URLs, hashtags, etc)", "items": {"type": "ref", "ref": "app.bsky.richtext.facet"} }, - "avatar": { - "type": "blob", - "accept": ["image/png", "image/jpeg"], - "maxSize": 1000000 + "reply": {"type": "ref", "ref": "#replyRef"}, + "embed": { + "type": "union", + "refs": [ + "app.bsky.embed.images", + "app.bsky.embed.video", + "app.bsky.embed.external", + "app.bsky.embed.record", + "app.bsky.embed.recordWithMedia" + ] }, - "acceptsInteractions": { - "type": "boolean", + "langs": { + "type": "array", "description": - "Declaration that a feed accepts feedback interactions from a client through app.bsky.feed.sendInteractions" + "Indicates human language of post primary text content.", + "items": {"type": "string", "format": "language"}, + "maxLength": 3 }, "labels": { "type": "union", - "description": "Self-label values", + "description": + "Self-label values for this post. Effectively content warnings.", "refs": ["com.atproto.label.defs#selfLabels"] }, + "tags": { + "type": "array", + "description": + "Additional hashtags, in addition to any included in post text and facets.", + "items": {"type": "string", "maxLength": 640, "maxGraphemes": 64}, + "maxLength": 8 + }, + "createdAt": { + "type": "string", + "format": "datetime", + "description": + "Client-declared timestamp when this post was originally created." + } + } + } + }, + "replyRef": { + "type": "object", + "required": ["root", "parent"], + "properties": { + "root": {"type": "ref", "ref": "com.atproto.repo.strongRef"}, + "parent": {"type": "ref", "ref": "com.atproto.repo.strongRef"} + } + }, + "entity": { + "type": "object", + "description": "Deprecated: use facets instead.", + "required": ["index", "type", "value"], + "properties": { + "index": {"type": "ref", "ref": "#textSlice"}, + "type": { + "type": "string", + "description": "Expected values are 'mention' and 'link'." + }, + "value": {"type": "string"} + } + }, + "textSlice": { + "type": "object", + "description": + "Deprecated. Use app.bsky.richtext instead -- A text segment. Start is inclusive, end is exclusive. Indices are for utf16-encoded strings.", + "required": ["start", "end"], + "properties": { + "start": {"type": "integer", "minimum": 0}, + "end": {"type": "integer", "minimum": 0} + } + } + } +}; + +/// `app.bsky.feed.like` +const appBskyFeedLike = { + "lexicon": 1, + "id": "app.bsky.feed.like", + "defs": { + "main": { + "type": "record", + "description": "Record declaring a 'like' of a piece of subject content.", + "key": "tid", + "record": { + "type": "object", + "required": ["subject", "createdAt"], + "properties": { + "subject": {"type": "ref", "ref": "com.atproto.repo.strongRef"}, "createdAt": {"type": "string", "format": "datetime"} } } @@ -4718,102 +4505,78 @@ const appBskyFeedGenerator = { } }; -/// `app.bsky.feed.sendInteractions` -const appBskyFeedSendInteractions = { +/// `app.bsky.feed.repost` +const appBskyFeedRepost = { "lexicon": 1, - "id": "app.bsky.feed.sendInteractions", + "id": "app.bsky.feed.repost", "defs": { "main": { - "type": "procedure", + "type": "record", "description": - "Send information about interactions with feed items back to the feed generator that served them.", - "input": { - "encoding": "application/json", - "schema": { - "type": "object", - "required": ["interactions"], - "properties": { - "interactions": { - "type": "array", - "items": {"type": "ref", "ref": "app.bsky.feed.defs#interaction"} - } - } + "Record representing a 'repost' of an existing Bluesky post.", + "key": "tid", + "record": { + "type": "object", + "required": ["subject", "createdAt"], + "properties": { + "subject": {"type": "ref", "ref": "com.atproto.repo.strongRef"}, + "createdAt": {"type": "string", "format": "datetime"} } - }, - "output": { - "encoding": "application/json", - "schema": {"type": "object", "properties": {}} } } } }; -/// `app.bsky.feed.getAuthorFeed` -const appBskyFeedGetAuthorFeed = { +/// `app.bsky.feed.describeFeedGenerator` +const appBskyFeedDescribeFeedGenerator = { "lexicon": 1, - "id": "app.bsky.feed.getAuthorFeed", + "id": "app.bsky.feed.describeFeedGenerator", "defs": { "main": { "type": "query", "description": - "Get a view of an actor's 'author feed' (post and reposts by the author). Does not require auth.", - "parameters": { - "type": "params", - "required": ["actor"], - "properties": { - "actor": {"type": "string", "format": "at-identifier"}, - "limit": { - "type": "integer", - "default": 50, - "minimum": 1, - "maximum": 100 - }, - "cursor": {"type": "string"}, - "filter": { - "type": "string", - "description": - "Combinations of post/repost types to include in response.", - "default": "posts_with_replies", - "knownValues": [ - "posts_with_replies", - "posts_no_replies", - "posts_with_media", - "posts_and_author_threads" - ] - }, - "includePins": {"type": "boolean", "default": false} - } - }, + "Get information about a feed generator, including policies and offered feed URIs. Does not require auth; implemented by Feed Generator services (not App View).", "output": { "encoding": "application/json", "schema": { "type": "object", - "required": ["feed"], + "required": ["did", "feeds"], "properties": { - "cursor": {"type": "string"}, - "feed": { + "did": {"type": "string", "format": "did"}, + "feeds": { "type": "array", - "items": {"type": "ref", "ref": "app.bsky.feed.defs#feedViewPost"} - } + "items": {"type": "ref", "ref": "#feed"} + }, + "links": {"type": "ref", "ref": "#links"} } } - }, - "errors": [ - {"name": "BlockedActor"}, - {"name": "BlockedByActor"} - ] + } + }, + "feed": { + "type": "object", + "required": ["uri"], + "properties": { + "uri": {"type": "string", "format": "at-uri"} + } + }, + "links": { + "type": "object", + "properties": { + "privacyPolicy": {"type": "string"}, + "termsOfService": {"type": "string"} + } } } }; -/// `app.bsky.feed.getRepostedBy` -const appBskyFeedGetRepostedBy = { +/// `app.bsky.feed.getQuotes` +const appBskyFeedGetQuotes = { "lexicon": 1, - "id": "app.bsky.feed.getRepostedBy", + "id": "app.bsky.feed.getQuotes", "defs": { "main": { "type": "query", - "description": "Get a list of reposts for a given post.", + "description": "Get a list of quotes for a given post.", "parameters": { "type": "params", "required": ["uri"], @@ -4827,7 +4590,7 @@ const appBskyFeedGetRepostedBy = { "type": "string", "format": "cid", "description": - "If supplied, filters to reposts of specific version (by CID) of the post record." + "If supplied, filters to quotes of specific version (by CID) of the post record." }, "limit": { "type": "integer", @@ -4842,14 +4605,14 @@ const appBskyFeedGetRepostedBy = { "encoding": "application/json", "schema": { "type": "object", - "required": ["uri", "repostedBy"], + "required": ["uri", "posts"], "properties": { "uri": {"type": "string", "format": "at-uri"}, "cid": {"type": "string", "format": "cid"}, "cursor": {"type": "string"}, - "repostedBy": { + "posts": { "type": "array", - "items": {"type": "ref", "ref": "app.bsky.actor.defs#profileView"} + "items": {"type": "ref", "ref": "app.bsky.feed.defs#postView"} } } } @@ -4858,83 +4621,23 @@ const appBskyFeedGetRepostedBy = { } }; -/// `app.bsky.feed.like` -const appBskyFeedLike = { - "lexicon": 1, - "id": "app.bsky.feed.like", - "defs": { - "main": { - "type": "record", - "description": "Record declaring a 'like' of a piece of subject content.", - "key": "tid", - "record": { - "type": "object", - "required": ["subject", "createdAt"], - "properties": { - "subject": {"type": "ref", "ref": "com.atproto.repo.strongRef"}, - "createdAt": {"type": "string", "format": "datetime"} - } - } - } - } -}; - -/// `app.bsky.feed.getSuggestedFeeds` -const appBskyFeedGetSuggestedFeeds = { +/// `app.bsky.feed.getTimeline` +const appBskyFeedGetTimeline = { "lexicon": 1, - "id": "app.bsky.feed.getSuggestedFeeds", + "id": "app.bsky.feed.getTimeline", "defs": { "main": { "type": "query", "description": - "Get a list of suggested feeds (feed generators) for the requesting account.", + "Get a view of the requesting account's home timeline. This is expected to be some form of reverse-chronological feed.", "parameters": { "type": "params", "properties": { - "limit": { - "type": "integer", - "default": 50, - "minimum": 1, - "maximum": 100 + "algorithm": { + "type": "string", + "description": + "Variant 'algorithm' for timeline. Implementation-specific. NOTE: most feed flexibility has been moved to feed generator mechanism." }, - "cursor": {"type": "string"} - } - }, - "output": { - "encoding": "application/json", - "schema": { - "type": "object", - "required": ["feeds"], - "properties": { - "cursor": {"type": "string"}, - "feeds": { - "type": "array", - "items": { - "type": "ref", - "ref": "app.bsky.feed.defs#generatorView" - } - } - } - } - } - } - } -}; - -/// `app.bsky.feed.getFeed` -const appBskyFeedGetFeed = { - "lexicon": 1, - "id": "app.bsky.feed.getFeed", - "defs": { - "main": { - "type": "query", - "description": - "Get a hydrated feed from an actor's selected feed generator. Implemented by App View.", - "parameters": { - "type": "params", - "required": ["feed"], - "properties": { - "feed": {"type": "string", "format": "at-uri"}, "limit": { "type": "integer", "default": 50, @@ -4957,519 +4660,499 @@ const appBskyFeedGetFeed = { } } } - }, - "errors": [ - {"name": "UnknownFeed"} - ] + } } } }; -/// `app.bsky.feed.getFeedSkeleton` -const appBskyFeedGetFeedSkeleton = { +/// `app.bsky.feed.postgate` +const appBskyFeedPostgate = { "lexicon": 1, - "id": "app.bsky.feed.getFeedSkeleton", + "id": "app.bsky.feed.postgate", "defs": { "main": { - "type": "query", + "type": "record", "description": - "Get a skeleton of a feed provided by a feed generator. Auth is optional, depending on provider requirements, and provides the DID of the requester. Implemented by Feed Generator Service.", - "parameters": { - "type": "params", - "required": ["feed"], + "Record defining interaction rules for a post. The record key (rkey) of the postgate record must match the record key of the post, and that record must be in the same repository.", + "key": "tid", + "record": { + "type": "object", + "required": ["post", "createdAt"], "properties": { - "feed": { + "createdAt": {"type": "string", "format": "datetime"}, + "post": { "type": "string", "format": "at-uri", - "description": - "Reference to feed generator record describing the specific feed being requested." + "description": "Reference (AT-URI) to the post record." }, - "limit": { - "type": "integer", - "default": 50, - "minimum": 1, - "maximum": 100 + "detachedEmbeddingUris": { + "type": "array", + "description": + "List of AT-URIs embedding this post that the author has detached from.", + "items": {"type": "string", "format": "at-uri"}, + "maxLength": 50 }, - "cursor": {"type": "string"} - } - }, - "output": { - "encoding": "application/json", - "schema": { - "type": "object", - "required": ["feed"], - "properties": { - "cursor": {"type": "string"}, - "feed": { - "type": "array", - "items": { - "type": "ref", - "ref": "app.bsky.feed.defs#skeletonFeedPost" - } - } + "embeddingRules": { + "type": "array", + "items": { + "type": "union", + "refs": ["#disableRule"] + }, + "maxLength": 5 } } - }, - "errors": [ - {"name": "UnknownFeed"} - ] + } + }, + "disableRule": { + "type": "object", + "description": "Disables embedding of this post.", + "properties": {} } } }; -/// `app.bsky.embed.images` -const appBskyEmbedImages = { +/// `app.bsky.feed.defs` +const appBskyFeedDefs = { "lexicon": 1, - "id": "app.bsky.embed.images", - "description": "A set of images embedded in a Bluesky record (eg, a post).", + "id": "app.bsky.feed.defs", "defs": { - "main": { + "postView": { "type": "object", - "required": ["images"], + "required": ["uri", "cid", "author", "record", "indexedAt"], "properties": { - "images": { + "uri": {"type": "string", "format": "at-uri"}, + "cid": {"type": "string", "format": "cid"}, + "author": { + "type": "ref", + "ref": "app.bsky.actor.defs#profileViewBasic" + }, + "record": {"type": "unknown"}, + "embed": { + "type": "union", + "refs": [ + "app.bsky.embed.images#view", + "app.bsky.embed.video#view", + "app.bsky.embed.external#view", + "app.bsky.embed.record#view", + "app.bsky.embed.recordWithMedia#view" + ] + }, + "replyCount": {"type": "integer"}, + "repostCount": {"type": "integer"}, + "likeCount": {"type": "integer"}, + "quoteCount": {"type": "integer"}, + "indexedAt": {"type": "string", "format": "datetime"}, + "viewer": {"type": "ref", "ref": "#viewerState"}, + "labels": { "type": "array", - "items": {"type": "ref", "ref": "#image"}, - "maxLength": 4 - } + "items": {"type": "ref", "ref": "com.atproto.label.defs#label"} + }, + "threadgate": {"type": "ref", "ref": "#threadgateView"} } }, - "image": { + "viewerState": { "type": "object", - "required": ["image", "alt"], + "description": + "Metadata about the requesting account's relationship with the subject content. Only has meaningful content for authed requests.", "properties": { - "image": { - "type": "blob", - "accept": ["image/*"], - "maxSize": 1000000 - }, - "alt": { - "type": "string", - "description": "Alt text description of the image, for accessibility." - }, - "aspectRatio": {"type": "ref", "ref": "app.bsky.embed.defs#aspectRatio"} + "repost": {"type": "string", "format": "at-uri"}, + "like": {"type": "string", "format": "at-uri"}, + "threadMuted": {"type": "boolean"}, + "replyDisabled": {"type": "boolean"}, + "embeddingDisabled": {"type": "boolean"}, + "pinned": {"type": "boolean"} } }, - "view": { + "threadContext": { "type": "object", - "required": ["images"], + "description": + "Metadata about this post within the context of the thread it is in.", "properties": { - "images": { - "type": "array", - "items": {"type": "ref", "ref": "#viewImage"}, - "maxLength": 4 - } + "rootAuthorLike": {"type": "string", "format": "at-uri"} } }, - "viewImage": { + "feedViewPost": { "type": "object", - "required": ["thumb", "fullsize", "alt"], + "required": ["post"], "properties": { - "thumb": { - "type": "string", - "format": "uri", - "description": - "Fully-qualified URL where a thumbnail of the image can be fetched. For example, CDN location provided by the App View." + "post": {"type": "ref", "ref": "#postView"}, + "reply": {"type": "ref", "ref": "#replyRef"}, + "reason": { + "type": "union", + "refs": ["#reasonRepost", "#reasonPin"] }, - "fullsize": { + "feedContext": { "type": "string", - "format": "uri", "description": - "Fully-qualified URL where a large version of the image can be fetched. May or may not be the exact original blob. For example, CDN location provided by the App View." - }, - "alt": { - "type": "string", - "description": "Alt text description of the image, for accessibility." - }, - "aspectRatio": {"type": "ref", "ref": "app.bsky.embed.defs#aspectRatio"} - } - } - } -}; - -/// `app.bsky.embed.defs` -const appBskyEmbedDefs = { - "lexicon": 1, - "id": "app.bsky.embed.defs", - "defs": { - "aspectRatio": { - "type": "object", - "description": - "width:height represents an aspect ratio. It may be approximate, and may not correspond to absolute dimensions in any given unit.", - "required": ["width", "height"], - "properties": { - "width": {"type": "integer", "minimum": 1}, - "height": {"type": "integer", "minimum": 1} + "Context provided by feed generator that may be passed back alongside interactions.", + "maxLength": 2000 + } } - } - } -}; - -/// `app.bsky.embed.recordWithMedia` -const appBskyEmbedRecordWithMedia = { - "lexicon": 1, - "id": "app.bsky.embed.recordWithMedia", - "description": - "A representation of a record embedded in a Bluesky record (eg, a post), alongside other compatible embeds. For example, a quote post and image, or a quote post and external URL card.", - "defs": { - "main": { + }, + "replyRef": { "type": "object", - "required": ["record", "media"], + "required": ["root", "parent"], "properties": { - "record": {"type": "ref", "ref": "app.bsky.embed.record"}, - "media": { + "root": { "type": "union", - "refs": [ - "app.bsky.embed.images", - "app.bsky.embed.video", - "app.bsky.embed.external" - ] + "refs": ["#postView", "#notFoundPost", "#blockedPost"] + }, + "parent": { + "type": "union", + "refs": ["#postView", "#notFoundPost", "#blockedPost"] + }, + "grandparentAuthor": { + "type": "ref", + "description": + "When parent is a reply to another post, this is the author of that post.", + "ref": "app.bsky.actor.defs#profileViewBasic" } } }, - "view": { + "reasonRepost": { "type": "object", - "required": ["record", "media"], + "required": ["by", "indexedAt"], "properties": { - "record": {"type": "ref", "ref": "app.bsky.embed.record#view"}, - "media": { - "type": "union", - "refs": [ - "app.bsky.embed.images#view", - "app.bsky.embed.video#view", - "app.bsky.embed.external#view" - ] - } + "by": {"type": "ref", "ref": "app.bsky.actor.defs#profileViewBasic"}, + "indexedAt": {"type": "string", "format": "datetime"} } - } - } -}; - -/// `app.bsky.embed.video` -const appBskyEmbedVideo = { - "lexicon": 1, - "id": "app.bsky.embed.video", - "description": "A video embedded in a Bluesky record (eg, a post).", - "defs": { - "main": { + }, + "reasonPin": {"type": "object", "properties": {}}, + "threadViewPost": { "type": "object", - "required": ["video"], + "required": ["post"], "properties": { - "video": { - "type": "blob", - "accept": ["video/mp4"], - "maxSize": 50000000 + "post": {"type": "ref", "ref": "#postView"}, + "parent": { + "type": "union", + "refs": ["#threadViewPost", "#notFoundPost", "#blockedPost"] }, - "captions": { + "replies": { "type": "array", - "items": {"type": "ref", "ref": "#caption"}, - "maxLength": 20 - }, - "alt": { - "type": "string", - "description": - "Alt text description of the video, for accessibility.", - "maxLength": 10000, - "maxGraphemes": 1000 + "items": { + "type": "union", + "refs": ["#threadViewPost", "#notFoundPost", "#blockedPost"] + } }, - "aspectRatio": {"type": "ref", "ref": "app.bsky.embed.defs#aspectRatio"} + "threadContext": {"type": "ref", "ref": "#threadContext"} } }, - "caption": { + "notFoundPost": { "type": "object", - "required": ["lang", "file"], + "required": ["uri", "notFound"], "properties": { - "lang": {"type": "string", "format": "language"}, - "file": { - "type": "blob", - "accept": ["text/vtt"], - "maxSize": 20000 - } + "uri": {"type": "string", "format": "at-uri"}, + "notFound": {"type": "boolean", "const": true} } }, - "view": { + "blockedPost": { "type": "object", - "required": ["cid", "playlist"], + "required": ["uri", "blocked", "author"], "properties": { - "cid": {"type": "string", "format": "cid"}, - "playlist": {"type": "string", "format": "uri"}, - "thumbnail": {"type": "string", "format": "uri"}, - "alt": {"type": "string", "maxLength": 10000, "maxGraphemes": 1000}, - "aspectRatio": {"type": "ref", "ref": "app.bsky.embed.defs#aspectRatio"} + "uri": {"type": "string", "format": "at-uri"}, + "blocked": {"type": "boolean", "const": true}, + "author": {"type": "ref", "ref": "#blockedAuthor"} } - } - } -}; - -/// `app.bsky.embed.external` -const appBskyEmbedExternal = { - "lexicon": 1, - "id": "app.bsky.embed.external", - "defs": { - "main": { + }, + "blockedAuthor": { "type": "object", - "description": - "A representation of some externally linked content (eg, a URL and 'card'), embedded in a Bluesky record (eg, a post).", - "required": ["external"], + "required": ["did"], "properties": { - "external": {"type": "ref", "ref": "#external"} + "did": {"type": "string", "format": "did"}, + "viewer": {"type": "ref", "ref": "app.bsky.actor.defs#viewerState"} } }, - "external": { + "generatorView": { "type": "object", - "required": ["uri", "title", "description"], + "required": ["uri", "cid", "did", "creator", "displayName", "indexedAt"], "properties": { - "uri": {"type": "string", "format": "uri"}, - "title": {"type": "string"}, - "description": {"type": "string"}, - "thumb": { - "type": "blob", - "accept": ["image/*"], - "maxSize": 1000000 - } + "uri": {"type": "string", "format": "at-uri"}, + "cid": {"type": "string", "format": "cid"}, + "did": {"type": "string", "format": "did"}, + "creator": {"type": "ref", "ref": "app.bsky.actor.defs#profileView"}, + "displayName": {"type": "string"}, + "description": { + "type": "string", + "maxLength": 3000, + "maxGraphemes": 300 + }, + "descriptionFacets": { + "type": "array", + "items": {"type": "ref", "ref": "app.bsky.richtext.facet"} + }, + "avatar": {"type": "string", "format": "uri"}, + "likeCount": {"type": "integer", "minimum": 0}, + "acceptsInteractions": {"type": "boolean"}, + "labels": { + "type": "array", + "items": {"type": "ref", "ref": "com.atproto.label.defs#label"} + }, + "viewer": {"type": "ref", "ref": "#generatorViewerState"}, + "contentMode": { + "type": "string", + "knownValues": [ + "app.bsky.feed.defs#contentModeUnspecified", + "app.bsky.feed.defs#contentModeVideo" + ] + }, + "indexedAt": {"type": "string", "format": "datetime"} } }, - "view": { + "generatorViewerState": { "type": "object", - "required": ["external"], "properties": { - "external": {"type": "ref", "ref": "#viewExternal"} + "like": {"type": "string", "format": "at-uri"} } }, - "viewExternal": { - "type": "object", - "required": ["uri", "title", "description"], - "properties": { - "uri": {"type": "string", "format": "uri"}, - "title": {"type": "string"}, - "description": {"type": "string"}, - "thumb": {"type": "string", "format": "uri"} - } - } - } -}; - -/// `app.bsky.embed.record` -const appBskyEmbedRecord = { - "lexicon": 1, - "id": "app.bsky.embed.record", - "description": - "A representation of a record embedded in a Bluesky record (eg, a post). For example, a quote-post, or sharing a feed generator record.", - "defs": { - "main": { + "skeletonFeedPost": { "type": "object", - "required": ["record"], + "required": ["post"], "properties": { - "record": {"type": "ref", "ref": "com.atproto.repo.strongRef"} + "post": {"type": "string", "format": "at-uri"}, + "reason": { + "type": "union", + "refs": ["#skeletonReasonRepost", "#skeletonReasonPin"] + }, + "feedContext": { + "type": "string", + "description": + "Context that will be passed through to client and may be passed to feed generator back alongside interactions.", + "maxLength": 2000 + } } }, - "view": { + "skeletonReasonRepost": { "type": "object", - "required": ["record"], + "required": ["repost"], "properties": { - "record": { - "type": "union", - "refs": [ - "#viewRecord", - "#viewNotFound", - "#viewBlocked", - "#viewDetached", - "app.bsky.feed.defs#generatorView", - "app.bsky.graph.defs#listView", - "app.bsky.labeler.defs#labelerView", - "app.bsky.graph.defs#starterPackViewBasic" - ] - } + "repost": {"type": "string", "format": "at-uri"} } }, - "viewRecord": { + "skeletonReasonPin": {"type": "object", "properties": {}}, + "threadgateView": { "type": "object", - "required": ["uri", "cid", "author", "value", "indexedAt"], "properties": { "uri": {"type": "string", "format": "at-uri"}, "cid": {"type": "string", "format": "cid"}, - "author": { - "type": "ref", - "ref": "app.bsky.actor.defs#profileViewBasic" - }, - "value": {"type": "unknown", "description": "The record data itself."}, - "labels": { - "type": "array", - "items": {"type": "ref", "ref": "com.atproto.label.defs#label"} - }, - "replyCount": {"type": "integer"}, - "repostCount": {"type": "integer"}, - "likeCount": {"type": "integer"}, - "quoteCount": {"type": "integer"}, - "embeds": { + "record": {"type": "unknown"}, + "lists": { "type": "array", - "items": { - "type": "union", - "refs": [ - "app.bsky.embed.images#view", - "app.bsky.embed.video#view", - "app.bsky.embed.external#view", - "app.bsky.embed.record#view", - "app.bsky.embed.recordWithMedia#view" - ] - } - }, - "indexedAt": {"type": "string", "format": "datetime"} + "items": {"type": "ref", "ref": "app.bsky.graph.defs#listViewBasic"} + } } }, - "viewNotFound": { + "interaction": { "type": "object", - "required": ["uri", "notFound"], "properties": { - "uri": {"type": "string", "format": "at-uri"}, - "notFound": {"type": "boolean", "const": true} + "item": {"type": "string", "format": "at-uri"}, + "event": { + "type": "string", + "knownValues": [ + "app.bsky.feed.defs#requestLess", + "app.bsky.feed.defs#requestMore", + "app.bsky.feed.defs#clickthroughItem", + "app.bsky.feed.defs#clickthroughAuthor", + "app.bsky.feed.defs#clickthroughReposter", + "app.bsky.feed.defs#clickthroughEmbed", + "app.bsky.feed.defs#interactionSeen", + "app.bsky.feed.defs#interactionLike", + "app.bsky.feed.defs#interactionRepost", + "app.bsky.feed.defs#interactionReply", + "app.bsky.feed.defs#interactionQuote", + "app.bsky.feed.defs#interactionShare" + ] + }, + "feedContext": { + "type": "string", + "description": + "Context on a feed item that was originally supplied by the feed generator on getFeedSkeleton.", + "maxLength": 2000 + } } }, - "viewBlocked": { - "type": "object", - "required": ["uri", "blocked", "author"], - "properties": { - "uri": {"type": "string", "format": "at-uri"}, - "blocked": {"type": "boolean", "const": true}, - "author": {"type": "ref", "ref": "app.bsky.feed.defs#blockedAuthor"} - } + "requestLess": { + "type": "token", + "description": + "Request that less content like the given feed item be shown in the feed" }, - "viewDetached": { - "type": "object", - "required": ["uri", "detached"], - "properties": { - "uri": {"type": "string", "format": "at-uri"}, - "detached": {"type": "boolean", "const": true} - } - } - } -}; - -/// `app.bsky.notification.updateSeen` -const appBskyNotificationUpdateSeen = { - "lexicon": 1, - "id": "app.bsky.notification.updateSeen", - "defs": { - "main": { - "type": "procedure", + "requestMore": { + "type": "token", "description": - "Notify server that the requesting account has seen notifications. Requires auth.", - "input": { - "encoding": "application/json", - "schema": { - "type": "object", - "required": ["seenAt"], - "properties": { - "seenAt": {"type": "string", "format": "datetime"} - } - } - } + "Request that more content like the given feed item be shown in the feed" + }, + "clickthroughItem": { + "type": "token", + "description": "User clicked through to the feed item" + }, + "clickthroughAuthor": { + "type": "token", + "description": "User clicked through to the author of the feed item" + }, + "clickthroughReposter": { + "type": "token", + "description": "User clicked through to the reposter of the feed item" + }, + "clickthroughEmbed": { + "type": "token", + "description": + "User clicked through to the embedded content of the feed item" + }, + "contentModeUnspecified": { + "type": "token", + "description": "Declares the feed generator returns any types of posts." + }, + "contentModeVideo": { + "type": "token", + "description": + "Declares the feed generator returns posts containing app.bsky.embed.video embeds." + }, + "interactionSeen": { + "type": "token", + "description": "Feed item was seen by user" + }, + "interactionLike": { + "type": "token", + "description": "User liked the feed item" + }, + "interactionRepost": { + "type": "token", + "description": "User reposted the feed item" + }, + "interactionReply": { + "type": "token", + "description": "User replied to the feed item" + }, + "interactionQuote": { + "type": "token", + "description": "User quoted the feed item" + }, + "interactionShare": { + "type": "token", + "description": "User shared the feed item" } } }; -/// `app.bsky.notification.getUnreadCount` -const appBskyNotificationGetUnreadCount = { +/// `app.bsky.feed.getAuthorFeed` +const appBskyFeedGetAuthorFeed = { "lexicon": 1, - "id": "app.bsky.notification.getUnreadCount", + "id": "app.bsky.feed.getAuthorFeed", "defs": { "main": { "type": "query", "description": - "Count the number of unread notifications for the requesting account. Requires auth.", + "Get a view of an actor's 'author feed' (post and reposts by the author). Does not require auth.", "parameters": { "type": "params", + "required": ["actor"], "properties": { - "priority": {"type": "boolean"}, - "seenAt": {"type": "string", "format": "datetime"} - } - }, - "output": { - "encoding": "application/json", - "schema": { - "type": "object", - "required": ["count"], - "properties": { - "count": {"type": "integer"} - } + "actor": {"type": "string", "format": "at-identifier"}, + "limit": { + "type": "integer", + "default": 50, + "minimum": 1, + "maximum": 100 + }, + "cursor": {"type": "string"}, + "filter": { + "type": "string", + "description": + "Combinations of post/repost types to include in response.", + "default": "posts_with_replies", + "knownValues": [ + "posts_with_replies", + "posts_no_replies", + "posts_with_media", + "posts_and_author_threads", + "posts_with_video" + ] + }, + "includePins": {"type": "boolean", "default": false} } - } - } - } -}; - -/// `app.bsky.notification.registerPush` -const appBskyNotificationRegisterPush = { - "lexicon": 1, - "id": "app.bsky.notification.registerPush", - "defs": { - "main": { - "type": "procedure", - "description": - "Register to receive push notifications, via a specified service, for the requesting account. Requires auth.", - "input": { + }, + "output": { "encoding": "application/json", "schema": { "type": "object", - "required": ["serviceDid", "token", "platform", "appId"], + "required": ["feed"], "properties": { - "serviceDid": {"type": "string", "format": "did"}, - "token": {"type": "string"}, - "platform": { - "type": "string", - "knownValues": ["ios", "android", "web"] - }, - "appId": {"type": "string"} + "cursor": {"type": "string"}, + "feed": { + "type": "array", + "items": {"type": "ref", "ref": "app.bsky.feed.defs#feedViewPost"} + } } } - } + }, + "errors": [ + {"name": "BlockedActor"}, + {"name": "BlockedByActor"} + ] } } }; -/// `app.bsky.notification.putPreferences` -const appBskyNotificationPutPreferences = { +/// `app.bsky.feed.getFeed` +const appBskyFeedGetFeed = { "lexicon": 1, - "id": "app.bsky.notification.putPreferences", + "id": "app.bsky.feed.getFeed", "defs": { "main": { - "type": "procedure", + "type": "query", "description": - "Set notification-related preferences for an account. Requires auth.", - "input": { + "Get a hydrated feed from an actor's selected feed generator. Implemented by App View.", + "parameters": { + "type": "params", + "required": ["feed"], + "properties": { + "feed": {"type": "string", "format": "at-uri"}, + "limit": { + "type": "integer", + "default": 50, + "minimum": 1, + "maximum": 100 + }, + "cursor": {"type": "string"} + } + }, + "output": { "encoding": "application/json", "schema": { "type": "object", - "required": ["priority"], + "required": ["feed"], "properties": { - "priority": {"type": "boolean"} + "cursor": {"type": "string"}, + "feed": { + "type": "array", + "items": {"type": "ref", "ref": "app.bsky.feed.defs#feedViewPost"} + } } } - } + }, + "errors": [ + {"name": "UnknownFeed"} + ] } } }; -/// `app.bsky.notification.listNotifications` -const appBskyNotificationListNotifications = { +/// `app.bsky.feed.getListFeed` +const appBskyFeedGetListFeed = { "lexicon": 1, - "id": "app.bsky.notification.listNotifications", + "id": "app.bsky.feed.getListFeed", "defs": { "main": { "type": "query", "description": - "Enumerate notifications for the requesting account. Requires auth.", + "Get a feed of recent posts from a list (posts and reposts from any actors on the list). Does not require auth.", "parameters": { "type": "params", + "required": ["list"], "properties": { - "reasons": { - "type": "array", - "description": "Notification reasons to include in response.", - "items": { - "type": "string", - "description": - "A reason that matches the reason property of #notification." - } + "list": { + "type": "string", + "format": "at-uri", + "description": "Reference (AT-URI) to the list record." }, "limit": { "type": "integer", @@ -5477,614 +5160,449 @@ const appBskyNotificationListNotifications = { "minimum": 1, "maximum": 100 }, - "priority": {"type": "boolean"}, - "cursor": {"type": "string"}, - "seenAt": {"type": "string", "format": "datetime"} + "cursor": {"type": "string"} } }, "output": { "encoding": "application/json", "schema": { "type": "object", - "required": ["notifications"], + "required": ["feed"], "properties": { "cursor": {"type": "string"}, - "notifications": { + "feed": { "type": "array", - "items": {"type": "ref", "ref": "#notification"} - }, - "priority": {"type": "boolean"}, - "seenAt": {"type": "string", "format": "datetime"} + "items": {"type": "ref", "ref": "app.bsky.feed.defs#feedViewPost"} + } } } - } - }, - "notification": { - "type": "object", - "required": [ - "uri", - "cid", - "author", - "reason", - "record", - "isRead", - "indexedAt" - ], - "properties": { - "uri": {"type": "string", "format": "at-uri"}, - "cid": {"type": "string", "format": "cid"}, - "author": {"type": "ref", "ref": "app.bsky.actor.defs#profileView"}, - "reason": { - "type": "string", - "description": - "Expected values are 'like', 'repost', 'follow', 'mention', 'reply', 'quote', and 'starterpack-joined'.", - "knownValues": [ - "like", - "repost", - "follow", - "mention", - "reply", - "quote", - "starterpack-joined" - ] - }, - "reasonSubject": {"type": "string", "format": "at-uri"}, - "record": {"type": "unknown"}, - "isRead": {"type": "boolean"}, - "indexedAt": {"type": "string", "format": "datetime"}, - "labels": { - "type": "array", - "items": {"type": "ref", "ref": "com.atproto.label.defs#label"} - } - } + }, + "errors": [ + {"name": "UnknownList"} + ] } } }; -/// `app.bsky.video.getJobStatus` -const appBskyVideoGetJobStatus = { +/// `app.bsky.embed.external` +const appBskyEmbedExternal = { "lexicon": 1, - "id": "app.bsky.video.getJobStatus", + "id": "app.bsky.embed.external", "defs": { "main": { - "type": "query", - "description": "Get status details for a video processing job.", - "parameters": { - "type": "params", - "required": ["jobId"], - "properties": { - "jobId": {"type": "string"} - } - }, - "output": { - "encoding": "application/json", - "schema": { - "type": "object", - "required": ["jobStatus"], - "properties": { - "jobStatus": {"type": "ref", "ref": "app.bsky.video.defs#jobStatus"} - } + "type": "object", + "description": + "A representation of some externally linked content (eg, a URL and 'card'), embedded in a Bluesky record (eg, a post).", + "required": ["external"], + "properties": { + "external": {"type": "ref", "ref": "#external"} + } + }, + "external": { + "type": "object", + "required": ["uri", "title", "description"], + "properties": { + "uri": {"type": "string", "format": "uri"}, + "title": {"type": "string"}, + "description": {"type": "string"}, + "thumb": { + "type": "blob", + "accept": ["image/*"], + "maxSize": 1000000 } } + }, + "view": { + "type": "object", + "required": ["external"], + "properties": { + "external": {"type": "ref", "ref": "#viewExternal"} + } + }, + "viewExternal": { + "type": "object", + "required": ["uri", "title", "description"], + "properties": { + "uri": {"type": "string", "format": "uri"}, + "title": {"type": "string"}, + "description": {"type": "string"}, + "thumb": {"type": "string", "format": "uri"} + } } } }; -/// `app.bsky.video.defs` -const appBskyVideoDefs = { +/// `app.bsky.embed.record` +const appBskyEmbedRecord = { "lexicon": 1, - "id": "app.bsky.video.defs", + "id": "app.bsky.embed.record", + "description": + "A representation of a record embedded in a Bluesky record (eg, a post). For example, a quote-post, or sharing a feed generator record.", "defs": { - "jobStatus": { + "main": { "type": "object", - "required": ["jobId", "did", "state"], + "required": ["record"], "properties": { - "jobId": {"type": "string"}, - "did": {"type": "string", "format": "did"}, - "state": { - "type": "string", - "description": - "The state of the video processing job. All values not listed as a known value indicate that the job is in process.", - "knownValues": ["JOB_STATE_COMPLETED", "JOB_STATE_FAILED"] - }, - "progress": { - "type": "integer", - "description": "Progress within the current processing state.", - "minimum": 0, - "maximum": 100 - }, - "blob": {"type": "blob"}, - "error": {"type": "string"}, - "message": {"type": "string"} - } - } - } -}; - -/// `app.bsky.video.uploadVideo` -const appBskyVideoUploadVideo = { - "lexicon": 1, - "id": "app.bsky.video.uploadVideo", - "defs": { - "main": { - "type": "procedure", - "description": "Upload a video to be processed then stored on the PDS.", - "input": {"encoding": "video/mp4"}, - "output": { - "encoding": "application/json", - "schema": { - "type": "object", - "required": ["jobStatus"], - "properties": { - "jobStatus": {"type": "ref", "ref": "app.bsky.video.defs#jobStatus"} - } - } + "record": {"type": "ref", "ref": "com.atproto.repo.strongRef"} } - } - } -}; - -/// `app.bsky.video.getUploadLimits` -const appBskyVideoGetUploadLimits = { - "lexicon": 1, - "id": "app.bsky.video.getUploadLimits", - "defs": { - "main": { - "type": "query", - "description": "Get video upload limits for the authenticated user.", - "output": { - "encoding": "application/json", - "schema": { - "type": "object", - "required": ["canUpload"], - "properties": { - "canUpload": {"type": "boolean"}, - "remainingDailyVideos": {"type": "integer"}, - "remainingDailyBytes": {"type": "integer"}, - "message": {"type": "string"}, - "error": {"type": "string"} - } + }, + "view": { + "type": "object", + "required": ["record"], + "properties": { + "record": { + "type": "union", + "refs": [ + "#viewRecord", + "#viewNotFound", + "#viewBlocked", + "#viewDetached", + "app.bsky.feed.defs#generatorView", + "app.bsky.graph.defs#listView", + "app.bsky.labeler.defs#labelerView", + "app.bsky.graph.defs#starterPackViewBasic" + ] } } - } - } -}; - -/// `app.bsky.actor.defs` -const appBskyActorDefs = { - "lexicon": 1, - "id": "app.bsky.actor.defs", - "defs": { - "profileViewBasic": { + }, + "viewRecord": { "type": "object", - "required": ["did", "handle"], + "required": ["uri", "cid", "author", "value", "indexedAt"], "properties": { - "did": {"type": "string", "format": "did"}, - "handle": {"type": "string", "format": "handle"}, - "displayName": {"type": "string", "maxLength": 640, "maxGraphemes": 64}, - "avatar": {"type": "string", "format": "uri"}, - "associated": {"type": "ref", "ref": "#profileAssociated"}, - "viewer": {"type": "ref", "ref": "#viewerState"}, + "uri": {"type": "string", "format": "at-uri"}, + "cid": {"type": "string", "format": "cid"}, + "author": { + "type": "ref", + "ref": "app.bsky.actor.defs#profileViewBasic" + }, + "value": {"type": "unknown", "description": "The record data itself."}, "labels": { "type": "array", "items": {"type": "ref", "ref": "com.atproto.label.defs#label"} }, - "createdAt": {"type": "string", "format": "datetime"} + "replyCount": {"type": "integer"}, + "repostCount": {"type": "integer"}, + "likeCount": {"type": "integer"}, + "quoteCount": {"type": "integer"}, + "embeds": { + "type": "array", + "items": { + "type": "union", + "refs": [ + "app.bsky.embed.images#view", + "app.bsky.embed.video#view", + "app.bsky.embed.external#view", + "app.bsky.embed.record#view", + "app.bsky.embed.recordWithMedia#view" + ] + } + }, + "indexedAt": {"type": "string", "format": "datetime"} } }, - "profileView": { + "viewNotFound": { "type": "object", - "required": ["did", "handle"], + "required": ["uri", "notFound"], "properties": { - "did": {"type": "string", "format": "did"}, - "handle": {"type": "string", "format": "handle"}, - "displayName": {"type": "string", "maxLength": 640, "maxGraphemes": 64}, - "description": { - "type": "string", - "maxLength": 2560, - "maxGraphemes": 256 - }, - "avatar": {"type": "string", "format": "uri"}, - "associated": {"type": "ref", "ref": "#profileAssociated"}, - "indexedAt": {"type": "string", "format": "datetime"}, - "createdAt": {"type": "string", "format": "datetime"}, - "viewer": {"type": "ref", "ref": "#viewerState"}, - "labels": { - "type": "array", - "items": {"type": "ref", "ref": "com.atproto.label.defs#label"} - } + "uri": {"type": "string", "format": "at-uri"}, + "notFound": {"type": "boolean", "const": true} } }, - "profileViewDetailed": { + "viewBlocked": { "type": "object", - "required": ["did", "handle"], + "required": ["uri", "blocked", "author"], "properties": { - "did": {"type": "string", "format": "did"}, - "handle": {"type": "string", "format": "handle"}, - "displayName": {"type": "string", "maxLength": 640, "maxGraphemes": 64}, - "description": { - "type": "string", - "maxLength": 2560, - "maxGraphemes": 256 - }, - "avatar": {"type": "string", "format": "uri"}, - "banner": {"type": "string", "format": "uri"}, - "followersCount": {"type": "integer"}, - "followsCount": {"type": "integer"}, - "postsCount": {"type": "integer"}, - "associated": {"type": "ref", "ref": "#profileAssociated"}, - "joinedViaStarterPack": { - "type": "ref", - "ref": "app.bsky.graph.defs#starterPackViewBasic" - }, - "indexedAt": {"type": "string", "format": "datetime"}, - "createdAt": {"type": "string", "format": "datetime"}, - "viewer": {"type": "ref", "ref": "#viewerState"}, - "labels": { - "type": "array", - "items": {"type": "ref", "ref": "com.atproto.label.defs#label"} - }, - "pinnedPost": {"type": "ref", "ref": "com.atproto.repo.strongRef"} + "uri": {"type": "string", "format": "at-uri"}, + "blocked": {"type": "boolean", "const": true}, + "author": {"type": "ref", "ref": "app.bsky.feed.defs#blockedAuthor"} } }, - "profileAssociated": { + "viewDetached": { "type": "object", + "required": ["uri", "detached"], "properties": { - "lists": {"type": "integer"}, - "feedgens": {"type": "integer"}, - "starterPacks": {"type": "integer"}, - "labeler": {"type": "boolean"}, - "chat": {"type": "ref", "ref": "#profileAssociatedChat"} + "uri": {"type": "string", "format": "at-uri"}, + "detached": {"type": "boolean", "const": true} } - }, - "profileAssociatedChat": { + } + } +}; + +/// `app.bsky.embed.images` +const appBskyEmbedImages = { + "lexicon": 1, + "id": "app.bsky.embed.images", + "description": "A set of images embedded in a Bluesky record (eg, a post).", + "defs": { + "main": { "type": "object", - "required": ["allowIncoming"], + "required": ["images"], "properties": { - "allowIncoming": { - "type": "string", - "knownValues": ["all", "none", "following"] + "images": { + "type": "array", + "items": {"type": "ref", "ref": "#image"}, + "maxLength": 4 } } }, - "viewerState": { + "image": { "type": "object", - "description": - "Metadata about the requesting account's relationship with the subject account. Only has meaningful content for authed requests.", + "required": ["image", "alt"], "properties": { - "muted": {"type": "boolean"}, - "mutedByList": { - "type": "ref", - "ref": "app.bsky.graph.defs#listViewBasic" + "image": { + "type": "blob", + "accept": ["image/*"], + "maxSize": 1000000 }, - "blockedBy": {"type": "boolean"}, - "blocking": {"type": "string", "format": "at-uri"}, - "blockingByList": { - "type": "ref", - "ref": "app.bsky.graph.defs#listViewBasic" + "alt": { + "type": "string", + "description": "Alt text description of the image, for accessibility." }, - "following": {"type": "string", "format": "at-uri"}, - "followedBy": {"type": "string", "format": "at-uri"}, - "knownFollowers": {"type": "ref", "ref": "#knownFollowers"} + "aspectRatio": {"type": "ref", "ref": "app.bsky.embed.defs#aspectRatio"} } }, - "knownFollowers": { + "view": { "type": "object", - "description": "The subject's followers whom you also follow", - "required": ["count", "followers"], + "required": ["images"], "properties": { - "count": {"type": "integer"}, - "followers": { + "images": { "type": "array", - "items": {"type": "ref", "ref": "#profileViewBasic"}, - "minLength": 0, - "maxLength": 5 + "items": {"type": "ref", "ref": "#viewImage"}, + "maxLength": 4 } } }, - "preferences": { - "type": "array", - "items": { - "type": "union", - "refs": [ - "#adultContentPref", - "#contentLabelPref", - "#savedFeedsPref", - "#savedFeedsPrefV2", - "#personalDetailsPref", - "#feedViewPref", - "#threadViewPref", - "#interestsPref", - "#mutedWordsPref", - "#hiddenPostsPref", - "#bskyAppStatePref", - "#labelersPref" - ] - } - }, - "adultContentPref": { - "type": "object", - "required": ["enabled"], - "properties": { - "enabled": {"type": "boolean", "default": false} - } - }, - "contentLabelPref": { + "viewImage": { "type": "object", - "required": ["label", "visibility"], + "required": ["thumb", "fullsize", "alt"], "properties": { - "labelerDid": { + "thumb": { "type": "string", - "format": "did", + "format": "uri", "description": - "Which labeler does this preference apply to? If undefined, applies globally." + "Fully-qualified URL where a thumbnail of the image can be fetched. For example, CDN location provided by the App View." }, - "label": {"type": "string"}, - "visibility": { + "fullsize": { "type": "string", - "knownValues": ["ignore", "show", "warn", "hide"] - } + "format": "uri", + "description": + "Fully-qualified URL where a large version of the image can be fetched. May or may not be the exact original blob. For example, CDN location provided by the App View." + }, + "alt": { + "type": "string", + "description": "Alt text description of the image, for accessibility." + }, + "aspectRatio": {"type": "ref", "ref": "app.bsky.embed.defs#aspectRatio"} } - }, - "savedFeed": { + } + } +}; + +/// `app.bsky.embed.recordWithMedia` +const appBskyEmbedRecordWithMedia = { + "lexicon": 1, + "id": "app.bsky.embed.recordWithMedia", + "description": + "A representation of a record embedded in a Bluesky record (eg, a post), alongside other compatible embeds. For example, a quote post and image, or a quote post and external URL card.", + "defs": { + "main": { "type": "object", - "required": ["id", "type", "value", "pinned"], + "required": ["record", "media"], "properties": { - "id": {"type": "string"}, - "type": { - "type": "string", - "knownValues": ["feed", "list", "timeline"] - }, - "value": {"type": "string"}, - "pinned": {"type": "boolean"} + "record": {"type": "ref", "ref": "app.bsky.embed.record"}, + "media": { + "type": "union", + "refs": [ + "app.bsky.embed.images", + "app.bsky.embed.video", + "app.bsky.embed.external" + ] + } } }, - "savedFeedsPrefV2": { + "view": { "type": "object", - "required": ["items"], + "required": ["record", "media"], "properties": { - "items": { - "type": "array", - "items": {"type": "ref", "ref": "app.bsky.actor.defs#savedFeed"} + "record": {"type": "ref", "ref": "app.bsky.embed.record#view"}, + "media": { + "type": "union", + "refs": [ + "app.bsky.embed.images#view", + "app.bsky.embed.video#view", + "app.bsky.embed.external#view" + ] } } - }, - "savedFeedsPref": { + } + } +}; + +/// `app.bsky.embed.video` +const appBskyEmbedVideo = { + "lexicon": 1, + "id": "app.bsky.embed.video", + "description": "A video embedded in a Bluesky record (eg, a post).", + "defs": { + "main": { "type": "object", - "required": ["pinned", "saved"], + "required": ["video"], "properties": { - "pinned": { - "type": "array", - "items": {"type": "string", "format": "at-uri"} + "video": { + "type": "blob", + "accept": ["video/mp4"], + "maxSize": 50000000 }, - "saved": { + "captions": { "type": "array", - "items": {"type": "string", "format": "at-uri"} + "items": {"type": "ref", "ref": "#caption"}, + "maxLength": 20 }, - "timelineIndex": {"type": "integer"} + "alt": { + "type": "string", + "description": + "Alt text description of the video, for accessibility.", + "maxLength": 10000, + "maxGraphemes": 1000 + }, + "aspectRatio": {"type": "ref", "ref": "app.bsky.embed.defs#aspectRatio"} } }, - "personalDetailsPref": { + "caption": { "type": "object", + "required": ["lang", "file"], "properties": { - "birthDate": { - "type": "string", - "format": "datetime", - "description": "The birth date of account owner." + "lang": {"type": "string", "format": "language"}, + "file": { + "type": "blob", + "accept": ["text/vtt"], + "maxSize": 20000 } } }, - "feedViewPref": { + "view": { "type": "object", - "required": ["feed"], + "required": ["cid", "playlist"], "properties": { - "feed": { - "type": "string", - "description": - "The URI of the feed, or an identifier which describes the feed." - }, - "hideReplies": { - "type": "boolean", - "description": "Hide replies in the feed." - }, - "hideRepliesByUnfollowed": { - "type": "boolean", - "description": - "Hide replies in the feed if they are not by followed users.", - "default": true - }, - "hideRepliesByLikeCount": { - "type": "integer", - "description": - "Hide replies in the feed if they do not have this number of likes." - }, - "hideReposts": { - "type": "boolean", - "description": "Hide reposts in the feed." - }, - "hideQuotePosts": { - "type": "boolean", - "description": "Hide quote posts in the feed." - } + "cid": {"type": "string", "format": "cid"}, + "playlist": {"type": "string", "format": "uri"}, + "thumbnail": {"type": "string", "format": "uri"}, + "alt": {"type": "string", "maxLength": 10000, "maxGraphemes": 1000}, + "aspectRatio": {"type": "ref", "ref": "app.bsky.embed.defs#aspectRatio"} } - }, - "threadViewPref": { + } + } +}; + +/// `app.bsky.embed.defs` +const appBskyEmbedDefs = { + "lexicon": 1, + "id": "app.bsky.embed.defs", + "defs": { + "aspectRatio": { "type": "object", + "description": + "width:height represents an aspect ratio. It may be approximate, and may not correspond to absolute dimensions in any given unit.", + "required": ["width", "height"], "properties": { - "sort": { - "type": "string", - "description": "Sorting mode for threads.", - "knownValues": ["oldest", "newest", "most-likes", "random", "hotness"] - }, - "prioritizeFollowedUsers": { - "type": "boolean", - "description": "Show followed users at the top of all replies." - } + "width": {"type": "integer", "minimum": 1}, + "height": {"type": "integer", "minimum": 1} } - }, - "interestsPref": { + } + } +}; + +/// `app.bsky.richtext.facet` +const appBskyRichtextFacet = { + "lexicon": 1, + "id": "app.bsky.richtext.facet", + "defs": { + "main": { "type": "object", - "required": ["tags"], + "description": "Annotation of a sub-string within rich text.", + "required": ["index", "features"], "properties": { - "tags": { + "index": {"type": "ref", "ref": "#byteSlice"}, + "features": { "type": "array", - "description": - "A list of tags which describe the account owner's interests gathered during onboarding.", - "items": {"type": "string", "maxLength": 640, "maxGraphemes": 64}, - "maxLength": 100 + "items": { + "type": "union", + "refs": ["#mention", "#link", "#tag"] + } } } }, - "mutedWordTarget": { - "type": "string", - "maxLength": 640, - "maxGraphemes": 64, - "knownValues": ["content", "tag"] + "mention": { + "type": "object", + "description": + "Facet feature for mention of another account. The text is usually a handle, including a '@' prefix, but the facet reference is a DID.", + "required": ["did"], + "properties": { + "did": {"type": "string", "format": "did"} + } }, - "mutedWord": { + "link": { "type": "object", - "description": "A word that the account owner has muted.", - "required": ["value", "targets"], + "description": + "Facet feature for a URL. The text URL may have been simplified or truncated, but the facet reference should be a complete URL.", + "required": ["uri"], "properties": { - "id": {"type": "string"}, - "value": { - "type": "string", - "description": "The muted word itself.", - "maxLength": 10000, - "maxGraphemes": 1000 - }, - "targets": { - "type": "array", - "description": "The intended targets of the muted word.", - "items": {"type": "ref", "ref": "app.bsky.actor.defs#mutedWordTarget"} - }, - "actorTarget": { - "type": "string", - "description": - "Groups of users to apply the muted word to. If undefined, applies to all users.", - "default": "all", - "knownValues": ["all", "exclude-following"] - }, - "expiresAt": { - "type": "string", - "format": "datetime", - "description": - "The date and time at which the muted word will expire and no longer be applied." - } - } - }, - "mutedWordsPref": { - "type": "object", - "required": ["items"], - "properties": { - "items": { - "type": "array", - "description": "A list of words the account owner has muted.", - "items": {"type": "ref", "ref": "app.bsky.actor.defs#mutedWord"} - } - } - }, - "hiddenPostsPref": { - "type": "object", - "required": ["items"], - "properties": { - "items": { - "type": "array", - "description": - "A list of URIs of posts the account owner has hidden.", - "items": {"type": "string", "format": "at-uri"} - } - } - }, - "labelersPref": { - "type": "object", - "required": ["labelers"], - "properties": { - "labelers": { - "type": "array", - "items": {"type": "ref", "ref": "#labelerPrefItem"} - } - } - }, - "labelerPrefItem": { - "type": "object", - "required": ["did"], - "properties": { - "did": {"type": "string", "format": "did"} + "uri": {"type": "string", "format": "uri"} } }, - "bskyAppStatePref": { + "tag": { "type": "object", "description": - "A grab bag of state that's specific to the bsky.app program. Third-party apps shouldn't use this.", + "Facet feature for a hashtag. The text usually includes a '#' prefix, but the facet reference should not (except in the case of 'double hash tags').", + "required": ["tag"], "properties": { - "activeProgressGuide": {"type": "ref", "ref": "#bskyAppProgressGuide"}, - "queuedNudges": { - "type": "array", - "description": - "An array of tokens which identify nudges (modals, popups, tours, highlight dots) that should be shown to the user.", - "items": {"type": "string", "maxLength": 100}, - "maxLength": 1000 - }, - "nuxs": { - "type": "array", - "description": "Storage for NUXs the user has encountered.", - "items": {"type": "ref", "ref": "app.bsky.actor.defs#nux"}, - "maxLength": 100 - } + "tag": {"type": "string", "maxLength": 640, "maxGraphemes": 64} } }, - "bskyAppProgressGuide": { + "byteSlice": { "type": "object", "description": - "If set, an active progress guide. Once completed, can be set to undefined. Should have unspecced fields tracking progress.", - "required": ["guide"], - "properties": { - "guide": {"type": "string", "maxLength": 100} - } - }, - "nux": { - "type": "object", - "description": "A new user experiences (NUX) storage object", - "required": ["id", "completed"], + "Specifies the sub-string range a facet feature applies to. Start index is inclusive, end index is exclusive. Indices are zero-indexed, counting bytes of the UTF-8 encoded text. NOTE: some languages, like Javascript, use UTF-16 or Unicode codepoints for string slice indexing; in these languages, convert to byte arrays before working with facets.", + "required": ["byteStart", "byteEnd"], "properties": { - "id": {"type": "string", "maxLength": 100}, - "completed": {"type": "boolean", "default": false}, - "data": { - "type": "string", - "description": - "Arbitrary data for the NUX. The structure is defined by the NUX itself. Limited to 300 characters.", - "maxLength": 3000, - "maxGraphemes": 300 - }, - "expiresAt": { - "type": "string", - "format": "datetime", - "description": - "The date and time at which the NUX will expire and should be considered completed." - } + "byteStart": {"type": "integer", "minimum": 0}, + "byteEnd": {"type": "integer", "minimum": 0} } } } }; -/// `app.bsky.actor.putPreferences` -const appBskyActorPutPreferences = { +/// `app.bsky.graph.getListMutes` +const appBskyGraphGetListMutes = { "lexicon": 1, - "id": "app.bsky.actor.putPreferences", + "id": "app.bsky.graph.getListMutes", "defs": { "main": { - "type": "procedure", - "description": "Set the private preferences attached to the account.", - "input": { + "type": "query", + "description": + "Enumerates mod lists that the requesting account (actor) currently has muted. Requires auth.", + "parameters": { + "type": "params", + "properties": { + "limit": { + "type": "integer", + "default": 50, + "minimum": 1, + "maximum": 100 + }, + "cursor": {"type": "string"} + } + }, + "output": { "encoding": "application/json", "schema": { "type": "object", - "required": ["preferences"], + "required": ["lists"], "properties": { - "preferences": { - "type": "ref", - "ref": "app.bsky.actor.defs#preferences" + "cursor": {"type": "string"}, + "lists": { + "type": "array", + "items": {"type": "ref", "ref": "app.bsky.graph.defs#listView"} } } } @@ -6093,38 +5611,21 @@ const appBskyActorPutPreferences = { } }; -/// `app.bsky.actor.getProfiles` -const appBskyActorGetProfiles = { +/// `app.bsky.graph.unmuteThread` +const appBskyGraphUnmuteThread = { "lexicon": 1, - "id": "app.bsky.actor.getProfiles", + "id": "app.bsky.graph.unmuteThread", "defs": { "main": { - "type": "query", - "description": "Get detailed profile views of multiple actors.", - "parameters": { - "type": "params", - "required": ["actors"], - "properties": { - "actors": { - "type": "array", - "items": {"type": "string", "format": "at-identifier"}, - "maxLength": 25 - } - } - }, - "output": { + "type": "procedure", + "description": "Unmutes the specified thread. Requires auth.", + "input": { "encoding": "application/json", "schema": { "type": "object", - "required": ["profiles"], + "required": ["root"], "properties": { - "profiles": { - "type": "array", - "items": { - "type": "ref", - "ref": "app.bsky.actor.defs#profileViewDetailed" - } - } + "root": {"type": "string", "format": "at-uri"} } } } @@ -6132,26 +5633,22 @@ const appBskyActorGetProfiles = { } }; -/// `app.bsky.actor.getPreferences` -const appBskyActorGetPreferences = { +/// `app.bsky.graph.muteThread` +const appBskyGraphMuteThread = { "lexicon": 1, - "id": "app.bsky.actor.getPreferences", + "id": "app.bsky.graph.muteThread", "defs": { "main": { - "type": "query", + "type": "procedure", "description": - "Get private preferences attached to the current account. Expected use is synchronization between multiple devices, and import/export during account migration. Requires auth.", - "parameters": {"type": "params", "properties": {}}, - "output": { + "Mutes a thread preventing notifications from the thread and any of its children. Mutes are private in Bluesky. Requires auth.", + "input": { "encoding": "application/json", "schema": { "type": "object", - "required": ["preferences"], + "required": ["root"], "properties": { - "preferences": { - "type": "ref", - "ref": "app.bsky.actor.defs#preferences" - } + "root": {"type": "string", "format": "at-uri"} } } } @@ -6159,15 +5656,15 @@ const appBskyActorGetPreferences = { } }; -/// `app.bsky.actor.getSuggestions` -const appBskyActorGetSuggestions = { +/// `app.bsky.graph.getBlocks` +const appBskyGraphGetBlocks = { "lexicon": 1, - "id": "app.bsky.actor.getSuggestions", + "id": "app.bsky.graph.getBlocks", "defs": { "main": { "type": "query", "description": - "Get a list of suggested actors. Expected use is discovery of accounts to follow during new account onboarding.", + "Enumerates which accounts the requesting account is currently blocking. Requires auth.", "parameters": { "type": "params", "properties": { @@ -6184,10 +5681,10 @@ const appBskyActorGetSuggestions = { "encoding": "application/json", "schema": { "type": "object", - "required": ["actors"], + "required": ["blocks"], "properties": { "cursor": {"type": "string"}, - "actors": { + "blocks": { "type": "array", "items": {"type": "ref", "ref": "app.bsky.actor.defs#profileView"} } @@ -6198,77 +5695,92 @@ const appBskyActorGetSuggestions = { } }; -/// `app.bsky.actor.getProfile` -const appBskyActorGetProfile = { +/// `app.bsky.graph.getList` +const appBskyGraphGetList = { "lexicon": 1, - "id": "app.bsky.actor.getProfile", + "id": "app.bsky.graph.getList", "defs": { "main": { "type": "query", "description": - "Get detailed profile view of an actor. Does not require auth, but contains relevant metadata with auth.", + "Gets a 'view' (with additional context) of a specified list.", "parameters": { "type": "params", - "required": ["actor"], + "required": ["list"], "properties": { - "actor": { + "list": { "type": "string", - "format": "at-identifier", - "description": "Handle or DID of account to fetch profile of." - } + "format": "at-uri", + "description": "Reference (AT-URI) of the list record to hydrate." + }, + "limit": { + "type": "integer", + "default": 50, + "minimum": 1, + "maximum": 100 + }, + "cursor": {"type": "string"} } }, "output": { "encoding": "application/json", "schema": { - "type": "ref", - "ref": "app.bsky.actor.defs#profileViewDetailed" + "type": "object", + "required": ["list", "items"], + "properties": { + "cursor": {"type": "string"}, + "list": {"type": "ref", "ref": "app.bsky.graph.defs#listView"}, + "items": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.bsky.graph.defs#listItemView" + } + } + } } } } } }; -/// `app.bsky.actor.searchActorsTypeahead` -const appBskyActorSearchActorsTypeahead = { +/// `app.bsky.graph.getKnownFollowers` +const appBskyGraphGetKnownFollowers = { "lexicon": 1, - "id": "app.bsky.actor.searchActorsTypeahead", + "id": "app.bsky.graph.getKnownFollowers", "defs": { "main": { "type": "query", "description": - "Find actor suggestions for a prefix search term. Expected use is for auto-completion during text field entry. Does not require auth.", + "Enumerates accounts which follow a specified account (actor) and are followed by the viewer.", "parameters": { "type": "params", + "required": ["actor"], "properties": { - "term": { - "type": "string", - "description": "DEPRECATED: use 'q' instead." - }, - "q": { - "type": "string", - "description": "Search query prefix; not a full query string." - }, + "actor": {"type": "string", "format": "at-identifier"}, "limit": { "type": "integer", - "default": 10, + "default": 50, "minimum": 1, "maximum": 100 - } + }, + "cursor": {"type": "string"} } }, "output": { "encoding": "application/json", "schema": { "type": "object", - "required": ["actors"], + "required": ["subject", "followers"], "properties": { - "actors": { + "subject": { + "type": "ref", + "ref": "app.bsky.actor.defs#profileView" + }, + "cursor": {"type": "string"}, + "followers": { "type": "array", - "items": { - "type": "ref", - "ref": "app.bsky.actor.defs#profileViewBasic" - } + "items": {"type": "ref", "ref": "app.bsky.actor.defs#profileView"} } } } @@ -6277,46 +5789,34 @@ const appBskyActorSearchActorsTypeahead = { } }; -/// `app.bsky.actor.searchActors` -const appBskyActorSearchActors = { +/// `app.bsky.graph.getStarterPack` +const appBskyGraphGetStarterPack = { "lexicon": 1, - "id": "app.bsky.actor.searchActors", + "id": "app.bsky.graph.getStarterPack", "defs": { "main": { "type": "query", - "description": - "Find actors (profiles) matching search criteria. Does not require auth.", + "description": "Gets a view of a starter pack.", "parameters": { "type": "params", + "required": ["starterPack"], "properties": { - "term": { - "type": "string", - "description": "DEPRECATED: use 'q' instead." - }, - "q": { + "starterPack": { "type": "string", - "description": - "Search query string. Syntax, phrase, boolean, and faceting is unspecified, but Lucene query syntax is recommended." - }, - "limit": { - "type": "integer", - "default": 25, - "minimum": 1, - "maximum": 100 - }, - "cursor": {"type": "string"} + "format": "at-uri", + "description": "Reference (AT-URI) of the starter pack record." + } } }, "output": { "encoding": "application/json", "schema": { "type": "object", - "required": ["actors"], + "required": ["starterPack"], "properties": { - "cursor": {"type": "string"}, - "actors": { - "type": "array", - "items": {"type": "ref", "ref": "app.bsky.actor.defs#profileView"} + "starterPack": { + "type": "ref", + "ref": "app.bsky.graph.defs#starterPackView" } } } @@ -6325,54 +5825,50 @@ const appBskyActorSearchActors = { } }; -/// `app.bsky.actor.profile` -const appBskyActorProfile = { +/// `app.bsky.graph.list` +const appBskyGraphList = { "lexicon": 1, - "id": "app.bsky.actor.profile", + "id": "app.bsky.graph.list", "defs": { "main": { "type": "record", - "description": "A declaration of a Bluesky account profile.", - "key": "literal:self", + "description": + "Record representing a list of accounts (actors). Scope includes both moderation-oriented lists and curration-oriented lists.", + "key": "tid", "record": { "type": "object", + "required": ["name", "purpose", "createdAt"], "properties": { - "displayName": { + "purpose": { + "type": "ref", + "description": + "Defines the purpose of the list (aka, moderation-oriented or curration-oriented)", + "ref": "app.bsky.graph.defs#listPurpose" + }, + "name": { "type": "string", - "maxLength": 640, - "maxGraphemes": 64 + "description": "Display name for list; can not be empty.", + "minLength": 1, + "maxLength": 64 }, "description": { "type": "string", - "description": "Free-form profile description text.", - "maxLength": 2560, - "maxGraphemes": 256 + "maxLength": 3000, + "maxGraphemes": 300 }, - "avatar": { - "type": "blob", - "description": - "Small image to be displayed next to posts from account. AKA, 'profile picture'", - "accept": ["image/png", "image/jpeg"], - "maxSize": 1000000 + "descriptionFacets": { + "type": "array", + "items": {"type": "ref", "ref": "app.bsky.richtext.facet"} }, - "banner": { + "avatar": { "type": "blob", - "description": - "Larger horizontal image to display behind profile view.", "accept": ["image/png", "image/jpeg"], "maxSize": 1000000 }, "labels": { "type": "union", - "description": - "Self-label values, specific to the Bluesky application, on the overall account.", "refs": ["com.atproto.label.defs#selfLabels"] }, - "joinedViaStarterPack": { - "type": "ref", - "ref": "com.atproto.repo.strongRef" - }, - "pinnedPost": {"type": "ref", "ref": "com.atproto.repo.strongRef"}, "createdAt": {"type": "string", "format": "datetime"} } } @@ -6380,204 +5876,156 @@ const appBskyActorProfile = { } }; -/// `app.bsky.richtext.facet` -const appBskyRichtextFacet = { +/// `app.bsky.graph.unmuteActorList` +const appBskyGraphUnmuteActorList = { "lexicon": 1, - "id": "app.bsky.richtext.facet", + "id": "app.bsky.graph.unmuteActorList", "defs": { "main": { - "type": "object", - "description": "Annotation of a sub-string within rich text.", - "required": ["index", "features"], - "properties": { - "index": {"type": "ref", "ref": "#byteSlice"}, - "features": { - "type": "array", - "items": { - "type": "union", - "refs": ["#mention", "#link", "#tag"] + "type": "procedure", + "description": "Unmutes the specified list of accounts. Requires auth.", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["list"], + "properties": { + "list": {"type": "string", "format": "at-uri"} } } } - }, - "mention": { - "type": "object", - "description": - "Facet feature for mention of another account. The text is usually a handle, including a '@' prefix, but the facet reference is a DID.", - "required": ["did"], - "properties": { - "did": {"type": "string", "format": "did"} - } - }, - "link": { - "type": "object", - "description": - "Facet feature for a URL. The text URL may have been simplified or truncated, but the facet reference should be a complete URL.", - "required": ["uri"], - "properties": { - "uri": {"type": "string", "format": "uri"} - } - }, - "tag": { - "type": "object", - "description": - "Facet feature for a hashtag. The text usually includes a '#' prefix, but the facet reference should not (except in the case of 'double hash tags').", - "required": ["tag"], - "properties": { - "tag": {"type": "string", "maxLength": 640, "maxGraphemes": 64} - } - }, - "byteSlice": { - "type": "object", + } + } +}; + +/// `app.bsky.graph.block` +const appBskyGraphBlock = { + "lexicon": 1, + "id": "app.bsky.graph.block", + "defs": { + "main": { + "type": "record", "description": - "Specifies the sub-string range a facet feature applies to. Start index is inclusive, end index is exclusive. Indices are zero-indexed, counting bytes of the UTF-8 encoded text. NOTE: some languages, like Javascript, use UTF-16 or Unicode codepoints for string slice indexing; in these languages, convert to byte arrays before working with facets.", - "required": ["byteStart", "byteEnd"], - "properties": { - "byteStart": {"type": "integer", "minimum": 0}, - "byteEnd": {"type": "integer", "minimum": 0} + "Record declaring a 'block' relationship against another account. NOTE: blocks are public in Bluesky; see blog posts for details.", + "key": "tid", + "record": { + "type": "object", + "required": ["subject", "createdAt"], + "properties": { + "subject": { + "type": "string", + "format": "did", + "description": "DID of the account to be blocked." + }, + "createdAt": {"type": "string", "format": "datetime"} + } } } } }; -/// `app.bsky.unspecced.searchStarterPacksSkeleton` -const appBskyUnspeccedSearchStarterPacksSkeleton = { +/// `app.bsky.graph.getMutes` +const appBskyGraphGetMutes = { "lexicon": 1, - "id": "app.bsky.unspecced.searchStarterPacksSkeleton", + "id": "app.bsky.graph.getMutes", "defs": { "main": { "type": "query", - "description": "Backend Starter Pack search, returns only skeleton.", + "description": + "Enumerates accounts that the requesting account (actor) currently has muted. Requires auth.", "parameters": { "type": "params", - "required": ["q"], "properties": { - "q": { - "type": "string", - "description": - "Search query string; syntax, phrase, boolean, and faceting is unspecified, but Lucene query syntax is recommended." - }, - "viewer": { - "type": "string", - "format": "did", - "description": - "DID of the account making the request (not included for public/unauthenticated queries)." - }, "limit": { "type": "integer", - "default": 25, + "default": 50, "minimum": 1, "maximum": 100 }, - "cursor": { - "type": "string", - "description": - "Optional pagination mechanism; may not necessarily allow scrolling through entire result set." - } + "cursor": {"type": "string"} } }, "output": { "encoding": "application/json", "schema": { "type": "object", - "required": ["starterPacks"], + "required": ["mutes"], "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." - }, - "starterPacks": { + "mutes": { "type": "array", - "items": { - "type": "ref", - "ref": "app.bsky.unspecced.defs#skeletonSearchStarterPack" - } + "items": {"type": "ref", "ref": "app.bsky.actor.defs#profileView"} } } } - }, - "errors": [ - {"name": "BadQueryString"} - ] + } } } }; -/// `app.bsky.unspecced.defs` -const appBskyUnspeccedDefs = { +/// `app.bsky.graph.listblock` +const appBskyGraphListblock = { "lexicon": 1, - "id": "app.bsky.unspecced.defs", + "id": "app.bsky.graph.listblock", "defs": { - "skeletonSearchPost": { - "type": "object", - "required": ["uri"], - "properties": { - "uri": {"type": "string", "format": "at-uri"} - } - }, - "skeletonSearchActor": { - "type": "object", - "required": ["did"], - "properties": { - "did": {"type": "string", "format": "did"} - } - }, - "skeletonSearchStarterPack": { - "type": "object", - "required": ["uri"], - "properties": { - "uri": {"type": "string", "format": "at-uri"} - } - }, - "trendingTopic": { - "type": "object", - "required": ["topic", "link"], - "properties": { - "topic": {"type": "string"}, - "displayName": {"type": "string"}, - "description": {"type": "string"}, - "link": {"type": "string"} + "main": { + "type": "record", + "description": + "Record representing a block relationship against an entire an entire list of accounts (actors).", + "key": "tid", + "record": { + "type": "object", + "required": ["subject", "createdAt"], + "properties": { + "subject": { + "type": "string", + "format": "at-uri", + "description": "Reference (AT-URI) to the mod list record." + }, + "createdAt": {"type": "string", "format": "datetime"} + } } } } }; -/// `app.bsky.unspecced.getPopularFeedGenerators` -const appBskyUnspeccedGetPopularFeedGenerators = { +/// `app.bsky.graph.getFollows` +const appBskyGraphGetFollows = { "lexicon": 1, - "id": "app.bsky.unspecced.getPopularFeedGenerators", + "id": "app.bsky.graph.getFollows", "defs": { "main": { "type": "query", - "description": "An unspecced view of globally popular feed generators.", + "description": + "Enumerates accounts which a specified account (actor) follows.", "parameters": { "type": "params", + "required": ["actor"], "properties": { + "actor": {"type": "string", "format": "at-identifier"}, "limit": { "type": "integer", "default": 50, "minimum": 1, "maximum": 100 }, - "cursor": {"type": "string"}, - "query": {"type": "string"} + "cursor": {"type": "string"} } }, "output": { "encoding": "application/json", "schema": { "type": "object", - "required": ["feeds"], + "required": ["subject", "follows"], "properties": { + "subject": { + "type": "ref", + "ref": "app.bsky.actor.defs#profileView" + }, "cursor": {"type": "string"}, - "feeds": { + "follows": { "type": "array", - "items": { - "type": "ref", - "ref": "app.bsky.feed.defs#generatorView" - } + "items": {"type": "ref", "ref": "app.bsky.actor.defs#profileView"} } } } @@ -6586,36 +6034,22 @@ const appBskyUnspeccedGetPopularFeedGenerators = { } }; -/// `app.bsky.unspecced.getSuggestionsSkeleton` -const appBskyUnspeccedGetSuggestionsSkeleton = { +/// `app.bsky.graph.getStarterPacks` +const appBskyGraphGetStarterPacks = { "lexicon": 1, - "id": "app.bsky.unspecced.getSuggestionsSkeleton", + "id": "app.bsky.graph.getStarterPacks", "defs": { "main": { "type": "query", - "description": - "Get a skeleton of suggested actors. Intended to be called and then hydrated through app.bsky.actor.getSuggestions", + "description": "Get views for a list of starter packs.", "parameters": { "type": "params", + "required": ["uris"], "properties": { - "viewer": { - "type": "string", - "format": "did", - "description": - "DID of the account making the request (not included for public/unauthenticated queries). Used to boost followed accounts in ranking." - }, - "limit": { - "type": "integer", - "default": 50, - "minimum": 1, - "maximum": 100 - }, - "cursor": {"type": "string"}, - "relativeToDid": { - "type": "string", - "format": "did", - "description": - "DID of the account to get suggestions relative to. If not provided, suggestions will be based on the viewer." + "uris": { + "type": "array", + "items": {"type": "string", "format": "at-uri"}, + "maxLength": 25 } } }, @@ -6623,21 +6057,14 @@ const appBskyUnspeccedGetSuggestionsSkeleton = { "encoding": "application/json", "schema": { "type": "object", - "required": ["actors"], + "required": ["starterPacks"], "properties": { - "cursor": {"type": "string"}, - "actors": { + "starterPacks": { "type": "array", "items": { "type": "ref", - "ref": "app.bsky.unspecced.defs#skeletonSearchActor" + "ref": "app.bsky.graph.defs#starterPackViewBasic" } - }, - "relativeToDid": { - "type": "string", - "format": "did", - "description": - "DID of the account these suggestions are relative to. If this is returned undefined, suggestions are based on the viewer." } } } @@ -6646,90 +6073,99 @@ const appBskyUnspeccedGetSuggestionsSkeleton = { } }; -/// `app.bsky.unspecced.searchActorsSkeleton` -const appBskyUnspeccedSearchActorsSkeleton = { +/// `app.bsky.graph.getFollowers` +const appBskyGraphGetFollowers = { "lexicon": 1, - "id": "app.bsky.unspecced.searchActorsSkeleton", + "id": "app.bsky.graph.getFollowers", "defs": { "main": { "type": "query", - "description": "Backend Actors (profile) search, returns only skeleton.", + "description": + "Enumerates accounts which follow a specified account (actor).", "parameters": { "type": "params", - "required": ["q"], + "required": ["actor"], "properties": { - "q": { - "type": "string", - "description": - "Search query string; syntax, phrase, boolean, and faceting is unspecified, but Lucene query syntax is recommended. For typeahead search, only simple term match is supported, not full syntax." - }, - "viewer": { - "type": "string", - "format": "did", - "description": - "DID of the account making the request (not included for public/unauthenticated queries). Used to boost followed accounts in ranking." - }, - "typeahead": { - "type": "boolean", - "description": "If true, acts as fast/simple 'typeahead' query." - }, + "actor": {"type": "string", "format": "at-identifier"}, "limit": { "type": "integer", - "default": 25, + "default": 50, "minimum": 1, "maximum": 100 }, - "cursor": { - "type": "string", - "description": - "Optional pagination mechanism; may not necessarily allow scrolling through entire result set." - } + "cursor": {"type": "string"} } }, "output": { "encoding": "application/json", "schema": { "type": "object", - "required": ["actors"], + "required": ["subject", "followers"], "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." + "subject": { + "type": "ref", + "ref": "app.bsky.actor.defs#profileView" }, - "actors": { + "cursor": {"type": "string"}, + "followers": { "type": "array", - "items": { - "type": "ref", - "ref": "app.bsky.unspecced.defs#skeletonSearchActor" - } + "items": {"type": "ref", "ref": "app.bsky.actor.defs#profileView"} } } } - }, - "errors": [ - {"name": "BadQueryString"} - ] + } } } }; -/// `app.bsky.unspecced.getConfig` -const appBskyUnspeccedGetConfig = { +/// `app.bsky.graph.listitem` +const appBskyGraphListitem = { "lexicon": 1, - "id": "app.bsky.unspecced.getConfig", + "id": "app.bsky.graph.listitem", "defs": { "main": { - "type": "query", - "description": "Get miscellaneous runtime configuration.", - "output": { + "type": "record", + "description": + "Record representing an account's inclusion on a specific list. The AppView will ignore duplicate listitem records.", + "key": "tid", + "record": { + "type": "object", + "required": ["subject", "list", "createdAt"], + "properties": { + "subject": { + "type": "string", + "format": "did", + "description": "The account which is included on the list." + }, + "list": { + "type": "string", + "format": "at-uri", + "description": + "Reference (AT-URI) to the list record (app.bsky.graph.list)." + }, + "createdAt": {"type": "string", "format": "datetime"} + } + } + } + } +}; + +/// `app.bsky.graph.muteActorList` +const appBskyGraphMuteActorList = { + "lexicon": 1, + "id": "app.bsky.graph.muteActorList", + "defs": { + "main": { + "type": "procedure", + "description": + "Creates a mute relationship for the specified list of accounts. Mutes are private in Bluesky. Requires auth.", + "input": { "encoding": "application/json", "schema": { "type": "object", - "required": [], + "required": ["list"], "properties": { - "checkEmailConfirmed": {"type": "boolean"} + "list": {"type": "string", "format": "at-uri"} } } } @@ -6737,49 +6173,99 @@ const appBskyUnspeccedGetConfig = { } }; -/// `app.bsky.unspecced.getTrendingTopics` -const appBskyUnspeccedGetTrendingTopics = { +/// `app.bsky.graph.starterpack` +const appBskyGraphStarterpack = { "lexicon": 1, - "id": "app.bsky.unspecced.getTrendingTopics", + "id": "app.bsky.graph.starterpack", "defs": { "main": { - "type": "query", - "description": "Get a list of trending topics", - "parameters": { - "type": "params", + "type": "record", + "description": + "Record defining a starter pack of actors and feeds for new users.", + "key": "tid", + "record": { + "type": "object", + "required": ["name", "list", "createdAt"], "properties": { - "viewer": { + "name": { "type": "string", - "format": "did", - "description": - "DID of the account making the request (not included for public/unauthenticated queries). Used to boost followed accounts in ranking." + "description": "Display name for starter pack; can not be empty.", + "minLength": 1, + "maxLength": 500, + "maxGraphemes": 50 }, - "limit": { - "type": "integer", - "default": 10, - "minimum": 1, - "maximum": 25 - } + "description": { + "type": "string", + "maxLength": 3000, + "maxGraphemes": 300 + }, + "descriptionFacets": { + "type": "array", + "items": {"type": "ref", "ref": "app.bsky.richtext.facet"} + }, + "list": { + "type": "string", + "format": "at-uri", + "description": "Reference (AT-URI) to the list record." + }, + "feeds": { + "type": "array", + "items": {"type": "ref", "ref": "#feedItem"}, + "maxLength": 3 + }, + "createdAt": {"type": "string", "format": "datetime"} + } + } + }, + "feedItem": { + "type": "object", + "required": ["uri"], + "properties": { + "uri": {"type": "string", "format": "at-uri"} + } + } + } +}; + +/// `app.bsky.graph.searchStarterPacks` +const appBskyGraphSearchStarterPacks = { + "lexicon": 1, + "id": "app.bsky.graph.searchStarterPacks", + "defs": { + "main": { + "type": "query", + "description": + "Find starter packs matching search criteria. Does not require auth.", + "parameters": { + "type": "params", + "required": ["q"], + "properties": { + "q": { + "type": "string", + "description": + "Search query string. Syntax, phrase, boolean, and faceting is unspecified, but Lucene query syntax is recommended." + }, + "limit": { + "type": "integer", + "default": 25, + "minimum": 1, + "maximum": 100 + }, + "cursor": {"type": "string"} } }, "output": { "encoding": "application/json", "schema": { "type": "object", - "required": ["topics", "suggested"], + "required": ["starterPacks"], "properties": { - "topics": { - "type": "array", - "items": { - "type": "ref", - "ref": "app.bsky.unspecced.defs#trendingTopic" - } - }, - "suggested": { + "cursor": {"type": "string"}, + "starterPacks": { "type": "array", "items": { "type": "ref", - "ref": "app.bsky.unspecced.defs#trendingTopic" + "ref": "app.bsky.graph.defs#starterPackViewBasic" } } } @@ -6789,294 +6275,159 @@ const appBskyUnspeccedGetTrendingTopics = { } }; -/// `app.bsky.unspecced.getTaggedSuggestions` -const appBskyUnspeccedGetTaggedSuggestions = { +/// `app.bsky.graph.getRelationships` +const appBskyGraphGetRelationships = { "lexicon": 1, - "id": "app.bsky.unspecced.getTaggedSuggestions", + "id": "app.bsky.graph.getRelationships", "defs": { "main": { "type": "query", "description": - "Get a list of suggestions (feeds and users) tagged with categories", - "parameters": {"type": "params", "properties": {}}, + "Enumerates public relationships between one account, and a list of other accounts. Does not require auth.", + "parameters": { + "type": "params", + "required": ["actor"], + "properties": { + "actor": { + "type": "string", + "format": "at-identifier", + "description": "Primary account requesting relationships for." + }, + "others": { + "type": "array", + "description": + "List of 'other' accounts to be related back to the primary.", + "items": {"type": "string", "format": "at-identifier"}, + "maxLength": 30 + } + } + }, "output": { "encoding": "application/json", "schema": { "type": "object", - "required": ["suggestions"], + "required": ["relationships"], "properties": { - "suggestions": { + "actor": {"type": "string", "format": "did"}, + "relationships": { "type": "array", - "items": {"type": "ref", "ref": "#suggestion"} + "items": { + "type": "union", + "refs": [ + "app.bsky.graph.defs#relationship", + "app.bsky.graph.defs#notFoundActor" + ] + } } } } - } - }, - "suggestion": { - "type": "object", - "required": ["tag", "subjectType", "subject"], - "properties": { - "tag": {"type": "string"}, - "subjectType": { - "type": "string", - "knownValues": ["actor", "feed"] - }, - "subject": {"type": "string", "format": "uri"} + }, + "errors": [ + { + "name": "ActorNotFound", + "description": "the primary actor at-identifier could not be resolved" + } + ] + } + } +}; + +/// `app.bsky.graph.unmuteActor` +const appBskyGraphUnmuteActor = { + "lexicon": 1, + "id": "app.bsky.graph.unmuteActor", + "defs": { + "main": { + "type": "procedure", + "description": "Unmutes the specified account. Requires auth.", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["actor"], + "properties": { + "actor": {"type": "string", "format": "at-identifier"} + } + } } } } }; -/// `app.bsky.unspecced.searchPostsSkeleton` -const appBskyUnspeccedSearchPostsSkeleton = { +/// `app.bsky.graph.getActorStarterPacks` +const appBskyGraphGetActorStarterPacks = { "lexicon": 1, - "id": "app.bsky.unspecced.searchPostsSkeleton", + "id": "app.bsky.graph.getActorStarterPacks", "defs": { "main": { "type": "query", - "description": "Backend Posts search, returns only skeleton", + "description": "Get a list of starter packs created by the actor.", "parameters": { "type": "params", - "required": ["q"], + "required": ["actor"], "properties": { - "q": { - "type": "string", - "description": - "Search query string; syntax, phrase, boolean, and faceting is unspecified, but Lucene query syntax is recommended." - }, - "sort": { - "type": "string", - "description": "Specifies the ranking order of results.", - "default": "latest", - "knownValues": ["top", "latest"] - }, - "since": { - "type": "string", - "description": - "Filter results for posts after the indicated datetime (inclusive). Expected to use 'sortAt' timestamp, which may not match 'createdAt'. Can be a datetime, or just an ISO date (YYYY-MM-DD)." - }, - "until": { - "type": "string", - "description": - "Filter results for posts before the indicated datetime (not inclusive). Expected to use 'sortAt' timestamp, which may not match 'createdAt'. Can be a datetime, or just an ISO date (YYY-MM-DD)." - }, - "mentions": { - "type": "string", - "format": "at-identifier", - "description": - "Filter to posts which mention the given account. Handles are resolved to DID before query-time. Only matches rich-text facet mentions." - }, - "author": { - "type": "string", - "format": "at-identifier", - "description": - "Filter to posts by the given account. Handles are resolved to DID before query-time." - }, - "lang": { - "type": "string", - "format": "language", - "description": - "Filter to posts in the given language. Expected to be based on post language field, though server may override language detection." - }, - "domain": { - "type": "string", - "description": - "Filter to posts with URLs (facet links or embeds) linking to the given domain (hostname). Server may apply hostname normalization." - }, - "url": { - "type": "string", - "format": "uri", - "description": - "Filter to posts with links (facet links or embeds) pointing to this URL. Server may apply URL normalization or fuzzy matching." - }, - "tag": { - "type": "array", - "description": - "Filter to posts with the given tag (hashtag), based on rich-text facet or tag field. Do not include the hash (#) prefix. Multiple tags can be specified, with 'AND' matching.", - "items": {"type": "string", "maxLength": 640, "maxGraphemes": 64} - }, - "viewer": { - "type": "string", - "format": "did", - "description": - "DID of the account making the request (not included for public/unauthenticated queries). Used for 'from:me' queries." - }, + "actor": {"type": "string", "format": "at-identifier"}, "limit": { "type": "integer", - "default": 25, + "default": 50, "minimum": 1, "maximum": 100 }, - "cursor": { - "type": "string", - "description": - "Optional pagination mechanism; may not necessarily allow scrolling through entire result set." - } + "cursor": {"type": "string"} } }, "output": { "encoding": "application/json", "schema": { "type": "object", - "required": ["posts"], + "required": ["starterPacks"], "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": { + "starterPacks": { "type": "array", "items": { "type": "ref", - "ref": "app.bsky.unspecced.defs#skeletonSearchPost" + "ref": "app.bsky.graph.defs#starterPackViewBasic" } } } } - }, - "errors": [ - {"name": "BadQueryString"} - ] + } } } }; -/// `app.bsky.labeler.defs` -const appBskyLabelerDefs = { +/// `app.bsky.graph.getListBlocks` +const appBskyGraphGetListBlocks = { "lexicon": 1, - "id": "app.bsky.labeler.defs", - "defs": { - "labelerView": { - "type": "object", - "required": ["uri", "cid", "creator", "indexedAt"], - "properties": { - "uri": {"type": "string", "format": "at-uri"}, - "cid": {"type": "string", "format": "cid"}, - "creator": {"type": "ref", "ref": "app.bsky.actor.defs#profileView"}, - "likeCount": {"type": "integer", "minimum": 0}, - "viewer": {"type": "ref", "ref": "#labelerViewerState"}, - "indexedAt": {"type": "string", "format": "datetime"}, - "labels": { - "type": "array", - "items": {"type": "ref", "ref": "com.atproto.label.defs#label"} - } - } - }, - "labelerViewDetailed": { - "type": "object", - "required": ["uri", "cid", "creator", "policies", "indexedAt"], - "properties": { - "uri": {"type": "string", "format": "at-uri"}, - "cid": {"type": "string", "format": "cid"}, - "creator": {"type": "ref", "ref": "app.bsky.actor.defs#profileView"}, - "policies": { - "type": "ref", - "ref": "app.bsky.labeler.defs#labelerPolicies" - }, - "likeCount": {"type": "integer", "minimum": 0}, - "viewer": {"type": "ref", "ref": "#labelerViewerState"}, - "indexedAt": {"type": "string", "format": "datetime"}, - "labels": { - "type": "array", - "items": {"type": "ref", "ref": "com.atproto.label.defs#label"} - } - } - }, - "labelerViewerState": { - "type": "object", - "properties": { - "like": {"type": "string", "format": "at-uri"} - } - }, - "labelerPolicies": { - "type": "object", - "required": ["labelValues"], - "properties": { - "labelValues": { - "type": "array", - "description": - "The label values which this labeler publishes. May include global or custom labels.", - "items": {"type": "ref", "ref": "com.atproto.label.defs#labelValue"} - }, - "labelValueDefinitions": { - "type": "array", - "description": - "Label values created by this labeler and scoped exclusively to it. Labels defined here will override global label definitions for this labeler.", - "items": { - "type": "ref", - "ref": "com.atproto.label.defs#labelValueDefinition" - } - } - } - } - } -}; - -/// `app.bsky.labeler.service` -const appBskyLabelerService = { - "lexicon": 1, - "id": "app.bsky.labeler.service", - "defs": { - "main": { - "type": "record", - "description": "A declaration of the existence of labeler service.", - "key": "literal:self", - "record": { - "type": "object", - "required": ["policies", "createdAt"], - "properties": { - "policies": { - "type": "ref", - "ref": "app.bsky.labeler.defs#labelerPolicies" - }, - "labels": { - "type": "union", - "refs": ["com.atproto.label.defs#selfLabels"] - }, - "createdAt": {"type": "string", "format": "datetime"} - } - } - } - } -}; - -/// `app.bsky.labeler.getServices` -const appBskyLabelerGetServices = { - "lexicon": 1, - "id": "app.bsky.labeler.getServices", + "id": "app.bsky.graph.getListBlocks", "defs": { "main": { "type": "query", - "description": "Get information about a list of labeler services.", + "description": + "Get mod lists that the requesting account (actor) is blocking. Requires auth.", "parameters": { "type": "params", - "required": ["dids"], "properties": { - "dids": { - "type": "array", - "items": {"type": "string", "format": "did"} + "limit": { + "type": "integer", + "default": 50, + "minimum": 1, + "maximum": 100 }, - "detailed": {"type": "boolean", "default": false} + "cursor": {"type": "string"} } }, "output": { "encoding": "application/json", "schema": { "type": "object", - "required": ["views"], + "required": ["lists"], "properties": { - "views": { + "cursor": {"type": "string"}, + "lists": { "type": "array", - "items": { - "type": "union", - "refs": [ - "app.bsky.labeler.defs#labelerView", - "app.bsky.labeler.defs#labelerViewDetailed" - ] - } + "items": {"type": "ref", "ref": "app.bsky.graph.defs#listView"} } } } @@ -7085,27 +6436,49 @@ const appBskyLabelerGetServices = { } }; -/// `app.bsky.graph.searchStarterPacks` -const appBskyGraphSearchStarterPacks = { +/// `app.bsky.graph.follow` +const appBskyGraphFollow = { "lexicon": 1, - "id": "app.bsky.graph.searchStarterPacks", + "id": "app.bsky.graph.follow", + "defs": { + "main": { + "type": "record", + "description": + "Record declaring a social 'follow' relationship of another account. Duplicate follows will be ignored by the AppView.", + "key": "tid", + "record": { + "type": "object", + "required": ["subject", "createdAt"], + "properties": { + "subject": {"type": "string", "format": "did"}, + "createdAt": {"type": "string", "format": "datetime"} + } + } + } + } +}; + +/// `app.bsky.graph.getLists` +const appBskyGraphGetLists = { + "lexicon": 1, + "id": "app.bsky.graph.getLists", "defs": { "main": { "type": "query", "description": - "Find starter packs matching search criteria. Does not require auth.", + "Enumerates the lists created by a specified account (actor).", "parameters": { "type": "params", - "required": ["q"], + "required": ["actor"], "properties": { - "q": { + "actor": { "type": "string", - "description": - "Search query string. Syntax, phrase, boolean, and faceting is unspecified, but Lucene query syntax is recommended." + "format": "at-identifier", + "description": "The account (actor) to enumerate lists from." }, "limit": { "type": "integer", - "default": 25, + "default": 50, "minimum": 1, "maximum": 100 }, @@ -7116,15 +6489,12 @@ const appBskyGraphSearchStarterPacks = { "encoding": "application/json", "schema": { "type": "object", - "required": ["starterPacks"], + "required": ["lists"], "properties": { "cursor": {"type": "string"}, - "starterPacks": { + "lists": { "type": "array", - "items": { - "type": "ref", - "ref": "app.bsky.graph.defs#starterPackViewBasic" - } + "items": {"type": "ref", "ref": "app.bsky.graph.defs#listView"} } } } @@ -7133,73 +6503,22 @@ const appBskyGraphSearchStarterPacks = { } }; -/// `app.bsky.graph.list` -const appBskyGraphList = { - "lexicon": 1, - "id": "app.bsky.graph.list", - "defs": { - "main": { - "type": "record", - "description": - "Record representing a list of accounts (actors). Scope includes both moderation-oriented lists and curration-oriented lists.", - "key": "tid", - "record": { - "type": "object", - "required": ["name", "purpose", "createdAt"], - "properties": { - "purpose": { - "type": "ref", - "description": - "Defines the purpose of the list (aka, moderation-oriented or curration-oriented)", - "ref": "app.bsky.graph.defs#listPurpose" - }, - "name": { - "type": "string", - "description": "Display name for list; can not be empty.", - "minLength": 1, - "maxLength": 64 - }, - "description": { - "type": "string", - "maxLength": 3000, - "maxGraphemes": 300 - }, - "descriptionFacets": { - "type": "array", - "items": {"type": "ref", "ref": "app.bsky.richtext.facet"} - }, - "avatar": { - "type": "blob", - "accept": ["image/png", "image/jpeg"], - "maxSize": 1000000 - }, - "labels": { - "type": "union", - "refs": ["com.atproto.label.defs#selfLabels"] - }, - "createdAt": {"type": "string", "format": "datetime"} - } - } - } - } -}; - -/// `app.bsky.graph.muteActorList` -const appBskyGraphMuteActorList = { +/// `app.bsky.graph.muteActor` +const appBskyGraphMuteActor = { "lexicon": 1, - "id": "app.bsky.graph.muteActorList", + "id": "app.bsky.graph.muteActor", "defs": { "main": { "type": "procedure", "description": - "Creates a mute relationship for the specified list of accounts. Mutes are private in Bluesky. Requires auth.", + "Creates a mute relationship for the specified account. Mutes are private in Bluesky. Requires auth.", "input": { "encoding": "application/json", "schema": { "type": "object", - "required": ["list"], + "required": ["actor"], "properties": { - "list": {"type": "string", "format": "at-uri"} + "actor": {"type": "string", "format": "at-identifier"} } } } @@ -7207,132 +6526,10 @@ const appBskyGraphMuteActorList = { } }; -/// `app.bsky.graph.getRelationships` -const appBskyGraphGetRelationships = { +/// `app.bsky.graph.defs` +const appBskyGraphDefs = { "lexicon": 1, - "id": "app.bsky.graph.getRelationships", - "defs": { - "main": { - "type": "query", - "description": - "Enumerates public relationships between one account, and a list of other accounts. Does not require auth.", - "parameters": { - "type": "params", - "required": ["actor"], - "properties": { - "actor": { - "type": "string", - "format": "at-identifier", - "description": "Primary account requesting relationships for." - }, - "others": { - "type": "array", - "description": - "List of 'other' accounts to be related back to the primary.", - "items": {"type": "string", "format": "at-identifier"}, - "maxLength": 30 - } - } - }, - "output": { - "encoding": "application/json", - "schema": { - "type": "object", - "required": ["relationships"], - "properties": { - "actor": {"type": "string", "format": "did"}, - "relationships": { - "type": "array", - "items": { - "type": "union", - "refs": [ - "app.bsky.graph.defs#relationship", - "app.bsky.graph.defs#notFoundActor" - ] - } - } - } - } - }, - "errors": [ - { - "name": "ActorNotFound", - "description": "the primary actor at-identifier could not be resolved" - } - ] - } - } -}; - -/// `app.bsky.graph.getListBlocks` -const appBskyGraphGetListBlocks = { - "lexicon": 1, - "id": "app.bsky.graph.getListBlocks", - "defs": { - "main": { - "type": "query", - "description": - "Get mod lists that the requesting account (actor) is blocking. Requires auth.", - "parameters": { - "type": "params", - "properties": { - "limit": { - "type": "integer", - "default": 50, - "minimum": 1, - "maximum": 100 - }, - "cursor": {"type": "string"} - } - }, - "output": { - "encoding": "application/json", - "schema": { - "type": "object", - "required": ["lists"], - "properties": { - "cursor": {"type": "string"}, - "lists": { - "type": "array", - "items": {"type": "ref", "ref": "app.bsky.graph.defs#listView"} - } - } - } - } - } - } -}; - -/// `app.bsky.graph.block` -const appBskyGraphBlock = { - "lexicon": 1, - "id": "app.bsky.graph.block", - "defs": { - "main": { - "type": "record", - "description": - "Record declaring a 'block' relationship against another account. NOTE: blocks are public in Bluesky; see blog posts for details.", - "key": "tid", - "record": { - "type": "object", - "required": ["subject", "createdAt"], - "properties": { - "subject": { - "type": "string", - "format": "did", - "description": "DID of the account to be blocked." - }, - "createdAt": {"type": "string", "format": "datetime"} - } - } - } - } -}; - -/// `app.bsky.graph.defs` -const appBskyGraphDefs = { - "lexicon": 1, - "id": "app.bsky.graph.defs", + "id": "app.bsky.graph.defs", "defs": { "listViewBasic": { "type": "object", @@ -7503,47 +6700,42 @@ const appBskyGraphDefs = { } }; -/// `app.bsky.graph.getList` -const appBskyGraphGetList = { +/// `app.bsky.graph.getSuggestedFollowsByActor` +const appBskyGraphGetSuggestedFollowsByActor = { "lexicon": 1, - "id": "app.bsky.graph.getList", + "id": "app.bsky.graph.getSuggestedFollowsByActor", "defs": { "main": { "type": "query", "description": - "Gets a 'view' (with additional context) of a specified list.", + "Enumerates follows similar to a given account (actor). Expected use is to recommend additional accounts immediately after following one account.", "parameters": { "type": "params", - "required": ["list"], + "required": ["actor"], "properties": { - "list": { - "type": "string", - "format": "at-uri", - "description": "Reference (AT-URI) of the list record to hydrate." - }, - "limit": { - "type": "integer", - "default": 50, - "minimum": 1, - "maximum": 100 - }, - "cursor": {"type": "string"} + "actor": {"type": "string", "format": "at-identifier"} } }, "output": { "encoding": "application/json", "schema": { "type": "object", - "required": ["list", "items"], + "required": ["suggestions"], "properties": { - "cursor": {"type": "string"}, - "list": {"type": "ref", "ref": "app.bsky.graph.defs#listView"}, - "items": { + "suggestions": { "type": "array", - "items": { - "type": "ref", - "ref": "app.bsky.graph.defs#listItemView" - } + "items": {"type": "ref", "ref": "app.bsky.actor.defs#profileView"} + }, + "isFallback": { + "type": "boolean", + "description": + "If true, response has fallen-back to generic results, and is not scoped using relativeToDid", + "default": false + }, + "recId": { + "type": "integer", + "description": + "Snowflake for this recommendation, use when submitting recommendation events." } } } @@ -7552,22 +6744,22 @@ const appBskyGraphGetList = { } }; -/// `app.bsky.graph.muteThread` -const appBskyGraphMuteThread = { +/// `app.bsky.notification.updateSeen` +const appBskyNotificationUpdateSeen = { "lexicon": 1, - "id": "app.bsky.graph.muteThread", + "id": "app.bsky.notification.updateSeen", "defs": { "main": { "type": "procedure", "description": - "Mutes a thread preventing notifications from the thread and any of its children. Mutes are private in Bluesky. Requires auth.", + "Notify server that the requesting account has seen notifications. Requires auth.", "input": { "encoding": "application/json", "schema": { "type": "object", - "required": ["root"], + "required": ["seenAt"], "properties": { - "root": {"type": "string", "format": "at-uri"} + "seenAt": {"type": "string", "format": "datetime"} } } } @@ -7575,38 +6767,58 @@ const appBskyGraphMuteThread = { } }; -/// `app.bsky.graph.getStarterPacks` -const appBskyGraphGetStarterPacks = { +/// `app.bsky.notification.registerPush` +const appBskyNotificationRegisterPush = { "lexicon": 1, - "id": "app.bsky.graph.getStarterPacks", + "id": "app.bsky.notification.registerPush", + "defs": { + "main": { + "type": "procedure", + "description": + "Register to receive push notifications, via a specified service, for the requesting account. Requires auth.", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["serviceDid", "token", "platform", "appId"], + "properties": { + "serviceDid": {"type": "string", "format": "did"}, + "token": {"type": "string"}, + "platform": { + "type": "string", + "knownValues": ["ios", "android", "web"] + }, + "appId": {"type": "string"} + } + } + } + } + } +}; + +/// `app.bsky.notification.getUnreadCount` +const appBskyNotificationGetUnreadCount = { + "lexicon": 1, + "id": "app.bsky.notification.getUnreadCount", "defs": { "main": { "type": "query", - "description": "Get views for a list of starter packs.", + "description": + "Count the number of unread notifications for the requesting account. Requires auth.", "parameters": { "type": "params", - "required": ["uris"], "properties": { - "uris": { - "type": "array", - "items": {"type": "string", "format": "at-uri"}, - "maxLength": 25 - } + "priority": {"type": "boolean"}, + "seenAt": {"type": "string", "format": "datetime"} } }, "output": { "encoding": "application/json", "schema": { "type": "object", - "required": ["starterPacks"], + "required": ["count"], "properties": { - "starterPacks": { - "type": "array", - "items": { - "type": "ref", - "ref": "app.bsky.graph.defs#starterPackViewBasic" - } - } + "count": {"type": "integer"} } } } @@ -7614,66 +6826,113 @@ const appBskyGraphGetStarterPacks = { } }; -/// `app.bsky.graph.getKnownFollowers` -const appBskyGraphGetKnownFollowers = { +/// `app.bsky.notification.listNotifications` +const appBskyNotificationListNotifications = { "lexicon": 1, - "id": "app.bsky.graph.getKnownFollowers", + "id": "app.bsky.notification.listNotifications", "defs": { "main": { "type": "query", "description": - "Enumerates accounts which follow a specified account (actor) and are followed by the viewer.", + "Enumerate notifications for the requesting account. Requires auth.", "parameters": { "type": "params", - "required": ["actor"], "properties": { - "actor": {"type": "string", "format": "at-identifier"}, + "reasons": { + "type": "array", + "description": "Notification reasons to include in response.", + "items": { + "type": "string", + "description": + "A reason that matches the reason property of #notification." + } + }, "limit": { "type": "integer", "default": 50, "minimum": 1, "maximum": 100 }, - "cursor": {"type": "string"} + "priority": {"type": "boolean"}, + "cursor": {"type": "string"}, + "seenAt": {"type": "string", "format": "datetime"} } }, "output": { "encoding": "application/json", "schema": { "type": "object", - "required": ["subject", "followers"], + "required": ["notifications"], "properties": { - "subject": { - "type": "ref", - "ref": "app.bsky.actor.defs#profileView" - }, "cursor": {"type": "string"}, - "followers": { + "notifications": { "type": "array", - "items": {"type": "ref", "ref": "app.bsky.actor.defs#profileView"} - } - } - } + "items": {"type": "ref", "ref": "#notification"} + }, + "priority": {"type": "boolean"}, + "seenAt": {"type": "string", "format": "datetime"} + } + } + } + }, + "notification": { + "type": "object", + "required": [ + "uri", + "cid", + "author", + "reason", + "record", + "isRead", + "indexedAt" + ], + "properties": { + "uri": {"type": "string", "format": "at-uri"}, + "cid": {"type": "string", "format": "cid"}, + "author": {"type": "ref", "ref": "app.bsky.actor.defs#profileView"}, + "reason": { + "type": "string", + "description": + "Expected values are 'like', 'repost', 'follow', 'mention', 'reply', 'quote', and 'starterpack-joined'.", + "knownValues": [ + "like", + "repost", + "follow", + "mention", + "reply", + "quote", + "starterpack-joined" + ] + }, + "reasonSubject": {"type": "string", "format": "at-uri"}, + "record": {"type": "unknown"}, + "isRead": {"type": "boolean"}, + "indexedAt": {"type": "string", "format": "datetime"}, + "labels": { + "type": "array", + "items": {"type": "ref", "ref": "com.atproto.label.defs#label"} + } } } } }; -/// `app.bsky.graph.unmuteActorList` -const appBskyGraphUnmuteActorList = { +/// `app.bsky.notification.putPreferences` +const appBskyNotificationPutPreferences = { "lexicon": 1, - "id": "app.bsky.graph.unmuteActorList", + "id": "app.bsky.notification.putPreferences", "defs": { "main": { "type": "procedure", - "description": "Unmutes the specified list of accounts. Requires auth.", + "description": + "Set notification-related preferences for an account. Requires auth.", "input": { "encoding": "application/json", "schema": { "type": "object", - "required": ["list"], + "required": ["priority"], "properties": { - "list": {"type": "string", "format": "at-uri"} + "priority": {"type": "boolean"} } } } @@ -7681,30 +6940,139 @@ const appBskyGraphUnmuteActorList = { } }; -/// `app.bsky.graph.listitem` -const appBskyGraphListitem = { +/// `app.bsky.labeler.getServices` +const appBskyLabelerGetServices = { "lexicon": 1, - "id": "app.bsky.graph.listitem", + "id": "app.bsky.labeler.getServices", + "defs": { + "main": { + "type": "query", + "description": "Get information about a list of labeler services.", + "parameters": { + "type": "params", + "required": ["dids"], + "properties": { + "dids": { + "type": "array", + "items": {"type": "string", "format": "did"} + }, + "detailed": {"type": "boolean", "default": false} + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["views"], + "properties": { + "views": { + "type": "array", + "items": { + "type": "union", + "refs": [ + "app.bsky.labeler.defs#labelerView", + "app.bsky.labeler.defs#labelerViewDetailed" + ] + } + } + } + } + } + } + } +}; + +/// `app.bsky.labeler.defs` +const appBskyLabelerDefs = { + "lexicon": 1, + "id": "app.bsky.labeler.defs", + "defs": { + "labelerView": { + "type": "object", + "required": ["uri", "cid", "creator", "indexedAt"], + "properties": { + "uri": {"type": "string", "format": "at-uri"}, + "cid": {"type": "string", "format": "cid"}, + "creator": {"type": "ref", "ref": "app.bsky.actor.defs#profileView"}, + "likeCount": {"type": "integer", "minimum": 0}, + "viewer": {"type": "ref", "ref": "#labelerViewerState"}, + "indexedAt": {"type": "string", "format": "datetime"}, + "labels": { + "type": "array", + "items": {"type": "ref", "ref": "com.atproto.label.defs#label"} + } + } + }, + "labelerViewDetailed": { + "type": "object", + "required": ["uri", "cid", "creator", "policies", "indexedAt"], + "properties": { + "uri": {"type": "string", "format": "at-uri"}, + "cid": {"type": "string", "format": "cid"}, + "creator": {"type": "ref", "ref": "app.bsky.actor.defs#profileView"}, + "policies": { + "type": "ref", + "ref": "app.bsky.labeler.defs#labelerPolicies" + }, + "likeCount": {"type": "integer", "minimum": 0}, + "viewer": {"type": "ref", "ref": "#labelerViewerState"}, + "indexedAt": {"type": "string", "format": "datetime"}, + "labels": { + "type": "array", + "items": {"type": "ref", "ref": "com.atproto.label.defs#label"} + } + } + }, + "labelerViewerState": { + "type": "object", + "properties": { + "like": {"type": "string", "format": "at-uri"} + } + }, + "labelerPolicies": { + "type": "object", + "required": ["labelValues"], + "properties": { + "labelValues": { + "type": "array", + "description": + "The label values which this labeler publishes. May include global or custom labels.", + "items": {"type": "ref", "ref": "com.atproto.label.defs#labelValue"} + }, + "labelValueDefinitions": { + "type": "array", + "description": + "Label values created by this labeler and scoped exclusively to it. Labels defined here will override global label definitions for this labeler.", + "items": { + "type": "ref", + "ref": "com.atproto.label.defs#labelValueDefinition" + } + } + } + } + } +}; + +/// `app.bsky.labeler.service` +const appBskyLabelerService = { + "lexicon": 1, + "id": "app.bsky.labeler.service", "defs": { "main": { "type": "record", - "description": - "Record representing an account's inclusion on a specific list. The AppView will ignore duplicate listitem records.", - "key": "tid", + "description": "A declaration of the existence of labeler service.", + "key": "literal:self", "record": { "type": "object", - "required": ["subject", "list", "createdAt"], + "required": ["policies", "createdAt"], "properties": { - "subject": { - "type": "string", - "format": "did", - "description": "The account which is included on the list." + "policies": { + "type": "ref", + "ref": "app.bsky.labeler.defs#labelerPolicies" }, - "list": { - "type": "string", - "format": "at-uri", - "description": - "Reference (AT-URI) to the list record (app.bsky.graph.list)." + "labels": { + "type": "union", + "refs": ["com.atproto.label.defs#selfLabels"] }, "createdAt": {"type": "string", "format": "datetime"} } @@ -7713,233 +7081,1266 @@ const appBskyGraphListitem = { } }; -/// `app.bsky.graph.getLists` -const appBskyGraphGetLists = { +/// `app.bsky.unspecced.searchStarterPacksSkeleton` +const appBskyUnspeccedSearchStarterPacksSkeleton = { "lexicon": 1, - "id": "app.bsky.graph.getLists", + "id": "app.bsky.unspecced.searchStarterPacksSkeleton", "defs": { "main": { "type": "query", - "description": - "Enumerates the lists created by a specified account (actor).", + "description": "Backend Starter Pack search, returns only skeleton.", "parameters": { "type": "params", - "required": ["actor"], + "required": ["q"], "properties": { - "actor": { + "q": { "type": "string", - "format": "at-identifier", - "description": "The account (actor) to enumerate lists from." + "description": + "Search query string; syntax, phrase, boolean, and faceting is unspecified, but Lucene query syntax is recommended." + }, + "viewer": { + "type": "string", + "format": "did", + "description": + "DID of the account making the request (not included for public/unauthenticated queries)." }, "limit": { "type": "integer", - "default": 50, + "default": 25, "minimum": 1, "maximum": 100 }, - "cursor": {"type": "string"} + "cursor": { + "type": "string", + "description": + "Optional pagination mechanism; may not necessarily allow scrolling through entire result set." + } } }, "output": { "encoding": "application/json", "schema": { "type": "object", - "required": ["lists"], + "required": ["starterPacks"], "properties": { "cursor": {"type": "string"}, - "lists": { + "hitsTotal": { + "type": "integer", + "description": + "Count of search hits. Optional, may be rounded/truncated, and may not be possible to paginate through all hits." + }, + "starterPacks": { "type": "array", - "items": {"type": "ref", "ref": "app.bsky.graph.defs#listView"} + "items": { + "type": "ref", + "ref": "app.bsky.unspecced.defs#skeletonSearchStarterPack" + } } } } - } + }, + "errors": [ + {"name": "BadQueryString"} + ] } } }; -/// `app.bsky.graph.getFollowers` -const appBskyGraphGetFollowers = { +/// `app.bsky.unspecced.getPopularFeedGenerators` +const appBskyUnspeccedGetPopularFeedGenerators = { "lexicon": 1, - "id": "app.bsky.graph.getFollowers", + "id": "app.bsky.unspecced.getPopularFeedGenerators", "defs": { "main": { "type": "query", - "description": - "Enumerates accounts which follow a specified account (actor).", + "description": "An unspecced view of globally popular feed generators.", "parameters": { "type": "params", - "required": ["actor"], "properties": { - "actor": {"type": "string", "format": "at-identifier"}, "limit": { "type": "integer", "default": 50, "minimum": 1, "maximum": 100 }, - "cursor": {"type": "string"} + "cursor": {"type": "string"}, + "query": {"type": "string"} } }, "output": { "encoding": "application/json", "schema": { "type": "object", - "required": ["subject", "followers"], + "required": ["feeds"], "properties": { - "subject": { - "type": "ref", - "ref": "app.bsky.actor.defs#profileView" - }, "cursor": {"type": "string"}, - "followers": { + "feeds": { "type": "array", - "items": {"type": "ref", "ref": "app.bsky.actor.defs#profileView"} + "items": { + "type": "ref", + "ref": "app.bsky.feed.defs#generatorView" + } + } + } + } + } + } + } +}; + +/// `app.bsky.unspecced.getTaggedSuggestions` +const appBskyUnspeccedGetTaggedSuggestions = { + "lexicon": 1, + "id": "app.bsky.unspecced.getTaggedSuggestions", + "defs": { + "main": { + "type": "query", + "description": + "Get a list of suggestions (feeds and users) tagged with categories", + "parameters": {"type": "params", "properties": {}}, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["suggestions"], + "properties": { + "suggestions": { + "type": "array", + "items": {"type": "ref", "ref": "#suggestion"} + } + } + } + } + }, + "suggestion": { + "type": "object", + "required": ["tag", "subjectType", "subject"], + "properties": { + "tag": {"type": "string"}, + "subjectType": { + "type": "string", + "knownValues": ["actor", "feed"] + }, + "subject": {"type": "string", "format": "uri"} + } + } + } +}; + +/// `app.bsky.unspecced.getSuggestionsSkeleton` +const appBskyUnspeccedGetSuggestionsSkeleton = { + "lexicon": 1, + "id": "app.bsky.unspecced.getSuggestionsSkeleton", + "defs": { + "main": { + "type": "query", + "description": + "Get a skeleton of suggested actors. Intended to be called and then hydrated through app.bsky.actor.getSuggestions", + "parameters": { + "type": "params", + "properties": { + "viewer": { + "type": "string", + "format": "did", + "description": + "DID of the account making the request (not included for public/unauthenticated queries). Used to boost followed accounts in ranking." + }, + "limit": { + "type": "integer", + "default": 50, + "minimum": 1, + "maximum": 100 + }, + "cursor": {"type": "string"}, + "relativeToDid": { + "type": "string", + "format": "did", + "description": + "DID of the account to get suggestions relative to. If not provided, suggestions will be based on the viewer." + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["actors"], + "properties": { + "cursor": {"type": "string"}, + "actors": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.bsky.unspecced.defs#skeletonSearchActor" + } + }, + "relativeToDid": { + "type": "string", + "format": "did", + "description": + "DID of the account these suggestions are relative to. If this is returned undefined, suggestions are based on the viewer." + }, + "recId": { + "type": "integer", + "description": + "Snowflake for this recommendation, use when submitting recommendation events." + } + } + } + } + } + } +}; + +/// `app.bsky.unspecced.getTrendingTopics` +const appBskyUnspeccedGetTrendingTopics = { + "lexicon": 1, + "id": "app.bsky.unspecced.getTrendingTopics", + "defs": { + "main": { + "type": "query", + "description": "Get a list of trending topics", + "parameters": { + "type": "params", + "properties": { + "viewer": { + "type": "string", + "format": "did", + "description": + "DID of the account making the request (not included for public/unauthenticated queries). Used to boost followed accounts in ranking." + }, + "limit": { + "type": "integer", + "default": 10, + "minimum": 1, + "maximum": 25 + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["topics", "suggested"], + "properties": { + "topics": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.bsky.unspecced.defs#trendingTopic" + } + }, + "suggested": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.bsky.unspecced.defs#trendingTopic" + } } } } } - } - } -}; - -/// `app.bsky.graph.getActorStarterPacks` -const appBskyGraphGetActorStarterPacks = { - "lexicon": 1, - "id": "app.bsky.graph.getActorStarterPacks", - "defs": { - "main": { - "type": "query", - "description": "Get a list of starter packs created by the actor.", - "parameters": { - "type": "params", - "required": ["actor"], - "properties": { - "actor": {"type": "string", "format": "at-identifier"}, - "limit": { - "type": "integer", - "default": 50, - "minimum": 1, - "maximum": 100 - }, - "cursor": {"type": "string"} - } - }, - "output": { - "encoding": "application/json", - "schema": { - "type": "object", - "required": ["starterPacks"], - "properties": { - "cursor": {"type": "string"}, - "starterPacks": { - "type": "array", - "items": { - "type": "ref", - "ref": "app.bsky.graph.defs#starterPackViewBasic" - } - } - } + } + } +}; + +/// `app.bsky.unspecced.getConfig` +const appBskyUnspeccedGetConfig = { + "lexicon": 1, + "id": "app.bsky.unspecced.getConfig", + "defs": { + "main": { + "type": "query", + "description": "Get miscellaneous runtime configuration.", + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": [], + "properties": { + "checkEmailConfirmed": {"type": "boolean"} + } + } + } + } + } +}; + +/// `app.bsky.unspecced.searchPostsSkeleton` +const appBskyUnspeccedSearchPostsSkeleton = { + "lexicon": 1, + "id": "app.bsky.unspecced.searchPostsSkeleton", + "defs": { + "main": { + "type": "query", + "description": "Backend Posts search, returns only skeleton", + "parameters": { + "type": "params", + "required": ["q"], + "properties": { + "q": { + "type": "string", + "description": + "Search query string; syntax, phrase, boolean, and faceting is unspecified, but Lucene query syntax is recommended." + }, + "sort": { + "type": "string", + "description": "Specifies the ranking order of results.", + "default": "latest", + "knownValues": ["top", "latest"] + }, + "since": { + "type": "string", + "description": + "Filter results for posts after the indicated datetime (inclusive). Expected to use 'sortAt' timestamp, which may not match 'createdAt'. Can be a datetime, or just an ISO date (YYYY-MM-DD)." + }, + "until": { + "type": "string", + "description": + "Filter results for posts before the indicated datetime (not inclusive). Expected to use 'sortAt' timestamp, which may not match 'createdAt'. Can be a datetime, or just an ISO date (YYY-MM-DD)." + }, + "mentions": { + "type": "string", + "format": "at-identifier", + "description": + "Filter to posts which mention the given account. Handles are resolved to DID before query-time. Only matches rich-text facet mentions." + }, + "author": { + "type": "string", + "format": "at-identifier", + "description": + "Filter to posts by the given account. Handles are resolved to DID before query-time." + }, + "lang": { + "type": "string", + "format": "language", + "description": + "Filter to posts in the given language. Expected to be based on post language field, though server may override language detection." + }, + "domain": { + "type": "string", + "description": + "Filter to posts with URLs (facet links or embeds) linking to the given domain (hostname). Server may apply hostname normalization." + }, + "url": { + "type": "string", + "format": "uri", + "description": + "Filter to posts with links (facet links or embeds) pointing to this URL. Server may apply URL normalization or fuzzy matching." + }, + "tag": { + "type": "array", + "description": + "Filter to posts with the given tag (hashtag), based on rich-text facet or tag field. Do not include the hash (#) prefix. Multiple tags can be specified, with 'AND' matching.", + "items": {"type": "string", "maxLength": 640, "maxGraphemes": 64} + }, + "viewer": { + "type": "string", + "format": "did", + "description": + "DID of the account making the request (not included for public/unauthenticated queries). Used for 'from:me' queries." + }, + "limit": { + "type": "integer", + "default": 25, + "minimum": 1, + "maximum": 100 + }, + "cursor": { + "type": "string", + "description": + "Optional pagination mechanism; may not necessarily allow scrolling through entire result set." + } + } + }, + "output": { + "encoding": "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": { + "type": "ref", + "ref": "app.bsky.unspecced.defs#skeletonSearchPost" + } + } + } + } + }, + "errors": [ + {"name": "BadQueryString"} + ] + } + } +}; + +/// `app.bsky.unspecced.defs` +const appBskyUnspeccedDefs = { + "lexicon": 1, + "id": "app.bsky.unspecced.defs", + "defs": { + "skeletonSearchPost": { + "type": "object", + "required": ["uri"], + "properties": { + "uri": {"type": "string", "format": "at-uri"} + } + }, + "skeletonSearchActor": { + "type": "object", + "required": ["did"], + "properties": { + "did": {"type": "string", "format": "did"} + } + }, + "skeletonSearchStarterPack": { + "type": "object", + "required": ["uri"], + "properties": { + "uri": {"type": "string", "format": "at-uri"} + } + }, + "trendingTopic": { + "type": "object", + "required": ["topic", "link"], + "properties": { + "topic": {"type": "string"}, + "displayName": {"type": "string"}, + "description": {"type": "string"}, + "link": {"type": "string"} + } + } + } +}; + +/// `app.bsky.unspecced.searchActorsSkeleton` +const appBskyUnspeccedSearchActorsSkeleton = { + "lexicon": 1, + "id": "app.bsky.unspecced.searchActorsSkeleton", + "defs": { + "main": { + "type": "query", + "description": "Backend Actors (profile) search, returns only skeleton.", + "parameters": { + "type": "params", + "required": ["q"], + "properties": { + "q": { + "type": "string", + "description": + "Search query string; syntax, phrase, boolean, and faceting is unspecified, but Lucene query syntax is recommended. For typeahead search, only simple term match is supported, not full syntax." + }, + "viewer": { + "type": "string", + "format": "did", + "description": + "DID of the account making the request (not included for public/unauthenticated queries). Used to boost followed accounts in ranking." + }, + "typeahead": { + "type": "boolean", + "description": "If true, acts as fast/simple 'typeahead' query." + }, + "limit": { + "type": "integer", + "default": 25, + "minimum": 1, + "maximum": 100 + }, + "cursor": { + "type": "string", + "description": + "Optional pagination mechanism; may not necessarily allow scrolling through entire result set." + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["actors"], + "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." + }, + "actors": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.bsky.unspecced.defs#skeletonSearchActor" + } + } + } + } + }, + "errors": [ + {"name": "BadQueryString"} + ] + } + } +}; + +/// `app.bsky.actor.searchActors` +const appBskyActorSearchActors = { + "lexicon": 1, + "id": "app.bsky.actor.searchActors", + "defs": { + "main": { + "type": "query", + "description": + "Find actors (profiles) matching search criteria. Does not require auth.", + "parameters": { + "type": "params", + "properties": { + "term": { + "type": "string", + "description": "DEPRECATED: use 'q' instead." + }, + "q": { + "type": "string", + "description": + "Search query string. Syntax, phrase, boolean, and faceting is unspecified, but Lucene query syntax is recommended." + }, + "limit": { + "type": "integer", + "default": 25, + "minimum": 1, + "maximum": 100 + }, + "cursor": {"type": "string"} + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["actors"], + "properties": { + "cursor": {"type": "string"}, + "actors": { + "type": "array", + "items": {"type": "ref", "ref": "app.bsky.actor.defs#profileView"} + } + } + } + } + } + } +}; + +/// `app.bsky.actor.getSuggestions` +const appBskyActorGetSuggestions = { + "lexicon": 1, + "id": "app.bsky.actor.getSuggestions", + "defs": { + "main": { + "type": "query", + "description": + "Get a list of suggested actors. Expected use is discovery of accounts to follow during new account onboarding.", + "parameters": { + "type": "params", + "properties": { + "limit": { + "type": "integer", + "default": 50, + "minimum": 1, + "maximum": 100 + }, + "cursor": {"type": "string"} + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["actors"], + "properties": { + "cursor": {"type": "string"}, + "actors": { + "type": "array", + "items": {"type": "ref", "ref": "app.bsky.actor.defs#profileView"} + }, + "recId": { + "type": "integer", + "description": + "Snowflake for this recommendation, use when submitting recommendation events." + } + } + } + } + } + } +}; + +/// `app.bsky.actor.getProfile` +const appBskyActorGetProfile = { + "lexicon": 1, + "id": "app.bsky.actor.getProfile", + "defs": { + "main": { + "type": "query", + "description": + "Get detailed profile view of an actor. Does not require auth, but contains relevant metadata with auth.", + "parameters": { + "type": "params", + "required": ["actor"], + "properties": { + "actor": { + "type": "string", + "format": "at-identifier", + "description": "Handle or DID of account to fetch profile of." + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "ref", + "ref": "app.bsky.actor.defs#profileViewDetailed" + } + } + } + } +}; + +/// `app.bsky.actor.getProfiles` +const appBskyActorGetProfiles = { + "lexicon": 1, + "id": "app.bsky.actor.getProfiles", + "defs": { + "main": { + "type": "query", + "description": "Get detailed profile views of multiple actors.", + "parameters": { + "type": "params", + "required": ["actors"], + "properties": { + "actors": { + "type": "array", + "items": {"type": "string", "format": "at-identifier"}, + "maxLength": 25 + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["profiles"], + "properties": { + "profiles": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.bsky.actor.defs#profileViewDetailed" + } + } + } + } + } + } + } +}; + +/// `app.bsky.actor.profile` +const appBskyActorProfile = { + "lexicon": 1, + "id": "app.bsky.actor.profile", + "defs": { + "main": { + "type": "record", + "description": "A declaration of a Bluesky account profile.", + "key": "literal:self", + "record": { + "type": "object", + "properties": { + "displayName": { + "type": "string", + "maxLength": 640, + "maxGraphemes": 64 + }, + "description": { + "type": "string", + "description": "Free-form profile description text.", + "maxLength": 2560, + "maxGraphemes": 256 + }, + "avatar": { + "type": "blob", + "description": + "Small image to be displayed next to posts from account. AKA, 'profile picture'", + "accept": ["image/png", "image/jpeg"], + "maxSize": 1000000 + }, + "banner": { + "type": "blob", + "description": + "Larger horizontal image to display behind profile view.", + "accept": ["image/png", "image/jpeg"], + "maxSize": 1000000 + }, + "labels": { + "type": "union", + "description": + "Self-label values, specific to the Bluesky application, on the overall account.", + "refs": ["com.atproto.label.defs#selfLabels"] + }, + "joinedViaStarterPack": { + "type": "ref", + "ref": "com.atproto.repo.strongRef" + }, + "pinnedPost": {"type": "ref", "ref": "com.atproto.repo.strongRef"}, + "createdAt": {"type": "string", "format": "datetime"} + } + } + } + } +}; + +/// `app.bsky.actor.searchActorsTypeahead` +const appBskyActorSearchActorsTypeahead = { + "lexicon": 1, + "id": "app.bsky.actor.searchActorsTypeahead", + "defs": { + "main": { + "type": "query", + "description": + "Find actor suggestions for a prefix search term. Expected use is for auto-completion during text field entry. Does not require auth.", + "parameters": { + "type": "params", + "properties": { + "term": { + "type": "string", + "description": "DEPRECATED: use 'q' instead." + }, + "q": { + "type": "string", + "description": "Search query prefix; not a full query string." + }, + "limit": { + "type": "integer", + "default": 10, + "minimum": 1, + "maximum": 100 + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["actors"], + "properties": { + "actors": { + "type": "array", + "items": { + "type": "ref", + "ref": "app.bsky.actor.defs#profileViewBasic" + } + } + } + } + } + } + } +}; + +/// `app.bsky.actor.getPreferences` +const appBskyActorGetPreferences = { + "lexicon": 1, + "id": "app.bsky.actor.getPreferences", + "defs": { + "main": { + "type": "query", + "description": + "Get private preferences attached to the current account. Expected use is synchronization between multiple devices, and import/export during account migration. Requires auth.", + "parameters": {"type": "params", "properties": {}}, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["preferences"], + "properties": { + "preferences": { + "type": "ref", + "ref": "app.bsky.actor.defs#preferences" + } + } + } + } + } + } +}; + +/// `app.bsky.actor.putPreferences` +const appBskyActorPutPreferences = { + "lexicon": 1, + "id": "app.bsky.actor.putPreferences", + "defs": { + "main": { + "type": "procedure", + "description": "Set the private preferences attached to the account.", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["preferences"], + "properties": { + "preferences": { + "type": "ref", + "ref": "app.bsky.actor.defs#preferences" + } + } + } + } + } + } +}; + +/// `app.bsky.actor.defs` +const appBskyActorDefs = { + "lexicon": 1, + "id": "app.bsky.actor.defs", + "defs": { + "profileViewBasic": { + "type": "object", + "required": ["did", "handle"], + "properties": { + "did": {"type": "string", "format": "did"}, + "handle": {"type": "string", "format": "handle"}, + "displayName": {"type": "string", "maxLength": 640, "maxGraphemes": 64}, + "avatar": {"type": "string", "format": "uri"}, + "associated": {"type": "ref", "ref": "#profileAssociated"}, + "viewer": {"type": "ref", "ref": "#viewerState"}, + "labels": { + "type": "array", + "items": {"type": "ref", "ref": "com.atproto.label.defs#label"} + }, + "createdAt": {"type": "string", "format": "datetime"} + } + }, + "profileView": { + "type": "object", + "required": ["did", "handle"], + "properties": { + "did": {"type": "string", "format": "did"}, + "handle": {"type": "string", "format": "handle"}, + "displayName": {"type": "string", "maxLength": 640, "maxGraphemes": 64}, + "description": { + "type": "string", + "maxLength": 2560, + "maxGraphemes": 256 + }, + "avatar": {"type": "string", "format": "uri"}, + "associated": {"type": "ref", "ref": "#profileAssociated"}, + "indexedAt": {"type": "string", "format": "datetime"}, + "createdAt": {"type": "string", "format": "datetime"}, + "viewer": {"type": "ref", "ref": "#viewerState"}, + "labels": { + "type": "array", + "items": {"type": "ref", "ref": "com.atproto.label.defs#label"} + } + } + }, + "profileViewDetailed": { + "type": "object", + "required": ["did", "handle"], + "properties": { + "did": {"type": "string", "format": "did"}, + "handle": {"type": "string", "format": "handle"}, + "displayName": {"type": "string", "maxLength": 640, "maxGraphemes": 64}, + "description": { + "type": "string", + "maxLength": 2560, + "maxGraphemes": 256 + }, + "avatar": {"type": "string", "format": "uri"}, + "banner": {"type": "string", "format": "uri"}, + "followersCount": {"type": "integer"}, + "followsCount": {"type": "integer"}, + "postsCount": {"type": "integer"}, + "associated": {"type": "ref", "ref": "#profileAssociated"}, + "joinedViaStarterPack": { + "type": "ref", + "ref": "app.bsky.graph.defs#starterPackViewBasic" + }, + "indexedAt": {"type": "string", "format": "datetime"}, + "createdAt": {"type": "string", "format": "datetime"}, + "viewer": {"type": "ref", "ref": "#viewerState"}, + "labels": { + "type": "array", + "items": {"type": "ref", "ref": "com.atproto.label.defs#label"} + }, + "pinnedPost": {"type": "ref", "ref": "com.atproto.repo.strongRef"} + } + }, + "profileAssociated": { + "type": "object", + "properties": { + "lists": {"type": "integer"}, + "feedgens": {"type": "integer"}, + "starterPacks": {"type": "integer"}, + "labeler": {"type": "boolean"}, + "chat": {"type": "ref", "ref": "#profileAssociatedChat"} + } + }, + "profileAssociatedChat": { + "type": "object", + "required": ["allowIncoming"], + "properties": { + "allowIncoming": { + "type": "string", + "knownValues": ["all", "none", "following"] + } + } + }, + "viewerState": { + "type": "object", + "description": + "Metadata about the requesting account's relationship with the subject account. Only has meaningful content for authed requests.", + "properties": { + "muted": {"type": "boolean"}, + "mutedByList": { + "type": "ref", + "ref": "app.bsky.graph.defs#listViewBasic" + }, + "blockedBy": {"type": "boolean"}, + "blocking": {"type": "string", "format": "at-uri"}, + "blockingByList": { + "type": "ref", + "ref": "app.bsky.graph.defs#listViewBasic" + }, + "following": {"type": "string", "format": "at-uri"}, + "followedBy": {"type": "string", "format": "at-uri"}, + "knownFollowers": {"type": "ref", "ref": "#knownFollowers"} + } + }, + "knownFollowers": { + "type": "object", + "description": "The subject's followers whom you also follow", + "required": ["count", "followers"], + "properties": { + "count": {"type": "integer"}, + "followers": { + "type": "array", + "items": {"type": "ref", "ref": "#profileViewBasic"}, + "minLength": 0, + "maxLength": 5 + } + } + }, + "preferences": { + "type": "array", + "items": { + "type": "union", + "refs": [ + "#adultContentPref", + "#contentLabelPref", + "#savedFeedsPref", + "#savedFeedsPrefV2", + "#personalDetailsPref", + "#feedViewPref", + "#threadViewPref", + "#interestsPref", + "#mutedWordsPref", + "#hiddenPostsPref", + "#bskyAppStatePref", + "#labelersPref" + ] + } + }, + "adultContentPref": { + "type": "object", + "required": ["enabled"], + "properties": { + "enabled": {"type": "boolean", "default": false} + } + }, + "contentLabelPref": { + "type": "object", + "required": ["label", "visibility"], + "properties": { + "labelerDid": { + "type": "string", + "format": "did", + "description": + "Which labeler does this preference apply to? If undefined, applies globally." + }, + "label": {"type": "string"}, + "visibility": { + "type": "string", + "knownValues": ["ignore", "show", "warn", "hide"] + } + } + }, + "savedFeed": { + "type": "object", + "required": ["id", "type", "value", "pinned"], + "properties": { + "id": {"type": "string"}, + "type": { + "type": "string", + "knownValues": ["feed", "list", "timeline"] + }, + "value": {"type": "string"}, + "pinned": {"type": "boolean"} + } + }, + "savedFeedsPrefV2": { + "type": "object", + "required": ["items"], + "properties": { + "items": { + "type": "array", + "items": {"type": "ref", "ref": "app.bsky.actor.defs#savedFeed"} + } + } + }, + "savedFeedsPref": { + "type": "object", + "required": ["pinned", "saved"], + "properties": { + "pinned": { + "type": "array", + "items": {"type": "string", "format": "at-uri"} + }, + "saved": { + "type": "array", + "items": {"type": "string", "format": "at-uri"} + }, + "timelineIndex": {"type": "integer"} + } + }, + "personalDetailsPref": { + "type": "object", + "properties": { + "birthDate": { + "type": "string", + "format": "datetime", + "description": "The birth date of account owner." + } + } + }, + "feedViewPref": { + "type": "object", + "required": ["feed"], + "properties": { + "feed": { + "type": "string", + "description": + "The URI of the feed, or an identifier which describes the feed." + }, + "hideReplies": { + "type": "boolean", + "description": "Hide replies in the feed." + }, + "hideRepliesByUnfollowed": { + "type": "boolean", + "description": + "Hide replies in the feed if they are not by followed users.", + "default": true + }, + "hideRepliesByLikeCount": { + "type": "integer", + "description": + "Hide replies in the feed if they do not have this number of likes." + }, + "hideReposts": { + "type": "boolean", + "description": "Hide reposts in the feed." + }, + "hideQuotePosts": { + "type": "boolean", + "description": "Hide quote posts in the feed." + } + } + }, + "threadViewPref": { + "type": "object", + "properties": { + "sort": { + "type": "string", + "description": "Sorting mode for threads.", + "knownValues": ["oldest", "newest", "most-likes", "random", "hotness"] + }, + "prioritizeFollowedUsers": { + "type": "boolean", + "description": "Show followed users at the top of all replies." + } + } + }, + "interestsPref": { + "type": "object", + "required": ["tags"], + "properties": { + "tags": { + "type": "array", + "description": + "A list of tags which describe the account owner's interests gathered during onboarding.", + "items": {"type": "string", "maxLength": 640, "maxGraphemes": 64}, + "maxLength": 100 + } + } + }, + "mutedWordTarget": { + "type": "string", + "maxLength": 640, + "maxGraphemes": 64, + "knownValues": ["content", "tag"] + }, + "mutedWord": { + "type": "object", + "description": "A word that the account owner has muted.", + "required": ["value", "targets"], + "properties": { + "id": {"type": "string"}, + "value": { + "type": "string", + "description": "The muted word itself.", + "maxLength": 10000, + "maxGraphemes": 1000 + }, + "targets": { + "type": "array", + "description": "The intended targets of the muted word.", + "items": {"type": "ref", "ref": "app.bsky.actor.defs#mutedWordTarget"} + }, + "actorTarget": { + "type": "string", + "description": + "Groups of users to apply the muted word to. If undefined, applies to all users.", + "default": "all", + "knownValues": ["all", "exclude-following"] + }, + "expiresAt": { + "type": "string", + "format": "datetime", + "description": + "The date and time at which the muted word will expire and no longer be applied." + } + } + }, + "mutedWordsPref": { + "type": "object", + "required": ["items"], + "properties": { + "items": { + "type": "array", + "description": "A list of words the account owner has muted.", + "items": {"type": "ref", "ref": "app.bsky.actor.defs#mutedWord"} + } + } + }, + "hiddenPostsPref": { + "type": "object", + "required": ["items"], + "properties": { + "items": { + "type": "array", + "description": + "A list of URIs of posts the account owner has hidden.", + "items": {"type": "string", "format": "at-uri"} + } + } + }, + "labelersPref": { + "type": "object", + "required": ["labelers"], + "properties": { + "labelers": { + "type": "array", + "items": {"type": "ref", "ref": "#labelerPrefItem"} } } - } - } -}; - -/// `app.bsky.graph.getMutes` -const appBskyGraphGetMutes = { - "lexicon": 1, - "id": "app.bsky.graph.getMutes", - "defs": { - "main": { - "type": "query", + }, + "labelerPrefItem": { + "type": "object", + "required": ["did"], + "properties": { + "did": {"type": "string", "format": "did"} + } + }, + "bskyAppStatePref": { + "type": "object", "description": - "Enumerates accounts that the requesting account (actor) currently has muted. Requires auth.", - "parameters": { - "type": "params", - "properties": { - "limit": { - "type": "integer", - "default": 50, - "minimum": 1, - "maximum": 100 - }, - "cursor": {"type": "string"} - } - }, - "output": { - "encoding": "application/json", - "schema": { - "type": "object", - "required": ["mutes"], - "properties": { - "cursor": {"type": "string"}, - "mutes": { - "type": "array", - "items": {"type": "ref", "ref": "app.bsky.actor.defs#profileView"} - } - } + "A grab bag of state that's specific to the bsky.app program. Third-party apps shouldn't use this.", + "properties": { + "activeProgressGuide": {"type": "ref", "ref": "#bskyAppProgressGuide"}, + "queuedNudges": { + "type": "array", + "description": + "An array of tokens which identify nudges (modals, popups, tours, highlight dots) that should be shown to the user.", + "items": {"type": "string", "maxLength": 100}, + "maxLength": 1000 + }, + "nuxs": { + "type": "array", + "description": "Storage for NUXs the user has encountered.", + "items": {"type": "ref", "ref": "app.bsky.actor.defs#nux"}, + "maxLength": 100 } } - } - } -}; - -/// `app.bsky.graph.muteActor` -const appBskyGraphMuteActor = { - "lexicon": 1, - "id": "app.bsky.graph.muteActor", - "defs": { - "main": { - "type": "procedure", + }, + "bskyAppProgressGuide": { + "type": "object", "description": - "Creates a mute relationship for the specified account. Mutes are private in Bluesky. Requires auth.", - "input": { - "encoding": "application/json", - "schema": { - "type": "object", - "required": ["actor"], - "properties": { - "actor": {"type": "string", "format": "at-identifier"} - } + "If set, an active progress guide. Once completed, can be set to undefined. Should have unspecced fields tracking progress.", + "required": ["guide"], + "properties": { + "guide": {"type": "string", "maxLength": 100} + } + }, + "nux": { + "type": "object", + "description": "A new user experiences (NUX) storage object", + "required": ["id", "completed"], + "properties": { + "id": {"type": "string", "maxLength": 100}, + "completed": {"type": "boolean", "default": false}, + "data": { + "type": "string", + "description": + "Arbitrary data for the NUX. The structure is defined by the NUX itself. Limited to 300 characters.", + "maxLength": 3000, + "maxGraphemes": 300 + }, + "expiresAt": { + "type": "string", + "format": "datetime", + "description": + "The date and time at which the NUX will expire and should be considered completed." } } } } }; -/// `app.bsky.graph.getBlocks` -const appBskyGraphGetBlocks = { +/// `chat.bsky.moderation.updateActorAccess` +const chatBskyModerationUpdateActorAccess = { "lexicon": 1, - "id": "app.bsky.graph.getBlocks", + "id": "chat.bsky.moderation.updateActorAccess", "defs": { "main": { - "type": "query", - "description": - "Enumerates which accounts the requesting account is currently blocking. Requires auth.", - "parameters": { - "type": "params", - "properties": { - "limit": { - "type": "integer", - "default": 50, - "minimum": 1, - "maximum": 100 - }, - "cursor": {"type": "string"} - } - }, - "output": { + "type": "procedure", + "input": { "encoding": "application/json", "schema": { "type": "object", - "required": ["blocks"], + "required": ["actor", "allowAccess"], "properties": { - "cursor": {"type": "string"}, - "blocks": { - "type": "array", - "items": {"type": "ref", "ref": "app.bsky.actor.defs#profileView"} - } + "actor": {"type": "string", "format": "did"}, + "allowAccess": {"type": "boolean"}, + "ref": {"type": "string"} } } } @@ -7947,127 +8348,87 @@ const appBskyGraphGetBlocks = { } }; -/// `app.bsky.graph.starterpack` -const appBskyGraphStarterpack = { - "lexicon": 1, - "id": "app.bsky.graph.starterpack", - "defs": { - "main": { - "type": "record", - "description": - "Record defining a starter pack of actors and feeds for new users.", - "key": "tid", - "record": { - "type": "object", - "required": ["name", "list", "createdAt"], - "properties": { - "name": { - "type": "string", - "description": "Display name for starter pack; can not be empty.", - "minLength": 1, - "maxLength": 500, - "maxGraphemes": 50 - }, - "description": { - "type": "string", - "maxLength": 3000, - "maxGraphemes": 300 - }, - "descriptionFacets": { - "type": "array", - "items": {"type": "ref", "ref": "app.bsky.richtext.facet"} - }, - "list": { - "type": "string", - "format": "at-uri", - "description": "Reference (AT-URI) to the list record." - }, - "feeds": { - "type": "array", - "items": {"type": "ref", "ref": "#feedItem"}, - "maxLength": 3 - }, - "createdAt": {"type": "string", "format": "datetime"} - } - } - }, - "feedItem": { - "type": "object", - "required": ["uri"], - "properties": { - "uri": {"type": "string", "format": "at-uri"} - } - } - } -}; - -/// `app.bsky.graph.getListMutes` -const appBskyGraphGetListMutes = { +/// `chat.bsky.moderation.getActorMetadata` +const chatBskyModerationGetActorMetadata = { "lexicon": 1, - "id": "app.bsky.graph.getListMutes", + "id": "chat.bsky.moderation.getActorMetadata", "defs": { "main": { "type": "query", - "description": - "Enumerates mod lists that the requesting account (actor) currently has muted. Requires auth.", "parameters": { "type": "params", + "required": ["actor"], "properties": { - "limit": { - "type": "integer", - "default": 50, - "minimum": 1, - "maximum": 100 - }, - "cursor": {"type": "string"} + "actor": {"type": "string", "format": "did"} } }, "output": { "encoding": "application/json", "schema": { "type": "object", - "required": ["lists"], + "required": ["day", "month", "all"], "properties": { - "cursor": {"type": "string"}, - "lists": { - "type": "array", - "items": {"type": "ref", "ref": "app.bsky.graph.defs#listView"} - } + "day": {"type": "ref", "ref": "#metadata"}, + "month": {"type": "ref", "ref": "#metadata"}, + "all": {"type": "ref", "ref": "#metadata"} } } } + }, + "metadata": { + "type": "object", + "required": [ + "messagesSent", + "messagesReceived", + "convos", + "convosStarted" + ], + "properties": { + "messagesSent": {"type": "integer"}, + "messagesReceived": {"type": "integer"}, + "convos": {"type": "integer"}, + "convosStarted": {"type": "integer"} + } } } }; -/// `app.bsky.graph.getStarterPack` -const appBskyGraphGetStarterPack = { +/// `chat.bsky.moderation.getMessageContext` +const chatBskyModerationGetMessageContext = { "lexicon": 1, - "id": "app.bsky.graph.getStarterPack", + "id": "chat.bsky.moderation.getMessageContext", "defs": { "main": { "type": "query", - "description": "Gets a view of a starter pack.", "parameters": { "type": "params", - "required": ["starterPack"], + "required": ["messageId"], "properties": { - "starterPack": { + "convoId": { "type": "string", - "format": "at-uri", - "description": "Reference (AT-URI) of the starter pack record." - } + "description": + "Conversation that the message is from. NOTE: this field will eventually be required." + }, + "messageId": {"type": "string"}, + "before": {"type": "integer", "default": 5}, + "after": {"type": "integer", "default": 5} } }, "output": { "encoding": "application/json", "schema": { "type": "object", - "required": ["starterPack"], + "required": ["messages"], "properties": { - "starterPack": { - "type": "ref", - "ref": "app.bsky.graph.defs#starterPackView" + "messages": { + "type": "array", + "items": { + "type": "union", + "refs": [ + "chat.bsky.convo.defs#messageView", + "chat.bsky.convo.defs#deletedMessageView" + ] + } } } } @@ -8076,69 +8437,103 @@ const appBskyGraphGetStarterPack = { } }; -/// `app.bsky.graph.follow` -const appBskyGraphFollow = { +/// `chat.bsky.convo.leaveConvo` +const chatBskyConvoLeaveConvo = { "lexicon": 1, - "id": "app.bsky.graph.follow", + "id": "chat.bsky.convo.leaveConvo", "defs": { "main": { - "type": "record", - "description": - "Record declaring a social 'follow' relationship of another account. Duplicate follows will be ignored by the AppView.", - "key": "tid", - "record": { - "type": "object", - "required": ["subject", "createdAt"], - "properties": { - "subject": {"type": "string", "format": "did"}, - "createdAt": {"type": "string", "format": "datetime"} + "type": "procedure", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["convoId"], + "properties": { + "convoId": {"type": "string"} + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["convoId", "rev"], + "properties": { + "convoId": {"type": "string"}, + "rev": {"type": "string"} + } } } } } }; -/// `app.bsky.graph.listblock` -const appBskyGraphListblock = { +/// `chat.bsky.convo.getLog` +const chatBskyConvoGetLog = { "lexicon": 1, - "id": "app.bsky.graph.listblock", + "id": "chat.bsky.convo.getLog", "defs": { "main": { - "type": "record", - "description": - "Record representing a block relationship against an entire an entire list of accounts (actors).", - "key": "tid", - "record": { - "type": "object", - "required": ["subject", "createdAt"], + "type": "query", + "parameters": { + "type": "params", + "required": [], "properties": { - "subject": { - "type": "string", - "format": "at-uri", - "description": "Reference (AT-URI) to the mod list record." - }, - "createdAt": {"type": "string", "format": "datetime"} + "cursor": {"type": "string"} + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["logs"], + "properties": { + "cursor": {"type": "string"}, + "logs": { + "type": "array", + "items": { + "type": "union", + "refs": [ + "chat.bsky.convo.defs#logBeginConvo", + "chat.bsky.convo.defs#logLeaveConvo", + "chat.bsky.convo.defs#logCreateMessage", + "chat.bsky.convo.defs#logDeleteMessage" + ] + } + } + } } } } } }; -/// `app.bsky.graph.unmuteActor` -const appBskyGraphUnmuteActor = { +/// `chat.bsky.convo.updateRead` +const chatBskyConvoUpdateRead = { "lexicon": 1, - "id": "app.bsky.graph.unmuteActor", + "id": "chat.bsky.convo.updateRead", "defs": { "main": { "type": "procedure", - "description": "Unmutes the specified account. Requires auth.", "input": { "encoding": "application/json", "schema": { "type": "object", - "required": ["actor"], + "required": ["convoId"], "properties": { - "actor": {"type": "string", "format": "at-identifier"} + "convoId": {"type": "string"}, + "messageId": {"type": "string"} + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["convo"], + "properties": { + "convo": {"type": "ref", "ref": "chat.bsky.convo.defs#convoView"} } } } @@ -8146,21 +8541,27 @@ const appBskyGraphUnmuteActor = { } }; -/// `app.bsky.graph.unmuteThread` -const appBskyGraphUnmuteThread = { +/// `chat.bsky.convo.getConvo` +const chatBskyConvoGetConvo = { "lexicon": 1, - "id": "app.bsky.graph.unmuteThread", + "id": "chat.bsky.convo.getConvo", "defs": { "main": { - "type": "procedure", - "description": "Unmutes the specified thread. Requires auth.", - "input": { + "type": "query", + "parameters": { + "type": "params", + "required": ["convoId"], + "properties": { + "convoId": {"type": "string"} + } + }, + "output": { "encoding": "application/json", "schema": { "type": "object", - "required": ["root"], + "required": ["convo"], "properties": { - "root": {"type": "string", "format": "at-uri"} + "convo": {"type": "ref", "ref": "chat.bsky.convo.defs#convoView"} } } } @@ -8168,44 +8569,30 @@ const appBskyGraphUnmuteThread = { } }; -/// `app.bsky.graph.getFollows` -const appBskyGraphGetFollows = { +/// `chat.bsky.convo.muteConvo` +const chatBskyConvoMuteConvo = { "lexicon": 1, - "id": "app.bsky.graph.getFollows", + "id": "chat.bsky.convo.muteConvo", "defs": { "main": { - "type": "query", - "description": - "Enumerates accounts which a specified account (actor) follows.", - "parameters": { - "type": "params", - "required": ["actor"], - "properties": { - "actor": {"type": "string", "format": "at-identifier"}, - "limit": { - "type": "integer", - "default": 50, - "minimum": 1, - "maximum": 100 - }, - "cursor": {"type": "string"} + "type": "procedure", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["convoId"], + "properties": { + "convoId": {"type": "string"} + } } }, "output": { "encoding": "application/json", "schema": { "type": "object", - "required": ["subject", "follows"], + "required": ["convo"], "properties": { - "subject": { - "type": "ref", - "ref": "app.bsky.actor.defs#profileView" - }, - "cursor": {"type": "string"}, - "follows": { - "type": "array", - "items": {"type": "ref", "ref": "app.bsky.actor.defs#profileView"} - } + "convo": {"type": "ref", "ref": "chat.bsky.convo.defs#convoView"} } } } @@ -8213,38 +8600,30 @@ const appBskyGraphGetFollows = { } }; -/// `app.bsky.graph.getSuggestedFollowsByActor` -const appBskyGraphGetSuggestedFollowsByActor = { +/// `chat.bsky.convo.unmuteConvo` +const chatBskyConvoUnmuteConvo = { "lexicon": 1, - "id": "app.bsky.graph.getSuggestedFollowsByActor", - "defs": { - "main": { - "type": "query", - "description": - "Enumerates follows similar to a given account (actor). Expected use is to recommend additional accounts immediately after following one account.", - "parameters": { - "type": "params", - "required": ["actor"], - "properties": { - "actor": {"type": "string", "format": "at-identifier"} + "id": "chat.bsky.convo.unmuteConvo", + "defs": { + "main": { + "type": "procedure", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["convoId"], + "properties": { + "convoId": {"type": "string"} + } } }, "output": { "encoding": "application/json", "schema": { "type": "object", - "required": ["suggestions"], + "required": ["convo"], "properties": { - "suggestions": { - "type": "array", - "items": {"type": "ref", "ref": "app.bsky.actor.defs#profileView"} - }, - "isFallback": { - "type": "boolean", - "description": - "If true, response has fallen-back to generic results, and is not scoped using relativeToDid", - "default": false - } + "convo": {"type": "ref", "ref": "chat.bsky.convo.defs#convoView"} } } } @@ -8252,27 +8631,36 @@ const appBskyGraphGetSuggestedFollowsByActor = { } }; -/// `chat.bsky.convo.getConvo` -const chatBskyConvoGetConvo = { +/// `chat.bsky.convo.listConvos` +const chatBskyConvoListConvos = { "lexicon": 1, - "id": "chat.bsky.convo.getConvo", + "id": "chat.bsky.convo.listConvos", "defs": { "main": { "type": "query", "parameters": { "type": "params", - "required": ["convoId"], "properties": { - "convoId": {"type": "string"} + "limit": { + "type": "integer", + "default": 50, + "minimum": 1, + "maximum": 100 + }, + "cursor": {"type": "string"} } }, "output": { "encoding": "application/json", "schema": { "type": "object", - "required": ["convo"], + "required": ["convos"], "properties": { - "convo": {"type": "ref", "ref": "chat.bsky.convo.defs#convoView"} + "cursor": {"type": "string"}, + "convos": { + "type": "array", + "items": {"type": "ref", "ref": "chat.bsky.convo.defs#convoView"} + } } } } @@ -8280,10 +8668,10 @@ const chatBskyConvoGetConvo = { } }; -/// `chat.bsky.convo.leaveConvo` -const chatBskyConvoLeaveConvo = { +/// `chat.bsky.convo.sendMessage` +const chatBskyConvoSendMessage = { "lexicon": 1, - "id": "chat.bsky.convo.leaveConvo", + "id": "chat.bsky.convo.sendMessage", "defs": { "main": { "type": "procedure", @@ -8291,22 +8679,19 @@ const chatBskyConvoLeaveConvo = { "encoding": "application/json", "schema": { "type": "object", - "required": ["convoId"], + "required": ["convoId", "message"], "properties": { - "convoId": {"type": "string"} + "convoId": {"type": "string"}, + "message": { + "type": "ref", + "ref": "chat.bsky.convo.defs#messageInput" + } } } }, "output": { "encoding": "application/json", - "schema": { - "type": "object", - "required": ["convoId", "rev"], - "properties": { - "convoId": {"type": "string"}, - "rev": {"type": "string"} - } - } + "schema": {"type": "ref", "ref": "chat.bsky.convo.defs#messageView"} } } } @@ -8361,16 +8746,18 @@ const chatBskyConvoSendMessageBatch = { } }; -/// `chat.bsky.convo.listConvos` -const chatBskyConvoListConvos = { +/// `chat.bsky.convo.getMessages` +const chatBskyConvoGetMessages = { "lexicon": 1, - "id": "chat.bsky.convo.listConvos", + "id": "chat.bsky.convo.getMessages", "defs": { "main": { "type": "query", "parameters": { "type": "params", + "required": ["convoId"], "properties": { + "convoId": {"type": "string"}, "limit": { "type": "integer", "default": 50, @@ -8384,12 +8771,18 @@ const chatBskyConvoListConvos = { "encoding": "application/json", "schema": { "type": "object", - "required": ["convos"], + "required": ["messages"], "properties": { "cursor": {"type": "string"}, - "convos": { + "messages": { "type": "array", - "items": {"type": "ref", "ref": "chat.bsky.convo.defs#convoView"} + "items": { + "type": "union", + "refs": [ + "chat.bsky.convo.defs#messageView", + "chat.bsky.convo.defs#deletedMessageView" + ] + } } } } @@ -8398,6 +8791,68 @@ const chatBskyConvoListConvos = { } }; +/// `chat.bsky.convo.deleteMessageForSelf` +const chatBskyConvoDeleteMessageForSelf = { + "lexicon": 1, + "id": "chat.bsky.convo.deleteMessageForSelf", + "defs": { + "main": { + "type": "procedure", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["convoId", "messageId"], + "properties": { + "convoId": {"type": "string"}, + "messageId": {"type": "string"} + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "ref", + "ref": "chat.bsky.convo.defs#deletedMessageView" + } + } + } + } +}; + +/// `chat.bsky.convo.getConvoForMembers` +const chatBskyConvoGetConvoForMembers = { + "lexicon": 1, + "id": "chat.bsky.convo.getConvoForMembers", + "defs": { + "main": { + "type": "query", + "parameters": { + "type": "params", + "required": ["members"], + "properties": { + "members": { + "type": "array", + "items": {"type": "string", "format": "did"}, + "minLength": 1, + "maxLength": 10 + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["convo"], + "properties": { + "convo": {"type": "ref", "ref": "chat.bsky.convo.defs#convoView"} + } + } + } + } + } +}; + /// `chat.bsky.convo.defs` const chatBskyConvoDefs = { "lexicon": 1, @@ -8529,131 +8984,23 @@ const chatBskyConvoDefs = { } } }; - -/// `chat.bsky.convo.getLog` -const chatBskyConvoGetLog = { - "lexicon": 1, - "id": "chat.bsky.convo.getLog", - "defs": { - "main": { - "type": "query", - "parameters": { - "type": "params", - "required": [], - "properties": { - "cursor": {"type": "string"} - } - }, - "output": { - "encoding": "application/json", - "schema": { - "type": "object", - "required": ["logs"], - "properties": { - "cursor": {"type": "string"}, - "logs": { - "type": "array", - "items": { - "type": "union", - "refs": [ - "chat.bsky.convo.defs#logBeginConvo", - "chat.bsky.convo.defs#logLeaveConvo", - "chat.bsky.convo.defs#logCreateMessage", - "chat.bsky.convo.defs#logDeleteMessage" - ] - } - } - } - } - } - } - } -}; - -/// `chat.bsky.convo.deleteMessageForSelf` -const chatBskyConvoDeleteMessageForSelf = { - "lexicon": 1, - "id": "chat.bsky.convo.deleteMessageForSelf", - "defs": { - "main": { - "type": "procedure", - "input": { - "encoding": "application/json", - "schema": { - "type": "object", - "required": ["convoId", "messageId"], - "properties": { - "convoId": {"type": "string"}, - "messageId": {"type": "string"} - } - } - }, - "output": { - "encoding": "application/json", - "schema": { - "type": "ref", - "ref": "chat.bsky.convo.defs#deletedMessageView" - } - } - } - } -}; - -/// `chat.bsky.convo.unmuteConvo` -const chatBskyConvoUnmuteConvo = { - "lexicon": 1, - "id": "chat.bsky.convo.unmuteConvo", - "defs": { - "main": { - "type": "procedure", - "input": { - "encoding": "application/json", - "schema": { - "type": "object", - "required": ["convoId"], - "properties": { - "convoId": {"type": "string"} - } - } - }, - "output": { - "encoding": "application/json", - "schema": { - "type": "object", - "required": ["convo"], - "properties": { - "convo": {"type": "ref", "ref": "chat.bsky.convo.defs#convoView"} - } - } - } - } - } -}; - -/// `chat.bsky.convo.muteConvo` -const chatBskyConvoMuteConvo = { + +/// `chat.bsky.actor.declaration` +const chatBskyActorDeclaration = { "lexicon": 1, - "id": "chat.bsky.convo.muteConvo", + "id": "chat.bsky.actor.declaration", "defs": { "main": { - "type": "procedure", - "input": { - "encoding": "application/json", - "schema": { - "type": "object", - "required": ["convoId"], - "properties": { - "convoId": {"type": "string"} - } - } - }, - "output": { - "encoding": "application/json", - "schema": { - "type": "object", - "required": ["convo"], - "properties": { - "convo": {"type": "ref", "ref": "chat.bsky.convo.defs#convoView"} + "type": "record", + "description": "A declaration of a Bluesky chat account.", + "key": "literal:self", + "record": { + "type": "object", + "required": ["allowIncoming"], + "properties": { + "allowIncoming": { + "type": "string", + "knownValues": ["all", "none", "following"] } } } @@ -8661,136 +9008,95 @@ const chatBskyConvoMuteConvo = { } }; -/// `chat.bsky.convo.getConvoForMembers` -const chatBskyConvoGetConvoForMembers = { +/// `chat.bsky.actor.exportAccountData` +const chatBskyActorExportAccountData = { "lexicon": 1, - "id": "chat.bsky.convo.getConvoForMembers", + "id": "chat.bsky.actor.exportAccountData", "defs": { "main": { "type": "query", - "parameters": { - "type": "params", - "required": ["members"], - "properties": { - "members": { - "type": "array", - "items": {"type": "string", "format": "did"}, - "minLength": 1, - "maxLength": 10 - } - } - }, - "output": { - "encoding": "application/json", - "schema": { - "type": "object", - "required": ["convo"], - "properties": { - "convo": {"type": "ref", "ref": "chat.bsky.convo.defs#convoView"} - } - } - } + "output": {"encoding": "application/jsonl"} } } }; -/// `chat.bsky.convo.sendMessage` -const chatBskyConvoSendMessage = { +/// `chat.bsky.actor.deleteAccount` +const chatBskyActorDeleteAccount = { "lexicon": 1, - "id": "chat.bsky.convo.sendMessage", + "id": "chat.bsky.actor.deleteAccount", "defs": { "main": { "type": "procedure", - "input": { - "encoding": "application/json", - "schema": { - "type": "object", - "required": ["convoId", "message"], - "properties": { - "convoId": {"type": "string"}, - "message": { - "type": "ref", - "ref": "chat.bsky.convo.defs#messageInput" - } - } - } - }, "output": { "encoding": "application/json", - "schema": {"type": "ref", "ref": "chat.bsky.convo.defs#messageView"} + "schema": {"type": "object", "properties": {}} } } } }; -/// `chat.bsky.convo.updateRead` -const chatBskyConvoUpdateRead = { +/// `chat.bsky.actor.defs` +const chatBskyActorDefs = { "lexicon": 1, - "id": "chat.bsky.convo.updateRead", + "id": "chat.bsky.actor.defs", "defs": { - "main": { - "type": "procedure", - "input": { - "encoding": "application/json", - "schema": { - "type": "object", - "required": ["convoId"], - "properties": { - "convoId": {"type": "string"}, - "messageId": {"type": "string"} - } - } - }, - "output": { - "encoding": "application/json", - "schema": { - "type": "object", - "required": ["convo"], - "properties": { - "convo": {"type": "ref", "ref": "chat.bsky.convo.defs#convoView"} - } + "profileViewBasic": { + "type": "object", + "required": ["did", "handle"], + "properties": { + "did": {"type": "string", "format": "did"}, + "handle": {"type": "string", "format": "handle"}, + "displayName": {"type": "string", "maxLength": 640, "maxGraphemes": 64}, + "avatar": {"type": "string", "format": "uri"}, + "associated": { + "type": "ref", + "ref": "app.bsky.actor.defs#profileAssociated" + }, + "viewer": {"type": "ref", "ref": "app.bsky.actor.defs#viewerState"}, + "labels": { + "type": "array", + "items": {"type": "ref", "ref": "com.atproto.label.defs#label"} + }, + "chatDisabled": { + "type": "boolean", + "description": + "Set to true when the actor cannot actively participate in converations" } } } } }; -/// `chat.bsky.convo.getMessages` -const chatBskyConvoGetMessages = { +/// `tools.ozone.signature.findCorrelation` +const toolsOzoneSignatureFindCorrelation = { "lexicon": 1, - "id": "chat.bsky.convo.getMessages", + "id": "tools.ozone.signature.findCorrelation", "defs": { "main": { "type": "query", + "description": + "Find all correlated threat signatures between 2 or more accounts.", "parameters": { "type": "params", - "required": ["convoId"], + "required": ["dids"], "properties": { - "convoId": {"type": "string"}, - "limit": { - "type": "integer", - "default": 50, - "minimum": 1, - "maximum": 100 - }, - "cursor": {"type": "string"} + "dids": { + "type": "array", + "items": {"type": "string", "format": "did"} + } } }, "output": { "encoding": "application/json", "schema": { "type": "object", - "required": ["messages"], + "required": ["details"], "properties": { - "cursor": {"type": "string"}, - "messages": { + "details": { "type": "array", "items": { - "type": "union", - "refs": [ - "chat.bsky.convo.defs#messageView", - "chat.bsky.convo.defs#deletedMessageView" - ] + "type": "ref", + "ref": "tools.ozone.signature.defs#sigDetail" } } } @@ -8800,67 +9106,54 @@ const chatBskyConvoGetMessages = { } }; -/// `chat.bsky.moderation.getActorMetadata` -const chatBskyModerationGetActorMetadata = { +/// `tools.ozone.signature.findRelatedAccounts` +const toolsOzoneSignatureFindRelatedAccounts = { "lexicon": 1, - "id": "chat.bsky.moderation.getActorMetadata", + "id": "tools.ozone.signature.findRelatedAccounts", "defs": { "main": { "type": "query", + "description": + "Get accounts that share some matching threat signatures with the root account.", "parameters": { "type": "params", - "required": ["actor"], + "required": ["did"], "properties": { - "actor": {"type": "string", "format": "did"} + "did": {"type": "string", "format": "did"}, + "cursor": {"type": "string"}, + "limit": { + "type": "integer", + "default": 50, + "minimum": 1, + "maximum": 100 + } } }, "output": { "encoding": "application/json", "schema": { "type": "object", - "required": ["day", "month", "all"], + "required": ["accounts"], "properties": { - "day": {"type": "ref", "ref": "#metadata"}, - "month": {"type": "ref", "ref": "#metadata"}, - "all": {"type": "ref", "ref": "#metadata"} + "cursor": {"type": "string"}, + "accounts": { + "type": "array", + "items": {"type": "ref", "ref": "#relatedAccount"} + } } } } }, - "metadata": { + "relatedAccount": { "type": "object", - "required": [ - "messagesSent", - "messagesReceived", - "convos", - "convosStarted" - ], + "required": ["account"], "properties": { - "messagesSent": {"type": "integer"}, - "messagesReceived": {"type": "integer"}, - "convos": {"type": "integer"}, - "convosStarted": {"type": "integer"} - } - } - } -}; - -/// `chat.bsky.moderation.updateActorAccess` -const chatBskyModerationUpdateActorAccess = { - "lexicon": 1, - "id": "chat.bsky.moderation.updateActorAccess", - "defs": { - "main": { - "type": "procedure", - "input": { - "encoding": "application/json", - "schema": { - "type": "object", - "required": ["actor", "allowAccess"], - "properties": { - "actor": {"type": "string", "format": "did"}, - "allowAccess": {"type": "boolean"}, - "ref": {"type": "string"} + "account": {"type": "ref", "ref": "com.atproto.admin.defs#accountView"}, + "similarities": { + "type": "array", + "items": { + "type": "ref", + "ref": "tools.ozone.signature.defs#sigDetail" } } } @@ -8868,41 +9161,44 @@ const chatBskyModerationUpdateActorAccess = { } }; -/// `chat.bsky.moderation.getMessageContext` -const chatBskyModerationGetMessageContext = { +/// `tools.ozone.signature.searchAccounts` +const toolsOzoneSignatureSearchAccounts = { "lexicon": 1, - "id": "chat.bsky.moderation.getMessageContext", + "id": "tools.ozone.signature.searchAccounts", "defs": { "main": { "type": "query", + "description": + "Search for accounts that match one or more threat signature values.", "parameters": { "type": "params", - "required": ["messageId"], + "required": ["values"], "properties": { - "convoId": { - "type": "string", - "description": - "Conversation that the message is from. NOTE: this field will eventually be required." + "values": { + "type": "array", + "items": {"type": "string"} }, - "messageId": {"type": "string"}, - "before": {"type": "integer", "default": 5}, - "after": {"type": "integer", "default": 5} + "cursor": {"type": "string"}, + "limit": { + "type": "integer", + "default": 50, + "minimum": 1, + "maximum": 100 + } } }, "output": { "encoding": "application/json", "schema": { "type": "object", - "required": ["messages"], + "required": ["accounts"], "properties": { - "messages": { + "cursor": {"type": "string"}, + "accounts": { "type": "array", "items": { - "type": "union", - "refs": [ - "chat.bsky.convo.defs#messageView", - "chat.bsky.convo.defs#deletedMessageView" - ] + "type": "ref", + "ref": "com.atproto.admin.defs#accountView" } } } @@ -8912,163 +9208,61 @@ const chatBskyModerationGetMessageContext = { } }; -/// `chat.bsky.actor.defs` -const chatBskyActorDefs = { +/// `tools.ozone.signature.defs` +const toolsOzoneSignatureDefs = { "lexicon": 1, - "id": "chat.bsky.actor.defs", + "id": "tools.ozone.signature.defs", "defs": { - "profileViewBasic": { + "sigDetail": { "type": "object", - "required": ["did", "handle"], + "required": ["property", "value"], "properties": { - "did": {"type": "string", "format": "did"}, - "handle": {"type": "string", "format": "handle"}, - "displayName": {"type": "string", "maxLength": 640, "maxGraphemes": 64}, - "avatar": {"type": "string", "format": "uri"}, - "associated": { - "type": "ref", - "ref": "app.bsky.actor.defs#profileAssociated" - }, - "viewer": {"type": "ref", "ref": "app.bsky.actor.defs#viewerState"}, - "labels": { - "type": "array", - "items": {"type": "ref", "ref": "com.atproto.label.defs#label"} - }, - "chatDisabled": { - "type": "boolean", - "description": - "Set to true when the actor cannot actively participate in converations" - } + "property": {"type": "string"}, + "value": {"type": "string"} } } } }; -/// `chat.bsky.actor.declaration` -const chatBskyActorDeclaration = { +/// `tools.ozone.server.getConfig` +const toolsOzoneServerGetConfig = { "lexicon": 1, - "id": "chat.bsky.actor.declaration", + "id": "tools.ozone.server.getConfig", "defs": { "main": { - "type": "record", - "description": "A declaration of a Bluesky chat account.", - "key": "literal:self", - "record": { - "type": "object", - "required": ["allowIncoming"], - "properties": { - "allowIncoming": { - "type": "string", - "knownValues": ["all", "none", "following"] + "type": "query", + "description": "Get details about ozone's server configuration.", + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "properties": { + "appview": {"type": "ref", "ref": "#serviceConfig"}, + "pds": {"type": "ref", "ref": "#serviceConfig"}, + "blobDivert": {"type": "ref", "ref": "#serviceConfig"}, + "chat": {"type": "ref", "ref": "#serviceConfig"}, + "viewer": {"type": "ref", "ref": "#viewerConfig"} } } } - } - } -}; - -/// `chat.bsky.actor.deleteAccount` -const chatBskyActorDeleteAccount = { - "lexicon": 1, - "id": "chat.bsky.actor.deleteAccount", - "defs": { - "main": { - "type": "procedure", - "output": { - "encoding": "application/json", - "schema": {"type": "object", "properties": {}} + }, + "serviceConfig": { + "type": "object", + "properties": { + "url": {"type": "string", "format": "uri"} } - } - } -}; - -/// `chat.bsky.actor.exportAccountData` -const chatBskyActorExportAccountData = { - "lexicon": 1, - "id": "chat.bsky.actor.exportAccountData", - "defs": { - "main": { - "type": "query", - "output": {"encoding": "application/jsonl"} - } - } -}; - -/// `tools.ozone.setting.defs` -const toolsOzoneSettingDefs = { - "lexicon": 1, - "id": "tools.ozone.setting.defs", - "defs": { - "option": { + }, + "viewerConfig": { "type": "object", - "required": [ - "key", - "value", - "did", - "scope", - "createdBy", - "lastUpdatedBy" - ], "properties": { - "key": {"type": "string", "format": "nsid"}, - "did": {"type": "string", "format": "did"}, - "value": {"type": "unknown"}, - "description": { - "type": "string", - "maxLength": 10240, - "maxGraphemes": 1024 - }, - "createdAt": {"type": "string", "format": "datetime"}, - "updatedAt": {"type": "string", "format": "datetime"}, - "managerRole": { + "role": { "type": "string", "knownValues": [ + "tools.ozone.team.defs#roleAdmin", "tools.ozone.team.defs#roleModerator", - "tools.ozone.team.defs#roleTriage", - "tools.ozone.team.defs#roleAdmin" + "tools.ozone.team.defs#roleTriage" ] - }, - "scope": { - "type": "string", - "knownValues": ["instance", "personal"] - }, - "createdBy": {"type": "string", "format": "did"}, - "lastUpdatedBy": {"type": "string", "format": "did"} - } - } - } -}; - -/// `tools.ozone.setting.removeOptions` -const toolsOzoneSettingRemoveOptions = { - "lexicon": 1, - "id": "tools.ozone.setting.removeOptions", - "defs": { - "main": { - "type": "procedure", - "description": "Delete settings by key", - "input": { - "encoding": "application/json", - "schema": { - "type": "object", - "required": ["keys", "scope"], - "properties": { - "keys": { - "type": "array", - "items": {"type": "string", "format": "nsid"}, - "minLength": 1, - "maxLength": 200 - }, - "scope": { - "type": "string", - "knownValues": ["instance", "personal"] - } - } } - }, - "output": { - "encoding": "application/json", - "schema": {"type": "object", "properties": {}} } } } @@ -9171,26 +9365,102 @@ const toolsOzoneSettingUpsertOption = { } }; -/// `tools.ozone.signature.findRelatedAccounts` -const toolsOzoneSignatureFindRelatedAccounts = { +/// `tools.ozone.setting.removeOptions` +const toolsOzoneSettingRemoveOptions = { + "lexicon": 1, + "id": "tools.ozone.setting.removeOptions", + "defs": { + "main": { + "type": "procedure", + "description": "Delete settings by key", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["keys", "scope"], + "properties": { + "keys": { + "type": "array", + "items": {"type": "string", "format": "nsid"}, + "minLength": 1, + "maxLength": 200 + }, + "scope": { + "type": "string", + "knownValues": ["instance", "personal"] + } + } + } + }, + "output": { + "encoding": "application/json", + "schema": {"type": "object", "properties": {}} + } + } + } +}; + +/// `tools.ozone.setting.defs` +const toolsOzoneSettingDefs = { + "lexicon": 1, + "id": "tools.ozone.setting.defs", + "defs": { + "option": { + "type": "object", + "required": [ + "key", + "value", + "did", + "scope", + "createdBy", + "lastUpdatedBy" + ], + "properties": { + "key": {"type": "string", "format": "nsid"}, + "did": {"type": "string", "format": "did"}, + "value": {"type": "unknown"}, + "description": { + "type": "string", + "maxLength": 10240, + "maxGraphemes": 1024 + }, + "createdAt": {"type": "string", "format": "datetime"}, + "updatedAt": {"type": "string", "format": "datetime"}, + "managerRole": { + "type": "string", + "knownValues": [ + "tools.ozone.team.defs#roleModerator", + "tools.ozone.team.defs#roleTriage", + "tools.ozone.team.defs#roleAdmin" + ] + }, + "scope": { + "type": "string", + "knownValues": ["instance", "personal"] + }, + "createdBy": {"type": "string", "format": "did"}, + "lastUpdatedBy": {"type": "string", "format": "did"} + } + } + } +}; + +/// `tools.ozone.moderation.getRecords` +const toolsOzoneModerationGetRecords = { "lexicon": 1, - "id": "tools.ozone.signature.findRelatedAccounts", + "id": "tools.ozone.moderation.getRecords", "defs": { "main": { "type": "query", - "description": - "Get accounts that share some matching threat signatures with the root account.", + "description": "Get details about some records.", "parameters": { "type": "params", - "required": ["did"], + "required": ["uris"], "properties": { - "did": {"type": "string", "format": "did"}, - "cursor": {"type": "string"}, - "limit": { - "type": "integer", - "default": 50, - "minimum": 1, - "maximum": 100 + "uris": { + "type": "array", + "items": {"type": "string", "format": "at-uri"}, + "maxLength": 100 } } }, @@ -9198,66 +9468,234 @@ const toolsOzoneSignatureFindRelatedAccounts = { "encoding": "application/json", "schema": { "type": "object", - "required": ["accounts"], + "required": ["records"], "properties": { - "cursor": {"type": "string"}, - "accounts": { + "records": { "type": "array", - "items": {"type": "ref", "ref": "#relatedAccount"} + "items": { + "type": "union", + "refs": [ + "tools.ozone.moderation.defs#recordViewDetail", + "tools.ozone.moderation.defs#recordViewNotFound" + ] + } } } } } - }, - "relatedAccount": { - "type": "object", - "required": ["account"], - "properties": { - "account": {"type": "ref", "ref": "com.atproto.admin.defs#accountView"}, - "similarities": { - "type": "array", - "items": { - "type": "ref", - "ref": "tools.ozone.signature.defs#sigDetail" - } - } - } } } }; -/// `tools.ozone.signature.defs` -const toolsOzoneSignatureDefs = { +/// `tools.ozone.moderation.getEvent` +const toolsOzoneModerationGetEvent = { "lexicon": 1, - "id": "tools.ozone.signature.defs", + "id": "tools.ozone.moderation.getEvent", "defs": { - "sigDetail": { - "type": "object", - "required": ["property", "value"], - "properties": { - "property": {"type": "string"}, - "value": {"type": "string"} + "main": { + "type": "query", + "description": "Get details about a moderation event.", + "parameters": { + "type": "params", + "required": ["id"], + "properties": { + "id": {"type": "integer"} + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "ref", + "ref": "tools.ozone.moderation.defs#modEventViewDetail" + } } } } }; -/// `tools.ozone.signature.findCorrelation` -const toolsOzoneSignatureFindCorrelation = { +/// `tools.ozone.moderation.queryStatuses` +const toolsOzoneModerationQueryStatuses = { "lexicon": 1, - "id": "tools.ozone.signature.findCorrelation", + "id": "tools.ozone.moderation.queryStatuses", "defs": { "main": { "type": "query", - "description": - "Find all correlated threat signatures between 2 or more accounts.", + "description": "View moderation statuses of subjects (record or repo).", "parameters": { "type": "params", - "required": ["dids"], "properties": { - "dids": { + "queueCount": { + "type": "integer", + "description": + "Number of queues being used by moderators. Subjects will be split among all queues." + }, + "queueIndex": { + "type": "integer", + "description": + "Index of the queue to fetch subjects from. Works only when queueCount value is specified." + }, + "queueSeed": { + "type": "string", + "description": "A seeder to shuffle/balance the queue items." + }, + "includeAllUserRecords": { + "type": "boolean", + "description": + "All subjects, or subjects from given 'collections' param, belonging to the account specified in the 'subject' param will be returned." + }, + "subject": { + "type": "string", + "format": "uri", + "description": "The subject to get the status for." + }, + "comment": { + "type": "string", + "description": "Search subjects by keyword from comments" + }, + "reportedAfter": { + "type": "string", + "format": "datetime", + "description": "Search subjects reported after a given timestamp" + }, + "reportedBefore": { + "type": "string", + "format": "datetime", + "description": "Search subjects reported before a given timestamp" + }, + "reviewedAfter": { + "type": "string", + "format": "datetime", + "description": "Search subjects reviewed after a given timestamp" + }, + "hostingDeletedAfter": { + "type": "string", + "format": "datetime", + "description": + "Search subjects where the associated record/account was deleted after a given timestamp" + }, + "hostingDeletedBefore": { + "type": "string", + "format": "datetime", + "description": + "Search subjects where the associated record/account was deleted before a given timestamp" + }, + "hostingUpdatedAfter": { + "type": "string", + "format": "datetime", + "description": + "Search subjects where the associated record/account was updated after a given timestamp" + }, + "hostingUpdatedBefore": { + "type": "string", + "format": "datetime", + "description": + "Search subjects where the associated record/account was updated before a given timestamp" + }, + "hostingStatuses": { "type": "array", - "items": {"type": "string", "format": "did"} + "description": + "Search subjects by the status of the associated record/account", + "items": {"type": "string"} + }, + "reviewedBefore": { + "type": "string", + "format": "datetime", + "description": "Search subjects reviewed before a given timestamp" + }, + "includeMuted": { + "type": "boolean", + "description": + "By default, we don't include muted subjects in the results. Set this to true to include them." + }, + "onlyMuted": { + "type": "boolean", + "description": + "When set to true, only muted subjects and reporters will be returned." + }, + "reviewState": { + "type": "string", + "description": "Specify when fetching subjects in a certain state" + }, + "ignoreSubjects": { + "type": "array", + "items": {"type": "string", "format": "uri"} + }, + "lastReviewedBy": { + "type": "string", + "format": "did", + "description": + "Get all subject statuses that were reviewed by a specific moderator" + }, + "sortField": { + "type": "string", + "default": "lastReportedAt", + "enum": [ + "lastReviewedAt", + "lastReportedAt", + "reportedRecordsCount", + "takendownRecordsCount" + ] + }, + "sortDirection": { + "type": "string", + "default": "desc", + "enum": ["asc", "desc"] + }, + "takendown": { + "type": "boolean", + "description": "Get subjects that were taken down" + }, + "appealed": { + "type": "boolean", + "description": "Get subjects in unresolved appealed status" + }, + "limit": { + "type": "integer", + "default": 50, + "minimum": 1, + "maximum": 100 + }, + "tags": { + "type": "array", + "items": { + "type": "string", + "description": + "Items in this array are applied with OR filters. To apply AND filter, put all tags in the same string and separate using && characters" + }, + "maxLength": 25 + }, + "excludeTags": { + "type": "array", + "items": {"type": "string"} + }, + "cursor": {"type": "string"}, + "collections": { + "type": "array", + "description": + "If specified, subjects belonging to the given collections will be returned. When subjectType is set to 'account', this will be ignored.", + "items": {"type": "string", "format": "nsid"}, + "maxLength": 20 + }, + "subjectType": { + "type": "string", + "description": + "If specified, subjects of the given type (account or record) will be returned. When this is set to 'account' the 'collections' parameter will be ignored. When includeAllUserRecords or subject is set, this will be ignored.", + "knownValues": ["account", "record"] + }, + "minAccountSuspendCount": { + "type": "integer", + "description": + "If specified, only subjects that belong to an account that has at least this many suspensions will be returned." + }, + "minReportedRecordsCount": { + "type": "integer", + "description": + "If specified, only subjects that belong to an account that has at least this many reported records will be returned." + }, + "minTakendownRecordsCount": { + "type": "integer", + "description": + "If specified, only subjects that belong to an account that has at least this many taken down records will be returned." } } }, @@ -9265,13 +9703,14 @@ const toolsOzoneSignatureFindCorrelation = { "encoding": "application/json", "schema": { "type": "object", - "required": ["details"], + "required": ["subjectStatuses"], "properties": { - "details": { + "cursor": {"type": "string"}, + "subjectStatuses": { "type": "array", "items": { "type": "ref", - "ref": "tools.ozone.signature.defs#sigDetail" + "ref": "tools.ozone.moderation.defs#subjectStatusView" } } } @@ -9281,29 +9720,22 @@ const toolsOzoneSignatureFindCorrelation = { } }; -/// `tools.ozone.signature.searchAccounts` -const toolsOzoneSignatureSearchAccounts = { +/// `tools.ozone.moderation.getRepos` +const toolsOzoneModerationGetRepos = { "lexicon": 1, - "id": "tools.ozone.signature.searchAccounts", + "id": "tools.ozone.moderation.getRepos", "defs": { "main": { "type": "query", - "description": - "Search for accounts that match one or more threat signature values.", + "description": "Get details about some repositories.", "parameters": { "type": "params", - "required": ["values"], + "required": ["dids"], "properties": { - "values": { + "dids": { "type": "array", - "items": {"type": "string"} - }, - "cursor": {"type": "string"}, - "limit": { - "type": "integer", - "default": 50, - "minimum": 1, - "maximum": 100 + "items": {"type": "string", "format": "did"}, + "maxLength": 100 } } }, @@ -9311,14 +9743,16 @@ const toolsOzoneSignatureSearchAccounts = { "encoding": "application/json", "schema": { "type": "object", - "required": ["accounts"], + "required": ["repos"], "properties": { - "cursor": {"type": "string"}, - "accounts": { + "repos": { "type": "array", "items": { - "type": "ref", - "ref": "com.atproto.admin.defs#accountView" + "type": "union", + "refs": [ + "tools.ozone.moderation.defs#repoViewDetail", + "tools.ozone.moderation.defs#repoViewNotFound" + ] } } } @@ -9328,222 +9762,217 @@ const toolsOzoneSignatureSearchAccounts = { } }; -/// `tools.ozone.server.getConfig` -const toolsOzoneServerGetConfig = { +/// `tools.ozone.moderation.getRepo` +const toolsOzoneModerationGetRepo = { "lexicon": 1, - "id": "tools.ozone.server.getConfig", + "id": "tools.ozone.moderation.getRepo", "defs": { "main": { "type": "query", - "description": "Get details about ozone's server configuration.", - "output": { - "encoding": "application/json", - "schema": { - "type": "object", - "properties": { - "appview": {"type": "ref", "ref": "#serviceConfig"}, - "pds": {"type": "ref", "ref": "#serviceConfig"}, - "blobDivert": {"type": "ref", "ref": "#serviceConfig"}, - "chat": {"type": "ref", "ref": "#serviceConfig"}, - "viewer": {"type": "ref", "ref": "#viewerConfig"} - } - } - } - }, - "serviceConfig": { - "type": "object", - "properties": { - "url": {"type": "string", "format": "uri"} - } - }, - "viewerConfig": { - "type": "object", - "properties": { - "role": { - "type": "string", - "knownValues": [ - "tools.ozone.team.defs#roleAdmin", - "tools.ozone.team.defs#roleModerator", - "tools.ozone.team.defs#roleTriage" - ] - } - } - } - } -}; - -/// `tools.ozone.team.updateMember` -const toolsOzoneTeamUpdateMember = { - "lexicon": 1, - "id": "tools.ozone.team.updateMember", - "defs": { - "main": { - "type": "procedure", - "description": - "Update a member in the ozone service. Requires admin role.", - "input": { - "encoding": "application/json", - "schema": { - "type": "object", - "required": ["did"], - "properties": { - "did": {"type": "string", "format": "did"}, - "disabled": {"type": "boolean"}, - "role": { - "type": "string", - "knownValues": [ - "tools.ozone.team.defs#roleAdmin", - "tools.ozone.team.defs#roleModerator", - "tools.ozone.team.defs#roleTriage" - ] - } - } + "description": "Get details about a repository.", + "parameters": { + "type": "params", + "required": ["did"], + "properties": { + "did": {"type": "string", "format": "did"} } }, "output": { "encoding": "application/json", - "schema": {"type": "ref", "ref": "tools.ozone.team.defs#member"} + "schema": { + "type": "ref", + "ref": "tools.ozone.moderation.defs#repoViewDetail" + } }, "errors": [ - { - "name": "MemberNotFound", - "description": "The member being updated does not exist in the team" - } + {"name": "RepoNotFound"} ] } } }; -/// `tools.ozone.team.defs` -const toolsOzoneTeamDefs = { - "lexicon": 1, - "id": "tools.ozone.team.defs", - "defs": { - "member": { - "type": "object", - "required": ["did", "role"], - "properties": { - "did": {"type": "string", "format": "did"}, - "disabled": {"type": "boolean"}, - "profile": { - "type": "ref", - "ref": "app.bsky.actor.defs#profileViewDetailed" - }, - "createdAt": {"type": "string", "format": "datetime"}, - "updatedAt": {"type": "string", "format": "datetime"}, - "lastUpdatedBy": {"type": "string"}, - "role": { - "type": "string", - "knownValues": ["#roleAdmin", "#roleModerator", "#roleTriage"] - } - } - }, - "roleAdmin": { - "type": "token", - "description": - "Admin role. Highest level of access, can perform all actions." - }, - "roleModerator": { - "type": "token", - "description": "Moderator role. Can perform most actions." - }, - "roleTriage": { - "type": "token", - "description": - "Triage role. Mostly intended for monitoring and escalating issues." - } - } -}; - -/// `tools.ozone.team.deleteMember` -const toolsOzoneTeamDeleteMember = { +/// `tools.ozone.moderation.searchRepos` +const toolsOzoneModerationSearchRepos = { "lexicon": 1, - "id": "tools.ozone.team.deleteMember", + "id": "tools.ozone.moderation.searchRepos", "defs": { "main": { - "type": "procedure", - "description": "Delete a member from ozone team. Requires admin role.", - "input": { + "type": "query", + "description": "Find repositories based on a search term.", + "parameters": { + "type": "params", + "properties": { + "term": { + "type": "string", + "description": "DEPRECATED: use 'q' instead" + }, + "q": {"type": "string"}, + "limit": { + "type": "integer", + "default": 50, + "minimum": 1, + "maximum": 100 + }, + "cursor": {"type": "string"} + } + }, + "output": { "encoding": "application/json", "schema": { "type": "object", - "required": ["did"], + "required": ["repos"], "properties": { - "did": {"type": "string", "format": "did"} + "cursor": {"type": "string"}, + "repos": { + "type": "array", + "items": { + "type": "ref", + "ref": "tools.ozone.moderation.defs#repoView" + } + } } } - }, - "errors": [ - { - "name": "MemberNotFound", - "description": "The member being deleted does not exist" - }, - { - "name": "CannotDeleteSelf", - "description": "You can not delete yourself from the team" - } - ] + } } } }; -/// `tools.ozone.team.addMember` -const toolsOzoneTeamAddMember = { +/// `tools.ozone.moderation.getRecord` +const toolsOzoneModerationGetRecord = { "lexicon": 1, - "id": "tools.ozone.team.addMember", + "id": "tools.ozone.moderation.getRecord", "defs": { "main": { - "type": "procedure", - "description": "Add a member to the ozone team. Requires admin role.", - "input": { - "encoding": "application/json", - "schema": { - "type": "object", - "required": ["did", "role"], - "properties": { - "did": {"type": "string", "format": "did"}, - "role": { - "type": "string", - "knownValues": [ - "tools.ozone.team.defs#roleAdmin", - "tools.ozone.team.defs#roleModerator", - "tools.ozone.team.defs#roleTriage" - ] - } - } + "type": "query", + "description": "Get details about a record.", + "parameters": { + "type": "params", + "required": ["uri"], + "properties": { + "uri": {"type": "string", "format": "at-uri"}, + "cid": {"type": "string", "format": "cid"} } }, "output": { "encoding": "application/json", - "schema": {"type": "ref", "ref": "tools.ozone.team.defs#member"} + "schema": { + "type": "ref", + "ref": "tools.ozone.moderation.defs#recordViewDetail" + } }, "errors": [ - { - "name": "MemberAlreadyExists", - "description": "Member already exists in the team." - } + {"name": "RecordNotFound"} ] } } }; -/// `tools.ozone.team.listMembers` -const toolsOzoneTeamListMembers = { +/// `tools.ozone.moderation.queryEvents` +const toolsOzoneModerationQueryEvents = { "lexicon": 1, - "id": "tools.ozone.team.listMembers", + "id": "tools.ozone.moderation.queryEvents", "defs": { "main": { "type": "query", - "description": "List all members with access to the ozone service.", + "description": "List moderation events related to a subject.", "parameters": { "type": "params", "properties": { + "types": { + "type": "array", + "description": + "The types of events (fully qualified string in the format of tools.ozone.moderation.defs#modEvent) to filter by. If not specified, all events are returned.", + "items": {"type": "string"} + }, + "createdBy": {"type": "string", "format": "did"}, + "sortDirection": { + "type": "string", + "description": + "Sort direction for the events. Defaults to descending order of created at timestamp.", + "default": "desc", + "enum": ["asc", "desc"] + }, + "createdAfter": { + "type": "string", + "format": "datetime", + "description": "Retrieve events created after a given timestamp" + }, + "createdBefore": { + "type": "string", + "format": "datetime", + "description": "Retrieve events created before a given timestamp" + }, + "subject": {"type": "string", "format": "uri"}, + "collections": { + "type": "array", + "description": + "If specified, only events where the subject belongs to the given collections will be returned. When subjectType is set to 'account', this will be ignored.", + "items": {"type": "string", "format": "nsid"}, + "maxLength": 20 + }, + "subjectType": { + "type": "string", + "description": + "If specified, only events where the subject is of the given type (account or record) will be returned. When this is set to 'account' the 'collections' parameter will be ignored. When includeAllUserRecords or subject is set, this will be ignored.", + "knownValues": ["account", "record"] + }, + "includeAllUserRecords": { + "type": "boolean", + "description": + "If true, events on all record types (posts, lists, profile etc.) or records from given 'collections' param, owned by the did are returned.", + "default": false + }, "limit": { "type": "integer", "default": 50, "minimum": 1, "maximum": 100 }, + "hasComment": { + "type": "boolean", + "description": "If true, only events with comments are returned" + }, + "comment": { + "type": "string", + "description": + "If specified, only events with comments containing the keyword are returned. Apply || separator to use multiple keywords and match using OR condition." + }, + "addedLabels": { + "type": "array", + "description": + "If specified, only events where all of these labels were added are returned", + "items": {"type": "string"} + }, + "removedLabels": { + "type": "array", + "description": + "If specified, only events where all of these labels were removed are returned", + "items": {"type": "string"} + }, + "addedTags": { + "type": "array", + "description": + "If specified, only events where all of these tags were added are returned", + "items": {"type": "string"} + }, + "removedTags": { + "type": "array", + "description": + "If specified, only events where all of these tags were removed are returned", + "items": {"type": "string"} + }, + "reportTypes": { + "type": "array", + "items": {"type": "string"} + }, + "policies": { + "type": "array", + "items": { + "type": "string", + "description": + "If specified, only events where the action policies match any of the given policies are returned" + } + }, "cursor": {"type": "string"} } }, @@ -9551,12 +9980,15 @@ const toolsOzoneTeamListMembers = { "encoding": "application/json", "schema": { "type": "object", - "required": ["members"], + "required": ["events"], "properties": { "cursor": {"type": "string"}, - "members": { + "events": { "type": "array", - "items": {"type": "ref", "ref": "tools.ozone.team.defs#member"} + "items": { + "type": "ref", + "ref": "tools.ozone.moderation.defs#modEventView" + } } } } @@ -9565,72 +9997,66 @@ const toolsOzoneTeamListMembers = { } }; -/// `tools.ozone.moderation.getRepos` -const toolsOzoneModerationGetRepos = { +/// `tools.ozone.moderation.emitEvent` +const toolsOzoneModerationEmitEvent = { "lexicon": 1, - "id": "tools.ozone.moderation.getRepos", + "id": "tools.ozone.moderation.emitEvent", "defs": { "main": { - "type": "query", - "description": "Get details about some repositories.", - "parameters": { - "type": "params", - "required": ["dids"], - "properties": { - "dids": { - "type": "array", - "items": {"type": "string", "format": "did"}, - "maxLength": 100 - } - } - }, - "output": { + "type": "procedure", + "description": "Take a moderation action on an actor.", + "input": { "encoding": "application/json", "schema": { "type": "object", - "required": ["repos"], + "required": ["event", "subject", "createdBy"], "properties": { - "repos": { + "event": { + "type": "union", + "refs": [ + "tools.ozone.moderation.defs#modEventTakedown", + "tools.ozone.moderation.defs#modEventAcknowledge", + "tools.ozone.moderation.defs#modEventEscalate", + "tools.ozone.moderation.defs#modEventComment", + "tools.ozone.moderation.defs#modEventLabel", + "tools.ozone.moderation.defs#modEventReport", + "tools.ozone.moderation.defs#modEventMute", + "tools.ozone.moderation.defs#modEventUnmute", + "tools.ozone.moderation.defs#modEventMuteReporter", + "tools.ozone.moderation.defs#modEventUnmuteReporter", + "tools.ozone.moderation.defs#modEventReverseTakedown", + "tools.ozone.moderation.defs#modEventResolveAppeal", + "tools.ozone.moderation.defs#modEventEmail", + "tools.ozone.moderation.defs#modEventTag", + "tools.ozone.moderation.defs#accountEvent", + "tools.ozone.moderation.defs#identityEvent", + "tools.ozone.moderation.defs#recordEvent" + ] + }, + "subject": { + "type": "union", + "refs": [ + "com.atproto.admin.defs#repoRef", + "com.atproto.repo.strongRef" + ] + }, + "subjectBlobCids": { "type": "array", - "items": { - "type": "union", - "refs": [ - "tools.ozone.moderation.defs#repoViewDetail", - "tools.ozone.moderation.defs#repoViewNotFound" - ] - } - } + "items": {"type": "string", "format": "cid"} + }, + "createdBy": {"type": "string", "format": "did"} } } - } - } - } -}; - -/// `tools.ozone.moderation.getRepo` -const toolsOzoneModerationGetRepo = { - "lexicon": 1, - "id": "tools.ozone.moderation.getRepo", - "defs": { - "main": { - "type": "query", - "description": "Get details about a repository.", - "parameters": { - "type": "params", - "required": ["did"], - "properties": { - "did": {"type": "string", "format": "did"} - } }, "output": { "encoding": "application/json", "schema": { "type": "ref", - "ref": "tools.ozone.moderation.defs#repoViewDetail" + "ref": "tools.ozone.moderation.defs#modEventView" } }, "errors": [ - {"name": "RepoNotFound"} + {"name": "SubjectHasAction"} ] } } @@ -9777,34 +10203,113 @@ const toolsOzoneModerationDefs = { "type": "string", "format": "datetime", "description": - "Timestamp referencing the first moderation status impacting event was emitted on the subject" + "Timestamp referencing the first moderation status impacting event was emitted on the subject" + }, + "reviewState": {"type": "ref", "ref": "#subjectReviewState"}, + "comment": { + "type": "string", + "description": "Sticky comment on the subject." + }, + "muteUntil": {"type": "string", "format": "datetime"}, + "muteReportingUntil": {"type": "string", "format": "datetime"}, + "lastReviewedBy": {"type": "string", "format": "did"}, + "lastReviewedAt": {"type": "string", "format": "datetime"}, + "lastReportedAt": {"type": "string", "format": "datetime"}, + "lastAppealedAt": { + "type": "string", + "format": "datetime", + "description": + "Timestamp referencing when the author of the subject appealed a moderation action" + }, + "takendown": {"type": "boolean"}, + "appealed": { + "type": "boolean", + "description": + "True indicates that the a previously taken moderator action was appealed against, by the author of the content. False indicates last appeal was resolved by moderators." + }, + "suspendUntil": {"type": "string", "format": "datetime"}, + "tags": { + "type": "array", + "items": {"type": "string"} + }, + "accountStats": { + "type": "ref", + "description": "Statistics related to the account subject", + "ref": "#accountStats" + }, + "recordsStats": { + "type": "ref", + "description": + "Statistics related to the record subjects authored by the subject's account", + "ref": "#recordsStats" + } + } + }, + "accountStats": { + "type": "object", + "description": "Statistics about a particular account subject", + "properties": { + "reportCount": { + "type": "integer", + "description": "Total number of reports on the account" + }, + "appealCount": { + "type": "integer", + "description": + "Total number of appeals against a moderation action on the account" + }, + "suspendCount": { + "type": "integer", + "description": "Number of times the account was suspended" + }, + "escalateCount": { + "type": "integer", + "description": "Number of times the account was escalated" + }, + "takedownCount": { + "type": "integer", + "description": "Number of times the account was taken down" + } + } + }, + "recordsStats": { + "type": "object", + "description": "Statistics about a set of record subject items", + "properties": { + "totalReports": { + "type": "integer", + "description": + "Cumulative sum of the number of reports on the items in the set" }, - "reviewState": {"type": "ref", "ref": "#subjectReviewState"}, - "comment": { - "type": "string", - "description": "Sticky comment on the subject." + "reportedCount": { + "type": "integer", + "description": "Number of items that were reported at least once" }, - "muteUntil": {"type": "string", "format": "datetime"}, - "muteReportingUntil": {"type": "string", "format": "datetime"}, - "lastReviewedBy": {"type": "string", "format": "did"}, - "lastReviewedAt": {"type": "string", "format": "datetime"}, - "lastReportedAt": {"type": "string", "format": "datetime"}, - "lastAppealedAt": { - "type": "string", - "format": "datetime", + "escalatedCount": { + "type": "integer", + "description": "Number of items that were escalated at least once" + }, + "appealedCount": { + "type": "integer", + "description": "Number of items that were appealed at least once" + }, + "subjectCount": { + "type": "integer", + "description": "Total number of item in the set" + }, + "pendingCount": { + "type": "integer", "description": - "Timestamp referencing when the author of the subject appealed a moderation action" + "Number of item currently in \"reviewOpen\" or \"reviewEscalated\" state" }, - "takendown": {"type": "boolean"}, - "appealed": { - "type": "boolean", + "processedCount": { + "type": "integer", "description": - "True indicates that the a previously taken moderator action was appealed against, by the author of the content. False indicates last appeal was resolved by moderators." + "Number of item currently in \"reviewNone\" or \"reviewClosed\" state" }, - "suspendUntil": {"type": "string", "format": "datetime"}, - "tags": { - "type": "array", - "items": {"type": "string"} + "takendownCount": { + "type": "integer", + "description": "Number of item currently taken down" } } }, @@ -10273,282 +10778,82 @@ const toolsOzoneModerationDefs = { "required": ["width", "height", "length"], "properties": { "width": {"type": "integer"}, - "height": {"type": "integer"}, - "length": {"type": "integer"} - } - }, - "accountHosting": { - "type": "object", - "required": ["status"], - "properties": { - "status": { - "type": "string", - "knownValues": [ - "takendown", - "suspended", - "deleted", - "deactivated", - "unknown" - ] - }, - "updatedAt": {"type": "string", "format": "datetime"}, - "createdAt": {"type": "string", "format": "datetime"}, - "deletedAt": {"type": "string", "format": "datetime"}, - "deactivatedAt": {"type": "string", "format": "datetime"}, - "reactivatedAt": {"type": "string", "format": "datetime"} - } - }, - "recordHosting": { - "type": "object", - "required": ["status"], - "properties": { - "status": { - "type": "string", - "knownValues": ["deleted", "unknown"] - }, - "updatedAt": {"type": "string", "format": "datetime"}, - "createdAt": {"type": "string", "format": "datetime"}, - "deletedAt": {"type": "string", "format": "datetime"} - } - } - } -}; - -/// `tools.ozone.moderation.queryStatuses` -const toolsOzoneModerationQueryStatuses = { - "lexicon": 1, - "id": "tools.ozone.moderation.queryStatuses", - "defs": { - "main": { - "type": "query", - "description": "View moderation statuses of subjects (record or repo).", - "parameters": { - "type": "params", - "properties": { - "queueCount": { - "type": "integer", - "description": - "Number of queues being used by moderators. Subjects will be split among all queues." - }, - "queueIndex": { - "type": "integer", - "description": - "Index of the queue to fetch subjects from. Works only when queueCount value is specified." - }, - "queueSeed": { - "type": "string", - "description": "A seeder to shuffle/balance the queue items." - }, - "includeAllUserRecords": { - "type": "boolean", - "description": - "All subjects, or subjects from given 'collections' param, belonging to the account specified in the 'subject' param will be returned." - }, - "subject": { - "type": "string", - "format": "uri", - "description": "The subject to get the status for." - }, - "comment": { - "type": "string", - "description": "Search subjects by keyword from comments" - }, - "reportedAfter": { - "type": "string", - "format": "datetime", - "description": "Search subjects reported after a given timestamp" - }, - "reportedBefore": { - "type": "string", - "format": "datetime", - "description": "Search subjects reported before a given timestamp" - }, - "reviewedAfter": { - "type": "string", - "format": "datetime", - "description": "Search subjects reviewed after a given timestamp" - }, - "hostingDeletedAfter": { - "type": "string", - "format": "datetime", - "description": - "Search subjects where the associated record/account was deleted after a given timestamp" - }, - "hostingDeletedBefore": { - "type": "string", - "format": "datetime", - "description": - "Search subjects where the associated record/account was deleted before a given timestamp" - }, - "hostingUpdatedAfter": { - "type": "string", - "format": "datetime", - "description": - "Search subjects where the associated record/account was updated after a given timestamp" - }, - "hostingUpdatedBefore": { - "type": "string", - "format": "datetime", - "description": - "Search subjects where the associated record/account was updated before a given timestamp" - }, - "hostingStatuses": { - "type": "array", - "description": - "Search subjects by the status of the associated record/account", - "items": {"type": "string"} - }, - "reviewedBefore": { - "type": "string", - "format": "datetime", - "description": "Search subjects reviewed before a given timestamp" - }, - "includeMuted": { - "type": "boolean", - "description": - "By default, we don't include muted subjects in the results. Set this to true to include them." - }, - "onlyMuted": { - "type": "boolean", - "description": - "When set to true, only muted subjects and reporters will be returned." - }, - "reviewState": { - "type": "string", - "description": "Specify when fetching subjects in a certain state" - }, - "ignoreSubjects": { - "type": "array", - "items": {"type": "string", "format": "uri"} - }, - "lastReviewedBy": { - "type": "string", - "format": "did", - "description": - "Get all subject statuses that were reviewed by a specific moderator" - }, - "sortField": { - "type": "string", - "default": "lastReportedAt", - "enum": ["lastReviewedAt", "lastReportedAt"] - }, - "sortDirection": { - "type": "string", - "default": "desc", - "enum": ["asc", "desc"] - }, - "takendown": { - "type": "boolean", - "description": "Get subjects that were taken down" - }, - "appealed": { - "type": "boolean", - "description": "Get subjects in unresolved appealed status" - }, - "limit": { - "type": "integer", - "default": 50, - "minimum": 1, - "maximum": 100 - }, - "tags": { - "type": "array", - "items": { - "type": "string", - "description": - "Items in this array are applied with OR filters. To apply AND filter, put all tags in the same string and separate using && characters" - }, - "maxLength": 25 - }, - "excludeTags": { - "type": "array", - "items": {"type": "string"} - }, - "cursor": {"type": "string"}, - "collections": { - "type": "array", - "description": - "If specified, subjects belonging to the given collections will be returned. When subjectType is set to 'account', this will be ignored.", - "items": {"type": "string", "format": "nsid"}, - "maxLength": 20 - }, - "subjectType": { - "type": "string", - "description": - "If specified, subjects of the given type (account or record) will be returned. When this is set to 'account' the 'collections' parameter will be ignored. When includeAllUserRecords or subject is set, this will be ignored.", - "knownValues": ["account", "record"] - } - } - }, - "output": { - "encoding": "application/json", - "schema": { - "type": "object", - "required": ["subjectStatuses"], - "properties": { - "cursor": {"type": "string"}, - "subjectStatuses": { - "type": "array", - "items": { - "type": "ref", - "ref": "tools.ozone.moderation.defs#subjectStatusView" - } - } - } - } + "height": {"type": "integer"}, + "length": {"type": "integer"} + } + }, + "accountHosting": { + "type": "object", + "required": ["status"], + "properties": { + "status": { + "type": "string", + "knownValues": [ + "takendown", + "suspended", + "deleted", + "deactivated", + "unknown" + ] + }, + "updatedAt": {"type": "string", "format": "datetime"}, + "createdAt": {"type": "string", "format": "datetime"}, + "deletedAt": {"type": "string", "format": "datetime"}, + "deactivatedAt": {"type": "string", "format": "datetime"}, + "reactivatedAt": {"type": "string", "format": "datetime"} + } + }, + "recordHosting": { + "type": "object", + "required": ["status"], + "properties": { + "status": { + "type": "string", + "knownValues": ["deleted", "unknown"] + }, + "updatedAt": {"type": "string", "format": "datetime"}, + "createdAt": {"type": "string", "format": "datetime"}, + "deletedAt": {"type": "string", "format": "datetime"} } } } }; -/// `tools.ozone.moderation.emitEvent` -const toolsOzoneModerationEmitEvent = { +/// `tools.ozone.communication.createTemplate` +const toolsOzoneCommunicationCreateTemplate = { "lexicon": 1, - "id": "tools.ozone.moderation.emitEvent", + "id": "tools.ozone.communication.createTemplate", "defs": { "main": { "type": "procedure", - "description": "Take a moderation action on an actor.", + "description": + "Administrative action to create a new, re-usable communication (email for now) template.", "input": { "encoding": "application/json", "schema": { "type": "object", - "required": ["event", "subject", "createdBy"], + "required": ["subject", "contentMarkdown", "name"], "properties": { - "event": { - "type": "union", - "refs": [ - "tools.ozone.moderation.defs#modEventTakedown", - "tools.ozone.moderation.defs#modEventAcknowledge", - "tools.ozone.moderation.defs#modEventEscalate", - "tools.ozone.moderation.defs#modEventComment", - "tools.ozone.moderation.defs#modEventLabel", - "tools.ozone.moderation.defs#modEventReport", - "tools.ozone.moderation.defs#modEventMute", - "tools.ozone.moderation.defs#modEventUnmute", - "tools.ozone.moderation.defs#modEventMuteReporter", - "tools.ozone.moderation.defs#modEventUnmuteReporter", - "tools.ozone.moderation.defs#modEventReverseTakedown", - "tools.ozone.moderation.defs#modEventResolveAppeal", - "tools.ozone.moderation.defs#modEventEmail", - "tools.ozone.moderation.defs#modEventTag", - "tools.ozone.moderation.defs#accountEvent", - "tools.ozone.moderation.defs#identityEvent", - "tools.ozone.moderation.defs#recordEvent" - ] + "name": {"type": "string", "description": "Name of the template."}, + "contentMarkdown": { + "type": "string", + "description": + "Content of the template, markdown supported, can contain variable placeholders." }, "subject": { - "type": "union", - "refs": [ - "com.atproto.admin.defs#repoRef", - "com.atproto.repo.strongRef" - ] + "type": "string", + "description": "Subject of the message, used in emails." }, - "subjectBlobCids": { - "type": "array", - "items": {"type": "string", "format": "cid"} + "lang": { + "type": "string", + "format": "language", + "description": "Message language." }, - "createdBy": {"type": "string", "format": "did"} + "createdBy": { + "type": "string", + "format": "did", + "description": "DID of the user who is creating the template." + } } } }, @@ -10556,162 +10861,180 @@ const toolsOzoneModerationEmitEvent = { "encoding": "application/json", "schema": { "type": "ref", - "ref": "tools.ozone.moderation.defs#modEventView" + "ref": "tools.ozone.communication.defs#templateView" } }, "errors": [ - {"name": "SubjectHasAction"} + {"name": "DuplicateTemplateName"} ] } } }; -/// `tools.ozone.moderation.queryEvents` -const toolsOzoneModerationQueryEvents = { +/// `tools.ozone.communication.deleteTemplate` +const toolsOzoneCommunicationDeleteTemplate = { "lexicon": 1, - "id": "tools.ozone.moderation.queryEvents", + "id": "tools.ozone.communication.deleteTemplate", + "defs": { + "main": { + "type": "procedure", + "description": "Delete a communication template.", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["id"], + "properties": { + "id": {"type": "string"} + } + } + } + } + } +}; + +/// `tools.ozone.communication.listTemplates` +const toolsOzoneCommunicationListTemplates = { + "lexicon": 1, + "id": "tools.ozone.communication.listTemplates", "defs": { "main": { "type": "query", - "description": "List moderation events related to a subject.", - "parameters": { - "type": "params", - "properties": { - "types": { - "type": "array", - "description": - "The types of events (fully qualified string in the format of tools.ozone.moderation.defs#modEvent) to filter by. If not specified, all events are returned.", - "items": {"type": "string"} - }, - "createdBy": {"type": "string", "format": "did"}, - "sortDirection": { - "type": "string", - "description": - "Sort direction for the events. Defaults to descending order of created at timestamp.", - "default": "desc", - "enum": ["asc", "desc"] - }, - "createdAfter": { - "type": "string", - "format": "datetime", - "description": "Retrieve events created after a given timestamp" - }, - "createdBefore": { - "type": "string", - "format": "datetime", - "description": "Retrieve events created before a given timestamp" - }, - "subject": {"type": "string", "format": "uri"}, - "collections": { - "type": "array", - "description": - "If specified, only events where the subject belongs to the given collections will be returned. When subjectType is set to 'account', this will be ignored.", - "items": {"type": "string", "format": "nsid"}, - "maxLength": 20 - }, - "subjectType": { - "type": "string", - "description": - "If specified, only events where the subject is of the given type (account or record) will be returned. When this is set to 'account' the 'collections' parameter will be ignored. When includeAllUserRecords or subject is set, this will be ignored.", - "knownValues": ["account", "record"] - }, - "includeAllUserRecords": { - "type": "boolean", - "description": - "If true, events on all record types (posts, lists, profile etc.) or records from given 'collections' param, owned by the did are returned.", - "default": false - }, - "limit": { - "type": "integer", - "default": 50, - "minimum": 1, - "maximum": 100 - }, - "hasComment": { - "type": "boolean", - "description": "If true, only events with comments are returned" - }, - "comment": { - "type": "string", - "description": - "If specified, only events with comments containing the keyword are returned. Apply || separator to use multiple keywords and match using OR condition." - }, - "addedLabels": { - "type": "array", - "description": - "If specified, only events where all of these labels were added are returned", - "items": {"type": "string"} - }, - "removedLabels": { - "type": "array", - "description": - "If specified, only events where all of these labels were removed are returned", - "items": {"type": "string"} - }, - "addedTags": { - "type": "array", - "description": - "If specified, only events where all of these tags were added are returned", - "items": {"type": "string"} - }, - "removedTags": { - "type": "array", - "description": - "If specified, only events where all of these tags were removed are returned", - "items": {"type": "string"} - }, - "reportTypes": { - "type": "array", - "items": {"type": "string"} - }, - "policies": { - "type": "array", - "items": { + "description": "Get list of all communication templates.", + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["communicationTemplates"], + "properties": { + "communicationTemplates": { + "type": "array", + "items": { + "type": "ref", + "ref": "tools.ozone.communication.defs#templateView" + } + } + } + } + } + } + } +}; + +/// `tools.ozone.communication.updateTemplate` +const toolsOzoneCommunicationUpdateTemplate = { + "lexicon": 1, + "id": "tools.ozone.communication.updateTemplate", + "defs": { + "main": { + "type": "procedure", + "description": + "Administrative action to update an existing communication template. Allows passing partial fields to patch specific fields only.", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["id"], + "properties": { + "id": { + "type": "string", + "description": "ID of the template to be updated." + }, + "name": {"type": "string", "description": "Name of the template."}, + "lang": { + "type": "string", + "format": "language", + "description": "Message language." + }, + "contentMarkdown": { "type": "string", "description": - "If specified, only events where the action policies match any of the given policies are returned" - } - }, - "cursor": {"type": "string"} + "Content of the template, markdown supported, can contain variable placeholders." + }, + "subject": { + "type": "string", + "description": "Subject of the message, used in emails." + }, + "updatedBy": { + "type": "string", + "format": "did", + "description": "DID of the user who is updating the template." + }, + "disabled": {"type": "boolean"} + } } }, "output": { "encoding": "application/json", "schema": { - "type": "object", - "required": ["events"], - "properties": { - "cursor": {"type": "string"}, - "events": { - "type": "array", - "items": { - "type": "ref", - "ref": "tools.ozone.moderation.defs#modEventView" - } - } - } + "type": "ref", + "ref": "tools.ozone.communication.defs#templateView" } + }, + "errors": [ + {"name": "DuplicateTemplateName"} + ] + } + } +}; + +/// `tools.ozone.communication.defs` +const toolsOzoneCommunicationDefs = { + "lexicon": 1, + "id": "tools.ozone.communication.defs", + "defs": { + "templateView": { + "type": "object", + "required": [ + "id", + "name", + "contentMarkdown", + "disabled", + "lastUpdatedBy", + "createdAt", + "updatedAt" + ], + "properties": { + "id": {"type": "string"}, + "name": {"type": "string", "description": "Name of the template."}, + "subject": { + "type": "string", + "description": + "Content of the template, can contain markdown and variable placeholders." + }, + "contentMarkdown": { + "type": "string", + "description": "Subject of the message, used in emails." + }, + "disabled": {"type": "boolean"}, + "lang": { + "type": "string", + "format": "language", + "description": "Message language." + }, + "lastUpdatedBy": { + "type": "string", + "format": "did", + "description": "DID of the user who last updated the template." + }, + "createdAt": {"type": "string", "format": "datetime"}, + "updatedAt": {"type": "string", "format": "datetime"} } } } }; -/// `tools.ozone.moderation.searchRepos` -const toolsOzoneModerationSearchRepos = { +/// `tools.ozone.team.listMembers` +const toolsOzoneTeamListMembers = { "lexicon": 1, - "id": "tools.ozone.moderation.searchRepos", + "id": "tools.ozone.team.listMembers", "defs": { "main": { "type": "query", - "description": "Find repositories based on a search term.", + "description": "List all members with access to the ozone service.", "parameters": { "type": "params", "properties": { - "term": { - "type": "string", - "description": "DEPRECATED: use 'q' instead" - }, - "q": {"type": "string"}, "limit": { "type": "integer", "default": 50, @@ -10725,15 +11048,12 @@ const toolsOzoneModerationSearchRepos = { "encoding": "application/json", "schema": { "type": "object", - "required": ["repos"], + "required": ["members"], "properties": { "cursor": {"type": "string"}, - "repos": { + "members": { "type": "array", - "items": { - "type": "ref", - "ref": "tools.ozone.moderation.defs#repoView" - } + "items": {"type": "ref", "ref": "tools.ozone.team.defs#member"} } } } @@ -10742,165 +11062,195 @@ const toolsOzoneModerationSearchRepos = { } }; -/// `tools.ozone.moderation.getEvent` -const toolsOzoneModerationGetEvent = { +/// `tools.ozone.team.deleteMember` +const toolsOzoneTeamDeleteMember = { "lexicon": 1, - "id": "tools.ozone.moderation.getEvent", + "id": "tools.ozone.team.deleteMember", "defs": { "main": { - "type": "query", - "description": "Get details about a moderation event.", - "parameters": { - "type": "params", - "required": ["id"], - "properties": { - "id": {"type": "integer"} - } - }, - "output": { + "type": "procedure", + "description": "Delete a member from ozone team. Requires admin role.", + "input": { "encoding": "application/json", "schema": { - "type": "ref", - "ref": "tools.ozone.moderation.defs#modEventViewDetail" + "type": "object", + "required": ["did"], + "properties": { + "did": {"type": "string", "format": "did"} + } } - } + }, + "errors": [ + { + "name": "MemberNotFound", + "description": "The member being deleted does not exist" + }, + { + "name": "CannotDeleteSelf", + "description": "You can not delete yourself from the team" + } + ] } } }; -/// `tools.ozone.moderation.getRecord` -const toolsOzoneModerationGetRecord = { +/// `tools.ozone.team.addMember` +const toolsOzoneTeamAddMember = { "lexicon": 1, - "id": "tools.ozone.moderation.getRecord", + "id": "tools.ozone.team.addMember", "defs": { "main": { - "type": "query", - "description": "Get details about a record.", - "parameters": { - "type": "params", - "required": ["uri"], - "properties": { - "uri": {"type": "string", "format": "at-uri"}, - "cid": {"type": "string", "format": "cid"} + "type": "procedure", + "description": "Add a member to the ozone team. Requires admin role.", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["did", "role"], + "properties": { + "did": {"type": "string", "format": "did"}, + "role": { + "type": "string", + "knownValues": [ + "tools.ozone.team.defs#roleAdmin", + "tools.ozone.team.defs#roleModerator", + "tools.ozone.team.defs#roleTriage" + ] + } + } } }, "output": { "encoding": "application/json", - "schema": { - "type": "ref", - "ref": "tools.ozone.moderation.defs#recordViewDetail" - } + "schema": {"type": "ref", "ref": "tools.ozone.team.defs#member"} }, "errors": [ - {"name": "RecordNotFound"} + { + "name": "MemberAlreadyExists", + "description": "Member already exists in the team." + } ] } } }; -/// `tools.ozone.moderation.getRecords` -const toolsOzoneModerationGetRecords = { +/// `tools.ozone.team.defs` +const toolsOzoneTeamDefs = { "lexicon": 1, - "id": "tools.ozone.moderation.getRecords", + "id": "tools.ozone.team.defs", "defs": { - "main": { - "type": "query", - "description": "Get details about some records.", - "parameters": { - "type": "params", - "required": ["uris"], - "properties": { - "uris": { - "type": "array", - "items": {"type": "string", "format": "at-uri"}, - "maxLength": 100 - } - } - }, - "output": { - "encoding": "application/json", - "schema": { - "type": "object", - "required": ["records"], - "properties": { - "records": { - "type": "array", - "items": { - "type": "union", - "refs": [ - "tools.ozone.moderation.defs#recordViewDetail", - "tools.ozone.moderation.defs#recordViewNotFound" - ] - } - } - } + "member": { + "type": "object", + "required": ["did", "role"], + "properties": { + "did": {"type": "string", "format": "did"}, + "disabled": {"type": "boolean"}, + "profile": { + "type": "ref", + "ref": "app.bsky.actor.defs#profileViewDetailed" + }, + "createdAt": {"type": "string", "format": "datetime"}, + "updatedAt": {"type": "string", "format": "datetime"}, + "lastUpdatedBy": {"type": "string"}, + "role": { + "type": "string", + "knownValues": ["#roleAdmin", "#roleModerator", "#roleTriage"] } } + }, + "roleAdmin": { + "type": "token", + "description": + "Admin role. Highest level of access, can perform all actions." + }, + "roleModerator": { + "type": "token", + "description": "Moderator role. Can perform most actions." + }, + "roleTriage": { + "type": "token", + "description": + "Triage role. Mostly intended for monitoring and escalating issues." } } }; -/// `tools.ozone.set.deleteSet` -const toolsOzoneSetDeleteSet = { +/// `tools.ozone.team.updateMember` +const toolsOzoneTeamUpdateMember = { "lexicon": 1, - "id": "tools.ozone.set.deleteSet", + "id": "tools.ozone.team.updateMember", "defs": { "main": { "type": "procedure", "description": - "Delete an entire set. Attempting to delete a set that does not exist will result in an error.", + "Update a member in the ozone service. Requires admin role.", "input": { "encoding": "application/json", "schema": { "type": "object", - "required": ["name"], + "required": ["did"], "properties": { - "name": { + "did": {"type": "string", "format": "did"}, + "disabled": {"type": "boolean"}, + "role": { "type": "string", - "description": "Name of the set to delete" + "knownValues": [ + "tools.ozone.team.defs#roleAdmin", + "tools.ozone.team.defs#roleModerator", + "tools.ozone.team.defs#roleTriage" + ] } } } }, "output": { "encoding": "application/json", - "schema": {"type": "object", "properties": {}} + "schema": {"type": "ref", "ref": "tools.ozone.team.defs#member"} }, "errors": [ { - "name": "SetNotFound", - "description": "set with the given name does not exist" + "name": "MemberNotFound", + "description": "The member being updated does not exist in the team" } ] } } }; -/// `tools.ozone.set.deleteValues` -const toolsOzoneSetDeleteValues = { +/// `tools.ozone.set.getValues` +const toolsOzoneSetGetValues = { "lexicon": 1, - "id": "tools.ozone.set.deleteValues", + "id": "tools.ozone.set.getValues", "defs": { "main": { - "type": "procedure", - "description": - "Delete values from a specific set. Attempting to delete values that are not in the set will not result in an error", - "input": { + "type": "query", + "description": "Get a specific set and its values", + "parameters": { + "type": "params", + "required": ["name"], + "properties": { + "name": {"type": "string"}, + "limit": { + "type": "integer", + "default": 100, + "minimum": 1, + "maximum": 1000 + }, + "cursor": {"type": "string"} + } + }, + "output": { "encoding": "application/json", "schema": { "type": "object", - "required": ["name", "values"], + "required": ["set", "values"], "properties": { - "name": { - "type": "string", - "description": "Name of the set to delete values from" - }, + "set": {"type": "ref", "ref": "tools.ozone.set.defs#setView"}, "values": { "type": "array", - "description": "Array of string values to delete from the set", - "items": {"type": "string"}, - "minLength": 1 - } + "items": {"type": "string"} + }, + "cursor": {"type": "string"} } } }, @@ -10964,121 +11314,6 @@ const toolsOzoneSetQuerySets = { } }; -/// `tools.ozone.set.defs` -const toolsOzoneSetDefs = { - "lexicon": 1, - "id": "tools.ozone.set.defs", - "defs": { - "set": { - "type": "object", - "required": ["name"], - "properties": { - "name": {"type": "string", "minLength": 3, "maxLength": 128}, - "description": { - "type": "string", - "maxLength": 10240, - "maxGraphemes": 1024 - } - } - }, - "setView": { - "type": "object", - "required": ["name", "setSize", "createdAt", "updatedAt"], - "properties": { - "name": {"type": "string", "minLength": 3, "maxLength": 128}, - "description": { - "type": "string", - "maxLength": 10240, - "maxGraphemes": 1024 - }, - "setSize": {"type": "integer"}, - "createdAt": {"type": "string", "format": "datetime"}, - "updatedAt": {"type": "string", "format": "datetime"} - } - } - } -}; - -/// `tools.ozone.set.addValues` -const toolsOzoneSetAddValues = { - "lexicon": 1, - "id": "tools.ozone.set.addValues", - "defs": { - "main": { - "type": "procedure", - "description": - "Add values to a specific set. Attempting to add values to a set that does not exist will result in an error.", - "input": { - "encoding": "application/json", - "schema": { - "type": "object", - "required": ["name", "values"], - "properties": { - "name": { - "type": "string", - "description": "Name of the set to add values to" - }, - "values": { - "type": "array", - "description": "Array of string values to add to the set", - "items": {"type": "string"}, - "minLength": 1, - "maxLength": 1000 - } - } - } - } - } - } -}; - -/// `tools.ozone.set.getValues` -const toolsOzoneSetGetValues = { - "lexicon": 1, - "id": "tools.ozone.set.getValues", - "defs": { - "main": { - "type": "query", - "description": "Get a specific set and its values", - "parameters": { - "type": "params", - "required": ["name"], - "properties": { - "name": {"type": "string"}, - "limit": { - "type": "integer", - "default": 100, - "minimum": 1, - "maximum": 1000 - }, - "cursor": {"type": "string"} - } - }, - "output": { - "encoding": "application/json", - "schema": { - "type": "object", - "required": ["set", "values"], - "properties": { - "set": {"type": "ref", "ref": "tools.ozone.set.defs#setView"}, - "values": { - "type": "array", - "items": {"type": "string"} - }, - "cursor": {"type": "string"} - } - } - }, - "errors": [ - { - "name": "SetNotFound", - "description": "set with the given name does not exist" - } - ] - } - } -}; - /// `tools.ozone.set.upsertSet` const toolsOzoneSetUpsertSet = { "lexicon": 1, @@ -11098,439 +11333,377 @@ const toolsOzoneSetUpsertSet = { } } }; - -/// `tools.ozone.communication.defs` -const toolsOzoneCommunicationDefs = { - "lexicon": 1, - "id": "tools.ozone.communication.defs", - "defs": { - "templateView": { - "type": "object", - "required": [ - "id", - "name", - "contentMarkdown", - "disabled", - "lastUpdatedBy", - "createdAt", - "updatedAt" - ], - "properties": { - "id": {"type": "string"}, - "name": {"type": "string", "description": "Name of the template."}, - "subject": { - "type": "string", - "description": - "Content of the template, can contain markdown and variable placeholders." - }, - "contentMarkdown": { - "type": "string", - "description": "Subject of the message, used in emails." - }, - "disabled": {"type": "boolean"}, - "lang": { - "type": "string", - "format": "language", - "description": "Message language." - }, - "lastUpdatedBy": { - "type": "string", - "format": "did", - "description": "DID of the user who last updated the template." - }, - "createdAt": {"type": "string", "format": "datetime"}, - "updatedAt": {"type": "string", "format": "datetime"} - } - } - } -}; - -/// `tools.ozone.communication.deleteTemplate` -const toolsOzoneCommunicationDeleteTemplate = { - "lexicon": 1, - "id": "tools.ozone.communication.deleteTemplate", - "defs": { - "main": { - "type": "procedure", - "description": "Delete a communication template.", - "input": { - "encoding": "application/json", - "schema": { - "type": "object", - "required": ["id"], - "properties": { - "id": {"type": "string"} - } - } - } - } - } -}; - -/// `tools.ozone.communication.listTemplates` -const toolsOzoneCommunicationListTemplates = { + +/// `tools.ozone.set.deleteValues` +const toolsOzoneSetDeleteValues = { "lexicon": 1, - "id": "tools.ozone.communication.listTemplates", + "id": "tools.ozone.set.deleteValues", "defs": { "main": { - "type": "query", - "description": "Get list of all communication templates.", - "output": { + "type": "procedure", + "description": + "Delete values from a specific set. Attempting to delete values that are not in the set will not result in an error", + "input": { "encoding": "application/json", "schema": { "type": "object", - "required": ["communicationTemplates"], + "required": ["name", "values"], "properties": { - "communicationTemplates": { + "name": { + "type": "string", + "description": "Name of the set to delete values from" + }, + "values": { "type": "array", - "items": { - "type": "ref", - "ref": "tools.ozone.communication.defs#templateView" - } + "description": "Array of string values to delete from the set", + "items": {"type": "string"}, + "minLength": 1 } } } - } + }, + "errors": [ + { + "name": "SetNotFound", + "description": "set with the given name does not exist" + } + ] } } }; -/// `tools.ozone.communication.updateTemplate` -const toolsOzoneCommunicationUpdateTemplate = { +/// `tools.ozone.set.addValues` +const toolsOzoneSetAddValues = { "lexicon": 1, - "id": "tools.ozone.communication.updateTemplate", + "id": "tools.ozone.set.addValues", "defs": { "main": { "type": "procedure", "description": - "Administrative action to update an existing communication template. Allows passing partial fields to patch specific fields only.", + "Add values to a specific set. Attempting to add values to a set that does not exist will result in an error.", "input": { "encoding": "application/json", "schema": { "type": "object", - "required": ["id"], + "required": ["name", "values"], "properties": { - "id": { - "type": "string", - "description": "ID of the template to be updated." - }, - "name": {"type": "string", "description": "Name of the template."}, - "lang": { - "type": "string", - "format": "language", - "description": "Message language." - }, - "contentMarkdown": { - "type": "string", - "description": - "Content of the template, markdown supported, can contain variable placeholders." - }, - "subject": { - "type": "string", - "description": "Subject of the message, used in emails." - }, - "updatedBy": { + "name": { "type": "string", - "format": "did", - "description": "DID of the user who is updating the template." + "description": "Name of the set to add values to" }, - "disabled": {"type": "boolean"} + "values": { + "type": "array", + "description": "Array of string values to add to the set", + "items": {"type": "string"}, + "minLength": 1, + "maxLength": 1000 + } } } - }, - "output": { - "encoding": "application/json", - "schema": { - "type": "ref", - "ref": "tools.ozone.communication.defs#templateView" - } - }, - "errors": [ - {"name": "DuplicateTemplateName"} - ] + } } } }; -/// `tools.ozone.communication.createTemplate` -const toolsOzoneCommunicationCreateTemplate = { +/// `tools.ozone.set.deleteSet` +const toolsOzoneSetDeleteSet = { "lexicon": 1, - "id": "tools.ozone.communication.createTemplate", + "id": "tools.ozone.set.deleteSet", "defs": { "main": { "type": "procedure", "description": - "Administrative action to create a new, re-usable communication (email for now) template.", + "Delete an entire set. Attempting to delete a set that does not exist will result in an error.", "input": { "encoding": "application/json", "schema": { "type": "object", - "required": ["subject", "contentMarkdown", "name"], + "required": ["name"], "properties": { - "name": {"type": "string", "description": "Name of the template."}, - "contentMarkdown": { - "type": "string", - "description": - "Content of the template, markdown supported, can contain variable placeholders." - }, - "subject": { - "type": "string", - "description": "Subject of the message, used in emails." - }, - "lang": { - "type": "string", - "format": "language", - "description": "Message language." - }, - "createdBy": { + "name": { "type": "string", - "format": "did", - "description": "DID of the user who is creating the template." + "description": "Name of the set to delete" } } } }, "output": { "encoding": "application/json", - "schema": { - "type": "ref", - "ref": "tools.ozone.communication.defs#templateView" - } + "schema": {"type": "object", "properties": {}} }, "errors": [ - {"name": "DuplicateTemplateName"} + { + "name": "SetNotFound", + "description": "set with the given name does not exist" + } ] } } }; +/// `tools.ozone.set.defs` +const toolsOzoneSetDefs = { + "lexicon": 1, + "id": "tools.ozone.set.defs", + "defs": { + "set": { + "type": "object", + "required": ["name"], + "properties": { + "name": {"type": "string", "minLength": 3, "maxLength": 128}, + "description": { + "type": "string", + "maxLength": 10240, + "maxGraphemes": 1024 + } + } + }, + "setView": { + "type": "object", + "required": ["name", "setSize", "createdAt", "updatedAt"], + "properties": { + "name": {"type": "string", "minLength": 3, "maxLength": 128}, + "description": { + "type": "string", + "maxLength": 10240, + "maxGraphemes": 1024 + }, + "setSize": {"type": "integer"}, + "createdAt": {"type": "string", "format": "datetime"}, + "updatedAt": {"type": "string", "format": "datetime"} + } + } + } +}; + /// The collection of official lexicons. const lexicons = >[ - comAtprotoSyncGetRepo, - comAtprotoSyncGetRepoStatus, - comAtprotoSyncListRepos, - comAtprotoSyncListBlobs, - comAtprotoSyncGetBlocks, - comAtprotoSyncGetHead, - comAtprotoSyncGetLatestCommit, - comAtprotoSyncGetBlob, - comAtprotoSyncSubscribeRepos, - comAtprotoSyncGetCheckout, - comAtprotoSyncGetRecord, - comAtprotoSyncNotifyOfUpdate, - comAtprotoSyncRequestCrawl, - comAtprotoAdminGetSubjectStatus, comAtprotoAdminUpdateAccountEmail, - comAtprotoAdminGetAccountInfo, - comAtprotoAdminDefs, - comAtprotoAdminDisableAccountInvites, - comAtprotoAdminEnableAccountInvites, - comAtprotoAdminUpdateAccountHandle, - comAtprotoAdminDisableInviteCodes, + comAtprotoAdminGetSubjectStatus, + comAtprotoAdminSendEmail, comAtprotoAdminGetAccountInfos, - comAtprotoAdminGetInviteCodes, - comAtprotoAdminUpdateAccountPassword, + comAtprotoAdminDisableAccountInvites, comAtprotoAdminDeleteAccount, - comAtprotoAdminSendEmail, comAtprotoAdminSearchAccounts, + comAtprotoAdminDisableInviteCodes, + comAtprotoAdminUpdateAccountHandle, + comAtprotoAdminGetInviteCodes, + comAtprotoAdminGetAccountInfo, comAtprotoAdminUpdateSubjectStatus, - comAtprotoLabelQueryLabels, - comAtprotoLabelDefs, - comAtprotoLabelSubscribeLabels, - comAtprotoServerUpdateEmail, - comAtprotoServerListAppPasswords, - comAtprotoServerCreateAccount, - comAtprotoServerDeleteSession, - comAtprotoServerCreateAppPassword, + comAtprotoAdminUpdateAccountPassword, + comAtprotoAdminEnableAccountInvites, + comAtprotoAdminDefs, + comAtprotoServerReserveSigningKey, + comAtprotoServerRequestEmailUpdate, comAtprotoServerConfirmEmail, + comAtprotoServerGetSession, comAtprotoServerDescribeServer, - comAtprotoServerDefs, - comAtprotoServerRequestPasswordReset, - comAtprotoServerRequestAccountDelete, - comAtprotoServerActivateAccount, - comAtprotoServerCreateInviteCodes, + comAtprotoServerDeleteSession, + comAtprotoServerCreateInviteCode, + comAtprotoServerCheckAccountStatus, + comAtprotoServerGetAccountInviteCodes, + comAtprotoServerCreateAccount, comAtprotoServerRevokeAppPassword, + comAtprotoServerActivateAccount, + comAtprotoServerCreateSession, comAtprotoServerDeactivateAccount, + comAtprotoServerRequestAccountDelete, comAtprotoServerRequestEmailConfirmation, - comAtprotoServerRefreshSession, - comAtprotoServerRequestEmailUpdate, + comAtprotoServerDeleteAccount, + comAtprotoServerCreateAppPassword, comAtprotoServerResetPassword, + comAtprotoServerRefreshSession, + comAtprotoServerCreateInviteCodes, + comAtprotoServerListAppPasswords, + comAtprotoServerRequestPasswordReset, + comAtprotoServerDefs, + comAtprotoServerUpdateEmail, comAtprotoServerGetServiceAuth, - comAtprotoServerReserveSigningKey, - comAtprotoServerGetAccountInviteCodes, - comAtprotoServerCreateInviteCode, - comAtprotoServerDeleteAccount, - comAtprotoServerCheckAccountStatus, - comAtprotoServerGetSession, - comAtprotoServerCreateSession, - comAtprotoModerationDefs, + comAtprotoLexiconSchema, comAtprotoModerationCreateReport, - comAtprotoRepoCreateRecord, + comAtprotoModerationDefs, + comAtprotoSyncGetCheckout, + comAtprotoSyncGetHead, + comAtprotoSyncListRepos, + comAtprotoSyncGetBlocks, + comAtprotoSyncListBlobs, + comAtprotoSyncNotifyOfUpdate, + comAtprotoSyncGetRepo, + comAtprotoSyncGetLatestCommit, + comAtprotoSyncGetRecord, + comAtprotoSyncRequestCrawl, + comAtprotoSyncSubscribeRepos, + comAtprotoSyncGetRepoStatus, + comAtprotoSyncGetBlob, + comAtprotoIdentityGetRecommendedDidCredentials, + comAtprotoIdentitySignPlcOperation, + comAtprotoIdentityRequestPlcOperationSignature, + comAtprotoIdentityUpdateHandle, + comAtprotoIdentitySubmitPlcOperation, + comAtprotoIdentityResolveHandle, + comAtprotoTempFetchLabels, + comAtprotoTempRequestPhoneVerification, + comAtprotoTempCheckSignupQueue, + comAtprotoTempAddReservedHandle, comAtprotoRepoImportRepo, - comAtprotoRepoDefs, - comAtprotoRepoUploadBlob, + comAtprotoRepoCreateRecord, comAtprotoRepoDescribeRepo, - comAtprotoRepoListRecords, - comAtprotoRepoDeleteRecord, - comAtprotoRepoStrongRef, - comAtprotoRepoApplyWrites, comAtprotoRepoListMissingBlobs, + comAtprotoRepoStrongRef, + comAtprotoRepoListRecords, comAtprotoRepoGetRecord, comAtprotoRepoPutRecord, - comAtprotoTempAddReservedHandle, - comAtprotoTempRequestPhoneVerification, - comAtprotoTempFetchLabels, - comAtprotoTempCheckSignupQueue, - comAtprotoIdentitySubmitPlcOperation, - comAtprotoIdentityUpdateHandle, - comAtprotoIdentitySignPlcOperation, - comAtprotoIdentityResolveHandle, - comAtprotoIdentityRequestPlcOperationSignature, - comAtprotoIdentityGetRecommendedDidCredentials, + comAtprotoRepoDeleteRecord, + comAtprotoRepoApplyWrites, + comAtprotoRepoUploadBlob, + comAtprotoRepoDefs, + comAtprotoLabelSubscribeLabels, + comAtprotoLabelQueryLabels, + comAtprotoLabelDefs, + appBskyVideoGetJobStatus, + appBskyVideoUploadVideo, + appBskyVideoGetUploadLimits, + appBskyVideoDefs, + appBskyFeedGetActorFeeds, + appBskyFeedGetRepostedBy, + appBskyFeedGetSuggestedFeeds, + appBskyFeedSearchPosts, + appBskyFeedGetPostThread, + appBskyFeedSendInteractions, appBskyFeedGetFeedGenerators, + appBskyFeedGetFeedGenerator, + appBskyFeedGetPosts, + appBskyFeedThreadgate, + appBskyFeedGetLikes, + appBskyFeedGenerator, + appBskyFeedGetFeedSkeleton, + appBskyFeedGetActorLikes, + appBskyFeedPost, + appBskyFeedLike, + appBskyFeedRepost, + appBskyFeedDescribeFeedGenerator, appBskyFeedGetQuotes, appBskyFeedGetTimeline, - appBskyFeedPost, appBskyFeedPostgate, appBskyFeedDefs, - appBskyFeedGetActorLikes, - appBskyFeedGetPostThread, - appBskyFeedThreadgate, - appBskyFeedGetActorFeeds, - appBskyFeedGetPosts, - appBskyFeedRepost, - appBskyFeedGetLikes, - appBskyFeedGetFeedGenerator, - appBskyFeedGetListFeed, - appBskyFeedDescribeFeedGenerator, - appBskyFeedSearchPosts, - appBskyFeedGenerator, - appBskyFeedSendInteractions, appBskyFeedGetAuthorFeed, - appBskyFeedGetRepostedBy, - appBskyFeedLike, - appBskyFeedGetSuggestedFeeds, appBskyFeedGetFeed, - appBskyFeedGetFeedSkeleton, + appBskyFeedGetListFeed, + appBskyEmbedExternal, + appBskyEmbedRecord, appBskyEmbedImages, - appBskyEmbedDefs, appBskyEmbedRecordWithMedia, appBskyEmbedVideo, - appBskyEmbedExternal, - appBskyEmbedRecord, - appBskyNotificationUpdateSeen, - appBskyNotificationGetUnreadCount, - appBskyNotificationRegisterPush, - appBskyNotificationPutPreferences, - appBskyNotificationListNotifications, - appBskyVideoGetJobStatus, - appBskyVideoDefs, - appBskyVideoUploadVideo, - appBskyVideoGetUploadLimits, - appBskyActorDefs, - appBskyActorPutPreferences, - appBskyActorGetProfiles, - appBskyActorGetPreferences, - appBskyActorGetSuggestions, - appBskyActorGetProfile, - appBskyActorSearchActorsTypeahead, - appBskyActorSearchActors, - appBskyActorProfile, + appBskyEmbedDefs, appBskyRichtextFacet, - appBskyUnspeccedSearchStarterPacksSkeleton, - appBskyUnspeccedDefs, - appBskyUnspeccedGetPopularFeedGenerators, - appBskyUnspeccedGetSuggestionsSkeleton, - appBskyUnspeccedSearchActorsSkeleton, - appBskyUnspeccedGetConfig, - appBskyUnspeccedGetTrendingTopics, - appBskyUnspeccedGetTaggedSuggestions, - appBskyUnspeccedSearchPostsSkeleton, - appBskyLabelerDefs, - appBskyLabelerService, - appBskyLabelerGetServices, - appBskyGraphSearchStarterPacks, - appBskyGraphList, - appBskyGraphMuteActorList, - appBskyGraphGetRelationships, - appBskyGraphGetListBlocks, - appBskyGraphBlock, - appBskyGraphDefs, - appBskyGraphGetList, + appBskyGraphGetListMutes, + appBskyGraphUnmuteThread, appBskyGraphMuteThread, - appBskyGraphGetStarterPacks, + appBskyGraphGetBlocks, + appBskyGraphGetList, appBskyGraphGetKnownFollowers, + appBskyGraphGetStarterPack, + appBskyGraphList, appBskyGraphUnmuteActorList, - appBskyGraphListitem, - appBskyGraphGetLists, - appBskyGraphGetFollowers, - appBskyGraphGetActorStarterPacks, + appBskyGraphBlock, appBskyGraphGetMutes, - appBskyGraphMuteActor, - appBskyGraphGetBlocks, - appBskyGraphStarterpack, - appBskyGraphGetListMutes, - appBskyGraphGetStarterPack, - appBskyGraphFollow, appBskyGraphListblock, - appBskyGraphUnmuteActor, - appBskyGraphUnmuteThread, appBskyGraphGetFollows, + appBskyGraphGetStarterPacks, + appBskyGraphGetFollowers, + appBskyGraphListitem, + appBskyGraphMuteActorList, + appBskyGraphStarterpack, + appBskyGraphSearchStarterPacks, + appBskyGraphGetRelationships, + appBskyGraphUnmuteActor, + appBskyGraphGetActorStarterPacks, + appBskyGraphGetListBlocks, + appBskyGraphFollow, + appBskyGraphGetLists, + appBskyGraphMuteActor, + appBskyGraphDefs, appBskyGraphGetSuggestedFollowsByActor, - chatBskyConvoGetConvo, + appBskyNotificationUpdateSeen, + appBskyNotificationRegisterPush, + appBskyNotificationGetUnreadCount, + appBskyNotificationListNotifications, + appBskyNotificationPutPreferences, + appBskyLabelerGetServices, + appBskyLabelerDefs, + appBskyLabelerService, + appBskyUnspeccedSearchStarterPacksSkeleton, + appBskyUnspeccedGetPopularFeedGenerators, + appBskyUnspeccedGetTaggedSuggestions, + appBskyUnspeccedGetSuggestionsSkeleton, + appBskyUnspeccedGetTrendingTopics, + appBskyUnspeccedGetConfig, + appBskyUnspeccedSearchPostsSkeleton, + appBskyUnspeccedDefs, + appBskyUnspeccedSearchActorsSkeleton, + appBskyActorSearchActors, + appBskyActorGetSuggestions, + appBskyActorGetProfile, + appBskyActorGetProfiles, + appBskyActorProfile, + appBskyActorSearchActorsTypeahead, + appBskyActorGetPreferences, + appBskyActorPutPreferences, + appBskyActorDefs, + chatBskyModerationUpdateActorAccess, + chatBskyModerationGetActorMetadata, + chatBskyModerationGetMessageContext, chatBskyConvoLeaveConvo, - chatBskyConvoSendMessageBatch, - chatBskyConvoListConvos, - chatBskyConvoDefs, chatBskyConvoGetLog, - chatBskyConvoDeleteMessageForSelf, - chatBskyConvoUnmuteConvo, + chatBskyConvoUpdateRead, + chatBskyConvoGetConvo, chatBskyConvoMuteConvo, - chatBskyConvoGetConvoForMembers, + chatBskyConvoUnmuteConvo, + chatBskyConvoListConvos, chatBskyConvoSendMessage, - chatBskyConvoUpdateRead, + chatBskyConvoSendMessageBatch, chatBskyConvoGetMessages, - chatBskyModerationGetActorMetadata, - chatBskyModerationUpdateActorAccess, - chatBskyModerationGetMessageContext, - chatBskyActorDefs, + chatBskyConvoDeleteMessageForSelf, + chatBskyConvoGetConvoForMembers, + chatBskyConvoDefs, chatBskyActorDeclaration, - chatBskyActorDeleteAccount, chatBskyActorExportAccountData, - toolsOzoneSettingDefs, - toolsOzoneSettingRemoveOptions, - toolsOzoneSettingListOptions, - toolsOzoneSettingUpsertOption, - toolsOzoneSignatureFindRelatedAccounts, - toolsOzoneSignatureDefs, + chatBskyActorDeleteAccount, + chatBskyActorDefs, toolsOzoneSignatureFindCorrelation, + toolsOzoneSignatureFindRelatedAccounts, toolsOzoneSignatureSearchAccounts, + toolsOzoneSignatureDefs, toolsOzoneServerGetConfig, - toolsOzoneTeamUpdateMember, - toolsOzoneTeamDefs, - toolsOzoneTeamDeleteMember, - toolsOzoneTeamAddMember, - toolsOzoneTeamListMembers, + toolsOzoneSettingListOptions, + toolsOzoneSettingUpsertOption, + toolsOzoneSettingRemoveOptions, + toolsOzoneSettingDefs, + toolsOzoneModerationGetRecords, + toolsOzoneModerationGetEvent, + toolsOzoneModerationQueryStatuses, toolsOzoneModerationGetRepos, toolsOzoneModerationGetRepo, - toolsOzoneModerationDefs, - toolsOzoneModerationQueryStatuses, - toolsOzoneModerationEmitEvent, - toolsOzoneModerationQueryEvents, toolsOzoneModerationSearchRepos, - toolsOzoneModerationGetEvent, toolsOzoneModerationGetRecord, - toolsOzoneModerationGetRecords, - toolsOzoneSetDeleteSet, - toolsOzoneSetDeleteValues, - toolsOzoneSetQuerySets, - toolsOzoneSetDefs, - toolsOzoneSetAddValues, - toolsOzoneSetGetValues, - toolsOzoneSetUpsertSet, - toolsOzoneCommunicationDefs, + toolsOzoneModerationQueryEvents, + toolsOzoneModerationEmitEvent, + toolsOzoneModerationDefs, + toolsOzoneCommunicationCreateTemplate, toolsOzoneCommunicationDeleteTemplate, toolsOzoneCommunicationListTemplates, toolsOzoneCommunicationUpdateTemplate, - toolsOzoneCommunicationCreateTemplate, + toolsOzoneCommunicationDefs, + toolsOzoneTeamListMembers, + toolsOzoneTeamDeleteMember, + toolsOzoneTeamAddMember, + toolsOzoneTeamDefs, + toolsOzoneTeamUpdateMember, + toolsOzoneSetGetValues, + toolsOzoneSetQuerySets, + toolsOzoneSetUpsertSet, + toolsOzoneSetDeleteValues, + toolsOzoneSetAddValues, + toolsOzoneSetDeleteSet, + toolsOzoneSetDefs, ]; diff --git a/website/docs/lexicons/app/bsky/actor/getSuggestions.md b/website/docs/lexicons/app/bsky/actor/getSuggestions.md index 6c9228695..28788f0f7 100644 --- a/website/docs/lexicons/app/bsky/actor/getSuggestions.md +++ b/website/docs/lexicons/app/bsky/actor/getSuggestions.md @@ -24,3 +24,4 @@ Get a list of suggested actors. Expected use is discovery of accounts to follow | --- | --- | --- | :---: | --- | | **cursor** | string | - | ❌ | - | | **actors** | array of [app.bsky.actor.defs#profileView](../../../../lexicons/app/bsky/actor/defs.md#profileview) | - | ✅ | - | +| **recId** | integer | - | ❌ | Snowflake for this recommendation, use when submitting recommendation events. | diff --git a/website/docs/lexicons/app/bsky/feed/defs.md b/website/docs/lexicons/app/bsky/feed/defs.md index a497794e2..7520be9ff 100644 --- a/website/docs/lexicons/app/bsky/feed/defs.md +++ b/website/docs/lexicons/app/bsky/feed/defs.md @@ -36,6 +36,14 @@ Metadata about the requesting account's relationship with the subject content. O | **embeddingDisabled** | boolean | - | ❌ | - | | **pinned** | boolean | - | ❌ | - | +## #threadContext + +Metadata about this post within the context of the thread it is in. + +| Property | Type | Known Values | Required | Description | +| --- | --- | --- | :---: | --- | +| **rootAuthorLike** | string ([at-uri](https://atproto.com/specs/at-uri-scheme)) | - | ❌ | - | + ## #feedViewPost | Property | Type | Known Values | Required | Description | @@ -69,6 +77,7 @@ Metadata about the requesting account's relationship with the subject content. O | **post** | [#postView](#postview) | - | ✅ | - | | **parent** | union of
[#threadViewPost](#threadviewpost)
[#notFoundPost](#notfoundpost)
[#blockedPost](#blockedpost) | - | ❌ | - | | **replies** | array of union
[#threadViewPost](#threadviewpost)
[#notFoundPost](#notfoundpost)
[#blockedPost](#blockedpost) | - | ❌ | - | +| **threadContext** | [#threadContext](#threadcontext) | - | ❌ | - | ## #notFoundPost @@ -108,6 +117,7 @@ Metadata about the requesting account's relationship with the subject content. O | **acceptsInteractions** | boolean | - | ❌ | - | | **labels** | array of [com.atproto.label.defs#label](../../../../lexicons/com/atproto/label/defs.md#label) | - | ❌ | - | | **viewer** | [#generatorViewerState](#generatorviewerstate) | - | ❌ | - | +| **contentMode** | string | [app.bsky.feed.defs#contentModeUnspecified](../../../../lexicons/app/bsky/feed/defs.md#contentmodeunspecified)
[app.bsky.feed.defs#contentModeVideo](../../../../lexicons/app/bsky/feed/defs.md#contentmodevideo) | ❌ | - | | **indexedAt** | string ([datetime](https://atproto.com/specs/lexicon#datetime)) | - | ✅ | - | ## #generatorViewerState @@ -173,6 +183,14 @@ Metadata about the requesting account's relationship with the subject content. O **TOKEN**: User clicked through to the embedded content of the feed item +## #contentModeUnspecified + +**TOKEN**: Declares the feed generator returns any types of posts. + +## #contentModeVideo + +**TOKEN**: Declares the feed generator returns posts containing app.bsky.embed.video embeds. + ## #interactionSeen **TOKEN**: Feed item was seen by user diff --git a/website/docs/lexicons/app/bsky/feed/generator.md b/website/docs/lexicons/app/bsky/feed/generator.md index 74cb46f0a..efacb4b7b 100644 --- a/website/docs/lexicons/app/bsky/feed/generator.md +++ b/website/docs/lexicons/app/bsky/feed/generator.md @@ -22,6 +22,7 @@ Use [com.atproto.repo.createRecord](../../../../lexicons/com/atproto/repo/create | **avatar** | [blob](https://atproto.com/specs/data-model#blob-type) | - | ❌ | - | | **acceptsInteractions** | boolean | - | ❌ | Declaration that a feed accepts feedback interactions from a client through app.bsky.feed.sendInteractions | | **labels** | union of
[com.atproto.label.defs#selfLabels](../../../../lexicons/com/atproto/label/defs.md#selflabels) | - | ❌ | - | +| **contentMode** | string | [app.bsky.feed.defs#contentModeUnspecified](../../../../lexicons/app/bsky/feed/defs.md#contentmodeunspecified)
[app.bsky.feed.defs#contentModeVideo](../../../../lexicons/app/bsky/feed/defs.md#contentmodevideo) | ❌ | - | | **createdAt** | string ([datetime](https://atproto.com/specs/lexicon#datetime)) | - | ✅ | - | ### Output diff --git a/website/docs/lexicons/app/bsky/feed/getAuthorFeed.md b/website/docs/lexicons/app/bsky/feed/getAuthorFeed.md index f1003450f..653e24b0e 100644 --- a/website/docs/lexicons/app/bsky/feed/getAuthorFeed.md +++ b/website/docs/lexicons/app/bsky/feed/getAuthorFeed.md @@ -16,7 +16,7 @@ Get a view of an actor's 'author feed' (post and reposts by the author). Does no | **actor** | string ([at-identifier](https://atproto.com/specs/lexicon#at-identifier)) | - | ✅ | - | | **limit** | integer | - | ❌ | - | | **cursor** | string | - | ❌ | - | -| **filter** | string | posts_with_replies
posts_no_replies
posts_with_media
posts_and_author_threads | ❌ | Combinations of post/repost types to include in response. | +| **filter** | string | posts_with_replies
posts_no_replies
posts_with_media
posts_and_author_threads
posts_with_video | ❌ | Combinations of post/repost types to include in response. | | **includePins** | boolean | - | ❌ | - | ### Output diff --git a/website/docs/lexicons/app/bsky/graph/getSuggestedFollowsByActor.md b/website/docs/lexicons/app/bsky/graph/getSuggestedFollowsByActor.md index db544052a..13e0d9a2d 100644 --- a/website/docs/lexicons/app/bsky/graph/getSuggestedFollowsByActor.md +++ b/website/docs/lexicons/app/bsky/graph/getSuggestedFollowsByActor.md @@ -23,3 +23,4 @@ Enumerates follows similar to a given account (actor). Expected use is to recomm | --- | --- | --- | :---: | --- | | **suggestions** | array of [app.bsky.actor.defs#profileView](../../../../lexicons/app/bsky/actor/defs.md#profileview) | - | ✅ | - | | **isFallback** | boolean | - | ❌ | If true, response has fallen-back to generic results, and is not scoped using relativeToDid | +| **recId** | integer | - | ❌ | Snowflake for this recommendation, use when submitting recommendation events. | diff --git a/website/docs/lexicons/app/bsky/unspecced/getSuggestionsSkeleton.md b/website/docs/lexicons/app/bsky/unspecced/getSuggestionsSkeleton.md index 6d728acc6..d7ab45844 100644 --- a/website/docs/lexicons/app/bsky/unspecced/getSuggestionsSkeleton.md +++ b/website/docs/lexicons/app/bsky/unspecced/getSuggestionsSkeleton.md @@ -27,3 +27,4 @@ Get a skeleton of suggested actors. Intended to be called and then hydrated thro | **cursor** | string | - | ❌ | - | | **actors** | array of [app.bsky.unspecced.defs#skeletonSearchActor](../../../../lexicons/app/bsky/unspecced/defs.md#skeletonsearchactor) | - | ✅ | - | | **relativeToDid** | string ([did](https://atproto.com/specs/did)) | - | ❌ | DID of the account these suggestions are relative to. If this is returned undefined, suggestions are based on the viewer. | +| **recId** | integer | - | ❌ | Snowflake for this recommendation, use when submitting recommendation events. | diff --git a/website/docs/lexicons/com/atproto/lexicon/schema.md b/website/docs/lexicons/com/atproto/lexicon/schema.md new file mode 100644 index 000000000..f618cf163 --- /dev/null +++ b/website/docs/lexicons/com/atproto/lexicon/schema.md @@ -0,0 +1,24 @@ +--- +title: schema +description: com.atproto.lexicon.schema +--- + +# [com.atproto.lexicon.schema](https://github.com/myConsciousness/atproto.dart/blob/main/lexicons/com/atproto/lexicon/schema.json) + +## #main + +### Properties + +Representation of Lexicon schemas themselves, when published as atproto records. Note that the schema language is not defined in Lexicon; this meta schema currently only includes a single version field ('lexicon'). See the atproto specifications for description of the other expected top-level fields ('id', 'defs', etc). + +Use [com.atproto.repo.createRecord](../../../../lexicons/com/atproto/repo/createRecord.md#main) to create a record. + +| Property | Type | Known Values | Required | Description | +| --- | --- | --- | :---: | --- | +| **lexicon** | integer | - | ✅ | Indicates the 'version' of the Lexicon language. Must be '1' for the current atproto/Lexicon schema system. | + +### Output + +| Property | Type | Known Values | Required | Description | +| --- | --- | --- | :---: | --- | +| ref | [com.atproto.repo.strongRef](../../../../lexicons/com/atproto/repo/strongRef.md#main) | - | ✅ | - | diff --git a/website/docs/lexicons/tools/ozone/moderation/defs.md b/website/docs/lexicons/tools/ozone/moderation/defs.md index b0e624c17..9e4b2afc4 100644 --- a/website/docs/lexicons/tools/ozone/moderation/defs.md +++ b/website/docs/lexicons/tools/ozone/moderation/defs.md @@ -52,6 +52,35 @@ description: tools.ozone.moderation.defs | **appealed** | boolean | - | ❌ | True indicates that the a previously taken moderator action was appealed against, by the author of the content. False indicates last appeal was resolved by moderators. | | **suspendUntil** | string ([datetime](https://atproto.com/specs/lexicon#datetime)) | - | ❌ | - | | **tags** | array of string | - | ❌ | - | +| **accountStats** | [#accountStats](#accountstats) | - | ❌ | - | +| **recordsStats** | [#recordsStats](#recordsstats) | - | ❌ | - | + +## #accountStats + +Statistics about a particular account subject + +| Property | Type | Known Values | Required | Description | +| --- | --- | --- | :---: | --- | +| **reportCount** | integer | - | ❌ | Total number of reports on the account | +| **appealCount** | integer | - | ❌ | Total number of appeals against a moderation action on the account | +| **suspendCount** | integer | - | ❌ | Number of times the account was suspended | +| **escalateCount** | integer | - | ❌ | Number of times the account was escalated | +| **takedownCount** | integer | - | ❌ | Number of times the account was taken down | + +## #recordsStats + +Statistics about a set of record subject items + +| Property | Type | Known Values | Required | Description | +| --- | --- | --- | :---: | --- | +| **totalReports** | integer | - | ❌ | Cumulative sum of the number of reports on the items in the set | +| **reportedCount** | integer | - | ❌ | Number of items that were reported at least once | +| **escalatedCount** | integer | - | ❌ | Number of items that were escalated at least once | +| **appealedCount** | integer | - | ❌ | Number of items that were appealed at least once | +| **subjectCount** | integer | - | ❌ | Total number of item in the set | +| **pendingCount** | integer | - | ❌ | Number of item currently in "reviewOpen" or "reviewEscalated" state | +| **processedCount** | integer | - | ❌ | Number of item currently in "reviewNone" or "reviewClosed" state | +| **takendownCount** | integer | - | ❌ | Number of item currently taken down | ## #subjectReviewState diff --git a/website/docs/lexicons/tools/ozone/moderation/queryStatuses.md b/website/docs/lexicons/tools/ozone/moderation/queryStatuses.md index 9a447be65..3f787c936 100644 --- a/website/docs/lexicons/tools/ozone/moderation/queryStatuses.md +++ b/website/docs/lexicons/tools/ozone/moderation/queryStatuses.md @@ -43,6 +43,9 @@ View moderation statuses of subjects (record or repo). | **cursor** | string | - | ❌ | - | | **collections** | array of [nsid](https://atproto.com/specs/nsid) | - | ❌ | - | | **subjectType** | string | account
record | ❌ | If specified, subjects of the given type (account or record) will be returned. When this is set to 'account' the 'collections' parameter will be ignored. When includeAllUserRecords or subject is set, this will be ignored. | +| **minAccountSuspendCount** | integer | - | ❌ | If specified, only subjects that belong to an account that has at least this many suspensions will be returned. | +| **minReportedRecordsCount** | integer | - | ❌ | If specified, only subjects that belong to an account that has at least this many reported records will be returned. | +| **minTakendownRecordsCount** | integer | - | ❌ | If specified, only subjects that belong to an account that has at least this many taken down records will be returned. | ### Output diff --git a/website/docs/supported_api.md b/website/docs/supported_api.md index 69864115e..cdbc7d7e3 100644 --- a/website/docs/supported_api.md +++ b/website/docs/supported_api.md @@ -8,79 +8,60 @@ sidebar_position: 4 [![pub package](https://img.shields.io/pub/v/atproto.svg?logo=dart&logoColor=00b9fc)](https://pub.dartlang.org/packages/atproto) [![Dart SDK Version](https://badgen.net/pub/sdk-version/atproto)](https://pub.dev/packages/atproto/) -### com.atproto.sync - -| Method | Docs | Paging (cursor) | -| --- | --- | :---: | -| **[com.atproto.sync.getRepo](https://pub.dev/documentation/atproto/latest/atproto/SyncService/getRepo.html)** | [Reference](lexicons/com/atproto/sync/getRepo.md) | ❌ | -| **[com.atproto.sync.getRepoStatus](https://pub.dev/documentation/atproto/latest/atproto/SyncService/getRepoStatus.html)** | [Reference](lexicons/com/atproto/sync/getRepoStatus.md) | ❌ | -| **[com.atproto.sync.listRepos](https://pub.dev/documentation/atproto/latest/atproto/SyncService/listRepos.html)** | [Reference](lexicons/com/atproto/sync/listRepos.md) | ✅ | -| **[com.atproto.sync.listBlobs](https://pub.dev/documentation/atproto/latest/atproto/SyncService/listBlobs.html)** | [Reference](lexicons/com/atproto/sync/listBlobs.md) | ✅ | -| **[com.atproto.sync.getBlocks](https://pub.dev/documentation/atproto/latest/atproto/SyncService/getBlocks.html)** | [Reference](lexicons/com/atproto/sync/getBlocks.md) | ❌ | -| **[com.atproto.sync.getHead](https://pub.dev/documentation/atproto/latest/atproto/SyncService/getHead.html)** | [Reference](lexicons/com/atproto/sync/getHead.md) | ❌ | -| **[com.atproto.sync.getLatestCommit](https://pub.dev/documentation/atproto/latest/atproto/SyncService/getLatestCommit.html)** | [Reference](lexicons/com/atproto/sync/getLatestCommit.md) | ❌ | -| **[com.atproto.sync.getBlob](https://pub.dev/documentation/atproto/latest/atproto/SyncService/getBlob.html)** | [Reference](lexicons/com/atproto/sync/getBlob.md) | ❌ | -| **[com.atproto.sync.subscribeRepos](https://pub.dev/documentation/atproto/latest/atproto/SyncService/subscribeRepos.html)** | [Reference](lexicons/com/atproto/sync/subscribeRepos.md) | ✅ | -| **[com.atproto.sync.getCheckout](https://pub.dev/documentation/atproto/latest/atproto/SyncService/getCheckout.html)** | [Reference](lexicons/com/atproto/sync/getCheckout.md) | ❌ | -| **[com.atproto.sync.getRecord](https://pub.dev/documentation/atproto/latest/atproto/SyncService/getRecord.html)** | [Reference](lexicons/com/atproto/sync/getRecord.md) | ❌ | -| **[com.atproto.sync.notifyOfUpdate](https://pub.dev/documentation/atproto/latest/atproto/SyncService/notifyOfUpdate.html)** | [Reference](lexicons/com/atproto/sync/notifyOfUpdate.md) | ❌ | -| **[com.atproto.sync.requestCrawl](https://pub.dev/documentation/atproto/latest/atproto/SyncService/requestCrawl.html)** | [Reference](lexicons/com/atproto/sync/requestCrawl.md) | ❌ | - ### com.atproto.admin | Method | Docs | Paging (cursor) | | --- | --- | :---: | -| **[com.atproto.admin.getSubjectStatus](https://pub.dev/documentation/atproto/latest/atproto/AdminService/getSubjectStatus.html)** | [Reference](lexicons/com/atproto/admin/getSubjectStatus.md) | ❌ | | **[com.atproto.admin.updateAccountEmail](https://pub.dev/documentation/atproto/latest/atproto/AdminService/updateAccountEmail.html)** | [Reference](lexicons/com/atproto/admin/updateAccountEmail.md) | ❌ | -| **[com.atproto.admin.getAccountInfo](https://pub.dev/documentation/atproto/latest/atproto/AdminService/getAccountInfo.html)** | [Reference](lexicons/com/atproto/admin/getAccountInfo.md) | ❌ | -| **[com.atproto.admin.disableAccountInvites](https://pub.dev/documentation/atproto/latest/atproto/AdminService/disableAccountInvites.html)** | [Reference](lexicons/com/atproto/admin/disableAccountInvites.md) | ❌ | -| **[com.atproto.admin.enableAccountInvites](https://pub.dev/documentation/atproto/latest/atproto/AdminService/enableAccountInvites.html)** | [Reference](lexicons/com/atproto/admin/enableAccountInvites.md) | ❌ | -| **[com.atproto.admin.updateAccountHandle](https://pub.dev/documentation/atproto/latest/atproto/AdminService/updateAccountHandle.html)** | [Reference](lexicons/com/atproto/admin/updateAccountHandle.md) | ❌ | -| **[com.atproto.admin.disableInviteCodes](https://pub.dev/documentation/atproto/latest/atproto/AdminService/disableInviteCodes.html)** | [Reference](lexicons/com/atproto/admin/disableInviteCodes.md) | ❌ | +| **[com.atproto.admin.getSubjectStatus](https://pub.dev/documentation/atproto/latest/atproto/AdminService/getSubjectStatus.html)** | [Reference](lexicons/com/atproto/admin/getSubjectStatus.md) | ❌ | +| **[com.atproto.admin.sendEmail](https://pub.dev/documentation/atproto/latest/atproto/AdminService/sendEmail.html)** | [Reference](lexicons/com/atproto/admin/sendEmail.md) | ❌ | | **[com.atproto.admin.getAccountInfos](https://pub.dev/documentation/atproto/latest/atproto/AdminService/getAccountInfos.html)** | [Reference](lexicons/com/atproto/admin/getAccountInfos.md) | ❌ | -| **[com.atproto.admin.getInviteCodes](https://pub.dev/documentation/atproto/latest/atproto/AdminService/getInviteCodes.html)** | [Reference](lexicons/com/atproto/admin/getInviteCodes.md) | ✅ | -| **[com.atproto.admin.updateAccountPassword](https://pub.dev/documentation/atproto/latest/atproto/AdminService/updateAccountPassword.html)** | [Reference](lexicons/com/atproto/admin/updateAccountPassword.md) | ❌ | +| **[com.atproto.admin.disableAccountInvites](https://pub.dev/documentation/atproto/latest/atproto/AdminService/disableAccountInvites.html)** | [Reference](lexicons/com/atproto/admin/disableAccountInvites.md) | ❌ | | **[com.atproto.admin.deleteAccount](https://pub.dev/documentation/atproto/latest/atproto/AdminService/deleteAccount.html)** | [Reference](lexicons/com/atproto/admin/deleteAccount.md) | ❌ | -| **[com.atproto.admin.sendEmail](https://pub.dev/documentation/atproto/latest/atproto/AdminService/sendEmail.html)** | [Reference](lexicons/com/atproto/admin/sendEmail.md) | ❌ | | **[com.atproto.admin.searchAccounts](https://pub.dev/documentation/atproto/latest/atproto/AdminService/searchAccounts.html)** | [Reference](lexicons/com/atproto/admin/searchAccounts.md) | ✅ | +| **[com.atproto.admin.disableInviteCodes](https://pub.dev/documentation/atproto/latest/atproto/AdminService/disableInviteCodes.html)** | [Reference](lexicons/com/atproto/admin/disableInviteCodes.md) | ❌ | +| **[com.atproto.admin.updateAccountHandle](https://pub.dev/documentation/atproto/latest/atproto/AdminService/updateAccountHandle.html)** | [Reference](lexicons/com/atproto/admin/updateAccountHandle.md) | ❌ | +| **[com.atproto.admin.getInviteCodes](https://pub.dev/documentation/atproto/latest/atproto/AdminService/getInviteCodes.html)** | [Reference](lexicons/com/atproto/admin/getInviteCodes.md) | ✅ | +| **[com.atproto.admin.getAccountInfo](https://pub.dev/documentation/atproto/latest/atproto/AdminService/getAccountInfo.html)** | [Reference](lexicons/com/atproto/admin/getAccountInfo.md) | ❌ | | **[com.atproto.admin.updateSubjectStatus](https://pub.dev/documentation/atproto/latest/atproto/AdminService/updateSubjectStatus.html)** | [Reference](lexicons/com/atproto/admin/updateSubjectStatus.md) | ❌ | - -### com.atproto.label - -| Method | Docs | Paging (cursor) | -| --- | --- | :---: | -| **[com.atproto.label.queryLabels](https://pub.dev/documentation/atproto/latest/atproto/LabelService/queryLabels.html)** | [Reference](lexicons/com/atproto/label/queryLabels.md) | ✅ | -| **[com.atproto.label.subscribeLabels](https://pub.dev/documentation/atproto/latest/atproto/LabelService/subscribeLabels.html)** | [Reference](lexicons/com/atproto/label/subscribeLabels.md) | ✅ | +| **[com.atproto.admin.updateAccountPassword](https://pub.dev/documentation/atproto/latest/atproto/AdminService/updateAccountPassword.html)** | [Reference](lexicons/com/atproto/admin/updateAccountPassword.md) | ❌ | +| **[com.atproto.admin.enableAccountInvites](https://pub.dev/documentation/atproto/latest/atproto/AdminService/enableAccountInvites.html)** | [Reference](lexicons/com/atproto/admin/enableAccountInvites.md) | ❌ | ### com.atproto.server | Method | Docs | Paging (cursor) | | --- | --- | :---: | -| **[com.atproto.server.updateEmail](https://pub.dev/documentation/atproto/latest/atproto/ServerService/updateEmail.html)** | [Reference](lexicons/com/atproto/server/updateEmail.md) | ❌ | -| **[com.atproto.server.listAppPasswords](https://pub.dev/documentation/atproto/latest/atproto/ServerService/listAppPasswords.html)** | [Reference](lexicons/com/atproto/server/listAppPasswords.md) | ❌ | -| **[com.atproto.server.createAccount](https://pub.dev/documentation/atproto/latest/atproto/ServerService/createAccount.html)** | [Reference](lexicons/com/atproto/server/createAccount.md) | ❌ | -| **[com.atproto.server.deleteSession](https://pub.dev/documentation/atproto/latest/atproto/deleteSession.html)** | [Reference](lexicons/com/atproto/server/deleteSession.md) | ❌ | -| **[com.atproto.server.createAppPassword](https://pub.dev/documentation/atproto/latest/atproto/ServerService/createAppPassword.html)** | [Reference](lexicons/com/atproto/server/createAppPassword.md) | ❌ | +| **[com.atproto.server.reserveSigningKey](https://pub.dev/documentation/atproto/latest/atproto/ServerService/reserveSigningKey.html)** | [Reference](lexicons/com/atproto/server/reserveSigningKey.md) | ❌ | +| **[com.atproto.server.requestEmailUpdate](https://pub.dev/documentation/atproto/latest/atproto/ServerService/requestEmailUpdate.html)** | [Reference](lexicons/com/atproto/server/requestEmailUpdate.md) | ❌ | | **[com.atproto.server.confirmEmail](https://pub.dev/documentation/atproto/latest/atproto/ServerService/confirmEmail.html)** | [Reference](lexicons/com/atproto/server/confirmEmail.md) | ❌ | +| **[com.atproto.server.getSession](https://pub.dev/documentation/atproto/latest/atproto/ServerService/getSession.html)** | [Reference](lexicons/com/atproto/server/getSession.md) | ❌ | | **[com.atproto.server.describeServer](https://pub.dev/documentation/atproto/latest/atproto/ServerService/describeServer.html)** | [Reference](lexicons/com/atproto/server/describeServer.md) | ❌ | -| **[com.atproto.server.requestPasswordReset](https://pub.dev/documentation/atproto/latest/atproto/ServerService/requestPasswordReset.html)** | [Reference](lexicons/com/atproto/server/requestPasswordReset.md) | ❌ | -| **[com.atproto.server.requestAccountDelete](https://pub.dev/documentation/atproto/latest/atproto/ServerService/requestAccountDelete.html)** | [Reference](lexicons/com/atproto/server/requestAccountDelete.md) | ❌ | -| **[com.atproto.server.activateAccount](https://pub.dev/documentation/atproto/latest/atproto/ServerService/activateAccount.html)** | [Reference](lexicons/com/atproto/server/activateAccount.md) | ❌ | -| **[com.atproto.server.createInviteCodes](https://pub.dev/documentation/atproto/latest/atproto/ServerService/createInviteCodes.html)** | [Reference](lexicons/com/atproto/server/createInviteCodes.md) | ❌ | +| **[com.atproto.server.deleteSession](https://pub.dev/documentation/atproto/latest/atproto/deleteSession.html)** | [Reference](lexicons/com/atproto/server/deleteSession.md) | ❌ | +| **[com.atproto.server.createInviteCode](https://pub.dev/documentation/atproto/latest/atproto/ServerService/createInviteCode.html)** | [Reference](lexicons/com/atproto/server/createInviteCode.md) | ❌ | +| **[com.atproto.server.checkAccountStatus](https://pub.dev/documentation/atproto/latest/atproto/ServerService/checkAccountStatus.html)** | [Reference](lexicons/com/atproto/server/checkAccountStatus.md) | ❌ | +| **[com.atproto.server.getAccountInviteCodes](https://pub.dev/documentation/atproto/latest/atproto/ServerService/getAccountInviteCodes.html)** | [Reference](lexicons/com/atproto/server/getAccountInviteCodes.md) | ❌ | +| **[com.atproto.server.createAccount](https://pub.dev/documentation/atproto/latest/atproto/ServerService/createAccount.html)** | [Reference](lexicons/com/atproto/server/createAccount.md) | ❌ | | **[com.atproto.server.revokeAppPassword](https://pub.dev/documentation/atproto/latest/atproto/ServerService/revokeAppPassword.html)** | [Reference](lexicons/com/atproto/server/revokeAppPassword.md) | ❌ | +| **[com.atproto.server.activateAccount](https://pub.dev/documentation/atproto/latest/atproto/ServerService/activateAccount.html)** | [Reference](lexicons/com/atproto/server/activateAccount.md) | ❌ | +| **[com.atproto.server.createSession](https://pub.dev/documentation/atproto/latest/atproto/createSession.html)** | [Reference](lexicons/com/atproto/server/createSession.md) | ❌ | | **[com.atproto.server.deactivateAccount](https://pub.dev/documentation/atproto/latest/atproto/ServerService/deactivateAccount.html)** | [Reference](lexicons/com/atproto/server/deactivateAccount.md) | ❌ | +| **[com.atproto.server.requestAccountDelete](https://pub.dev/documentation/atproto/latest/atproto/ServerService/requestAccountDelete.html)** | [Reference](lexicons/com/atproto/server/requestAccountDelete.md) | ❌ | | **[com.atproto.server.requestEmailConfirmation](https://pub.dev/documentation/atproto/latest/atproto/ServerService/requestEmailConfirmation.html)** | [Reference](lexicons/com/atproto/server/requestEmailConfirmation.md) | ❌ | -| **[com.atproto.server.refreshSession](https://pub.dev/documentation/atproto/latest/atproto/refreshSession.html)** | [Reference](lexicons/com/atproto/server/refreshSession.md) | ❌ | -| **[com.atproto.server.requestEmailUpdate](https://pub.dev/documentation/atproto/latest/atproto/ServerService/requestEmailUpdate.html)** | [Reference](lexicons/com/atproto/server/requestEmailUpdate.md) | ❌ | +| **[com.atproto.server.deleteAccount](https://pub.dev/documentation/atproto/latest/atproto/ServerService/deleteAccount.html)** | [Reference](lexicons/com/atproto/server/deleteAccount.md) | ❌ | +| **[com.atproto.server.createAppPassword](https://pub.dev/documentation/atproto/latest/atproto/ServerService/createAppPassword.html)** | [Reference](lexicons/com/atproto/server/createAppPassword.md) | ❌ | | **[com.atproto.server.resetPassword](https://pub.dev/documentation/atproto/latest/atproto/ServerService/resetPassword.html)** | [Reference](lexicons/com/atproto/server/resetPassword.md) | ❌ | +| **[com.atproto.server.refreshSession](https://pub.dev/documentation/atproto/latest/atproto/refreshSession.html)** | [Reference](lexicons/com/atproto/server/refreshSession.md) | ❌ | +| **[com.atproto.server.createInviteCodes](https://pub.dev/documentation/atproto/latest/atproto/ServerService/createInviteCodes.html)** | [Reference](lexicons/com/atproto/server/createInviteCodes.md) | ❌ | +| **[com.atproto.server.listAppPasswords](https://pub.dev/documentation/atproto/latest/atproto/ServerService/listAppPasswords.html)** | [Reference](lexicons/com/atproto/server/listAppPasswords.md) | ❌ | +| **[com.atproto.server.requestPasswordReset](https://pub.dev/documentation/atproto/latest/atproto/ServerService/requestPasswordReset.html)** | [Reference](lexicons/com/atproto/server/requestPasswordReset.md) | ❌ | +| **[com.atproto.server.updateEmail](https://pub.dev/documentation/atproto/latest/atproto/ServerService/updateEmail.html)** | [Reference](lexicons/com/atproto/server/updateEmail.md) | ❌ | | **[com.atproto.server.getServiceAuth](https://pub.dev/documentation/atproto/latest/atproto/ServerService/getServiceAuth.html)** | [Reference](lexicons/com/atproto/server/getServiceAuth.md) | ❌ | -| **[com.atproto.server.reserveSigningKey](https://pub.dev/documentation/atproto/latest/atproto/ServerService/reserveSigningKey.html)** | [Reference](lexicons/com/atproto/server/reserveSigningKey.md) | ❌ | -| **[com.atproto.server.getAccountInviteCodes](https://pub.dev/documentation/atproto/latest/atproto/ServerService/getAccountInviteCodes.html)** | [Reference](lexicons/com/atproto/server/getAccountInviteCodes.md) | ❌ | -| **[com.atproto.server.createInviteCode](https://pub.dev/documentation/atproto/latest/atproto/ServerService/createInviteCode.html)** | [Reference](lexicons/com/atproto/server/createInviteCode.md) | ❌ | -| **[com.atproto.server.deleteAccount](https://pub.dev/documentation/atproto/latest/atproto/ServerService/deleteAccount.html)** | [Reference](lexicons/com/atproto/server/deleteAccount.md) | ❌ | -| **[com.atproto.server.checkAccountStatus](https://pub.dev/documentation/atproto/latest/atproto/ServerService/checkAccountStatus.html)** | [Reference](lexicons/com/atproto/server/checkAccountStatus.md) | ❌ | -| **[com.atproto.server.getSession](https://pub.dev/documentation/atproto/latest/atproto/ServerService/getSession.html)** | [Reference](lexicons/com/atproto/server/getSession.md) | ❌ | -| **[com.atproto.server.createSession](https://pub.dev/documentation/atproto/latest/atproto/createSession.html)** | [Reference](lexicons/com/atproto/server/createSession.md) | ❌ | + +### com.atproto.lexicon + +| Method | Docs | Paging (cursor) | +| --- | --- | :---: | +| **[com.atproto.lexicon.schema](https://pub.dev/documentation/atproto/latest/atproto/LexiconService/schema.html)** | [Reference](lexicons/com/atproto/lexicon/schema.md) | ❌ | ### com.atproto.moderation @@ -88,40 +69,65 @@ sidebar_position: 4 | --- | --- | :---: | | **[com.atproto.moderation.createReport](https://pub.dev/documentation/atproto/latest/atproto/ModerationService/createReport.html)** | [Reference](lexicons/com/atproto/moderation/createReport.md) | ❌ | -### com.atproto.repo +### com.atproto.sync | Method | Docs | Paging (cursor) | | --- | --- | :---: | -| **[com.atproto.repo.createRecord](https://pub.dev/documentation/atproto/latest/atproto/RepoService/createRecord.html)** | [Reference](lexicons/com/atproto/repo/createRecord.md) | ❌ | -| **[com.atproto.repo.importRepo](https://pub.dev/documentation/atproto/latest/atproto/RepoService/importRepo.html)** | [Reference](lexicons/com/atproto/repo/importRepo.md) | ❌ | -| **[com.atproto.repo.uploadBlob](https://pub.dev/documentation/atproto/latest/atproto/RepoService/uploadBlob.html)** | [Reference](lexicons/com/atproto/repo/uploadBlob.md) | ❌ | -| **[com.atproto.repo.describeRepo](https://pub.dev/documentation/atproto/latest/atproto/RepoService/describeRepo.html)** | [Reference](lexicons/com/atproto/repo/describeRepo.md) | ❌ | -| **[com.atproto.repo.listRecords](https://pub.dev/documentation/atproto/latest/atproto/RepoService/listRecords.html)** | [Reference](lexicons/com/atproto/repo/listRecords.md) | ✅ | -| **[com.atproto.repo.deleteRecord](https://pub.dev/documentation/atproto/latest/atproto/RepoService/deleteRecord.html)** | [Reference](lexicons/com/atproto/repo/deleteRecord.md) | ❌ | -| **[com.atproto.repo.applyWrites](https://pub.dev/documentation/atproto/latest/atproto/RepoService/applyWrites.html)** | [Reference](lexicons/com/atproto/repo/applyWrites.md) | ❌ | -| **[com.atproto.repo.listMissingBlobs](https://pub.dev/documentation/atproto/latest/atproto/RepoService/listMissingBlobs.html)** | [Reference](lexicons/com/atproto/repo/listMissingBlobs.md) | ✅ | -| **[com.atproto.repo.getRecord](https://pub.dev/documentation/atproto/latest/atproto/RepoService/getRecord.html)** | [Reference](lexicons/com/atproto/repo/getRecord.md) | ❌ | -| **[com.atproto.repo.putRecord](https://pub.dev/documentation/atproto/latest/atproto/RepoService/putRecord.html)** | [Reference](lexicons/com/atproto/repo/putRecord.md) | ❌ | +| **[com.atproto.sync.getCheckout](https://pub.dev/documentation/atproto/latest/atproto/SyncService/getCheckout.html)** | [Reference](lexicons/com/atproto/sync/getCheckout.md) | ❌ | +| **[com.atproto.sync.getHead](https://pub.dev/documentation/atproto/latest/atproto/SyncService/getHead.html)** | [Reference](lexicons/com/atproto/sync/getHead.md) | ❌ | +| **[com.atproto.sync.listRepos](https://pub.dev/documentation/atproto/latest/atproto/SyncService/listRepos.html)** | [Reference](lexicons/com/atproto/sync/listRepos.md) | ✅ | +| **[com.atproto.sync.getBlocks](https://pub.dev/documentation/atproto/latest/atproto/SyncService/getBlocks.html)** | [Reference](lexicons/com/atproto/sync/getBlocks.md) | ❌ | +| **[com.atproto.sync.listBlobs](https://pub.dev/documentation/atproto/latest/atproto/SyncService/listBlobs.html)** | [Reference](lexicons/com/atproto/sync/listBlobs.md) | ✅ | +| **[com.atproto.sync.notifyOfUpdate](https://pub.dev/documentation/atproto/latest/atproto/SyncService/notifyOfUpdate.html)** | [Reference](lexicons/com/atproto/sync/notifyOfUpdate.md) | ❌ | +| **[com.atproto.sync.getRepo](https://pub.dev/documentation/atproto/latest/atproto/SyncService/getRepo.html)** | [Reference](lexicons/com/atproto/sync/getRepo.md) | ❌ | +| **[com.atproto.sync.getLatestCommit](https://pub.dev/documentation/atproto/latest/atproto/SyncService/getLatestCommit.html)** | [Reference](lexicons/com/atproto/sync/getLatestCommit.md) | ❌ | +| **[com.atproto.sync.getRecord](https://pub.dev/documentation/atproto/latest/atproto/SyncService/getRecord.html)** | [Reference](lexicons/com/atproto/sync/getRecord.md) | ❌ | +| **[com.atproto.sync.requestCrawl](https://pub.dev/documentation/atproto/latest/atproto/SyncService/requestCrawl.html)** | [Reference](lexicons/com/atproto/sync/requestCrawl.md) | ❌ | +| **[com.atproto.sync.subscribeRepos](https://pub.dev/documentation/atproto/latest/atproto/SyncService/subscribeRepos.html)** | [Reference](lexicons/com/atproto/sync/subscribeRepos.md) | ✅ | +| **[com.atproto.sync.getRepoStatus](https://pub.dev/documentation/atproto/latest/atproto/SyncService/getRepoStatus.html)** | [Reference](lexicons/com/atproto/sync/getRepoStatus.md) | ❌ | +| **[com.atproto.sync.getBlob](https://pub.dev/documentation/atproto/latest/atproto/SyncService/getBlob.html)** | [Reference](lexicons/com/atproto/sync/getBlob.md) | ❌ | + +### com.atproto.identity + +| Method | Docs | Paging (cursor) | +| --- | --- | :---: | +| **[com.atproto.identity.getRecommendedDidCredentials](https://pub.dev/documentation/atproto/latest/atproto/IdentityService/getRecommendedDidCredentials.html)** | [Reference](lexicons/com/atproto/identity/getRecommendedDidCredentials.md) | ❌ | +| **[com.atproto.identity.signPlcOperation](https://pub.dev/documentation/atproto/latest/atproto/IdentityService/signPlcOperation.html)** | [Reference](lexicons/com/atproto/identity/signPlcOperation.md) | ❌ | +| **[com.atproto.identity.requestPlcOperationSignature](https://pub.dev/documentation/atproto/latest/atproto/IdentityService/requestPlcOperationSignature.html)** | [Reference](lexicons/com/atproto/identity/requestPlcOperationSignature.md) | ❌ | +| **[com.atproto.identity.updateHandle](https://pub.dev/documentation/atproto/latest/atproto/IdentityService/updateHandle.html)** | [Reference](lexicons/com/atproto/identity/updateHandle.md) | ❌ | +| **[com.atproto.identity.submitPlcOperation](https://pub.dev/documentation/atproto/latest/atproto/IdentityService/submitPlcOperation.html)** | [Reference](lexicons/com/atproto/identity/submitPlcOperation.md) | ❌ | +| **[com.atproto.identity.resolveHandle](https://pub.dev/documentation/atproto/latest/atproto/IdentityService/resolveHandle.html)** | [Reference](lexicons/com/atproto/identity/resolveHandle.md) | ❌ | ### com.atproto.temp | Method | Docs | Paging (cursor) | | --- | --- | :---: | -| **[com.atproto.temp.addReservedHandle](https://pub.dev/documentation/atproto/latest/atproto/TempService/addReservedHandle.html)** | [Reference](lexicons/com/atproto/temp/addReservedHandle.md) | ❌ | -| **[com.atproto.temp.requestPhoneVerification](https://pub.dev/documentation/atproto/latest/atproto/TempService/requestPhoneVerification.html)** | [Reference](lexicons/com/atproto/temp/requestPhoneVerification.md) | ❌ | | **[com.atproto.temp.fetchLabels](https://pub.dev/documentation/atproto/latest/atproto/TempService/fetchLabels.html)** | [Reference](lexicons/com/atproto/temp/fetchLabels.md) | ❌ | +| **[com.atproto.temp.requestPhoneVerification](https://pub.dev/documentation/atproto/latest/atproto/TempService/requestPhoneVerification.html)** | [Reference](lexicons/com/atproto/temp/requestPhoneVerification.md) | ❌ | | **[com.atproto.temp.checkSignupQueue](https://pub.dev/documentation/atproto/latest/atproto/TempService/checkSignupQueue.html)** | [Reference](lexicons/com/atproto/temp/checkSignupQueue.md) | ❌ | +| **[com.atproto.temp.addReservedHandle](https://pub.dev/documentation/atproto/latest/atproto/TempService/addReservedHandle.html)** | [Reference](lexicons/com/atproto/temp/addReservedHandle.md) | ❌ | -### com.atproto.identity +### com.atproto.repo | Method | Docs | Paging (cursor) | | --- | --- | :---: | -| **[com.atproto.identity.submitPlcOperation](https://pub.dev/documentation/atproto/latest/atproto/IdentityService/submitPlcOperation.html)** | [Reference](lexicons/com/atproto/identity/submitPlcOperation.md) | ❌ | -| **[com.atproto.identity.updateHandle](https://pub.dev/documentation/atproto/latest/atproto/IdentityService/updateHandle.html)** | [Reference](lexicons/com/atproto/identity/updateHandle.md) | ❌ | -| **[com.atproto.identity.signPlcOperation](https://pub.dev/documentation/atproto/latest/atproto/IdentityService/signPlcOperation.html)** | [Reference](lexicons/com/atproto/identity/signPlcOperation.md) | ❌ | -| **[com.atproto.identity.resolveHandle](https://pub.dev/documentation/atproto/latest/atproto/IdentityService/resolveHandle.html)** | [Reference](lexicons/com/atproto/identity/resolveHandle.md) | ❌ | -| **[com.atproto.identity.requestPlcOperationSignature](https://pub.dev/documentation/atproto/latest/atproto/IdentityService/requestPlcOperationSignature.html)** | [Reference](lexicons/com/atproto/identity/requestPlcOperationSignature.md) | ❌ | -| **[com.atproto.identity.getRecommendedDidCredentials](https://pub.dev/documentation/atproto/latest/atproto/IdentityService/getRecommendedDidCredentials.html)** | [Reference](lexicons/com/atproto/identity/getRecommendedDidCredentials.md) | ❌ | +| **[com.atproto.repo.importRepo](https://pub.dev/documentation/atproto/latest/atproto/RepoService/importRepo.html)** | [Reference](lexicons/com/atproto/repo/importRepo.md) | ❌ | +| **[com.atproto.repo.createRecord](https://pub.dev/documentation/atproto/latest/atproto/RepoService/createRecord.html)** | [Reference](lexicons/com/atproto/repo/createRecord.md) | ❌ | +| **[com.atproto.repo.describeRepo](https://pub.dev/documentation/atproto/latest/atproto/RepoService/describeRepo.html)** | [Reference](lexicons/com/atproto/repo/describeRepo.md) | ❌ | +| **[com.atproto.repo.listMissingBlobs](https://pub.dev/documentation/atproto/latest/atproto/RepoService/listMissingBlobs.html)** | [Reference](lexicons/com/atproto/repo/listMissingBlobs.md) | ✅ | +| **[com.atproto.repo.listRecords](https://pub.dev/documentation/atproto/latest/atproto/RepoService/listRecords.html)** | [Reference](lexicons/com/atproto/repo/listRecords.md) | ✅ | +| **[com.atproto.repo.getRecord](https://pub.dev/documentation/atproto/latest/atproto/RepoService/getRecord.html)** | [Reference](lexicons/com/atproto/repo/getRecord.md) | ❌ | +| **[com.atproto.repo.putRecord](https://pub.dev/documentation/atproto/latest/atproto/RepoService/putRecord.html)** | [Reference](lexicons/com/atproto/repo/putRecord.md) | ❌ | +| **[com.atproto.repo.deleteRecord](https://pub.dev/documentation/atproto/latest/atproto/RepoService/deleteRecord.html)** | [Reference](lexicons/com/atproto/repo/deleteRecord.md) | ❌ | +| **[com.atproto.repo.applyWrites](https://pub.dev/documentation/atproto/latest/atproto/RepoService/applyWrites.html)** | [Reference](lexicons/com/atproto/repo/applyWrites.md) | ❌ | +| **[com.atproto.repo.uploadBlob](https://pub.dev/documentation/atproto/latest/atproto/RepoService/uploadBlob.html)** | [Reference](lexicons/com/atproto/repo/uploadBlob.md) | ❌ | + +### com.atproto.label + +| Method | Docs | Paging (cursor) | +| --- | --- | :---: | +| **[com.atproto.label.subscribeLabels](https://pub.dev/documentation/atproto/latest/atproto/LabelService/subscribeLabels.html)** | [Reference](lexicons/com/atproto/label/subscribeLabels.md) | ✅ | +| **[com.atproto.label.queryLabels](https://pub.dev/documentation/atproto/latest/atproto/LabelService/queryLabels.html)** | [Reference](lexicons/com/atproto/label/queryLabels.md) | ✅ | ## [bluesky](packages/bluesky) @@ -132,65 +138,91 @@ The [bluesky](#bluesky) package is designed based on the [atproto](#atproto) pac So all endpoints in the [atproto](#atproto) table are also available from [bluesky](#bluesky) package. ::: +### app.bsky.video + +| Method | Docs | Paging (cursor) | +| --- | --- | :---: | +| **[app.bsky.video.getJobStatus](https://pub.dev/documentation/bluesky/latest/bluesky/VideoService/getJobStatus.html)** | [Reference](lexicons/app/bsky/video/getJobStatus.md) | ❌ | +| **[app.bsky.video.uploadVideo](https://pub.dev/documentation/bluesky/latest/bluesky/VideoService/uploadVideo.html)** | [Reference](lexicons/app/bsky/video/uploadVideo.md) | ❌ | +| **[app.bsky.video.getUploadLimits](https://pub.dev/documentation/bluesky/latest/bluesky/VideoService/getUploadLimits.html)** | [Reference](lexicons/app/bsky/video/getUploadLimits.md) | ❌ | + ### app.bsky.feed | Method | Docs | Paging (cursor) | | --- | --- | :---: | -| **[app.bsky.feed.getFeedGenerators](https://pub.dev/documentation/bluesky/latest/bluesky/FeedService/getFeedGenerators.html)** | [Reference](lexicons/app/bsky/feed/getFeedGenerators.md) | ❌ | -| **[app.bsky.feed.getQuotes](https://pub.dev/documentation/bluesky/latest/bluesky/FeedService/getQuotes.html)** | [Reference](lexicons/app/bsky/feed/getQuotes.md) | ✅ | -| **[app.bsky.feed.getTimeline](https://pub.dev/documentation/bluesky/latest/bluesky/FeedService/getTimeline.html)** | [Reference](lexicons/app/bsky/feed/getTimeline.md) | ✅ | -| **[app.bsky.feed.post](https://pub.dev/documentation/bluesky/latest/bluesky/FeedService/post.html)** | [Reference](lexicons/app/bsky/feed/post.md) | ❌ | -| **[app.bsky.feed.postgate](https://pub.dev/documentation/bluesky/latest/bluesky/FeedService/postgate.html)** | [Reference](lexicons/app/bsky/feed/postgate.md) | ❌ | -| **[app.bsky.feed.getActorLikes](https://pub.dev/documentation/bluesky/latest/bluesky/FeedService/getActorLikes.html)** | [Reference](lexicons/app/bsky/feed/getActorLikes.md) | ✅ | -| **[app.bsky.feed.getPostThread](https://pub.dev/documentation/bluesky/latest/bluesky/FeedService/getPostThread.html)** | [Reference](lexicons/app/bsky/feed/getPostThread.md) | ❌ | -| **[app.bsky.feed.threadgate](https://pub.dev/documentation/bluesky/latest/bluesky/FeedService/threadgate.html)** | [Reference](lexicons/app/bsky/feed/threadgate.md) | ❌ | | **[app.bsky.feed.getActorFeeds](https://pub.dev/documentation/bluesky/latest/bluesky/FeedService/getActorFeeds.html)** | [Reference](lexicons/app/bsky/feed/getActorFeeds.md) | ✅ | +| **[app.bsky.feed.getRepostedBy](https://pub.dev/documentation/bluesky/latest/bluesky/FeedService/getRepostedBy.html)** | [Reference](lexicons/app/bsky/feed/getRepostedBy.md) | ✅ | +| **[app.bsky.feed.getSuggestedFeeds](https://pub.dev/documentation/bluesky/latest/bluesky/FeedService/getSuggestedFeeds.html)** | [Reference](lexicons/app/bsky/feed/getSuggestedFeeds.md) | ✅ | +| **[app.bsky.feed.searchPosts](https://pub.dev/documentation/bluesky/latest/bluesky/FeedService/searchPosts.html)** | [Reference](lexicons/app/bsky/feed/searchPosts.md) | ✅ | +| **[app.bsky.feed.getPostThread](https://pub.dev/documentation/bluesky/latest/bluesky/FeedService/getPostThread.html)** | [Reference](lexicons/app/bsky/feed/getPostThread.md) | ❌ | +| **[app.bsky.feed.sendInteractions](https://pub.dev/documentation/bluesky/latest/bluesky/FeedService/sendInteractions.html)** | [Reference](lexicons/app/bsky/feed/sendInteractions.md) | ❌ | +| **[app.bsky.feed.getFeedGenerators](https://pub.dev/documentation/bluesky/latest/bluesky/FeedService/getFeedGenerators.html)** | [Reference](lexicons/app/bsky/feed/getFeedGenerators.md) | ❌ | +| **[app.bsky.feed.getFeedGenerator](https://pub.dev/documentation/bluesky/latest/bluesky/FeedService/getFeedGenerator.html)** | [Reference](lexicons/app/bsky/feed/getFeedGenerator.md) | ❌ | | **[app.bsky.feed.getPosts](https://pub.dev/documentation/bluesky/latest/bluesky/FeedService/getPosts.html)** | [Reference](lexicons/app/bsky/feed/getPosts.md) | ❌ | -| **[app.bsky.feed.repost](https://pub.dev/documentation/bluesky/latest/bluesky/FeedService/repost.html)** | [Reference](lexicons/app/bsky/feed/repost.md) | ❌ | +| **[app.bsky.feed.threadgate](https://pub.dev/documentation/bluesky/latest/bluesky/FeedService/threadgate.html)** | [Reference](lexicons/app/bsky/feed/threadgate.md) | ❌ | | **[app.bsky.feed.getLikes](https://pub.dev/documentation/bluesky/latest/bluesky/FeedService/getLikes.html)** | [Reference](lexicons/app/bsky/feed/getLikes.md) | ✅ | -| **[app.bsky.feed.getFeedGenerator](https://pub.dev/documentation/bluesky/latest/bluesky/FeedService/getFeedGenerator.html)** | [Reference](lexicons/app/bsky/feed/getFeedGenerator.md) | ❌ | -| **[app.bsky.feed.getListFeed](https://pub.dev/documentation/bluesky/latest/bluesky/FeedService/getListFeed.html)** | [Reference](lexicons/app/bsky/feed/getListFeed.md) | ✅ | -| **[app.bsky.feed.describeFeedGenerator](https://pub.dev/documentation/bluesky/latest/bluesky/FeedService/describeFeedGenerator.html)** | [Reference](lexicons/app/bsky/feed/describeFeedGenerator.md) | ❌ | -| **[app.bsky.feed.searchPosts](https://pub.dev/documentation/bluesky/latest/bluesky/FeedService/searchPosts.html)** | [Reference](lexicons/app/bsky/feed/searchPosts.md) | ✅ | | **[app.bsky.feed.generator](https://pub.dev/documentation/bluesky/latest/bluesky/FeedService/generator.html)** | [Reference](lexicons/app/bsky/feed/generator.md) | ❌ | -| **[app.bsky.feed.sendInteractions](https://pub.dev/documentation/bluesky/latest/bluesky/FeedService/sendInteractions.html)** | [Reference](lexicons/app/bsky/feed/sendInteractions.md) | ❌ | -| **[app.bsky.feed.getAuthorFeed](https://pub.dev/documentation/bluesky/latest/bluesky/FeedService/getAuthorFeed.html)** | [Reference](lexicons/app/bsky/feed/getAuthorFeed.md) | ✅ | -| **[app.bsky.feed.getRepostedBy](https://pub.dev/documentation/bluesky/latest/bluesky/FeedService/getRepostedBy.html)** | [Reference](lexicons/app/bsky/feed/getRepostedBy.md) | ✅ | +| **[app.bsky.feed.getFeedSkeleton](https://pub.dev/documentation/bluesky/latest/bluesky/FeedService/getFeedSkeleton.html)** | [Reference](lexicons/app/bsky/feed/getFeedSkeleton.md) | ✅ | +| **[app.bsky.feed.getActorLikes](https://pub.dev/documentation/bluesky/latest/bluesky/FeedService/getActorLikes.html)** | [Reference](lexicons/app/bsky/feed/getActorLikes.md) | ✅ | +| **[app.bsky.feed.post](https://pub.dev/documentation/bluesky/latest/bluesky/FeedService/post.html)** | [Reference](lexicons/app/bsky/feed/post.md) | ❌ | | **[app.bsky.feed.like](https://pub.dev/documentation/bluesky/latest/bluesky/FeedService/like.html)** | [Reference](lexicons/app/bsky/feed/like.md) | ❌ | -| **[app.bsky.feed.getSuggestedFeeds](https://pub.dev/documentation/bluesky/latest/bluesky/FeedService/getSuggestedFeeds.html)** | [Reference](lexicons/app/bsky/feed/getSuggestedFeeds.md) | ✅ | +| **[app.bsky.feed.repost](https://pub.dev/documentation/bluesky/latest/bluesky/FeedService/repost.html)** | [Reference](lexicons/app/bsky/feed/repost.md) | ❌ | +| **[app.bsky.feed.describeFeedGenerator](https://pub.dev/documentation/bluesky/latest/bluesky/FeedService/describeFeedGenerator.html)** | [Reference](lexicons/app/bsky/feed/describeFeedGenerator.md) | ❌ | +| **[app.bsky.feed.getQuotes](https://pub.dev/documentation/bluesky/latest/bluesky/FeedService/getQuotes.html)** | [Reference](lexicons/app/bsky/feed/getQuotes.md) | ✅ | +| **[app.bsky.feed.getTimeline](https://pub.dev/documentation/bluesky/latest/bluesky/FeedService/getTimeline.html)** | [Reference](lexicons/app/bsky/feed/getTimeline.md) | ✅ | +| **[app.bsky.feed.postgate](https://pub.dev/documentation/bluesky/latest/bluesky/FeedService/postgate.html)** | [Reference](lexicons/app/bsky/feed/postgate.md) | ❌ | +| **[app.bsky.feed.getAuthorFeed](https://pub.dev/documentation/bluesky/latest/bluesky/FeedService/getAuthorFeed.html)** | [Reference](lexicons/app/bsky/feed/getAuthorFeed.md) | ✅ | | **[app.bsky.feed.getFeed](https://pub.dev/documentation/bluesky/latest/bluesky/FeedService/getFeed.html)** | [Reference](lexicons/app/bsky/feed/getFeed.md) | ✅ | -| **[app.bsky.feed.getFeedSkeleton](https://pub.dev/documentation/bluesky/latest/bluesky/FeedService/getFeedSkeleton.html)** | [Reference](lexicons/app/bsky/feed/getFeedSkeleton.md) | ✅ | +| **[app.bsky.feed.getListFeed](https://pub.dev/documentation/bluesky/latest/bluesky/FeedService/getListFeed.html)** | [Reference](lexicons/app/bsky/feed/getListFeed.md) | ✅ | -### app.bsky.notification +### app.bsky.graph | Method | Docs | Paging (cursor) | | --- | --- | :---: | -| **[app.bsky.notification.updateSeen](https://pub.dev/documentation/bluesky/latest/bluesky/NotificationService/updateSeen.html)** | [Reference](lexicons/app/bsky/notification/updateSeen.md) | ❌ | -| **[app.bsky.notification.getUnreadCount](https://pub.dev/documentation/bluesky/latest/bluesky/NotificationService/getUnreadCount.html)** | [Reference](lexicons/app/bsky/notification/getUnreadCount.md) | ❌ | -| **[app.bsky.notification.registerPush](https://pub.dev/documentation/bluesky/latest/bluesky/NotificationService/registerPush.html)** | [Reference](lexicons/app/bsky/notification/registerPush.md) | ❌ | -| **[app.bsky.notification.putPreferences](https://pub.dev/documentation/bluesky/latest/bluesky/NotificationService/putPreferences.html)** | [Reference](lexicons/app/bsky/notification/putPreferences.md) | ❌ | -| **[app.bsky.notification.listNotifications](https://pub.dev/documentation/bluesky/latest/bluesky/NotificationService/listNotifications.html)** | [Reference](lexicons/app/bsky/notification/listNotifications.md) | ✅ | +| **[app.bsky.graph.getListMutes](https://pub.dev/documentation/bluesky/latest/bluesky/GraphService/getListMutes.html)** | [Reference](lexicons/app/bsky/graph/getListMutes.md) | ✅ | +| **[app.bsky.graph.unmuteThread](https://pub.dev/documentation/bluesky/latest/bluesky/GraphService/unmuteThread.html)** | [Reference](lexicons/app/bsky/graph/unmuteThread.md) | ❌ | +| **[app.bsky.graph.muteThread](https://pub.dev/documentation/bluesky/latest/bluesky/GraphService/muteThread.html)** | [Reference](lexicons/app/bsky/graph/muteThread.md) | ❌ | +| **[app.bsky.graph.getBlocks](https://pub.dev/documentation/bluesky/latest/bluesky/GraphService/getBlocks.html)** | [Reference](lexicons/app/bsky/graph/getBlocks.md) | ✅ | +| **[app.bsky.graph.getList](https://pub.dev/documentation/bluesky/latest/bluesky/GraphService/getList.html)** | [Reference](lexicons/app/bsky/graph/getList.md) | ✅ | +| **[app.bsky.graph.getKnownFollowers](https://pub.dev/documentation/bluesky/latest/bluesky/GraphService/getKnownFollowers.html)** | [Reference](lexicons/app/bsky/graph/getKnownFollowers.md) | ✅ | +| **[app.bsky.graph.getStarterPack](https://pub.dev/documentation/bluesky/latest/bluesky/GraphService/getStarterPack.html)** | [Reference](lexicons/app/bsky/graph/getStarterPack.md) | ❌ | +| **[app.bsky.graph.list](https://pub.dev/documentation/bluesky/latest/bluesky/GraphService/list.html)** | [Reference](lexicons/app/bsky/graph/list.md) | ❌ | +| **[app.bsky.graph.unmuteActorList](https://pub.dev/documentation/bluesky/latest/bluesky/GraphService/unmuteActorList.html)** | [Reference](lexicons/app/bsky/graph/unmuteActorList.md) | ❌ | +| **[app.bsky.graph.block](https://pub.dev/documentation/bluesky/latest/bluesky/GraphService/block.html)** | [Reference](lexicons/app/bsky/graph/block.md) | ❌ | +| **[app.bsky.graph.getMutes](https://pub.dev/documentation/bluesky/latest/bluesky/GraphService/getMutes.html)** | [Reference](lexicons/app/bsky/graph/getMutes.md) | ✅ | +| **[app.bsky.graph.listblock](https://pub.dev/documentation/bluesky/latest/bluesky/GraphService/listblock.html)** | [Reference](lexicons/app/bsky/graph/listblock.md) | ❌ | +| **[app.bsky.graph.getFollows](https://pub.dev/documentation/bluesky/latest/bluesky/GraphService/getFollows.html)** | [Reference](lexicons/app/bsky/graph/getFollows.md) | ✅ | +| **[app.bsky.graph.getStarterPacks](https://pub.dev/documentation/bluesky/latest/bluesky/GraphService/getStarterPacks.html)** | [Reference](lexicons/app/bsky/graph/getStarterPacks.md) | ❌ | +| **[app.bsky.graph.getFollowers](https://pub.dev/documentation/bluesky/latest/bluesky/GraphService/getFollowers.html)** | [Reference](lexicons/app/bsky/graph/getFollowers.md) | ✅ | +| **[app.bsky.graph.listitem](https://pub.dev/documentation/bluesky/latest/bluesky/GraphService/listitem.html)** | [Reference](lexicons/app/bsky/graph/listitem.md) | ❌ | +| **[app.bsky.graph.muteActorList](https://pub.dev/documentation/bluesky/latest/bluesky/GraphService/muteActorList.html)** | [Reference](lexicons/app/bsky/graph/muteActorList.md) | ❌ | +| **[app.bsky.graph.starterpack](https://pub.dev/documentation/bluesky/latest/bluesky/GraphService/starterpack.html)** | [Reference](lexicons/app/bsky/graph/starterpack.md) | ❌ | +| **[app.bsky.graph.searchStarterPacks](https://pub.dev/documentation/bluesky/latest/bluesky/GraphService/searchStarterPacks.html)** | [Reference](lexicons/app/bsky/graph/searchStarterPacks.md) | ✅ | +| **[app.bsky.graph.getRelationships](https://pub.dev/documentation/bluesky/latest/bluesky/GraphService/getRelationships.html)** | [Reference](lexicons/app/bsky/graph/getRelationships.md) | ❌ | +| **[app.bsky.graph.unmuteActor](https://pub.dev/documentation/bluesky/latest/bluesky/GraphService/unmuteActor.html)** | [Reference](lexicons/app/bsky/graph/unmuteActor.md) | ❌ | +| **[app.bsky.graph.getActorStarterPacks](https://pub.dev/documentation/bluesky/latest/bluesky/GraphService/getActorStarterPacks.html)** | [Reference](lexicons/app/bsky/graph/getActorStarterPacks.md) | ✅ | +| **[app.bsky.graph.getListBlocks](https://pub.dev/documentation/bluesky/latest/bluesky/GraphService/getListBlocks.html)** | [Reference](lexicons/app/bsky/graph/getListBlocks.md) | ✅ | +| **[app.bsky.graph.follow](https://pub.dev/documentation/bluesky/latest/bluesky/GraphService/follow.html)** | [Reference](lexicons/app/bsky/graph/follow.md) | ❌ | +| **[app.bsky.graph.getLists](https://pub.dev/documentation/bluesky/latest/bluesky/GraphService/getLists.html)** | [Reference](lexicons/app/bsky/graph/getLists.md) | ✅ | +| **[app.bsky.graph.muteActor](https://pub.dev/documentation/bluesky/latest/bluesky/GraphService/muteActor.html)** | [Reference](lexicons/app/bsky/graph/muteActor.md) | ❌ | +| **[app.bsky.graph.getSuggestedFollowsByActor](https://pub.dev/documentation/bluesky/latest/bluesky/GraphService/getSuggestedFollowsByActor.html)** | [Reference](lexicons/app/bsky/graph/getSuggestedFollowsByActor.md) | ❌ | -### app.bsky.video +### app.bsky.notification | Method | Docs | Paging (cursor) | | --- | --- | :---: | -| **[app.bsky.video.getJobStatus](https://pub.dev/documentation/bluesky/latest/bluesky/VideoService/getJobStatus.html)** | [Reference](lexicons/app/bsky/video/getJobStatus.md) | ❌ | -| **[app.bsky.video.uploadVideo](https://pub.dev/documentation/bluesky/latest/bluesky/VideoService/uploadVideo.html)** | [Reference](lexicons/app/bsky/video/uploadVideo.md) | ❌ | -| **[app.bsky.video.getUploadLimits](https://pub.dev/documentation/bluesky/latest/bluesky/VideoService/getUploadLimits.html)** | [Reference](lexicons/app/bsky/video/getUploadLimits.md) | ❌ | +| **[app.bsky.notification.updateSeen](https://pub.dev/documentation/bluesky/latest/bluesky/NotificationService/updateSeen.html)** | [Reference](lexicons/app/bsky/notification/updateSeen.md) | ❌ | +| **[app.bsky.notification.registerPush](https://pub.dev/documentation/bluesky/latest/bluesky/NotificationService/registerPush.html)** | [Reference](lexicons/app/bsky/notification/registerPush.md) | ❌ | +| **[app.bsky.notification.getUnreadCount](https://pub.dev/documentation/bluesky/latest/bluesky/NotificationService/getUnreadCount.html)** | [Reference](lexicons/app/bsky/notification/getUnreadCount.md) | ❌ | +| **[app.bsky.notification.listNotifications](https://pub.dev/documentation/bluesky/latest/bluesky/NotificationService/listNotifications.html)** | [Reference](lexicons/app/bsky/notification/listNotifications.md) | ✅ | +| **[app.bsky.notification.putPreferences](https://pub.dev/documentation/bluesky/latest/bluesky/NotificationService/putPreferences.html)** | [Reference](lexicons/app/bsky/notification/putPreferences.md) | ❌ | -### app.bsky.actor +### app.bsky.labeler | Method | Docs | Paging (cursor) | | --- | --- | :---: | -| **[app.bsky.actor.putPreferences](https://pub.dev/documentation/bluesky/latest/bluesky/ActorService/putPreferences.html)** | [Reference](lexicons/app/bsky/actor/putPreferences.md) | ❌ | -| **[app.bsky.actor.getProfiles](https://pub.dev/documentation/bluesky/latest/bluesky/ActorService/getProfiles.html)** | [Reference](lexicons/app/bsky/actor/getProfiles.md) | ❌ | -| **[app.bsky.actor.getPreferences](https://pub.dev/documentation/bluesky/latest/bluesky/ActorService/getPreferences.html)** | [Reference](lexicons/app/bsky/actor/getPreferences.md) | ❌ | -| **[app.bsky.actor.getSuggestions](https://pub.dev/documentation/bluesky/latest/bluesky/ActorService/getSuggestions.html)** | [Reference](lexicons/app/bsky/actor/getSuggestions.md) | ✅ | -| **[app.bsky.actor.getProfile](https://pub.dev/documentation/bluesky/latest/bluesky/ActorService/getProfile.html)** | [Reference](lexicons/app/bsky/actor/getProfile.md) | ❌ | -| **[app.bsky.actor.searchActorsTypeahead](https://pub.dev/documentation/bluesky/latest/bluesky/ActorService/searchActorsTypeahead.html)** | [Reference](lexicons/app/bsky/actor/searchActorsTypeahead.md) | ❌ | -| **[app.bsky.actor.searchActors](https://pub.dev/documentation/bluesky/latest/bluesky/ActorService/searchActors.html)** | [Reference](lexicons/app/bsky/actor/searchActors.md) | ✅ | -| **[app.bsky.actor.profile](https://pub.dev/documentation/bluesky/latest/bluesky/ActorService/profile.html)** | [Reference](lexicons/app/bsky/actor/profile.md) | ❌ | +| **[app.bsky.labeler.getServices](https://pub.dev/documentation/bluesky/latest/bluesky/LabelerService/getServices.html)** | [Reference](lexicons/app/bsky/labeler/getServices.md) | ❌ | +| **[app.bsky.labeler.service](https://pub.dev/documentation/bluesky/latest/bluesky/LabelerService/service.html)** | [Reference](lexicons/app/bsky/labeler/service.md) | ❌ | ### app.bsky.unspecced @@ -198,81 +230,55 @@ So all endpoints in the [atproto](#atproto) table are also available from [blues | --- | --- | :---: | | **[app.bsky.unspecced.searchStarterPacksSkeleton](https://pub.dev/documentation/bluesky/latest/bluesky/UnspeccedService/searchStarterPacksSkeleton.html)** | [Reference](lexicons/app/bsky/unspecced/searchStarterPacksSkeleton.md) | ✅ | | **[app.bsky.unspecced.getPopularFeedGenerators](https://pub.dev/documentation/bluesky/latest/bluesky/UnspeccedService/getPopularFeedGenerators.html)** | [Reference](lexicons/app/bsky/unspecced/getPopularFeedGenerators.md) | ✅ | +| **[app.bsky.unspecced.getTaggedSuggestions](https://pub.dev/documentation/bluesky/latest/bluesky/UnspeccedService/getTaggedSuggestions.html)** | [Reference](lexicons/app/bsky/unspecced/getTaggedSuggestions.md) | ❌ | | **[app.bsky.unspecced.getSuggestionsSkeleton](https://pub.dev/documentation/bluesky/latest/bluesky/UnspeccedService/getSuggestionsSkeleton.html)** | [Reference](lexicons/app/bsky/unspecced/getSuggestionsSkeleton.md) | ✅ | -| **[app.bsky.unspecced.searchActorsSkeleton](https://pub.dev/documentation/bluesky/latest/bluesky/UnspeccedService/searchActorsSkeleton.html)** | [Reference](lexicons/app/bsky/unspecced/searchActorsSkeleton.md) | ✅ | -| **[app.bsky.unspecced.getConfig](https://pub.dev/documentation/bluesky/latest/bluesky/UnspeccedService/getConfig.html)** | [Reference](lexicons/app/bsky/unspecced/getConfig.md) | ❌ | | **[app.bsky.unspecced.getTrendingTopics](https://pub.dev/documentation/bluesky/latest/bluesky/UnspeccedService/getTrendingTopics.html)** | [Reference](lexicons/app/bsky/unspecced/getTrendingTopics.md) | ❌ | -| **[app.bsky.unspecced.getTaggedSuggestions](https://pub.dev/documentation/bluesky/latest/bluesky/UnspeccedService/getTaggedSuggestions.html)** | [Reference](lexicons/app/bsky/unspecced/getTaggedSuggestions.md) | ❌ | +| **[app.bsky.unspecced.getConfig](https://pub.dev/documentation/bluesky/latest/bluesky/UnspeccedService/getConfig.html)** | [Reference](lexicons/app/bsky/unspecced/getConfig.md) | ❌ | | **[app.bsky.unspecced.searchPostsSkeleton](https://pub.dev/documentation/bluesky/latest/bluesky/UnspeccedService/searchPostsSkeleton.html)** | [Reference](lexicons/app/bsky/unspecced/searchPostsSkeleton.md) | ✅ | +| **[app.bsky.unspecced.searchActorsSkeleton](https://pub.dev/documentation/bluesky/latest/bluesky/UnspeccedService/searchActorsSkeleton.html)** | [Reference](lexicons/app/bsky/unspecced/searchActorsSkeleton.md) | ✅ | -### app.bsky.labeler +### app.bsky.actor | Method | Docs | Paging (cursor) | | --- | --- | :---: | -| **[app.bsky.labeler.service](https://pub.dev/documentation/bluesky/latest/bluesky/LabelerService/service.html)** | [Reference](lexicons/app/bsky/labeler/service.md) | ❌ | -| **[app.bsky.labeler.getServices](https://pub.dev/documentation/bluesky/latest/bluesky/LabelerService/getServices.html)** | [Reference](lexicons/app/bsky/labeler/getServices.md) | ❌ | +| **[app.bsky.actor.searchActors](https://pub.dev/documentation/bluesky/latest/bluesky/ActorService/searchActors.html)** | [Reference](lexicons/app/bsky/actor/searchActors.md) | ✅ | +| **[app.bsky.actor.getSuggestions](https://pub.dev/documentation/bluesky/latest/bluesky/ActorService/getSuggestions.html)** | [Reference](lexicons/app/bsky/actor/getSuggestions.md) | ✅ | +| **[app.bsky.actor.getProfile](https://pub.dev/documentation/bluesky/latest/bluesky/ActorService/getProfile.html)** | [Reference](lexicons/app/bsky/actor/getProfile.md) | ❌ | +| **[app.bsky.actor.getProfiles](https://pub.dev/documentation/bluesky/latest/bluesky/ActorService/getProfiles.html)** | [Reference](lexicons/app/bsky/actor/getProfiles.md) | ❌ | +| **[app.bsky.actor.profile](https://pub.dev/documentation/bluesky/latest/bluesky/ActorService/profile.html)** | [Reference](lexicons/app/bsky/actor/profile.md) | ❌ | +| **[app.bsky.actor.searchActorsTypeahead](https://pub.dev/documentation/bluesky/latest/bluesky/ActorService/searchActorsTypeahead.html)** | [Reference](lexicons/app/bsky/actor/searchActorsTypeahead.md) | ❌ | +| **[app.bsky.actor.getPreferences](https://pub.dev/documentation/bluesky/latest/bluesky/ActorService/getPreferences.html)** | [Reference](lexicons/app/bsky/actor/getPreferences.md) | ❌ | +| **[app.bsky.actor.putPreferences](https://pub.dev/documentation/bluesky/latest/bluesky/ActorService/putPreferences.html)** | [Reference](lexicons/app/bsky/actor/putPreferences.md) | ❌ | -### app.bsky.graph +### chat.bsky.moderation | Method | Docs | Paging (cursor) | | --- | --- | :---: | -| **[app.bsky.graph.searchStarterPacks](https://pub.dev/documentation/bluesky/latest/bluesky/GraphService/searchStarterPacks.html)** | [Reference](lexicons/app/bsky/graph/searchStarterPacks.md) | ✅ | -| **[app.bsky.graph.list](https://pub.dev/documentation/bluesky/latest/bluesky/GraphService/list.html)** | [Reference](lexicons/app/bsky/graph/list.md) | ❌ | -| **[app.bsky.graph.muteActorList](https://pub.dev/documentation/bluesky/latest/bluesky/GraphService/muteActorList.html)** | [Reference](lexicons/app/bsky/graph/muteActorList.md) | ❌ | -| **[app.bsky.graph.getRelationships](https://pub.dev/documentation/bluesky/latest/bluesky/GraphService/getRelationships.html)** | [Reference](lexicons/app/bsky/graph/getRelationships.md) | ❌ | -| **[app.bsky.graph.getListBlocks](https://pub.dev/documentation/bluesky/latest/bluesky/GraphService/getListBlocks.html)** | [Reference](lexicons/app/bsky/graph/getListBlocks.md) | ✅ | -| **[app.bsky.graph.block](https://pub.dev/documentation/bluesky/latest/bluesky/GraphService/block.html)** | [Reference](lexicons/app/bsky/graph/block.md) | ❌ | -| **[app.bsky.graph.getList](https://pub.dev/documentation/bluesky/latest/bluesky/GraphService/getList.html)** | [Reference](lexicons/app/bsky/graph/getList.md) | ✅ | -| **[app.bsky.graph.muteThread](https://pub.dev/documentation/bluesky/latest/bluesky/GraphService/muteThread.html)** | [Reference](lexicons/app/bsky/graph/muteThread.md) | ❌ | -| **[app.bsky.graph.getStarterPacks](https://pub.dev/documentation/bluesky/latest/bluesky/GraphService/getStarterPacks.html)** | [Reference](lexicons/app/bsky/graph/getStarterPacks.md) | ❌ | -| **[app.bsky.graph.getKnownFollowers](https://pub.dev/documentation/bluesky/latest/bluesky/GraphService/getKnownFollowers.html)** | [Reference](lexicons/app/bsky/graph/getKnownFollowers.md) | ✅ | -| **[app.bsky.graph.unmuteActorList](https://pub.dev/documentation/bluesky/latest/bluesky/GraphService/unmuteActorList.html)** | [Reference](lexicons/app/bsky/graph/unmuteActorList.md) | ❌ | -| **[app.bsky.graph.listitem](https://pub.dev/documentation/bluesky/latest/bluesky/GraphService/listitem.html)** | [Reference](lexicons/app/bsky/graph/listitem.md) | ❌ | -| **[app.bsky.graph.getLists](https://pub.dev/documentation/bluesky/latest/bluesky/GraphService/getLists.html)** | [Reference](lexicons/app/bsky/graph/getLists.md) | ✅ | -| **[app.bsky.graph.getFollowers](https://pub.dev/documentation/bluesky/latest/bluesky/GraphService/getFollowers.html)** | [Reference](lexicons/app/bsky/graph/getFollowers.md) | ✅ | -| **[app.bsky.graph.getActorStarterPacks](https://pub.dev/documentation/bluesky/latest/bluesky/GraphService/getActorStarterPacks.html)** | [Reference](lexicons/app/bsky/graph/getActorStarterPacks.md) | ✅ | -| **[app.bsky.graph.getMutes](https://pub.dev/documentation/bluesky/latest/bluesky/GraphService/getMutes.html)** | [Reference](lexicons/app/bsky/graph/getMutes.md) | ✅ | -| **[app.bsky.graph.muteActor](https://pub.dev/documentation/bluesky/latest/bluesky/GraphService/muteActor.html)** | [Reference](lexicons/app/bsky/graph/muteActor.md) | ❌ | -| **[app.bsky.graph.getBlocks](https://pub.dev/documentation/bluesky/latest/bluesky/GraphService/getBlocks.html)** | [Reference](lexicons/app/bsky/graph/getBlocks.md) | ✅ | -| **[app.bsky.graph.starterpack](https://pub.dev/documentation/bluesky/latest/bluesky/GraphService/starterpack.html)** | [Reference](lexicons/app/bsky/graph/starterpack.md) | ❌ | -| **[app.bsky.graph.getListMutes](https://pub.dev/documentation/bluesky/latest/bluesky/GraphService/getListMutes.html)** | [Reference](lexicons/app/bsky/graph/getListMutes.md) | ✅ | -| **[app.bsky.graph.getStarterPack](https://pub.dev/documentation/bluesky/latest/bluesky/GraphService/getStarterPack.html)** | [Reference](lexicons/app/bsky/graph/getStarterPack.md) | ❌ | -| **[app.bsky.graph.follow](https://pub.dev/documentation/bluesky/latest/bluesky/GraphService/follow.html)** | [Reference](lexicons/app/bsky/graph/follow.md) | ❌ | -| **[app.bsky.graph.listblock](https://pub.dev/documentation/bluesky/latest/bluesky/GraphService/listblock.html)** | [Reference](lexicons/app/bsky/graph/listblock.md) | ❌ | -| **[app.bsky.graph.unmuteActor](https://pub.dev/documentation/bluesky/latest/bluesky/GraphService/unmuteActor.html)** | [Reference](lexicons/app/bsky/graph/unmuteActor.md) | ❌ | -| **[app.bsky.graph.unmuteThread](https://pub.dev/documentation/bluesky/latest/bluesky/GraphService/unmuteThread.html)** | [Reference](lexicons/app/bsky/graph/unmuteThread.md) | ❌ | -| **[app.bsky.graph.getFollows](https://pub.dev/documentation/bluesky/latest/bluesky/GraphService/getFollows.html)** | [Reference](lexicons/app/bsky/graph/getFollows.md) | ✅ | -| **[app.bsky.graph.getSuggestedFollowsByActor](https://pub.dev/documentation/bluesky/latest/bluesky/GraphService/getSuggestedFollowsByActor.html)** | [Reference](lexicons/app/bsky/graph/getSuggestedFollowsByActor.md) | ❌ | +| **[chat.bsky.moderation.updateActorAccess](https://pub.dev/documentation/bluesky/latest/bluesky_chat/ModerationService/updateActorAccess.html)** | [Reference](lexicons/chat/bsky/moderation/updateActorAccess.md) | ❌ | +| **[chat.bsky.moderation.getActorMetadata](https://pub.dev/documentation/bluesky/latest/bluesky_chat/ModerationService/getActorMetadata.html)** | [Reference](lexicons/chat/bsky/moderation/getActorMetadata.md) | ❌ | +| **[chat.bsky.moderation.getMessageContext](https://pub.dev/documentation/bluesky/latest/bluesky_chat/ModerationService/getMessageContext.html)** | [Reference](lexicons/chat/bsky/moderation/getMessageContext.md) | ❌ | ### chat.bsky.convo | Method | Docs | Paging (cursor) | | --- | --- | :---: | -| **[chat.bsky.convo.getConvo](https://pub.dev/documentation/bluesky/latest/bluesky_chat/ConvoService/getConvo.html)** | [Reference](lexicons/chat/bsky/convo/getConvo.md) | ❌ | | **[chat.bsky.convo.leaveConvo](https://pub.dev/documentation/bluesky/latest/bluesky_chat/ConvoService/leaveConvo.html)** | [Reference](lexicons/chat/bsky/convo/leaveConvo.md) | ❌ | -| **[chat.bsky.convo.sendMessageBatch](https://pub.dev/documentation/bluesky/latest/bluesky_chat/ConvoService/sendMessageBatch.html)** | [Reference](lexicons/chat/bsky/convo/sendMessageBatch.md) | ❌ | -| **[chat.bsky.convo.listConvos](https://pub.dev/documentation/bluesky/latest/bluesky_chat/ConvoService/listConvos.html)** | [Reference](lexicons/chat/bsky/convo/listConvos.md) | ✅ | | **[chat.bsky.convo.getLog](https://pub.dev/documentation/bluesky/latest/bluesky_chat/ConvoService/getLog.html)** | [Reference](lexicons/chat/bsky/convo/getLog.md) | ✅ | -| **[chat.bsky.convo.deleteMessageForSelf](https://pub.dev/documentation/bluesky/latest/bluesky_chat/ConvoService/deleteMessageForSelf.html)** | [Reference](lexicons/chat/bsky/convo/deleteMessageForSelf.md) | ❌ | -| **[chat.bsky.convo.unmuteConvo](https://pub.dev/documentation/bluesky/latest/bluesky_chat/ConvoService/unmuteConvo.html)** | [Reference](lexicons/chat/bsky/convo/unmuteConvo.md) | ❌ | +| **[chat.bsky.convo.updateRead](https://pub.dev/documentation/bluesky/latest/bluesky_chat/ConvoService/updateRead.html)** | [Reference](lexicons/chat/bsky/convo/updateRead.md) | ❌ | +| **[chat.bsky.convo.getConvo](https://pub.dev/documentation/bluesky/latest/bluesky_chat/ConvoService/getConvo.html)** | [Reference](lexicons/chat/bsky/convo/getConvo.md) | ❌ | | **[chat.bsky.convo.muteConvo](https://pub.dev/documentation/bluesky/latest/bluesky_chat/ConvoService/muteConvo.html)** | [Reference](lexicons/chat/bsky/convo/muteConvo.md) | ❌ | -| **[chat.bsky.convo.getConvoForMembers](https://pub.dev/documentation/bluesky/latest/bluesky_chat/ConvoService/getConvoForMembers.html)** | [Reference](lexicons/chat/bsky/convo/getConvoForMembers.md) | ❌ | +| **[chat.bsky.convo.unmuteConvo](https://pub.dev/documentation/bluesky/latest/bluesky_chat/ConvoService/unmuteConvo.html)** | [Reference](lexicons/chat/bsky/convo/unmuteConvo.md) | ❌ | +| **[chat.bsky.convo.listConvos](https://pub.dev/documentation/bluesky/latest/bluesky_chat/ConvoService/listConvos.html)** | [Reference](lexicons/chat/bsky/convo/listConvos.md) | ✅ | | **[chat.bsky.convo.sendMessage](https://pub.dev/documentation/bluesky/latest/bluesky_chat/ConvoService/sendMessage.html)** | [Reference](lexicons/chat/bsky/convo/sendMessage.md) | ❌ | -| **[chat.bsky.convo.updateRead](https://pub.dev/documentation/bluesky/latest/bluesky_chat/ConvoService/updateRead.html)** | [Reference](lexicons/chat/bsky/convo/updateRead.md) | ❌ | +| **[chat.bsky.convo.sendMessageBatch](https://pub.dev/documentation/bluesky/latest/bluesky_chat/ConvoService/sendMessageBatch.html)** | [Reference](lexicons/chat/bsky/convo/sendMessageBatch.md) | ❌ | | **[chat.bsky.convo.getMessages](https://pub.dev/documentation/bluesky/latest/bluesky_chat/ConvoService/getMessages.html)** | [Reference](lexicons/chat/bsky/convo/getMessages.md) | ✅ | - -### chat.bsky.moderation - -| Method | Docs | Paging (cursor) | -| --- | --- | :---: | -| **[chat.bsky.moderation.getActorMetadata](https://pub.dev/documentation/bluesky/latest/bluesky_chat/ModerationService/getActorMetadata.html)** | [Reference](lexicons/chat/bsky/moderation/getActorMetadata.md) | ❌ | -| **[chat.bsky.moderation.updateActorAccess](https://pub.dev/documentation/bluesky/latest/bluesky_chat/ModerationService/updateActorAccess.html)** | [Reference](lexicons/chat/bsky/moderation/updateActorAccess.md) | ❌ | -| **[chat.bsky.moderation.getMessageContext](https://pub.dev/documentation/bluesky/latest/bluesky_chat/ModerationService/getMessageContext.html)** | [Reference](lexicons/chat/bsky/moderation/getMessageContext.md) | ❌ | +| **[chat.bsky.convo.deleteMessageForSelf](https://pub.dev/documentation/bluesky/latest/bluesky_chat/ConvoService/deleteMessageForSelf.html)** | [Reference](lexicons/chat/bsky/convo/deleteMessageForSelf.md) | ❌ | +| **[chat.bsky.convo.getConvoForMembers](https://pub.dev/documentation/bluesky/latest/bluesky_chat/ConvoService/getConvoForMembers.html)** | [Reference](lexicons/chat/bsky/convo/getConvoForMembers.md) | ❌ | ### chat.bsky.actor | Method | Docs | Paging (cursor) | | --- | --- | :---: | | **[chat.bsky.actor.declaration](https://pub.dev/documentation/bluesky/latest/bluesky_chat/ActorService/declaration.html)** | [Reference](lexicons/chat/bsky/actor/declaration.md) | ❌ | -| **[chat.bsky.actor.deleteAccount](https://pub.dev/documentation/bluesky/latest/bluesky_chat/ActorService/deleteAccount.html)** | [Reference](lexicons/chat/bsky/actor/deleteAccount.md) | ❌ | | **[chat.bsky.actor.exportAccountData](https://pub.dev/documentation/bluesky/latest/bluesky_chat/ActorService/exportAccountData.html)** | [Reference](lexicons/chat/bsky/actor/exportAccountData.md) | ❌ | +| **[chat.bsky.actor.deleteAccount](https://pub.dev/documentation/bluesky/latest/bluesky_chat/ActorService/deleteAccount.html)** | [Reference](lexicons/chat/bsky/actor/deleteAccount.md) | ❌ |