Parse and validate AT Protocol Lexicons with DTO generation for Laravel
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Add AT Protocol and Bluesky lexicon JSON files

+8331
+647
resources/lexicons/app/bsky/actor/defs.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "app.bsky.actor.defs", 4 + "defs": { 5 + "profileViewBasic": { 6 + "type": "object", 7 + "required": ["did", "handle"], 8 + "properties": { 9 + "did": { "type": "string", "format": "did" }, 10 + "handle": { "type": "string", "format": "handle" }, 11 + "displayName": { 12 + "type": "string", 13 + "maxGraphemes": 64, 14 + "maxLength": 640 15 + }, 16 + "pronouns": { "type": "string" }, 17 + "avatar": { "type": "string", "format": "uri" }, 18 + "associated": { 19 + "type": "ref", 20 + "ref": "#profileAssociated" 21 + }, 22 + "viewer": { "type": "ref", "ref": "#viewerState" }, 23 + "labels": { 24 + "type": "array", 25 + "items": { "type": "ref", "ref": "com.atproto.label.defs#label" } 26 + }, 27 + "createdAt": { "type": "string", "format": "datetime" }, 28 + "verification": { 29 + "type": "ref", 30 + "ref": "#verificationState" 31 + }, 32 + "status": { 33 + "type": "ref", 34 + "ref": "#statusView" 35 + }, 36 + "debug": { 37 + "type": "unknown", 38 + "description": "Debug information for internal development" 39 + } 40 + } 41 + }, 42 + "profileView": { 43 + "type": "object", 44 + "required": ["did", "handle"], 45 + "properties": { 46 + "did": { "type": "string", "format": "did" }, 47 + "handle": { "type": "string", "format": "handle" }, 48 + "displayName": { 49 + "type": "string", 50 + "maxGraphemes": 64, 51 + "maxLength": 640 52 + }, 53 + "pronouns": { "type": "string" }, 54 + "description": { 55 + "type": "string", 56 + "maxGraphemes": 256, 57 + "maxLength": 2560 58 + }, 59 + "avatar": { "type": "string", "format": "uri" }, 60 + "associated": { 61 + "type": "ref", 62 + "ref": "#profileAssociated" 63 + }, 64 + "indexedAt": { "type": "string", "format": "datetime" }, 65 + "createdAt": { "type": "string", "format": "datetime" }, 66 + "viewer": { "type": "ref", "ref": "#viewerState" }, 67 + "labels": { 68 + "type": "array", 69 + "items": { "type": "ref", "ref": "com.atproto.label.defs#label" } 70 + }, 71 + "verification": { 72 + "type": "ref", 73 + "ref": "#verificationState" 74 + }, 75 + "status": { 76 + "type": "ref", 77 + "ref": "#statusView" 78 + }, 79 + "debug": { 80 + "type": "unknown", 81 + "description": "Debug information for internal development" 82 + } 83 + } 84 + }, 85 + "profileViewDetailed": { 86 + "type": "object", 87 + "required": ["did", "handle"], 88 + "properties": { 89 + "did": { "type": "string", "format": "did" }, 90 + "handle": { "type": "string", "format": "handle" }, 91 + "displayName": { 92 + "type": "string", 93 + "maxGraphemes": 64, 94 + "maxLength": 640 95 + }, 96 + "description": { 97 + "type": "string", 98 + "maxGraphemes": 256, 99 + "maxLength": 2560 100 + }, 101 + "pronouns": { "type": "string" }, 102 + "website": { "type": "string", "format": "uri" }, 103 + "avatar": { "type": "string", "format": "uri" }, 104 + "banner": { "type": "string", "format": "uri" }, 105 + "followersCount": { "type": "integer" }, 106 + "followsCount": { "type": "integer" }, 107 + "postsCount": { "type": "integer" }, 108 + "associated": { 109 + "type": "ref", 110 + "ref": "#profileAssociated" 111 + }, 112 + "joinedViaStarterPack": { 113 + "type": "ref", 114 + "ref": "app.bsky.graph.defs#starterPackViewBasic" 115 + }, 116 + "indexedAt": { "type": "string", "format": "datetime" }, 117 + "createdAt": { "type": "string", "format": "datetime" }, 118 + "viewer": { "type": "ref", "ref": "#viewerState" }, 119 + "labels": { 120 + "type": "array", 121 + "items": { "type": "ref", "ref": "com.atproto.label.defs#label" } 122 + }, 123 + "pinnedPost": { 124 + "type": "ref", 125 + "ref": "com.atproto.repo.strongRef" 126 + }, 127 + "verification": { 128 + "type": "ref", 129 + "ref": "#verificationState" 130 + }, 131 + "status": { 132 + "type": "ref", 133 + "ref": "#statusView" 134 + }, 135 + "debug": { 136 + "type": "unknown", 137 + "description": "Debug information for internal development" 138 + } 139 + } 140 + }, 141 + "profileAssociated": { 142 + "type": "object", 143 + "properties": { 144 + "lists": { "type": "integer" }, 145 + "feedgens": { "type": "integer" }, 146 + "starterPacks": { "type": "integer" }, 147 + "labeler": { "type": "boolean" }, 148 + "chat": { "type": "ref", "ref": "#profileAssociatedChat" }, 149 + "activitySubscription": { 150 + "type": "ref", 151 + "ref": "#profileAssociatedActivitySubscription" 152 + } 153 + } 154 + }, 155 + "profileAssociatedChat": { 156 + "type": "object", 157 + "required": ["allowIncoming"], 158 + "properties": { 159 + "allowIncoming": { 160 + "type": "string", 161 + "knownValues": ["all", "none", "following"] 162 + } 163 + } 164 + }, 165 + "profileAssociatedActivitySubscription": { 166 + "type": "object", 167 + "required": ["allowSubscriptions"], 168 + "properties": { 169 + "allowSubscriptions": { 170 + "type": "string", 171 + "knownValues": ["followers", "mutuals", "none"] 172 + } 173 + } 174 + }, 175 + "viewerState": { 176 + "type": "object", 177 + "description": "Metadata about the requesting account's relationship with the subject account. Only has meaningful content for authed requests.", 178 + "properties": { 179 + "muted": { "type": "boolean" }, 180 + "mutedByList": { 181 + "type": "ref", 182 + "ref": "app.bsky.graph.defs#listViewBasic" 183 + }, 184 + "blockedBy": { "type": "boolean" }, 185 + "blocking": { "type": "string", "format": "at-uri" }, 186 + "blockingByList": { 187 + "type": "ref", 188 + "ref": "app.bsky.graph.defs#listViewBasic" 189 + }, 190 + "following": { "type": "string", "format": "at-uri" }, 191 + "followedBy": { "type": "string", "format": "at-uri" }, 192 + "knownFollowers": { 193 + "description": "This property is present only in selected cases, as an optimization.", 194 + "type": "ref", 195 + "ref": "#knownFollowers" 196 + }, 197 + "activitySubscription": { 198 + "description": "This property is present only in selected cases, as an optimization.", 199 + "type": "ref", 200 + "ref": "app.bsky.notification.defs#activitySubscription" 201 + } 202 + } 203 + }, 204 + "knownFollowers": { 205 + "type": "object", 206 + "description": "The subject's followers whom you also follow", 207 + "required": ["count", "followers"], 208 + "properties": { 209 + "count": { "type": "integer" }, 210 + "followers": { 211 + "type": "array", 212 + "minLength": 0, 213 + "maxLength": 5, 214 + "items": { 215 + "type": "ref", 216 + "ref": "#profileViewBasic" 217 + } 218 + } 219 + } 220 + }, 221 + "verificationState": { 222 + "type": "object", 223 + "description": "Represents the verification information about the user this object is attached to.", 224 + "required": ["verifications", "verifiedStatus", "trustedVerifierStatus"], 225 + "properties": { 226 + "verifications": { 227 + "type": "array", 228 + "description": "All verifications issued by trusted verifiers on behalf of this user. Verifications by untrusted verifiers are not included.", 229 + "items": { "type": "ref", "ref": "#verificationView" } 230 + }, 231 + "verifiedStatus": { 232 + "type": "string", 233 + "description": "The user's status as a verified account.", 234 + "knownValues": ["valid", "invalid", "none"] 235 + }, 236 + "trustedVerifierStatus": { 237 + "type": "string", 238 + "description": "The user's status as a trusted verifier.", 239 + "knownValues": ["valid", "invalid", "none"] 240 + } 241 + } 242 + }, 243 + "verificationView": { 244 + "type": "object", 245 + "description": "An individual verification for an associated subject.", 246 + "required": ["issuer", "uri", "isValid", "createdAt"], 247 + "properties": { 248 + "issuer": { 249 + "type": "string", 250 + "description": "The user who issued this verification.", 251 + "format": "did" 252 + }, 253 + "uri": { 254 + "type": "string", 255 + "description": "The AT-URI of the verification record.", 256 + "format": "at-uri" 257 + }, 258 + "isValid": { 259 + "type": "boolean", 260 + "description": "True if the verification passes validation, otherwise false." 261 + }, 262 + "createdAt": { 263 + "type": "string", 264 + "description": "Timestamp when the verification was created.", 265 + "format": "datetime" 266 + } 267 + } 268 + }, 269 + "preferences": { 270 + "type": "array", 271 + "items": { 272 + "type": "union", 273 + "refs": [ 274 + "#adultContentPref", 275 + "#contentLabelPref", 276 + "#savedFeedsPref", 277 + "#savedFeedsPrefV2", 278 + "#personalDetailsPref", 279 + "#feedViewPref", 280 + "#threadViewPref", 281 + "#interestsPref", 282 + "#mutedWordsPref", 283 + "#hiddenPostsPref", 284 + "#bskyAppStatePref", 285 + "#labelersPref", 286 + "#postInteractionSettingsPref", 287 + "#verificationPrefs" 288 + ] 289 + } 290 + }, 291 + "adultContentPref": { 292 + "type": "object", 293 + "required": ["enabled"], 294 + "properties": { 295 + "enabled": { "type": "boolean", "default": false } 296 + } 297 + }, 298 + "contentLabelPref": { 299 + "type": "object", 300 + "required": ["label", "visibility"], 301 + "properties": { 302 + "labelerDid": { 303 + "type": "string", 304 + "description": "Which labeler does this preference apply to? If undefined, applies globally.", 305 + "format": "did" 306 + }, 307 + "label": { "type": "string" }, 308 + "visibility": { 309 + "type": "string", 310 + "knownValues": ["ignore", "show", "warn", "hide"] 311 + } 312 + } 313 + }, 314 + "savedFeed": { 315 + "type": "object", 316 + "required": ["id", "type", "value", "pinned"], 317 + "properties": { 318 + "id": { 319 + "type": "string" 320 + }, 321 + "type": { 322 + "type": "string", 323 + "knownValues": ["feed", "list", "timeline"] 324 + }, 325 + "value": { 326 + "type": "string" 327 + }, 328 + "pinned": { 329 + "type": "boolean" 330 + } 331 + } 332 + }, 333 + "savedFeedsPrefV2": { 334 + "type": "object", 335 + "required": ["items"], 336 + "properties": { 337 + "items": { 338 + "type": "array", 339 + "items": { 340 + "type": "ref", 341 + "ref": "app.bsky.actor.defs#savedFeed" 342 + } 343 + } 344 + } 345 + }, 346 + "savedFeedsPref": { 347 + "type": "object", 348 + "required": ["pinned", "saved"], 349 + "properties": { 350 + "pinned": { 351 + "type": "array", 352 + "items": { 353 + "type": "string", 354 + "format": "at-uri" 355 + } 356 + }, 357 + "saved": { 358 + "type": "array", 359 + "items": { 360 + "type": "string", 361 + "format": "at-uri" 362 + } 363 + }, 364 + "timelineIndex": { 365 + "type": "integer" 366 + } 367 + } 368 + }, 369 + "personalDetailsPref": { 370 + "type": "object", 371 + "properties": { 372 + "birthDate": { 373 + "type": "string", 374 + "format": "datetime", 375 + "description": "The birth date of account owner." 376 + } 377 + } 378 + }, 379 + "feedViewPref": { 380 + "type": "object", 381 + "required": ["feed"], 382 + "properties": { 383 + "feed": { 384 + "type": "string", 385 + "description": "The URI of the feed, or an identifier which describes the feed." 386 + }, 387 + "hideReplies": { 388 + "type": "boolean", 389 + "description": "Hide replies in the feed." 390 + }, 391 + "hideRepliesByUnfollowed": { 392 + "type": "boolean", 393 + "description": "Hide replies in the feed if they are not by followed users.", 394 + "default": true 395 + }, 396 + "hideRepliesByLikeCount": { 397 + "type": "integer", 398 + "description": "Hide replies in the feed if they do not have this number of likes." 399 + }, 400 + "hideReposts": { 401 + "type": "boolean", 402 + "description": "Hide reposts in the feed." 403 + }, 404 + "hideQuotePosts": { 405 + "type": "boolean", 406 + "description": "Hide quote posts in the feed." 407 + } 408 + } 409 + }, 410 + "threadViewPref": { 411 + "type": "object", 412 + "properties": { 413 + "sort": { 414 + "type": "string", 415 + "description": "Sorting mode for threads.", 416 + "knownValues": ["oldest", "newest", "most-likes", "random", "hotness"] 417 + } 418 + } 419 + }, 420 + "interestsPref": { 421 + "type": "object", 422 + "required": ["tags"], 423 + "properties": { 424 + "tags": { 425 + "type": "array", 426 + "maxLength": 100, 427 + "items": { "type": "string", "maxLength": 640, "maxGraphemes": 64 }, 428 + "description": "A list of tags which describe the account owner's interests gathered during onboarding." 429 + } 430 + } 431 + }, 432 + "mutedWordTarget": { 433 + "type": "string", 434 + "knownValues": ["content", "tag"], 435 + "maxLength": 640, 436 + "maxGraphemes": 64 437 + }, 438 + "mutedWord": { 439 + "type": "object", 440 + "description": "A word that the account owner has muted.", 441 + "required": ["value", "targets"], 442 + "properties": { 443 + "id": { "type": "string" }, 444 + "value": { 445 + "type": "string", 446 + "description": "The muted word itself.", 447 + "maxLength": 10000, 448 + "maxGraphemes": 1000 449 + }, 450 + "targets": { 451 + "type": "array", 452 + "description": "The intended targets of the muted word.", 453 + "items": { 454 + "type": "ref", 455 + "ref": "app.bsky.actor.defs#mutedWordTarget" 456 + } 457 + }, 458 + "actorTarget": { 459 + "type": "string", 460 + "description": "Groups of users to apply the muted word to. If undefined, applies to all users.", 461 + "knownValues": ["all", "exclude-following"], 462 + "default": "all" 463 + }, 464 + "expiresAt": { 465 + "type": "string", 466 + "format": "datetime", 467 + "description": "The date and time at which the muted word will expire and no longer be applied." 468 + } 469 + } 470 + }, 471 + "mutedWordsPref": { 472 + "type": "object", 473 + "required": ["items"], 474 + "properties": { 475 + "items": { 476 + "type": "array", 477 + "items": { 478 + "type": "ref", 479 + "ref": "app.bsky.actor.defs#mutedWord" 480 + }, 481 + "description": "A list of words the account owner has muted." 482 + } 483 + } 484 + }, 485 + "hiddenPostsPref": { 486 + "type": "object", 487 + "required": ["items"], 488 + "properties": { 489 + "items": { 490 + "type": "array", 491 + "items": { "type": "string", "format": "at-uri" }, 492 + "description": "A list of URIs of posts the account owner has hidden." 493 + } 494 + } 495 + }, 496 + "labelersPref": { 497 + "type": "object", 498 + "required": ["labelers"], 499 + "properties": { 500 + "labelers": { 501 + "type": "array", 502 + "items": { 503 + "type": "ref", 504 + "ref": "#labelerPrefItem" 505 + } 506 + } 507 + } 508 + }, 509 + "labelerPrefItem": { 510 + "type": "object", 511 + "required": ["did"], 512 + "properties": { 513 + "did": { 514 + "type": "string", 515 + "format": "did" 516 + } 517 + } 518 + }, 519 + "bskyAppStatePref": { 520 + "description": "A grab bag of state that's specific to the bsky.app program. Third-party apps shouldn't use this.", 521 + "type": "object", 522 + "properties": { 523 + "activeProgressGuide": { 524 + "type": "ref", 525 + "ref": "#bskyAppProgressGuide" 526 + }, 527 + "queuedNudges": { 528 + "description": "An array of tokens which identify nudges (modals, popups, tours, highlight dots) that should be shown to the user.", 529 + "type": "array", 530 + "maxLength": 1000, 531 + "items": { "type": "string", "maxLength": 100 } 532 + }, 533 + "nuxs": { 534 + "description": "Storage for NUXs the user has encountered.", 535 + "type": "array", 536 + "maxLength": 100, 537 + "items": { 538 + "type": "ref", 539 + "ref": "app.bsky.actor.defs#nux" 540 + } 541 + } 542 + } 543 + }, 544 + "bskyAppProgressGuide": { 545 + "description": "If set, an active progress guide. Once completed, can be set to undefined. Should have unspecced fields tracking progress.", 546 + "type": "object", 547 + "required": ["guide"], 548 + "properties": { 549 + "guide": { "type": "string", "maxLength": 100 } 550 + } 551 + }, 552 + "nux": { 553 + "type": "object", 554 + "description": "A new user experiences (NUX) storage object", 555 + "required": ["id", "completed"], 556 + "properties": { 557 + "id": { 558 + "type": "string", 559 + "maxLength": 100 560 + }, 561 + "completed": { 562 + "type": "boolean", 563 + "default": false 564 + }, 565 + "data": { 566 + "description": "Arbitrary data for the NUX. The structure is defined by the NUX itself. Limited to 300 characters.", 567 + "type": "string", 568 + "maxLength": 3000, 569 + "maxGraphemes": 300 570 + }, 571 + "expiresAt": { 572 + "type": "string", 573 + "format": "datetime", 574 + "description": "The date and time at which the NUX will expire and should be considered completed." 575 + } 576 + } 577 + }, 578 + "verificationPrefs": { 579 + "type": "object", 580 + "description": "Preferences for how verified accounts appear in the app.", 581 + "required": [], 582 + "properties": { 583 + "hideBadges": { 584 + "description": "Hide the blue check badges for verified accounts and trusted verifiers.", 585 + "type": "boolean", 586 + "default": false 587 + } 588 + } 589 + }, 590 + "postInteractionSettingsPref": { 591 + "type": "object", 592 + "description": "Default post interaction settings for the account. These values should be applied as default values when creating new posts. These refs should mirror the threadgate and postgate records exactly.", 593 + "required": [], 594 + "properties": { 595 + "threadgateAllowRules": { 596 + "description": "Matches threadgate record. List of rules defining who can reply to this users posts. If value is an empty array, no one can reply. If value is undefined, anyone can reply.", 597 + "type": "array", 598 + "maxLength": 5, 599 + "items": { 600 + "type": "union", 601 + "refs": [ 602 + "app.bsky.feed.threadgate#mentionRule", 603 + "app.bsky.feed.threadgate#followerRule", 604 + "app.bsky.feed.threadgate#followingRule", 605 + "app.bsky.feed.threadgate#listRule" 606 + ] 607 + } 608 + }, 609 + "postgateEmbeddingRules": { 610 + "description": "Matches postgate record. List of rules defining who can embed this users posts. If value is an empty array or is undefined, no particular rules apply and anyone can embed.", 611 + "type": "array", 612 + "maxLength": 5, 613 + "items": { 614 + "type": "union", 615 + "refs": ["app.bsky.feed.postgate#disableRule"] 616 + } 617 + } 618 + } 619 + }, 620 + "statusView": { 621 + "type": "object", 622 + "required": ["status", "record"], 623 + "properties": { 624 + "status": { 625 + "type": "string", 626 + "description": "The status for the account.", 627 + "knownValues": ["app.bsky.actor.status#live"] 628 + }, 629 + "record": { "type": "unknown" }, 630 + "embed": { 631 + "type": "union", 632 + "description": "An optional embed associated with the status.", 633 + "refs": ["app.bsky.embed.external#view"] 634 + }, 635 + "expiresAt": { 636 + "type": "string", 637 + "description": "The date when this status will expire. The application might choose to no longer return the status after expiration.", 638 + "format": "datetime" 639 + }, 640 + "isActive": { 641 + "type": "boolean", 642 + "description": "True if the status is not expired, false if it is expired. Only present if expiration was set." 643 + } 644 + } 645 + } 646 + } 647 + }
+28
resources/lexicons/app/bsky/actor/getProfile.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "app.bsky.actor.getProfile", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Get detailed profile view of an actor. Does not require auth, but contains relevant metadata with auth.", 8 + "parameters": { 9 + "type": "params", 10 + "required": ["actor"], 11 + "properties": { 12 + "actor": { 13 + "type": "string", 14 + "format": "at-identifier", 15 + "description": "Handle or DID of account to fetch profile of." 16 + } 17 + } 18 + }, 19 + "output": { 20 + "encoding": "application/json", 21 + "schema": { 22 + "type": "ref", 23 + "ref": "app.bsky.actor.defs#profileViewDetailed" 24 + } 25 + } 26 + } 27 + } 28 + }
+37
resources/lexicons/app/bsky/actor/getProfiles.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "app.bsky.actor.getProfiles", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Get detailed profile views of multiple actors.", 8 + "parameters": { 9 + "type": "params", 10 + "required": ["actors"], 11 + "properties": { 12 + "actors": { 13 + "type": "array", 14 + "items": { "type": "string", "format": "at-identifier" }, 15 + "maxLength": 25 16 + } 17 + } 18 + }, 19 + "output": { 20 + "encoding": "application/json", 21 + "schema": { 22 + "type": "object", 23 + "required": ["profiles"], 24 + "properties": { 25 + "profiles": { 26 + "type": "array", 27 + "items": { 28 + "type": "ref", 29 + "ref": "app.bsky.actor.defs#profileViewDetailed" 30 + } 31 + } 32 + } 33 + } 34 + } 35 + } 36 + } 37 + }
+43
resources/lexicons/app/bsky/actor/getSuggestions.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "app.bsky.actor.getSuggestions", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Get a list of suggested actors. Expected use is discovery of accounts to follow during new account onboarding.", 8 + "parameters": { 9 + "type": "params", 10 + "properties": { 11 + "limit": { 12 + "type": "integer", 13 + "minimum": 1, 14 + "maximum": 100, 15 + "default": 50 16 + }, 17 + "cursor": { "type": "string" } 18 + } 19 + }, 20 + "output": { 21 + "encoding": "application/json", 22 + "schema": { 23 + "type": "object", 24 + "required": ["actors"], 25 + "properties": { 26 + "cursor": { "type": "string" }, 27 + "actors": { 28 + "type": "array", 29 + "items": { 30 + "type": "ref", 31 + "ref": "app.bsky.actor.defs#profileView" 32 + } 33 + }, 34 + "recId": { 35 + "type": "integer", 36 + "description": "Snowflake for this recommendation, use when submitting recommendation events." 37 + } 38 + } 39 + } 40 + } 41 + } 42 + } 43 + }
+15
resources/lexicons/app/bsky/embed/defs.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "app.bsky.embed.defs", 4 + "defs": { 5 + "aspectRatio": { 6 + "type": "object", 7 + "description": "width:height represents an aspect ratio. It may be approximate, and may not correspond to absolute dimensions in any given unit.", 8 + "required": ["width", "height"], 9 + "properties": { 10 + "width": { "type": "integer", "minimum": 1 }, 11 + "height": { "type": "integer", "minimum": 1 } 12 + } 13 + } 14 + } 15 + }
+51
resources/lexicons/app/bsky/embed/external.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "app.bsky.embed.external", 4 + "defs": { 5 + "main": { 6 + "type": "object", 7 + "description": "A representation of some externally linked content (eg, a URL and 'card'), embedded in a Bluesky record (eg, a post).", 8 + "required": ["external"], 9 + "properties": { 10 + "external": { 11 + "type": "ref", 12 + "ref": "#external" 13 + } 14 + } 15 + }, 16 + "external": { 17 + "type": "object", 18 + "required": ["uri", "title", "description"], 19 + "properties": { 20 + "uri": { "type": "string", "format": "uri" }, 21 + "title": { "type": "string" }, 22 + "description": { "type": "string" }, 23 + "thumb": { 24 + "type": "blob", 25 + "accept": ["image/*"], 26 + "maxSize": 1000000 27 + } 28 + } 29 + }, 30 + "view": { 31 + "type": "object", 32 + "required": ["external"], 33 + "properties": { 34 + "external": { 35 + "type": "ref", 36 + "ref": "#viewExternal" 37 + } 38 + } 39 + }, 40 + "viewExternal": { 41 + "type": "object", 42 + "required": ["uri", "title", "description"], 43 + "properties": { 44 + "uri": { "type": "string", "format": "uri" }, 45 + "title": { "type": "string" }, 46 + "description": { "type": "string" }, 47 + "thumb": { "type": "string", "format": "uri" } 48 + } 49 + } 50 + } 51 + }
+72
resources/lexicons/app/bsky/embed/images.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "app.bsky.embed.images", 4 + "description": "A set of images embedded in a Bluesky record (eg, a post).", 5 + "defs": { 6 + "main": { 7 + "type": "object", 8 + "required": ["images"], 9 + "properties": { 10 + "images": { 11 + "type": "array", 12 + "items": { "type": "ref", "ref": "#image" }, 13 + "maxLength": 4 14 + } 15 + } 16 + }, 17 + "image": { 18 + "type": "object", 19 + "required": ["image", "alt"], 20 + "properties": { 21 + "image": { 22 + "type": "blob", 23 + "accept": ["image/*"], 24 + "maxSize": 1000000 25 + }, 26 + "alt": { 27 + "type": "string", 28 + "description": "Alt text description of the image, for accessibility." 29 + }, 30 + "aspectRatio": { 31 + "type": "ref", 32 + "ref": "app.bsky.embed.defs#aspectRatio" 33 + } 34 + } 35 + }, 36 + "view": { 37 + "type": "object", 38 + "required": ["images"], 39 + "properties": { 40 + "images": { 41 + "type": "array", 42 + "items": { "type": "ref", "ref": "#viewImage" }, 43 + "maxLength": 4 44 + } 45 + } 46 + }, 47 + "viewImage": { 48 + "type": "object", 49 + "required": ["thumb", "fullsize", "alt"], 50 + "properties": { 51 + "thumb": { 52 + "type": "string", 53 + "format": "uri", 54 + "description": "Fully-qualified URL where a thumbnail of the image can be fetched. For example, CDN location provided by the App View." 55 + }, 56 + "fullsize": { 57 + "type": "string", 58 + "format": "uri", 59 + "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." 60 + }, 61 + "alt": { 62 + "type": "string", 63 + "description": "Alt text description of the image, for accessibility." 64 + }, 65 + "aspectRatio": { 66 + "type": "ref", 67 + "ref": "app.bsky.embed.defs#aspectRatio" 68 + } 69 + } 70 + } 71 + } 72 + }
+96
resources/lexicons/app/bsky/embed/record.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "app.bsky.embed.record", 4 + "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.", 5 + "defs": { 6 + "main": { 7 + "type": "object", 8 + "required": ["record"], 9 + "properties": { 10 + "record": { "type": "ref", "ref": "com.atproto.repo.strongRef" } 11 + } 12 + }, 13 + "view": { 14 + "type": "object", 15 + "required": ["record"], 16 + "properties": { 17 + "record": { 18 + "type": "union", 19 + "refs": [ 20 + "#viewRecord", 21 + "#viewNotFound", 22 + "#viewBlocked", 23 + "#viewDetached", 24 + "app.bsky.feed.defs#generatorView", 25 + "app.bsky.graph.defs#listView", 26 + "app.bsky.labeler.defs#labelerView", 27 + "app.bsky.graph.defs#starterPackViewBasic" 28 + ] 29 + } 30 + } 31 + }, 32 + "viewRecord": { 33 + "type": "object", 34 + "required": ["uri", "cid", "author", "value", "indexedAt"], 35 + "properties": { 36 + "uri": { "type": "string", "format": "at-uri" }, 37 + "cid": { "type": "string", "format": "cid" }, 38 + "author": { 39 + "type": "ref", 40 + "ref": "app.bsky.actor.defs#profileViewBasic" 41 + }, 42 + "value": { 43 + "type": "unknown", 44 + "description": "The record data itself." 45 + }, 46 + "labels": { 47 + "type": "array", 48 + "items": { "type": "ref", "ref": "com.atproto.label.defs#label" } 49 + }, 50 + "replyCount": { "type": "integer" }, 51 + "repostCount": { "type": "integer" }, 52 + "likeCount": { "type": "integer" }, 53 + "quoteCount": { "type": "integer" }, 54 + "embeds": { 55 + "type": "array", 56 + "items": { 57 + "type": "union", 58 + "refs": [ 59 + "app.bsky.embed.images#view", 60 + "app.bsky.embed.video#view", 61 + "app.bsky.embed.external#view", 62 + "app.bsky.embed.record#view", 63 + "app.bsky.embed.recordWithMedia#view" 64 + ] 65 + } 66 + }, 67 + "indexedAt": { "type": "string", "format": "datetime" } 68 + } 69 + }, 70 + "viewNotFound": { 71 + "type": "object", 72 + "required": ["uri", "notFound"], 73 + "properties": { 74 + "uri": { "type": "string", "format": "at-uri" }, 75 + "notFound": { "type": "boolean", "const": true } 76 + } 77 + }, 78 + "viewBlocked": { 79 + "type": "object", 80 + "required": ["uri", "blocked", "author"], 81 + "properties": { 82 + "uri": { "type": "string", "format": "at-uri" }, 83 + "blocked": { "type": "boolean", "const": true }, 84 + "author": { "type": "ref", "ref": "app.bsky.feed.defs#blockedAuthor" } 85 + } 86 + }, 87 + "viewDetached": { 88 + "type": "object", 89 + "required": ["uri", "detached"], 90 + "properties": { 91 + "uri": { "type": "string", "format": "at-uri" }, 92 + "detached": { "type": "boolean", "const": true } 93 + } 94 + } 95 + } 96 + }
+43
resources/lexicons/app/bsky/embed/recordWithMedia.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "app.bsky.embed.recordWithMedia", 4 + "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.", 5 + "defs": { 6 + "main": { 7 + "type": "object", 8 + "required": ["record", "media"], 9 + "properties": { 10 + "record": { 11 + "type": "ref", 12 + "ref": "app.bsky.embed.record" 13 + }, 14 + "media": { 15 + "type": "union", 16 + "refs": [ 17 + "app.bsky.embed.images", 18 + "app.bsky.embed.video", 19 + "app.bsky.embed.external" 20 + ] 21 + } 22 + } 23 + }, 24 + "view": { 25 + "type": "object", 26 + "required": ["record", "media"], 27 + "properties": { 28 + "record": { 29 + "type": "ref", 30 + "ref": "app.bsky.embed.record#view" 31 + }, 32 + "media": { 33 + "type": "union", 34 + "refs": [ 35 + "app.bsky.embed.images#view", 36 + "app.bsky.embed.video#view", 37 + "app.bsky.embed.external#view" 38 + ] 39 + } 40 + } 41 + } 42 + } 43 + }
+67
resources/lexicons/app/bsky/embed/video.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "app.bsky.embed.video", 4 + "description": "A video embedded in a Bluesky record (eg, a post).", 5 + "defs": { 6 + "main": { 7 + "type": "object", 8 + "required": ["video"], 9 + "properties": { 10 + "video": { 11 + "type": "blob", 12 + "description": "The mp4 video file. May be up to 100mb, formerly limited to 50mb.", 13 + "accept": ["video/mp4"], 14 + "maxSize": 100000000 15 + }, 16 + "captions": { 17 + "type": "array", 18 + "items": { "type": "ref", "ref": "#caption" }, 19 + "maxLength": 20 20 + }, 21 + "alt": { 22 + "type": "string", 23 + "description": "Alt text description of the video, for accessibility.", 24 + "maxGraphemes": 1000, 25 + "maxLength": 10000 26 + }, 27 + "aspectRatio": { 28 + "type": "ref", 29 + "ref": "app.bsky.embed.defs#aspectRatio" 30 + } 31 + } 32 + }, 33 + "caption": { 34 + "type": "object", 35 + "required": ["lang", "file"], 36 + "properties": { 37 + "lang": { 38 + "type": "string", 39 + "format": "language" 40 + }, 41 + "file": { 42 + "type": "blob", 43 + "accept": ["text/vtt"], 44 + "maxSize": 20000 45 + } 46 + } 47 + }, 48 + "view": { 49 + "type": "object", 50 + "required": ["cid", "playlist"], 51 + "properties": { 52 + "cid": { "type": "string", "format": "cid" }, 53 + "playlist": { "type": "string", "format": "uri" }, 54 + "thumbnail": { "type": "string", "format": "uri" }, 55 + "alt": { 56 + "type": "string", 57 + "maxGraphemes": 1000, 58 + "maxLength": 10000 59 + }, 60 + "aspectRatio": { 61 + "type": "ref", 62 + "ref": "app.bsky.embed.defs#aspectRatio" 63 + } 64 + } 65 + } 66 + } 67 + }
+331
resources/lexicons/app/bsky/feed/defs.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "app.bsky.feed.defs", 4 + "defs": { 5 + "postView": { 6 + "type": "object", 7 + "required": ["uri", "cid", "author", "record", "indexedAt"], 8 + "properties": { 9 + "uri": { "type": "string", "format": "at-uri" }, 10 + "cid": { "type": "string", "format": "cid" }, 11 + "author": { 12 + "type": "ref", 13 + "ref": "app.bsky.actor.defs#profileViewBasic" 14 + }, 15 + "record": { "type": "unknown" }, 16 + "embed": { 17 + "type": "union", 18 + "refs": [ 19 + "app.bsky.embed.images#view", 20 + "app.bsky.embed.video#view", 21 + "app.bsky.embed.external#view", 22 + "app.bsky.embed.record#view", 23 + "app.bsky.embed.recordWithMedia#view" 24 + ] 25 + }, 26 + "bookmarkCount": { "type": "integer" }, 27 + "replyCount": { "type": "integer" }, 28 + "repostCount": { "type": "integer" }, 29 + "likeCount": { "type": "integer" }, 30 + "quoteCount": { "type": "integer" }, 31 + "indexedAt": { "type": "string", "format": "datetime" }, 32 + "viewer": { "type": "ref", "ref": "#viewerState" }, 33 + "labels": { 34 + "type": "array", 35 + "items": { "type": "ref", "ref": "com.atproto.label.defs#label" } 36 + }, 37 + "threadgate": { "type": "ref", "ref": "#threadgateView" }, 38 + "debug": { 39 + "type": "unknown", 40 + "description": "Debug information for internal development" 41 + } 42 + } 43 + }, 44 + "viewerState": { 45 + "type": "object", 46 + "description": "Metadata about the requesting account's relationship with the subject content. Only has meaningful content for authed requests.", 47 + "properties": { 48 + "repost": { "type": "string", "format": "at-uri" }, 49 + "like": { "type": "string", "format": "at-uri" }, 50 + "bookmarked": { "type": "boolean" }, 51 + "threadMuted": { "type": "boolean" }, 52 + "replyDisabled": { "type": "boolean" }, 53 + "embeddingDisabled": { "type": "boolean" }, 54 + "pinned": { "type": "boolean" } 55 + } 56 + }, 57 + "threadContext": { 58 + "type": "object", 59 + "description": "Metadata about this post within the context of the thread it is in.", 60 + "properties": { 61 + "rootAuthorLike": { "type": "string", "format": "at-uri" } 62 + } 63 + }, 64 + "feedViewPost": { 65 + "type": "object", 66 + "required": ["post"], 67 + "properties": { 68 + "post": { "type": "ref", "ref": "#postView" }, 69 + "reply": { "type": "ref", "ref": "#replyRef" }, 70 + "reason": { "type": "union", "refs": ["#reasonRepost", "#reasonPin"] }, 71 + "feedContext": { 72 + "type": "string", 73 + "description": "Context provided by feed generator that may be passed back alongside interactions.", 74 + "maxLength": 2000 75 + }, 76 + "reqId": { 77 + "type": "string", 78 + "description": "Unique identifier per request that may be passed back alongside interactions.", 79 + "maxLength": 100 80 + } 81 + } 82 + }, 83 + "replyRef": { 84 + "type": "object", 85 + "required": ["root", "parent"], 86 + "properties": { 87 + "root": { 88 + "type": "union", 89 + "refs": ["#postView", "#notFoundPost", "#blockedPost"] 90 + }, 91 + "parent": { 92 + "type": "union", 93 + "refs": ["#postView", "#notFoundPost", "#blockedPost"] 94 + }, 95 + "grandparentAuthor": { 96 + "type": "ref", 97 + "ref": "app.bsky.actor.defs#profileViewBasic", 98 + "description": "When parent is a reply to another post, this is the author of that post." 99 + } 100 + } 101 + }, 102 + "reasonRepost": { 103 + "type": "object", 104 + "required": ["by", "indexedAt"], 105 + "properties": { 106 + "by": { "type": "ref", "ref": "app.bsky.actor.defs#profileViewBasic" }, 107 + "uri": { "type": "string", "format": "at-uri" }, 108 + "cid": { "type": "string", "format": "cid" }, 109 + "indexedAt": { "type": "string", "format": "datetime" } 110 + } 111 + }, 112 + "reasonPin": { 113 + "type": "object", 114 + "properties": {} 115 + }, 116 + "threadViewPost": { 117 + "type": "object", 118 + "required": ["post"], 119 + "properties": { 120 + "post": { "type": "ref", "ref": "#postView" }, 121 + "parent": { 122 + "type": "union", 123 + "refs": ["#threadViewPost", "#notFoundPost", "#blockedPost"] 124 + }, 125 + "replies": { 126 + "type": "array", 127 + "items": { 128 + "type": "union", 129 + "refs": ["#threadViewPost", "#notFoundPost", "#blockedPost"] 130 + } 131 + }, 132 + "threadContext": { "type": "ref", "ref": "#threadContext" } 133 + } 134 + }, 135 + "notFoundPost": { 136 + "type": "object", 137 + "required": ["uri", "notFound"], 138 + "properties": { 139 + "uri": { "type": "string", "format": "at-uri" }, 140 + "notFound": { "type": "boolean", "const": true } 141 + } 142 + }, 143 + "blockedPost": { 144 + "type": "object", 145 + "required": ["uri", "blocked", "author"], 146 + "properties": { 147 + "uri": { "type": "string", "format": "at-uri" }, 148 + "blocked": { "type": "boolean", "const": true }, 149 + "author": { "type": "ref", "ref": "#blockedAuthor" } 150 + } 151 + }, 152 + "blockedAuthor": { 153 + "type": "object", 154 + "required": ["did"], 155 + "properties": { 156 + "did": { "type": "string", "format": "did" }, 157 + "viewer": { "type": "ref", "ref": "app.bsky.actor.defs#viewerState" } 158 + } 159 + }, 160 + "generatorView": { 161 + "type": "object", 162 + "required": ["uri", "cid", "did", "creator", "displayName", "indexedAt"], 163 + "properties": { 164 + "uri": { "type": "string", "format": "at-uri" }, 165 + "cid": { "type": "string", "format": "cid" }, 166 + "did": { "type": "string", "format": "did" }, 167 + "creator": { "type": "ref", "ref": "app.bsky.actor.defs#profileView" }, 168 + "displayName": { "type": "string" }, 169 + "description": { 170 + "type": "string", 171 + "maxGraphemes": 300, 172 + "maxLength": 3000 173 + }, 174 + "descriptionFacets": { 175 + "type": "array", 176 + "items": { "type": "ref", "ref": "app.bsky.richtext.facet" } 177 + }, 178 + "avatar": { "type": "string", "format": "uri" }, 179 + "likeCount": { "type": "integer", "minimum": 0 }, 180 + "acceptsInteractions": { "type": "boolean" }, 181 + "labels": { 182 + "type": "array", 183 + "items": { "type": "ref", "ref": "com.atproto.label.defs#label" } 184 + }, 185 + "viewer": { "type": "ref", "ref": "#generatorViewerState" }, 186 + "contentMode": { 187 + "type": "string", 188 + "knownValues": [ 189 + "app.bsky.feed.defs#contentModeUnspecified", 190 + "app.bsky.feed.defs#contentModeVideo" 191 + ] 192 + }, 193 + "indexedAt": { "type": "string", "format": "datetime" } 194 + } 195 + }, 196 + "generatorViewerState": { 197 + "type": "object", 198 + "properties": { 199 + "like": { "type": "string", "format": "at-uri" } 200 + } 201 + }, 202 + "skeletonFeedPost": { 203 + "type": "object", 204 + "required": ["post"], 205 + "properties": { 206 + "post": { "type": "string", "format": "at-uri" }, 207 + "reason": { 208 + "type": "union", 209 + "refs": ["#skeletonReasonRepost", "#skeletonReasonPin"] 210 + }, 211 + "feedContext": { 212 + "type": "string", 213 + "description": "Context that will be passed through to client and may be passed to feed generator back alongside interactions.", 214 + "maxLength": 2000 215 + } 216 + } 217 + }, 218 + "skeletonReasonRepost": { 219 + "type": "object", 220 + "required": ["repost"], 221 + "properties": { 222 + "repost": { "type": "string", "format": "at-uri" } 223 + } 224 + }, 225 + "skeletonReasonPin": { 226 + "type": "object", 227 + "properties": {} 228 + }, 229 + "threadgateView": { 230 + "type": "object", 231 + "properties": { 232 + "uri": { "type": "string", "format": "at-uri" }, 233 + "cid": { "type": "string", "format": "cid" }, 234 + "record": { "type": "unknown" }, 235 + "lists": { 236 + "type": "array", 237 + "items": { "type": "ref", "ref": "app.bsky.graph.defs#listViewBasic" } 238 + } 239 + } 240 + }, 241 + "interaction": { 242 + "type": "object", 243 + "properties": { 244 + "item": { "type": "string", "format": "at-uri" }, 245 + "event": { 246 + "type": "string", 247 + "knownValues": [ 248 + "app.bsky.feed.defs#requestLess", 249 + "app.bsky.feed.defs#requestMore", 250 + "app.bsky.feed.defs#clickthroughItem", 251 + "app.bsky.feed.defs#clickthroughAuthor", 252 + "app.bsky.feed.defs#clickthroughReposter", 253 + "app.bsky.feed.defs#clickthroughEmbed", 254 + "app.bsky.feed.defs#interactionSeen", 255 + "app.bsky.feed.defs#interactionLike", 256 + "app.bsky.feed.defs#interactionRepost", 257 + "app.bsky.feed.defs#interactionReply", 258 + "app.bsky.feed.defs#interactionQuote", 259 + "app.bsky.feed.defs#interactionShare" 260 + ] 261 + }, 262 + "feedContext": { 263 + "type": "string", 264 + "description": "Context on a feed item that was originally supplied by the feed generator on getFeedSkeleton.", 265 + "maxLength": 2000 266 + }, 267 + "reqId": { 268 + "type": "string", 269 + "description": "Unique identifier per request that may be passed back alongside interactions.", 270 + "maxLength": 100 271 + } 272 + } 273 + }, 274 + "requestLess": { 275 + "type": "token", 276 + "description": "Request that less content like the given feed item be shown in the feed" 277 + }, 278 + "requestMore": { 279 + "type": "token", 280 + "description": "Request that more content like the given feed item be shown in the feed" 281 + }, 282 + "clickthroughItem": { 283 + "type": "token", 284 + "description": "User clicked through to the feed item" 285 + }, 286 + "clickthroughAuthor": { 287 + "type": "token", 288 + "description": "User clicked through to the author of the feed item" 289 + }, 290 + "clickthroughReposter": { 291 + "type": "token", 292 + "description": "User clicked through to the reposter of the feed item" 293 + }, 294 + "clickthroughEmbed": { 295 + "type": "token", 296 + "description": "User clicked through to the embedded content of the feed item" 297 + }, 298 + "contentModeUnspecified": { 299 + "type": "token", 300 + "description": "Declares the feed generator returns any types of posts." 301 + }, 302 + "contentModeVideo": { 303 + "type": "token", 304 + "description": "Declares the feed generator returns posts containing app.bsky.embed.video embeds." 305 + }, 306 + "interactionSeen": { 307 + "type": "token", 308 + "description": "Feed item was seen by user" 309 + }, 310 + "interactionLike": { 311 + "type": "token", 312 + "description": "User liked the feed item" 313 + }, 314 + "interactionRepost": { 315 + "type": "token", 316 + "description": "User reposted the feed item" 317 + }, 318 + "interactionReply": { 319 + "type": "token", 320 + "description": "User replied to the feed item" 321 + }, 322 + "interactionQuote": { 323 + "type": "token", 324 + "description": "User quoted the feed item" 325 + }, 326 + "interactionShare": { 327 + "type": "token", 328 + "description": "User shared the feed item" 329 + } 330 + } 331 + }
+42
resources/lexicons/app/bsky/feed/getFeed.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "app.bsky.feed.getFeed", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Get a hydrated feed from an actor's selected feed generator. Implemented by App View.", 8 + "parameters": { 9 + "type": "params", 10 + "required": ["feed"], 11 + "properties": { 12 + "feed": { "type": "string", "format": "at-uri" }, 13 + "limit": { 14 + "type": "integer", 15 + "minimum": 1, 16 + "maximum": 100, 17 + "default": 50 18 + }, 19 + "cursor": { "type": "string" } 20 + } 21 + }, 22 + "output": { 23 + "encoding": "application/json", 24 + "schema": { 25 + "type": "object", 26 + "required": ["feed"], 27 + "properties": { 28 + "cursor": { "type": "string" }, 29 + "feed": { 30 + "type": "array", 31 + "items": { 32 + "type": "ref", 33 + "ref": "app.bsky.feed.defs#feedViewPost" 34 + } 35 + } 36 + } 37 + } 38 + }, 39 + "errors": [{ "name": "UnknownFeed" }] 40 + } 41 + } 42 + }
+58
resources/lexicons/app/bsky/feed/getLikes.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "app.bsky.feed.getLikes", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Get like records which reference a subject (by AT-URI and CID).", 8 + "parameters": { 9 + "type": "params", 10 + "required": ["uri"], 11 + "properties": { 12 + "uri": { 13 + "type": "string", 14 + "format": "at-uri", 15 + "description": "AT-URI of the subject (eg, a post record)." 16 + }, 17 + "cid": { 18 + "type": "string", 19 + "format": "cid", 20 + "description": "CID of the subject record (aka, specific version of record), to filter likes." 21 + }, 22 + "limit": { 23 + "type": "integer", 24 + "minimum": 1, 25 + "maximum": 100, 26 + "default": 50 27 + }, 28 + "cursor": { "type": "string" } 29 + } 30 + }, 31 + "output": { 32 + "encoding": "application/json", 33 + "schema": { 34 + "type": "object", 35 + "required": ["uri", "likes"], 36 + "properties": { 37 + "uri": { "type": "string", "format": "at-uri" }, 38 + "cid": { "type": "string", "format": "cid" }, 39 + "cursor": { "type": "string" }, 40 + "likes": { 41 + "type": "array", 42 + "items": { "type": "ref", "ref": "#like" } 43 + } 44 + } 45 + } 46 + } 47 + }, 48 + "like": { 49 + "type": "object", 50 + "required": ["indexedAt", "createdAt", "actor"], 51 + "properties": { 52 + "indexedAt": { "type": "string", "format": "datetime" }, 53 + "createdAt": { "type": "string", "format": "datetime" }, 54 + "actor": { "type": "ref", "ref": "app.bsky.actor.defs#profileView" } 55 + } 56 + } 57 + } 58 + }
+43
resources/lexicons/app/bsky/feed/getTimeline.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "app.bsky.feed.getTimeline", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Get a view of the requesting account's home timeline. This is expected to be some form of reverse-chronological feed.", 8 + "parameters": { 9 + "type": "params", 10 + "properties": { 11 + "algorithm": { 12 + "type": "string", 13 + "description": "Variant 'algorithm' for timeline. Implementation-specific. NOTE: most feed flexibility has been moved to feed generator mechanism." 14 + }, 15 + "limit": { 16 + "type": "integer", 17 + "minimum": 1, 18 + "maximum": 100, 19 + "default": 50 20 + }, 21 + "cursor": { "type": "string" } 22 + } 23 + }, 24 + "output": { 25 + "encoding": "application/json", 26 + "schema": { 27 + "type": "object", 28 + "required": ["feed"], 29 + "properties": { 30 + "cursor": { "type": "string" }, 31 + "feed": { 32 + "type": "array", 33 + "items": { 34 + "type": "ref", 35 + "ref": "app.bsky.feed.defs#feedViewPost" 36 + } 37 + } 38 + } 39 + } 40 + } 41 + } 42 + } 43 + }
+20
resources/lexicons/app/bsky/feed/like.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "app.bsky.feed.like", 4 + "defs": { 5 + "main": { 6 + "type": "record", 7 + "description": "Record declaring a 'like' of a piece of subject content.", 8 + "key": "tid", 9 + "record": { 10 + "type": "object", 11 + "required": ["subject", "createdAt"], 12 + "properties": { 13 + "subject": { "type": "ref", "ref": "com.atproto.repo.strongRef" }, 14 + "createdAt": { "type": "string", "format": "datetime" }, 15 + "via": { "type": "ref", "ref": "com.atproto.repo.strongRef" } 16 + } 17 + } 18 + } 19 + } 20 + }
+96
resources/lexicons/app/bsky/feed/post.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "app.bsky.feed.post", 4 + "defs": { 5 + "main": { 6 + "type": "record", 7 + "description": "Record containing a Bluesky post.", 8 + "key": "tid", 9 + "record": { 10 + "type": "object", 11 + "required": ["text", "createdAt"], 12 + "properties": { 13 + "text": { 14 + "type": "string", 15 + "maxLength": 3000, 16 + "maxGraphemes": 300, 17 + "description": "The primary post content. May be an empty string, if there are embeds." 18 + }, 19 + "entities": { 20 + "type": "array", 21 + "description": "DEPRECATED: replaced by app.bsky.richtext.facet.", 22 + "items": { "type": "ref", "ref": "#entity" } 23 + }, 24 + "facets": { 25 + "type": "array", 26 + "description": "Annotations of text (mentions, URLs, hashtags, etc)", 27 + "items": { "type": "ref", "ref": "app.bsky.richtext.facet" } 28 + }, 29 + "reply": { "type": "ref", "ref": "#replyRef" }, 30 + "embed": { 31 + "type": "union", 32 + "refs": [ 33 + "app.bsky.embed.images", 34 + "app.bsky.embed.video", 35 + "app.bsky.embed.external", 36 + "app.bsky.embed.record", 37 + "app.bsky.embed.recordWithMedia" 38 + ] 39 + }, 40 + "langs": { 41 + "type": "array", 42 + "description": "Indicates human language of post primary text content.", 43 + "maxLength": 3, 44 + "items": { "type": "string", "format": "language" } 45 + }, 46 + "labels": { 47 + "type": "union", 48 + "description": "Self-label values for this post. Effectively content warnings.", 49 + "refs": ["com.atproto.label.defs#selfLabels"] 50 + }, 51 + "tags": { 52 + "type": "array", 53 + "description": "Additional hashtags, in addition to any included in post text and facets.", 54 + "maxLength": 8, 55 + "items": { "type": "string", "maxLength": 640, "maxGraphemes": 64 } 56 + }, 57 + "createdAt": { 58 + "type": "string", 59 + "format": "datetime", 60 + "description": "Client-declared timestamp when this post was originally created." 61 + } 62 + } 63 + } 64 + }, 65 + "replyRef": { 66 + "type": "object", 67 + "required": ["root", "parent"], 68 + "properties": { 69 + "root": { "type": "ref", "ref": "com.atproto.repo.strongRef" }, 70 + "parent": { "type": "ref", "ref": "com.atproto.repo.strongRef" } 71 + } 72 + }, 73 + "entity": { 74 + "type": "object", 75 + "description": "Deprecated: use facets instead.", 76 + "required": ["index", "type", "value"], 77 + "properties": { 78 + "index": { "type": "ref", "ref": "#textSlice" }, 79 + "type": { 80 + "type": "string", 81 + "description": "Expected values are 'mention' and 'link'." 82 + }, 83 + "value": { "type": "string" } 84 + } 85 + }, 86 + "textSlice": { 87 + "type": "object", 88 + "description": "Deprecated. Use app.bsky.richtext instead -- A text segment. Start is inclusive, end is exclusive. Indices are for utf16-encoded strings.", 89 + "required": ["start", "end"], 90 + "properties": { 91 + "start": { "type": "integer", "minimum": 0 }, 92 + "end": { "type": "integer", "minimum": 0 } 93 + } 94 + } 95 + } 96 + }
+20
resources/lexicons/app/bsky/feed/repost.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "app.bsky.feed.repost", 4 + "defs": { 5 + "main": { 6 + "description": "Record representing a 'repost' of an existing Bluesky post.", 7 + "type": "record", 8 + "key": "tid", 9 + "record": { 10 + "type": "object", 11 + "required": ["subject", "createdAt"], 12 + "properties": { 13 + "subject": { "type": "ref", "ref": "com.atproto.repo.strongRef" }, 14 + "createdAt": { "type": "string", "format": "datetime" }, 15 + "via": { "type": "ref", "ref": "com.atproto.repo.strongRef" } 16 + } 17 + } 18 + } 19 + } 20 + }
+23
resources/lexicons/app/bsky/graph/block.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "app.bsky.graph.block", 4 + "defs": { 5 + "main": { 6 + "type": "record", 7 + "description": "Record declaring a 'block' relationship against another account. NOTE: blocks are public in Bluesky; see blog posts for details.", 8 + "key": "tid", 9 + "record": { 10 + "type": "object", 11 + "required": ["subject", "createdAt"], 12 + "properties": { 13 + "subject": { 14 + "type": "string", 15 + "format": "did", 16 + "description": "DID of the account to be blocked." 17 + }, 18 + "createdAt": { "type": "string", "format": "datetime" } 19 + } 20 + } 21 + } 22 + } 23 + }
+166
resources/lexicons/app/bsky/graph/defs.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "app.bsky.graph.defs", 4 + "defs": { 5 + "listViewBasic": { 6 + "type": "object", 7 + "required": ["uri", "cid", "name", "purpose"], 8 + "properties": { 9 + "uri": { "type": "string", "format": "at-uri" }, 10 + "cid": { "type": "string", "format": "cid" }, 11 + "name": { "type": "string", "maxLength": 64, "minLength": 1 }, 12 + "purpose": { "type": "ref", "ref": "#listPurpose" }, 13 + "avatar": { "type": "string", "format": "uri" }, 14 + "listItemCount": { "type": "integer", "minimum": 0 }, 15 + "labels": { 16 + "type": "array", 17 + "items": { "type": "ref", "ref": "com.atproto.label.defs#label" } 18 + }, 19 + "viewer": { "type": "ref", "ref": "#listViewerState" }, 20 + "indexedAt": { "type": "string", "format": "datetime" } 21 + } 22 + }, 23 + "listView": { 24 + "type": "object", 25 + "required": ["uri", "cid", "creator", "name", "purpose", "indexedAt"], 26 + "properties": { 27 + "uri": { "type": "string", "format": "at-uri" }, 28 + "cid": { "type": "string", "format": "cid" }, 29 + "creator": { "type": "ref", "ref": "app.bsky.actor.defs#profileView" }, 30 + "name": { "type": "string", "maxLength": 64, "minLength": 1 }, 31 + "purpose": { "type": "ref", "ref": "#listPurpose" }, 32 + "description": { 33 + "type": "string", 34 + "maxGraphemes": 300, 35 + "maxLength": 3000 36 + }, 37 + "descriptionFacets": { 38 + "type": "array", 39 + "items": { "type": "ref", "ref": "app.bsky.richtext.facet" } 40 + }, 41 + "avatar": { "type": "string", "format": "uri" }, 42 + "listItemCount": { "type": "integer", "minimum": 0 }, 43 + "labels": { 44 + "type": "array", 45 + "items": { "type": "ref", "ref": "com.atproto.label.defs#label" } 46 + }, 47 + "viewer": { "type": "ref", "ref": "#listViewerState" }, 48 + "indexedAt": { "type": "string", "format": "datetime" } 49 + } 50 + }, 51 + "listItemView": { 52 + "type": "object", 53 + "required": ["uri", "subject"], 54 + "properties": { 55 + "uri": { "type": "string", "format": "at-uri" }, 56 + "subject": { "type": "ref", "ref": "app.bsky.actor.defs#profileView" } 57 + } 58 + }, 59 + "starterPackView": { 60 + "type": "object", 61 + "required": ["uri", "cid", "record", "creator", "indexedAt"], 62 + "properties": { 63 + "uri": { "type": "string", "format": "at-uri" }, 64 + "cid": { "type": "string", "format": "cid" }, 65 + "record": { "type": "unknown" }, 66 + "creator": { 67 + "type": "ref", 68 + "ref": "app.bsky.actor.defs#profileViewBasic" 69 + }, 70 + "list": { "type": "ref", "ref": "#listViewBasic" }, 71 + "listItemsSample": { 72 + "type": "array", 73 + "maxLength": 12, 74 + "items": { "type": "ref", "ref": "#listItemView" } 75 + }, 76 + "feeds": { 77 + "type": "array", 78 + "maxLength": 3, 79 + "items": { "type": "ref", "ref": "app.bsky.feed.defs#generatorView" } 80 + }, 81 + "joinedWeekCount": { "type": "integer", "minimum": 0 }, 82 + "joinedAllTimeCount": { "type": "integer", "minimum": 0 }, 83 + "labels": { 84 + "type": "array", 85 + "items": { "type": "ref", "ref": "com.atproto.label.defs#label" } 86 + }, 87 + "indexedAt": { "type": "string", "format": "datetime" } 88 + } 89 + }, 90 + "starterPackViewBasic": { 91 + "type": "object", 92 + "required": ["uri", "cid", "record", "creator", "indexedAt"], 93 + "properties": { 94 + "uri": { "type": "string", "format": "at-uri" }, 95 + "cid": { "type": "string", "format": "cid" }, 96 + "record": { "type": "unknown" }, 97 + "creator": { 98 + "type": "ref", 99 + "ref": "app.bsky.actor.defs#profileViewBasic" 100 + }, 101 + "listItemCount": { "type": "integer", "minimum": 0 }, 102 + "joinedWeekCount": { "type": "integer", "minimum": 0 }, 103 + "joinedAllTimeCount": { "type": "integer", "minimum": 0 }, 104 + "labels": { 105 + "type": "array", 106 + "items": { "type": "ref", "ref": "com.atproto.label.defs#label" } 107 + }, 108 + "indexedAt": { "type": "string", "format": "datetime" } 109 + } 110 + }, 111 + "listPurpose": { 112 + "type": "string", 113 + "knownValues": [ 114 + "app.bsky.graph.defs#modlist", 115 + "app.bsky.graph.defs#curatelist", 116 + "app.bsky.graph.defs#referencelist" 117 + ] 118 + }, 119 + "modlist": { 120 + "type": "token", 121 + "description": "A list of actors to apply an aggregate moderation action (mute/block) on." 122 + }, 123 + "curatelist": { 124 + "type": "token", 125 + "description": "A list of actors used for curation purposes such as list feeds or interaction gating." 126 + }, 127 + "referencelist": { 128 + "type": "token", 129 + "description": "A list of actors used for only for reference purposes such as within a starter pack." 130 + }, 131 + "listViewerState": { 132 + "type": "object", 133 + "properties": { 134 + "muted": { "type": "boolean" }, 135 + "blocked": { "type": "string", "format": "at-uri" } 136 + } 137 + }, 138 + "notFoundActor": { 139 + "type": "object", 140 + "description": "indicates that a handle or DID could not be resolved", 141 + "required": ["actor", "notFound"], 142 + "properties": { 143 + "actor": { "type": "string", "format": "at-identifier" }, 144 + "notFound": { "type": "boolean", "const": true } 145 + } 146 + }, 147 + "relationship": { 148 + "type": "object", 149 + "description": "lists the bi-directional graph relationships between one actor (not indicated in the object), and the target actors (the DID included in the object)", 150 + "required": ["did"], 151 + "properties": { 152 + "did": { "type": "string", "format": "did" }, 153 + "following": { 154 + "type": "string", 155 + "format": "at-uri", 156 + "description": "if the actor follows this DID, this is the AT-URI of the follow record" 157 + }, 158 + "followedBy": { 159 + "type": "string", 160 + "format": "at-uri", 161 + "description": "if the actor is followed by this DID, contains the AT-URI of the follow record" 162 + } 163 + } 164 + } 165 + } 166 + }
+20
resources/lexicons/app/bsky/graph/follow.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "app.bsky.graph.follow", 4 + "defs": { 5 + "main": { 6 + "type": "record", 7 + "description": "Record declaring a social 'follow' relationship of another account. Duplicate follows will be ignored by the AppView.", 8 + "key": "tid", 9 + "record": { 10 + "type": "object", 11 + "required": ["subject", "createdAt"], 12 + "properties": { 13 + "subject": { "type": "string", "format": "did" }, 14 + "createdAt": { "type": "string", "format": "datetime" }, 15 + "via": { "type": "ref", "ref": "com.atproto.repo.strongRef" } 16 + } 17 + } 18 + } 19 + } 20 + }
+47
resources/lexicons/app/bsky/graph/list.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "app.bsky.graph.list", 4 + "defs": { 5 + "main": { 6 + "type": "record", 7 + "description": "Record representing a list of accounts (actors). Scope includes both moderation-oriented lists and curration-oriented lists.", 8 + "key": "tid", 9 + "record": { 10 + "type": "object", 11 + "required": ["name", "purpose", "createdAt"], 12 + "properties": { 13 + "purpose": { 14 + "type": "ref", 15 + "description": "Defines the purpose of the list (aka, moderation-oriented or curration-oriented)", 16 + "ref": "app.bsky.graph.defs#listPurpose" 17 + }, 18 + "name": { 19 + "type": "string", 20 + "maxLength": 64, 21 + "minLength": 1, 22 + "description": "Display name for list; can not be empty." 23 + }, 24 + "description": { 25 + "type": "string", 26 + "maxGraphemes": 300, 27 + "maxLength": 3000 28 + }, 29 + "descriptionFacets": { 30 + "type": "array", 31 + "items": { "type": "ref", "ref": "app.bsky.richtext.facet" } 32 + }, 33 + "avatar": { 34 + "type": "blob", 35 + "accept": ["image/png", "image/jpeg"], 36 + "maxSize": 1000000 37 + }, 38 + "labels": { 39 + "type": "union", 40 + "refs": ["com.atproto.label.defs#selfLabels"] 41 + }, 42 + "createdAt": { "type": "string", "format": "datetime" } 43 + } 44 + } 45 + } 46 + } 47 + }
+28
resources/lexicons/app/bsky/graph/listitem.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "app.bsky.graph.listitem", 4 + "defs": { 5 + "main": { 6 + "type": "record", 7 + "description": "Record representing an account's inclusion on a specific list. The AppView will ignore duplicate listitem records.", 8 + "key": "tid", 9 + "record": { 10 + "type": "object", 11 + "required": ["subject", "list", "createdAt"], 12 + "properties": { 13 + "subject": { 14 + "type": "string", 15 + "format": "did", 16 + "description": "The account which is included on the list." 17 + }, 18 + "list": { 19 + "type": "string", 20 + "format": "at-uri", 21 + "description": "Reference (AT-URI) to the list record (app.bsky.graph.list)." 22 + }, 23 + "createdAt": { "type": "string", "format": "datetime" } 24 + } 25 + } 26 + } 27 + } 28 + }
+91
resources/lexicons/app/bsky/labeler/defs.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "app.bsky.labeler.defs", 4 + "defs": { 5 + "labelerView": { 6 + "type": "object", 7 + "required": ["uri", "cid", "creator", "indexedAt"], 8 + "properties": { 9 + "uri": { "type": "string", "format": "at-uri" }, 10 + "cid": { "type": "string", "format": "cid" }, 11 + "creator": { "type": "ref", "ref": "app.bsky.actor.defs#profileView" }, 12 + "likeCount": { "type": "integer", "minimum": 0 }, 13 + "viewer": { "type": "ref", "ref": "#labelerViewerState" }, 14 + "indexedAt": { "type": "string", "format": "datetime" }, 15 + "labels": { 16 + "type": "array", 17 + "items": { "type": "ref", "ref": "com.atproto.label.defs#label" } 18 + } 19 + } 20 + }, 21 + "labelerViewDetailed": { 22 + "type": "object", 23 + "required": ["uri", "cid", "creator", "policies", "indexedAt"], 24 + "properties": { 25 + "uri": { "type": "string", "format": "at-uri" }, 26 + "cid": { "type": "string", "format": "cid" }, 27 + "creator": { "type": "ref", "ref": "app.bsky.actor.defs#profileView" }, 28 + "policies": { 29 + "type": "ref", 30 + "ref": "app.bsky.labeler.defs#labelerPolicies" 31 + }, 32 + "likeCount": { "type": "integer", "minimum": 0 }, 33 + "viewer": { "type": "ref", "ref": "#labelerViewerState" }, 34 + "indexedAt": { "type": "string", "format": "datetime" }, 35 + "labels": { 36 + "type": "array", 37 + "items": { "type": "ref", "ref": "com.atproto.label.defs#label" } 38 + }, 39 + "reasonTypes": { 40 + "description": "The set of report reason 'codes' which are in-scope for this service to review and action. These usually align to policy categories. If not defined (distinct from empty array), all reason types are allowed.", 41 + "type": "array", 42 + "items": { 43 + "type": "ref", 44 + "ref": "com.atproto.moderation.defs#reasonType" 45 + } 46 + }, 47 + "subjectTypes": { 48 + "description": "The set of subject types (account, record, etc) this service accepts reports on.", 49 + "type": "array", 50 + "items": { 51 + "type": "ref", 52 + "ref": "com.atproto.moderation.defs#subjectType" 53 + } 54 + }, 55 + "subjectCollections": { 56 + "type": "array", 57 + "description": "Set of record types (collection NSIDs) which can be reported to this service. If not defined (distinct from empty array), default is any record type.", 58 + "items": { "type": "string", "format": "nsid" } 59 + } 60 + } 61 + }, 62 + "labelerViewerState": { 63 + "type": "object", 64 + "properties": { 65 + "like": { "type": "string", "format": "at-uri" } 66 + } 67 + }, 68 + "labelerPolicies": { 69 + "type": "object", 70 + "required": ["labelValues"], 71 + "properties": { 72 + "labelValues": { 73 + "type": "array", 74 + "description": "The label values which this labeler publishes. May include global or custom labels.", 75 + "items": { 76 + "type": "ref", 77 + "ref": "com.atproto.label.defs#labelValue" 78 + } 79 + }, 80 + "labelValueDefinitions": { 81 + "type": "array", 82 + "description": "Label values created by this labeler and scoped exclusively to it. Labels defined here will override global label definitions for this labeler.", 83 + "items": { 84 + "type": "ref", 85 + "ref": "com.atproto.label.defs#labelValueDefinition" 86 + } 87 + } 88 + } 89 + } 90 + } 91 + }
+47
resources/lexicons/app/bsky/labeler/service.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "app.bsky.labeler.service", 4 + "defs": { 5 + "main": { 6 + "type": "record", 7 + "description": "A declaration of the existence of labeler service.", 8 + "key": "literal:self", 9 + "record": { 10 + "type": "object", 11 + "required": ["policies", "createdAt"], 12 + "properties": { 13 + "policies": { 14 + "type": "ref", 15 + "ref": "app.bsky.labeler.defs#labelerPolicies" 16 + }, 17 + "labels": { 18 + "type": "union", 19 + "refs": ["com.atproto.label.defs#selfLabels"] 20 + }, 21 + "createdAt": { "type": "string", "format": "datetime" }, 22 + "reasonTypes": { 23 + "description": "The set of report reason 'codes' which are in-scope for this service to review and action. These usually align to policy categories. If not defined (distinct from empty array), all reason types are allowed.", 24 + "type": "array", 25 + "items": { 26 + "type": "ref", 27 + "ref": "com.atproto.moderation.defs#reasonType" 28 + } 29 + }, 30 + "subjectTypes": { 31 + "description": "The set of subject types (account, record, etc) this service accepts reports on.", 32 + "type": "array", 33 + "items": { 34 + "type": "ref", 35 + "ref": "com.atproto.moderation.defs#subjectType" 36 + } 37 + }, 38 + "subjectCollections": { 39 + "type": "array", 40 + "description": "Set of record types (collection NSIDs) which can be reported to this service. If not defined (distinct from empty array), default is any record type.", 41 + "items": { "type": "string", "format": "nsid" } 42 + } 43 + } 44 + } 45 + } 46 + } 47 + }
+88
resources/lexicons/app/bsky/notification/defs.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "app.bsky.notification.defs", 4 + "defs": { 5 + "recordDeleted": { 6 + "type": "object", 7 + "properties": {} 8 + }, 9 + "chatPreference": { 10 + "type": "object", 11 + "required": ["include", "push"], 12 + "properties": { 13 + "include": { "type": "string", "knownValues": ["all", "accepted"] }, 14 + "push": { "type": "boolean" } 15 + } 16 + }, 17 + "filterablePreference": { 18 + "type": "object", 19 + "required": ["include", "list", "push"], 20 + "properties": { 21 + "include": { "type": "string", "knownValues": ["all", "follows"] }, 22 + "list": { "type": "boolean" }, 23 + "push": { "type": "boolean" } 24 + } 25 + }, 26 + "preference": { 27 + "type": "object", 28 + "required": ["list", "push"], 29 + "properties": { 30 + "list": { "type": "boolean" }, 31 + "push": { "type": "boolean" } 32 + } 33 + }, 34 + "preferences": { 35 + "type": "object", 36 + "required": [ 37 + "chat", 38 + "follow", 39 + "like", 40 + "likeViaRepost", 41 + "mention", 42 + "quote", 43 + "reply", 44 + "repost", 45 + "repostViaRepost", 46 + "starterpackJoined", 47 + "subscribedPost", 48 + "unverified", 49 + "verified" 50 + ], 51 + "properties": { 52 + "chat": { "type": "ref", "ref": "#chatPreference" }, 53 + "follow": { "type": "ref", "ref": "#filterablePreference" }, 54 + "like": { "type": "ref", "ref": "#filterablePreference" }, 55 + "likeViaRepost": { "type": "ref", "ref": "#filterablePreference" }, 56 + "mention": { "type": "ref", "ref": "#filterablePreference" }, 57 + "quote": { "type": "ref", "ref": "#filterablePreference" }, 58 + "reply": { "type": "ref", "ref": "#filterablePreference" }, 59 + "repost": { "type": "ref", "ref": "#filterablePreference" }, 60 + "repostViaRepost": { "type": "ref", "ref": "#filterablePreference" }, 61 + "starterpackJoined": { "type": "ref", "ref": "#preference" }, 62 + "subscribedPost": { "type": "ref", "ref": "#preference" }, 63 + "unverified": { "type": "ref", "ref": "#preference" }, 64 + "verified": { "type": "ref", "ref": "#preference" } 65 + } 66 + }, 67 + "activitySubscription": { 68 + "type": "object", 69 + "required": ["post", "reply"], 70 + "properties": { 71 + "post": { "type": "boolean" }, 72 + "reply": { "type": "boolean" } 73 + } 74 + }, 75 + "subjectActivitySubscription": { 76 + "description": "Object used to store activity subscription data in stash.", 77 + "type": "object", 78 + "required": ["subject", "activitySubscription"], 79 + "properties": { 80 + "subject": { "type": "string", "format": "did" }, 81 + "activitySubscription": { 82 + "type": "ref", 83 + "ref": "#activitySubscription" 84 + } 85 + } 86 + } 87 + } 88 + }
+91
resources/lexicons/app/bsky/notification/listNotifications.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "app.bsky.notification.listNotifications", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Enumerate notifications for the requesting account. Requires auth.", 8 + "parameters": { 9 + "type": "params", 10 + "properties": { 11 + "reasons": { 12 + "description": "Notification reasons to include in response.", 13 + "type": "array", 14 + "items": { 15 + "type": "string", 16 + "description": "A reason that matches the reason property of #notification." 17 + } 18 + }, 19 + "limit": { 20 + "type": "integer", 21 + "minimum": 1, 22 + "maximum": 100, 23 + "default": 50 24 + }, 25 + "priority": { "type": "boolean" }, 26 + "cursor": { "type": "string" }, 27 + "seenAt": { "type": "string", "format": "datetime" } 28 + } 29 + }, 30 + "output": { 31 + "encoding": "application/json", 32 + "schema": { 33 + "type": "object", 34 + "required": ["notifications"], 35 + "properties": { 36 + "cursor": { "type": "string" }, 37 + "notifications": { 38 + "type": "array", 39 + "items": { "type": "ref", "ref": "#notification" } 40 + }, 41 + "priority": { "type": "boolean" }, 42 + "seenAt": { "type": "string", "format": "datetime" } 43 + } 44 + } 45 + } 46 + }, 47 + "notification": { 48 + "type": "object", 49 + "required": [ 50 + "uri", 51 + "cid", 52 + "author", 53 + "reason", 54 + "record", 55 + "isRead", 56 + "indexedAt" 57 + ], 58 + "properties": { 59 + "uri": { "type": "string", "format": "at-uri" }, 60 + "cid": { "type": "string", "format": "cid" }, 61 + "author": { "type": "ref", "ref": "app.bsky.actor.defs#profileView" }, 62 + "reason": { 63 + "type": "string", 64 + "description": "The reason why this notification was delivered - e.g. your post was liked, or you received a new follower.", 65 + "knownValues": [ 66 + "like", 67 + "repost", 68 + "follow", 69 + "mention", 70 + "reply", 71 + "quote", 72 + "starterpack-joined", 73 + "verified", 74 + "unverified", 75 + "like-via-repost", 76 + "repost-via-repost", 77 + "subscribed-post" 78 + ] 79 + }, 80 + "reasonSubject": { "type": "string", "format": "at-uri" }, 81 + "record": { "type": "unknown" }, 82 + "isRead": { "type": "boolean" }, 83 + "indexedAt": { "type": "string", "format": "datetime" }, 84 + "labels": { 85 + "type": "array", 86 + "items": { "type": "ref", "ref": "com.atproto.label.defs#label" } 87 + } 88 + } 89 + } 90 + } 91 + }
+20
resources/lexicons/app/bsky/notification/updateSeen.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "app.bsky.notification.updateSeen", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Notify server that the requesting account has seen notifications. Requires auth.", 8 + "input": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "required": ["seenAt"], 13 + "properties": { 14 + "seenAt": { "type": "string", "format": "datetime" } 15 + } 16 + } 17 + } 18 + } 19 + } 20 + }
+51
resources/lexicons/app/bsky/richtext/facet.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "app.bsky.richtext.facet", 4 + "defs": { 5 + "main": { 6 + "type": "object", 7 + "description": "Annotation of a sub-string within rich text.", 8 + "required": ["index", "features"], 9 + "properties": { 10 + "index": { "type": "ref", "ref": "#byteSlice" }, 11 + "features": { 12 + "type": "array", 13 + "items": { "type": "union", "refs": ["#mention", "#link", "#tag"] } 14 + } 15 + } 16 + }, 17 + "mention": { 18 + "type": "object", 19 + "description": "Facet feature for mention of another account. The text is usually a handle, including a '@' prefix, but the facet reference is a DID.", 20 + "required": ["did"], 21 + "properties": { 22 + "did": { "type": "string", "format": "did" } 23 + } 24 + }, 25 + "link": { 26 + "type": "object", 27 + "description": "Facet feature for a URL. The text URL may have been simplified or truncated, but the facet reference should be a complete URL.", 28 + "required": ["uri"], 29 + "properties": { 30 + "uri": { "type": "string", "format": "uri" } 31 + } 32 + }, 33 + "tag": { 34 + "type": "object", 35 + "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').", 36 + "required": ["tag"], 37 + "properties": { 38 + "tag": { "type": "string", "maxLength": 640, "maxGraphemes": 64 } 39 + } 40 + }, 41 + "byteSlice": { 42 + "type": "object", 43 + "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.", 44 + "required": ["byteStart", "byteEnd"], 45 + "properties": { 46 + "byteStart": { "type": "integer", "minimum": 0 }, 47 + "byteEnd": { "type": "integer", "minimum": 0 } 48 + } 49 + } 50 + } 51 + }
+198
resources/lexicons/app/bsky/unspecced/defs.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "app.bsky.unspecced.defs", 4 + "defs": { 5 + "skeletonSearchPost": { 6 + "type": "object", 7 + "required": ["uri"], 8 + "properties": { 9 + "uri": { "type": "string", "format": "at-uri" } 10 + } 11 + }, 12 + "skeletonSearchActor": { 13 + "type": "object", 14 + "required": ["did"], 15 + "properties": { 16 + "did": { "type": "string", "format": "did" } 17 + } 18 + }, 19 + "skeletonSearchStarterPack": { 20 + "type": "object", 21 + "required": ["uri"], 22 + "properties": { 23 + "uri": { "type": "string", "format": "at-uri" } 24 + } 25 + }, 26 + "trendingTopic": { 27 + "type": "object", 28 + "required": ["topic", "link"], 29 + "properties": { 30 + "topic": { "type": "string" }, 31 + "displayName": { "type": "string" }, 32 + "description": { "type": "string" }, 33 + "link": { "type": "string" } 34 + } 35 + }, 36 + "skeletonTrend": { 37 + "type": "object", 38 + "required": [ 39 + "topic", 40 + "displayName", 41 + "link", 42 + "startedAt", 43 + "postCount", 44 + "dids" 45 + ], 46 + "properties": { 47 + "topic": { "type": "string" }, 48 + "displayName": { "type": "string" }, 49 + "link": { "type": "string" }, 50 + "startedAt": { "type": "string", "format": "datetime" }, 51 + "postCount": { "type": "integer" }, 52 + "status": { "type": "string", "knownValues": ["hot"] }, 53 + "category": { "type": "string" }, 54 + "dids": { 55 + "type": "array", 56 + "items": { 57 + "type": "string", 58 + "format": "did" 59 + } 60 + } 61 + } 62 + }, 63 + "trendView": { 64 + "type": "object", 65 + "required": [ 66 + "topic", 67 + "displayName", 68 + "link", 69 + "startedAt", 70 + "postCount", 71 + "actors" 72 + ], 73 + "properties": { 74 + "topic": { "type": "string" }, 75 + "displayName": { "type": "string" }, 76 + "link": { "type": "string" }, 77 + "startedAt": { "type": "string", "format": "datetime" }, 78 + "postCount": { "type": "integer" }, 79 + "status": { "type": "string", "knownValues": ["hot"] }, 80 + "category": { "type": "string" }, 81 + "actors": { 82 + "type": "array", 83 + "items": { 84 + "type": "ref", 85 + "ref": "app.bsky.actor.defs#profileViewBasic" 86 + } 87 + } 88 + } 89 + }, 90 + "threadItemPost": { 91 + "type": "object", 92 + "required": [ 93 + "post", 94 + "moreParents", 95 + "moreReplies", 96 + "opThread", 97 + "hiddenByThreadgate", 98 + "mutedByViewer" 99 + ], 100 + "properties": { 101 + "post": { "type": "ref", "ref": "app.bsky.feed.defs#postView" }, 102 + "moreParents": { 103 + "type": "boolean", 104 + "description": "This post has more parents that were not present in the response. This is just a boolean, without the number of parents." 105 + }, 106 + "moreReplies": { 107 + "type": "integer", 108 + "description": "This post has more replies that were not present in the response. This is a numeric value, which is best-effort and might not be accurate." 109 + }, 110 + "opThread": { 111 + "type": "boolean", 112 + "description": "This post is part of a contiguous thread by the OP from the thread root. Many different OP threads can happen in the same thread." 113 + }, 114 + "hiddenByThreadgate": { 115 + "type": "boolean", 116 + "description": "The threadgate created by the author indicates this post as a reply to be hidden for everyone consuming the thread." 117 + }, 118 + "mutedByViewer": { 119 + "type": "boolean", 120 + "description": "This is by an account muted by the viewer requesting it." 121 + } 122 + } 123 + }, 124 + "threadItemNoUnauthenticated": { 125 + "type": "object", 126 + "properties": {} 127 + }, 128 + "threadItemNotFound": { 129 + "type": "object", 130 + "properties": {} 131 + }, 132 + "threadItemBlocked": { 133 + "type": "object", 134 + "required": ["author"], 135 + "properties": { 136 + "author": { "type": "ref", "ref": "app.bsky.feed.defs#blockedAuthor" } 137 + } 138 + }, 139 + "ageAssuranceState": { 140 + "type": "object", 141 + "description": "The computed state of the age assurance process, returned to the user in question on certain authenticated requests.", 142 + "required": ["status"], 143 + "properties": { 144 + "lastInitiatedAt": { 145 + "type": "string", 146 + "format": "datetime", 147 + "description": "The timestamp when this state was last updated." 148 + }, 149 + "status": { 150 + "type": "string", 151 + "description": "The status of the age assurance process.", 152 + "knownValues": ["unknown", "pending", "assured", "blocked"] 153 + } 154 + } 155 + }, 156 + "ageAssuranceEvent": { 157 + "type": "object", 158 + "description": "Object used to store age assurance data in stash.", 159 + "required": ["createdAt", "status", "attemptId"], 160 + "properties": { 161 + "createdAt": { 162 + "type": "string", 163 + "format": "datetime", 164 + "description": "The date and time of this write operation." 165 + }, 166 + "status": { 167 + "type": "string", 168 + "description": "The status of the age assurance process.", 169 + "knownValues": ["unknown", "pending", "assured"] 170 + }, 171 + "attemptId": { 172 + "type": "string", 173 + "description": "The unique identifier for this instance of the age assurance flow, in UUID format." 174 + }, 175 + "email": { 176 + "type": "string", 177 + "description": "The email used for AA." 178 + }, 179 + "initIp": { 180 + "type": "string", 181 + "description": "The IP address used when initiating the AA flow." 182 + }, 183 + "initUa": { 184 + "type": "string", 185 + "description": "The user agent used when initiating the AA flow." 186 + }, 187 + "completeIp": { 188 + "type": "string", 189 + "description": "The IP address used when completing the AA flow." 190 + }, 191 + "completeUa": { 192 + "type": "string", 193 + "description": "The user agent used when completing the AA flow." 194 + } 195 + } 196 + } 197 + } 198 + }
+28
resources/lexicons/app/bsky/video/defs.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "app.bsky.video.defs", 4 + "defs": { 5 + "jobStatus": { 6 + "type": "object", 7 + "required": ["jobId", "did", "state"], 8 + "properties": { 9 + "jobId": { "type": "string" }, 10 + "did": { "type": "string", "format": "did" }, 11 + "state": { 12 + "type": "string", 13 + "description": "The state of the video processing job. All values not listed as a known value indicate that the job is in process.", 14 + "knownValues": ["JOB_STATE_COMPLETED", "JOB_STATE_FAILED"] 15 + }, 16 + "progress": { 17 + "type": "integer", 18 + "minimum": 0, 19 + "maximum": 100, 20 + "description": "Progress within the current processing state." 21 + }, 22 + "blob": { "type": "blob" }, 23 + "error": { "type": "string" }, 24 + "message": { "type": "string" } 25 + } 26 + } 27 + } 28 + }
+236
resources/lexicons/chat/bsky/convo/defs.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "chat.bsky.convo.defs", 4 + "defs": { 5 + "messageRef": { 6 + "type": "object", 7 + "required": ["did", "messageId", "convoId"], 8 + "properties": { 9 + "did": { "type": "string", "format": "did" }, 10 + "convoId": { "type": "string" }, 11 + "messageId": { "type": "string" } 12 + } 13 + }, 14 + "messageInput": { 15 + "type": "object", 16 + "required": ["text"], 17 + "properties": { 18 + "text": { 19 + "type": "string", 20 + "maxLength": 10000, 21 + "maxGraphemes": 1000 22 + }, 23 + "facets": { 24 + "type": "array", 25 + "description": "Annotations of text (mentions, URLs, hashtags, etc)", 26 + "items": { "type": "ref", "ref": "app.bsky.richtext.facet" } 27 + }, 28 + "embed": { 29 + "type": "union", 30 + "refs": ["app.bsky.embed.record"] 31 + } 32 + } 33 + }, 34 + "messageView": { 35 + "type": "object", 36 + "required": ["id", "rev", "text", "sender", "sentAt"], 37 + "properties": { 38 + "id": { "type": "string" }, 39 + "rev": { "type": "string" }, 40 + "text": { 41 + "type": "string", 42 + "maxLength": 10000, 43 + "maxGraphemes": 1000 44 + }, 45 + "facets": { 46 + "type": "array", 47 + "description": "Annotations of text (mentions, URLs, hashtags, etc)", 48 + "items": { "type": "ref", "ref": "app.bsky.richtext.facet" } 49 + }, 50 + "embed": { 51 + "type": "union", 52 + "refs": ["app.bsky.embed.record#view"] 53 + }, 54 + "reactions": { 55 + "type": "array", 56 + "description": "Reactions to this message, in ascending order of creation time.", 57 + "items": { "type": "ref", "ref": "#reactionView" } 58 + }, 59 + "sender": { "type": "ref", "ref": "#messageViewSender" }, 60 + "sentAt": { "type": "string", "format": "datetime" } 61 + } 62 + }, 63 + "deletedMessageView": { 64 + "type": "object", 65 + "required": ["id", "rev", "sender", "sentAt"], 66 + "properties": { 67 + "id": { "type": "string" }, 68 + "rev": { "type": "string" }, 69 + "sender": { "type": "ref", "ref": "#messageViewSender" }, 70 + "sentAt": { "type": "string", "format": "datetime" } 71 + } 72 + }, 73 + "messageViewSender": { 74 + "type": "object", 75 + "required": ["did"], 76 + "properties": { 77 + "did": { "type": "string", "format": "did" } 78 + } 79 + }, 80 + "reactionView": { 81 + "type": "object", 82 + "required": ["value", "sender", "createdAt"], 83 + "properties": { 84 + "value": { "type": "string" }, 85 + "sender": { "type": "ref", "ref": "#reactionViewSender" }, 86 + "createdAt": { "type": "string", "format": "datetime" } 87 + } 88 + }, 89 + "reactionViewSender": { 90 + "type": "object", 91 + "required": ["did"], 92 + "properties": { 93 + "did": { "type": "string", "format": "did" } 94 + } 95 + }, 96 + "messageAndReactionView": { 97 + "type": "object", 98 + "required": ["message", "reaction"], 99 + "properties": { 100 + "message": { "type": "ref", "ref": "#messageView" }, 101 + "reaction": { "type": "ref", "ref": "#reactionView" } 102 + } 103 + }, 104 + "convoView": { 105 + "type": "object", 106 + "required": ["id", "rev", "members", "muted", "unreadCount"], 107 + "properties": { 108 + "id": { "type": "string" }, 109 + "rev": { "type": "string" }, 110 + "members": { 111 + "type": "array", 112 + "items": { 113 + "type": "ref", 114 + "ref": "chat.bsky.actor.defs#profileViewBasic" 115 + } 116 + }, 117 + "lastMessage": { 118 + "type": "union", 119 + "refs": ["#messageView", "#deletedMessageView"] 120 + }, 121 + "lastReaction": { 122 + "type": "union", 123 + "refs": ["#messageAndReactionView"] 124 + }, 125 + "muted": { "type": "boolean" }, 126 + "status": { 127 + "type": "string", 128 + "knownValues": ["request", "accepted"] 129 + }, 130 + "unreadCount": { "type": "integer" } 131 + } 132 + }, 133 + "logBeginConvo": { 134 + "type": "object", 135 + "required": ["rev", "convoId"], 136 + "properties": { 137 + "rev": { "type": "string" }, 138 + "convoId": { "type": "string" } 139 + } 140 + }, 141 + "logAcceptConvo": { 142 + "type": "object", 143 + "required": ["rev", "convoId"], 144 + "properties": { 145 + "rev": { "type": "string" }, 146 + "convoId": { "type": "string" } 147 + } 148 + }, 149 + "logLeaveConvo": { 150 + "type": "object", 151 + "required": ["rev", "convoId"], 152 + "properties": { 153 + "rev": { "type": "string" }, 154 + "convoId": { "type": "string" } 155 + } 156 + }, 157 + "logMuteConvo": { 158 + "type": "object", 159 + "required": ["rev", "convoId"], 160 + "properties": { 161 + "rev": { "type": "string" }, 162 + "convoId": { "type": "string" } 163 + } 164 + }, 165 + "logUnmuteConvo": { 166 + "type": "object", 167 + "required": ["rev", "convoId"], 168 + "properties": { 169 + "rev": { "type": "string" }, 170 + "convoId": { "type": "string" } 171 + } 172 + }, 173 + "logCreateMessage": { 174 + "type": "object", 175 + "required": ["rev", "convoId", "message"], 176 + "properties": { 177 + "rev": { "type": "string" }, 178 + "convoId": { "type": "string" }, 179 + "message": { 180 + "type": "union", 181 + "refs": ["#messageView", "#deletedMessageView"] 182 + } 183 + } 184 + }, 185 + "logDeleteMessage": { 186 + "type": "object", 187 + "required": ["rev", "convoId", "message"], 188 + "properties": { 189 + "rev": { "type": "string" }, 190 + "convoId": { "type": "string" }, 191 + "message": { 192 + "type": "union", 193 + "refs": ["#messageView", "#deletedMessageView"] 194 + } 195 + } 196 + }, 197 + "logReadMessage": { 198 + "type": "object", 199 + "required": ["rev", "convoId", "message"], 200 + "properties": { 201 + "rev": { "type": "string" }, 202 + "convoId": { "type": "string" }, 203 + "message": { 204 + "type": "union", 205 + "refs": ["#messageView", "#deletedMessageView"] 206 + } 207 + } 208 + }, 209 + "logAddReaction": { 210 + "type": "object", 211 + "required": ["rev", "convoId", "message", "reaction"], 212 + "properties": { 213 + "rev": { "type": "string" }, 214 + "convoId": { "type": "string" }, 215 + "message": { 216 + "type": "union", 217 + "refs": ["#messageView", "#deletedMessageView"] 218 + }, 219 + "reaction": { "type": "ref", "ref": "#reactionView" } 220 + } 221 + }, 222 + "logRemoveReaction": { 223 + "type": "object", 224 + "required": ["rev", "convoId", "message", "reaction"], 225 + "properties": { 226 + "rev": { "type": "string" }, 227 + "convoId": { "type": "string" }, 228 + "message": { 229 + "type": "union", 230 + "refs": ["#messageView", "#deletedMessageView"] 231 + }, 232 + "reaction": { "type": "ref", "ref": "#reactionView" } 233 + } 234 + } 235 + } 236 + }
+32
resources/lexicons/chat/bsky/convo/muteConvo.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "chat.bsky.convo.muteConvo", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "input": { 8 + "encoding": "application/json", 9 + "schema": { 10 + "type": "object", 11 + "required": ["convoId"], 12 + "properties": { 13 + "convoId": { "type": "string" } 14 + } 15 + } 16 + }, 17 + "output": { 18 + "encoding": "application/json", 19 + "schema": { 20 + "type": "object", 21 + "required": ["convo"], 22 + "properties": { 23 + "convo": { 24 + "type": "ref", 25 + "ref": "chat.bsky.convo.defs#convoView" 26 + } 27 + } 28 + } 29 + } 30 + } 31 + } 32 + }
+32
resources/lexicons/chat/bsky/convo/unmuteConvo.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "chat.bsky.convo.unmuteConvo", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "input": { 8 + "encoding": "application/json", 9 + "schema": { 10 + "type": "object", 11 + "required": ["convoId"], 12 + "properties": { 13 + "convoId": { "type": "string" } 14 + } 15 + } 16 + }, 17 + "output": { 18 + "encoding": "application/json", 19 + "schema": { 20 + "type": "object", 21 + "required": ["convo"], 22 + "properties": { 23 + "convo": { 24 + "type": "ref", 25 + "ref": "chat.bsky.convo.defs#convoView" 26 + } 27 + } 28 + } 29 + } 30 + } 31 + } 32 + }
+71
resources/lexicons/com/atproto/admin/defs.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.admin.defs", 4 + "defs": { 5 + "statusAttr": { 6 + "type": "object", 7 + "required": ["applied"], 8 + "properties": { 9 + "applied": { "type": "boolean" }, 10 + "ref": { "type": "string" } 11 + } 12 + }, 13 + "accountView": { 14 + "type": "object", 15 + "required": ["did", "handle", "indexedAt"], 16 + "properties": { 17 + "did": { "type": "string", "format": "did" }, 18 + "handle": { "type": "string", "format": "handle" }, 19 + "email": { "type": "string" }, 20 + "relatedRecords": { "type": "array", "items": { "type": "unknown" } }, 21 + "indexedAt": { "type": "string", "format": "datetime" }, 22 + "invitedBy": { 23 + "type": "ref", 24 + "ref": "com.atproto.server.defs#inviteCode" 25 + }, 26 + "invites": { 27 + "type": "array", 28 + "items": { 29 + "type": "ref", 30 + "ref": "com.atproto.server.defs#inviteCode" 31 + } 32 + }, 33 + "invitesDisabled": { "type": "boolean" }, 34 + "emailConfirmedAt": { "type": "string", "format": "datetime" }, 35 + "inviteNote": { "type": "string" }, 36 + "deactivatedAt": { "type": "string", "format": "datetime" }, 37 + "threatSignatures": { 38 + "type": "array", 39 + "items": { 40 + "type": "ref", 41 + "ref": "#threatSignature" 42 + } 43 + } 44 + } 45 + }, 46 + "repoRef": { 47 + "type": "object", 48 + "required": ["did"], 49 + "properties": { 50 + "did": { "type": "string", "format": "did" } 51 + } 52 + }, 53 + "repoBlobRef": { 54 + "type": "object", 55 + "required": ["did", "cid"], 56 + "properties": { 57 + "did": { "type": "string", "format": "did" }, 58 + "cid": { "type": "string", "format": "cid" }, 59 + "recordUri": { "type": "string", "format": "at-uri" } 60 + } 61 + }, 62 + "threatSignature": { 63 + "type": "object", 64 + "required": ["property", "value"], 65 + "properties": { 66 + "property": { "type": "string" }, 67 + "value": { "type": "string" } 68 + } 69 + } 70 + } 71 + }
+20
resources/lexicons/com/atproto/admin/deleteAccount.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.admin.deleteAccount", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Delete a user account as an administrator.", 8 + "input": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "required": ["did"], 13 + "properties": { 14 + "did": { "type": "string", "format": "did" } 15 + } 16 + } 17 + } 18 + } 19 + } 20 + }
+24
resources/lexicons/com/atproto/admin/disableAccountInvites.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.admin.disableAccountInvites", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Disable an account from receiving new invite codes, but does not invalidate existing codes.", 8 + "input": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "required": ["account"], 13 + "properties": { 14 + "account": { "type": "string", "format": "did" }, 15 + "note": { 16 + "type": "string", 17 + "description": "Optional reason for disabled invites." 18 + } 19 + } 20 + } 21 + } 22 + } 23 + } 24 + }
+26
resources/lexicons/com/atproto/admin/disableInviteCodes.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.admin.disableInviteCodes", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Disable some set of codes and/or all codes associated with a set of users.", 8 + "input": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "properties": { 13 + "codes": { 14 + "type": "array", 15 + "items": { "type": "string" } 16 + }, 17 + "accounts": { 18 + "type": "array", 19 + "items": { "type": "string" } 20 + } 21 + } 22 + } 23 + } 24 + } 25 + } 26 + }
+24
resources/lexicons/com/atproto/admin/enableAccountInvites.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.admin.enableAccountInvites", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Re-enable an account's ability to receive invite codes.", 8 + "input": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "required": ["account"], 13 + "properties": { 14 + "account": { "type": "string", "format": "did" }, 15 + "note": { 16 + "type": "string", 17 + "description": "Optional reason for enabled invites." 18 + } 19 + } 20 + } 21 + } 22 + } 23 + } 24 + }
+24
resources/lexicons/com/atproto/admin/getAccountInfo.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.admin.getAccountInfo", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Get details about an account.", 8 + "parameters": { 9 + "type": "params", 10 + "required": ["did"], 11 + "properties": { 12 + "did": { "type": "string", "format": "did" } 13 + } 14 + }, 15 + "output": { 16 + "encoding": "application/json", 17 + "schema": { 18 + "type": "ref", 19 + "ref": "com.atproto.admin.defs#accountView" 20 + } 21 + } 22 + } 23 + } 24 + }
+36
resources/lexicons/com/atproto/admin/getAccountInfos.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.admin.getAccountInfos", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Get details about some accounts.", 8 + "parameters": { 9 + "type": "params", 10 + "required": ["dids"], 11 + "properties": { 12 + "dids": { 13 + "type": "array", 14 + "items": { "type": "string", "format": "did" } 15 + } 16 + } 17 + }, 18 + "output": { 19 + "encoding": "application/json", 20 + "schema": { 21 + "type": "object", 22 + "required": ["infos"], 23 + "properties": { 24 + "infos": { 25 + "type": "array", 26 + "items": { 27 + "type": "ref", 28 + "ref": "com.atproto.admin.defs#accountView" 29 + } 30 + } 31 + } 32 + } 33 + } 34 + } 35 + } 36 + }
+44
resources/lexicons/com/atproto/admin/getInviteCodes.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.admin.getInviteCodes", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Get an admin view of invite codes.", 8 + "parameters": { 9 + "type": "params", 10 + "properties": { 11 + "sort": { 12 + "type": "string", 13 + "knownValues": ["recent", "usage"], 14 + "default": "recent" 15 + }, 16 + "limit": { 17 + "type": "integer", 18 + "minimum": 1, 19 + "maximum": 500, 20 + "default": 100 21 + }, 22 + "cursor": { "type": "string" } 23 + } 24 + }, 25 + "output": { 26 + "encoding": "application/json", 27 + "schema": { 28 + "type": "object", 29 + "required": ["codes"], 30 + "properties": { 31 + "cursor": { "type": "string" }, 32 + "codes": { 33 + "type": "array", 34 + "items": { 35 + "type": "ref", 36 + "ref": "com.atproto.server.defs#inviteCode" 37 + } 38 + } 39 + } 40 + } 41 + } 42 + } 43 + } 44 + }
+43
resources/lexicons/com/atproto/admin/getSubjectStatus.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.admin.getSubjectStatus", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Get the service-specific admin status of a subject (account, record, or blob).", 8 + "parameters": { 9 + "type": "params", 10 + "properties": { 11 + "did": { "type": "string", "format": "did" }, 12 + "uri": { "type": "string", "format": "at-uri" }, 13 + "blob": { "type": "string", "format": "cid" } 14 + } 15 + }, 16 + "output": { 17 + "encoding": "application/json", 18 + "schema": { 19 + "type": "object", 20 + "required": ["subject"], 21 + "properties": { 22 + "subject": { 23 + "type": "union", 24 + "refs": [ 25 + "com.atproto.admin.defs#repoRef", 26 + "com.atproto.repo.strongRef", 27 + "com.atproto.admin.defs#repoBlobRef" 28 + ] 29 + }, 30 + "takedown": { 31 + "type": "ref", 32 + "ref": "com.atproto.admin.defs#statusAttr" 33 + }, 34 + "deactivated": { 35 + "type": "ref", 36 + "ref": "com.atproto.admin.defs#statusAttr" 37 + } 38 + } 39 + } 40 + } 41 + } 42 + } 43 + }
+40
resources/lexicons/com/atproto/admin/searchAccounts.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.admin.searchAccounts", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Get list of accounts that matches your search query.", 8 + "parameters": { 9 + "type": "params", 10 + "properties": { 11 + "email": { "type": "string" }, 12 + "cursor": { "type": "string" }, 13 + "limit": { 14 + "type": "integer", 15 + "minimum": 1, 16 + "maximum": 100, 17 + "default": 50 18 + } 19 + } 20 + }, 21 + "output": { 22 + "encoding": "application/json", 23 + "schema": { 24 + "type": "object", 25 + "required": ["accounts"], 26 + "properties": { 27 + "cursor": { "type": "string" }, 28 + "accounts": { 29 + "type": "array", 30 + "items": { 31 + "type": "ref", 32 + "ref": "com.atproto.admin.defs#accountView" 33 + } 34 + } 35 + } 36 + } 37 + } 38 + } 39 + } 40 + }
+37
resources/lexicons/com/atproto/admin/sendEmail.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.admin.sendEmail", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Send email to a user's account email address.", 8 + "input": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "required": ["recipientDid", "content", "senderDid"], 13 + "properties": { 14 + "recipientDid": { "type": "string", "format": "did" }, 15 + "content": { "type": "string" }, 16 + "subject": { "type": "string" }, 17 + "senderDid": { "type": "string", "format": "did" }, 18 + "comment": { 19 + "type": "string", 20 + "description": "Additional comment by the sender that won't be used in the email itself but helpful to provide more context for moderators/reviewers" 21 + } 22 + } 23 + } 24 + }, 25 + "output": { 26 + "encoding": "application/json", 27 + "schema": { 28 + "type": "object", 29 + "required": ["sent"], 30 + "properties": { 31 + "sent": { "type": "boolean" } 32 + } 33 + } 34 + } 35 + } 36 + } 37 + }
+25
resources/lexicons/com/atproto/admin/updateAccountEmail.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.admin.updateAccountEmail", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Administrative action to update an account's email.", 8 + "input": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "required": ["account", "email"], 13 + "properties": { 14 + "account": { 15 + "type": "string", 16 + "format": "at-identifier", 17 + "description": "The handle or DID of the repo." 18 + }, 19 + "email": { "type": "string" } 20 + } 21 + } 22 + } 23 + } 24 + } 25 + }
+21
resources/lexicons/com/atproto/admin/updateAccountHandle.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.admin.updateAccountHandle", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Administrative action to update an account's handle.", 8 + "input": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "required": ["did", "handle"], 13 + "properties": { 14 + "did": { "type": "string", "format": "did" }, 15 + "handle": { "type": "string", "format": "handle" } 16 + } 17 + } 18 + } 19 + } 20 + } 21 + }
+21
resources/lexicons/com/atproto/admin/updateAccountPassword.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.admin.updateAccountPassword", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Update the password for a user account as an administrator.", 8 + "input": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "required": ["did", "password"], 13 + "properties": { 14 + "did": { "type": "string", "format": "did" }, 15 + "password": { "type": "string" } 16 + } 17 + } 18 + } 19 + } 20 + } 21 + }
+25
resources/lexicons/com/atproto/admin/updateAccountSigningKey.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.admin.updateAccountSigningKey", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Administrative action to update an account's signing key in their Did document.", 8 + "input": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "required": ["did", "signingKey"], 13 + "properties": { 14 + "did": { "type": "string", "format": "did" }, 15 + "signingKey": { 16 + "type": "string", 17 + "format": "did", 18 + "description": "Did-key formatted public key" 19 + } 20 + } 21 + } 22 + } 23 + } 24 + } 25 + }
+56
resources/lexicons/com/atproto/admin/updateSubjectStatus.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.admin.updateSubjectStatus", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Update the service-specific admin status of a subject (account, record, or blob).", 8 + "input": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "required": ["subject"], 13 + "properties": { 14 + "subject": { 15 + "type": "union", 16 + "refs": [ 17 + "com.atproto.admin.defs#repoRef", 18 + "com.atproto.repo.strongRef", 19 + "com.atproto.admin.defs#repoBlobRef" 20 + ] 21 + }, 22 + "takedown": { 23 + "type": "ref", 24 + "ref": "com.atproto.admin.defs#statusAttr" 25 + }, 26 + "deactivated": { 27 + "type": "ref", 28 + "ref": "com.atproto.admin.defs#statusAttr" 29 + } 30 + } 31 + } 32 + }, 33 + "output": { 34 + "encoding": "application/json", 35 + "schema": { 36 + "type": "object", 37 + "required": ["subject"], 38 + "properties": { 39 + "subject": { 40 + "type": "union", 41 + "refs": [ 42 + "com.atproto.admin.defs#repoRef", 43 + "com.atproto.repo.strongRef", 44 + "com.atproto.admin.defs#repoBlobRef" 45 + ] 46 + }, 47 + "takedown": { 48 + "type": "ref", 49 + "ref": "com.atproto.admin.defs#statusAttr" 50 + } 51 + } 52 + } 53 + } 54 + } 55 + } 56 + }
+22
resources/lexicons/com/atproto/identity/defs.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.identity.defs", 4 + "defs": { 5 + "identityInfo": { 6 + "type": "object", 7 + "required": ["did", "handle", "didDoc"], 8 + "properties": { 9 + "did": { "type": "string", "format": "did" }, 10 + "handle": { 11 + "type": "string", 12 + "format": "handle", 13 + "description": "The validated handle of the account; or 'handle.invalid' if the handle did not bi-directionally match the DID document." 14 + }, 15 + "didDoc": { 16 + "type": "unknown", 17 + "description": "The complete DID document for the identity." 18 + } 19 + } 20 + } 21 + } 22 + }
+29
resources/lexicons/com/atproto/identity/getRecommendedDidCredentials.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.identity.getRecommendedDidCredentials", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Describe the credentials that should be included in the DID doc of an account that is migrating to this service.", 8 + "output": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "properties": { 13 + "rotationKeys": { 14 + "description": "Recommended rotation keys for PLC dids. Should be undefined (or ignored) for did:webs.", 15 + "type": "array", 16 + "items": { "type": "string" } 17 + }, 18 + "alsoKnownAs": { 19 + "type": "array", 20 + "items": { "type": "string" } 21 + }, 22 + "verificationMethods": { "type": "unknown" }, 23 + "services": { "type": "unknown" } 24 + } 25 + } 26 + } 27 + } 28 + } 29 + }
+44
resources/lexicons/com/atproto/identity/refreshIdentity.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.identity.refreshIdentity", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Request that the server re-resolve an identity (DID and handle). The server may ignore this request, or require authentication, depending on the role, implementation, and policy of the server.", 8 + "input": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "required": ["identifier"], 13 + "properties": { 14 + "identifier": { 15 + "type": "string", 16 + "format": "at-identifier" 17 + } 18 + } 19 + } 20 + }, 21 + "output": { 22 + "encoding": "application/json", 23 + "schema": { 24 + "type": "ref", 25 + "ref": "com.atproto.identity.defs#identityInfo" 26 + } 27 + }, 28 + "errors": [ 29 + { 30 + "name": "HandleNotFound", 31 + "description": "The resolution process confirmed that the handle does not resolve to any DID." 32 + }, 33 + { 34 + "name": "DidNotFound", 35 + "description": "The DID resolution process confirmed that there is no current DID." 36 + }, 37 + { 38 + "name": "DidDeactivated", 39 + "description": "The DID previously existed, but has been deactivated." 40 + } 41 + ] 42 + } 43 + } 44 + }
+10
resources/lexicons/com/atproto/identity/requestPlcOperationSignature.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.identity.requestPlcOperationSignature", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Request an email with a code to in order to request a signed PLC operation. Requires Auth." 8 + } 9 + } 10 + }
+44
resources/lexicons/com/atproto/identity/resolveDid.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.identity.resolveDid", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Resolves DID to DID document. Does not bi-directionally verify handle.", 8 + "parameters": { 9 + "type": "params", 10 + "required": ["did"], 11 + "properties": { 12 + "did": { 13 + "type": "string", 14 + "format": "did", 15 + "description": "DID to resolve." 16 + } 17 + } 18 + }, 19 + "output": { 20 + "encoding": "application/json", 21 + "schema": { 22 + "type": "object", 23 + "required": ["didDoc"], 24 + "properties": { 25 + "didDoc": { 26 + "type": "unknown", 27 + "description": "The complete DID document for the identity." 28 + } 29 + } 30 + } 31 + }, 32 + "errors": [ 33 + { 34 + "name": "DidNotFound", 35 + "description": "The DID resolution process confirmed that there is no current DID." 36 + }, 37 + { 38 + "name": "DidDeactivated", 39 + "description": "The DID previously existed, but has been deactivated." 40 + } 41 + ] 42 + } 43 + } 44 + }
+37
resources/lexicons/com/atproto/identity/resolveHandle.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.identity.resolveHandle", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Resolves an atproto handle (hostname) to a DID. Does not necessarily bi-directionally verify against the the DID document.", 8 + "parameters": { 9 + "type": "params", 10 + "required": ["handle"], 11 + "properties": { 12 + "handle": { 13 + "type": "string", 14 + "format": "handle", 15 + "description": "The handle to resolve." 16 + } 17 + } 18 + }, 19 + "output": { 20 + "encoding": "application/json", 21 + "schema": { 22 + "type": "object", 23 + "required": ["did"], 24 + "properties": { 25 + "did": { "type": "string", "format": "did" } 26 + } 27 + } 28 + }, 29 + "errors": [ 30 + { 31 + "name": "HandleNotFound", 32 + "description": "The resolution process confirmed that the handle does not resolve to any DID." 33 + } 34 + ] 35 + } 36 + } 37 + }
+42
resources/lexicons/com/atproto/identity/resolveIdentity.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.identity.resolveIdentity", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Resolves an identity (DID or Handle) to a full identity (DID document and verified handle).", 8 + "parameters": { 9 + "type": "params", 10 + "required": ["identifier"], 11 + "properties": { 12 + "identifier": { 13 + "type": "string", 14 + "format": "at-identifier", 15 + "description": "Handle or DID to resolve." 16 + } 17 + } 18 + }, 19 + "output": { 20 + "encoding": "application/json", 21 + "schema": { 22 + "type": "ref", 23 + "ref": "com.atproto.identity.defs#identityInfo" 24 + } 25 + }, 26 + "errors": [ 27 + { 28 + "name": "HandleNotFound", 29 + "description": "The resolution process confirmed that the handle does not resolve to any DID." 30 + }, 31 + { 32 + "name": "DidNotFound", 33 + "description": "The DID resolution process confirmed that there is no current DID." 34 + }, 35 + { 36 + "name": "DidDeactivated", 37 + "description": "The DID previously existed, but has been deactivated." 38 + } 39 + ] 40 + } 41 + } 42 + }
+45
resources/lexicons/com/atproto/identity/signPlcOperation.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.identity.signPlcOperation", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Signs a PLC operation to update some value(s) in the requesting DID's document.", 8 + "input": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "properties": { 13 + "token": { 14 + "description": "A token received through com.atproto.identity.requestPlcOperationSignature", 15 + "type": "string" 16 + }, 17 + "rotationKeys": { 18 + "type": "array", 19 + "items": { "type": "string" } 20 + }, 21 + "alsoKnownAs": { 22 + "type": "array", 23 + "items": { "type": "string" } 24 + }, 25 + "verificationMethods": { "type": "unknown" }, 26 + "services": { "type": "unknown" } 27 + } 28 + } 29 + }, 30 + "output": { 31 + "encoding": "application/json", 32 + "schema": { 33 + "type": "object", 34 + "required": ["operation"], 35 + "properties": { 36 + "operation": { 37 + "type": "unknown", 38 + "description": "A signed DID PLC operation." 39 + } 40 + } 41 + } 42 + } 43 + } 44 + } 45 + }
+20
resources/lexicons/com/atproto/identity/submitPlcOperation.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.identity.submitPlcOperation", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "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", 8 + "input": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "required": ["operation"], 13 + "properties": { 14 + "operation": { "type": "unknown" } 15 + } 16 + } 17 + } 18 + } 19 + } 20 + }
+24
resources/lexicons/com/atproto/identity/updateHandle.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.identity.updateHandle", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Updates the current account's handle. Verifies handle validity, and updates did:plc document if necessary. Implemented by PDS, and requires auth.", 8 + "input": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "required": ["handle"], 13 + "properties": { 14 + "handle": { 15 + "type": "string", 16 + "format": "handle", 17 + "description": "The new handle." 18 + } 19 + } 20 + } 21 + } 22 + } 23 + } 24 + }
+156
resources/lexicons/com/atproto/label/defs.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.label.defs", 4 + "defs": { 5 + "label": { 6 + "type": "object", 7 + "description": "Metadata tag on an atproto resource (eg, repo or record).", 8 + "required": ["src", "uri", "val", "cts"], 9 + "properties": { 10 + "ver": { 11 + "type": "integer", 12 + "description": "The AT Protocol version of the label object." 13 + }, 14 + "src": { 15 + "type": "string", 16 + "format": "did", 17 + "description": "DID of the actor who created this label." 18 + }, 19 + "uri": { 20 + "type": "string", 21 + "format": "uri", 22 + "description": "AT URI of the record, repository (account), or other resource that this label applies to." 23 + }, 24 + "cid": { 25 + "type": "string", 26 + "format": "cid", 27 + "description": "Optionally, CID specifying the specific version of 'uri' resource this label applies to." 28 + }, 29 + "val": { 30 + "type": "string", 31 + "maxLength": 128, 32 + "description": "The short string name of the value or type of this label." 33 + }, 34 + "neg": { 35 + "type": "boolean", 36 + "description": "If true, this is a negation label, overwriting a previous label." 37 + }, 38 + "cts": { 39 + "type": "string", 40 + "format": "datetime", 41 + "description": "Timestamp when this label was created." 42 + }, 43 + "exp": { 44 + "type": "string", 45 + "format": "datetime", 46 + "description": "Timestamp at which this label expires (no longer applies)." 47 + }, 48 + "sig": { 49 + "type": "bytes", 50 + "description": "Signature of dag-cbor encoded label." 51 + } 52 + } 53 + }, 54 + "selfLabels": { 55 + "type": "object", 56 + "description": "Metadata tags on an atproto record, published by the author within the record.", 57 + "required": ["values"], 58 + "properties": { 59 + "values": { 60 + "type": "array", 61 + "items": { "type": "ref", "ref": "#selfLabel" }, 62 + "maxLength": 10 63 + } 64 + } 65 + }, 66 + "selfLabel": { 67 + "type": "object", 68 + "description": "Metadata tag on an atproto record, published by the author within the record. Note that schemas should use #selfLabels, not #selfLabel.", 69 + "required": ["val"], 70 + "properties": { 71 + "val": { 72 + "type": "string", 73 + "maxLength": 128, 74 + "description": "The short string name of the value or type of this label." 75 + } 76 + } 77 + }, 78 + "labelValueDefinition": { 79 + "type": "object", 80 + "description": "Declares a label value and its expected interpretations and behaviors.", 81 + "required": ["identifier", "severity", "blurs", "locales"], 82 + "properties": { 83 + "identifier": { 84 + "type": "string", 85 + "description": "The value of the label being defined. Must only include lowercase ascii and the '-' character ([a-z-]+).", 86 + "maxLength": 100, 87 + "maxGraphemes": 100 88 + }, 89 + "severity": { 90 + "type": "string", 91 + "description": "How should a client visually convey this label? 'inform' means neutral and informational; 'alert' means negative and warning; 'none' means show nothing.", 92 + "knownValues": ["inform", "alert", "none"] 93 + }, 94 + "blurs": { 95 + "type": "string", 96 + "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.", 97 + "knownValues": ["content", "media", "none"] 98 + }, 99 + "defaultSetting": { 100 + "type": "string", 101 + "description": "The default setting for this label.", 102 + "knownValues": ["ignore", "warn", "hide"], 103 + "default": "warn" 104 + }, 105 + "adultOnly": { 106 + "type": "boolean", 107 + "description": "Does the user need to have adult content enabled in order to configure this label?" 108 + }, 109 + "locales": { 110 + "type": "array", 111 + "items": { "type": "ref", "ref": "#labelValueDefinitionStrings" } 112 + } 113 + } 114 + }, 115 + "labelValueDefinitionStrings": { 116 + "type": "object", 117 + "description": "Strings which describe the label in the UI, localized into a specific language.", 118 + "required": ["lang", "name", "description"], 119 + "properties": { 120 + "lang": { 121 + "type": "string", 122 + "description": "The code of the language these strings are written in.", 123 + "format": "language" 124 + }, 125 + "name": { 126 + "type": "string", 127 + "description": "A short human-readable name for the label.", 128 + "maxGraphemes": 64, 129 + "maxLength": 640 130 + }, 131 + "description": { 132 + "type": "string", 133 + "description": "A longer description of what the label means and why it might be applied.", 134 + "maxGraphemes": 10000, 135 + "maxLength": 100000 136 + } 137 + } 138 + }, 139 + "labelValue": { 140 + "type": "string", 141 + "knownValues": [ 142 + "!hide", 143 + "!no-promote", 144 + "!warn", 145 + "!no-unauthenticated", 146 + "dmca-violation", 147 + "doxxing", 148 + "porn", 149 + "sexual", 150 + "nudity", 151 + "nsfl", 152 + "gore" 153 + ] 154 + } 155 + } 156 + }
+47
resources/lexicons/com/atproto/label/queryLabels.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.label.queryLabels", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Find labels relevant to the provided AT-URI patterns. Public endpoint for moderation services, though may return different or additional results with auth.", 8 + "parameters": { 9 + "type": "params", 10 + "required": ["uriPatterns"], 11 + "properties": { 12 + "uriPatterns": { 13 + "type": "array", 14 + "items": { "type": "string" }, 15 + "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." 16 + }, 17 + "sources": { 18 + "type": "array", 19 + "items": { "type": "string", "format": "did" }, 20 + "description": "Optional list of label sources (DIDs) to filter on." 21 + }, 22 + "limit": { 23 + "type": "integer", 24 + "minimum": 1, 25 + "maximum": 250, 26 + "default": 50 27 + }, 28 + "cursor": { "type": "string" } 29 + } 30 + }, 31 + "output": { 32 + "encoding": "application/json", 33 + "schema": { 34 + "type": "object", 35 + "required": ["labels"], 36 + "properties": { 37 + "cursor": { "type": "string" }, 38 + "labels": { 39 + "type": "array", 40 + "items": { "type": "ref", "ref": "com.atproto.label.defs#label" } 41 + } 42 + } 43 + } 44 + } 45 + } 46 + } 47 + }
+50
resources/lexicons/com/atproto/label/subscribeLabels.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.label.subscribeLabels", 4 + "defs": { 5 + "main": { 6 + "type": "subscription", 7 + "description": "Subscribe to stream of labels (and negations). Public endpoint implemented by mod services. Uses same sequencing scheme as repo event stream.", 8 + "parameters": { 9 + "type": "params", 10 + "properties": { 11 + "cursor": { 12 + "type": "integer", 13 + "description": "The last known event seq number to backfill from." 14 + } 15 + } 16 + }, 17 + "message": { 18 + "schema": { 19 + "type": "union", 20 + "refs": ["#labels", "#info"] 21 + } 22 + }, 23 + "errors": [{ "name": "FutureCursor" }] 24 + }, 25 + "labels": { 26 + "type": "object", 27 + "required": ["seq", "labels"], 28 + "properties": { 29 + "seq": { "type": "integer" }, 30 + "labels": { 31 + "type": "array", 32 + "items": { "type": "ref", "ref": "com.atproto.label.defs#label" } 33 + } 34 + } 35 + }, 36 + "info": { 37 + "type": "object", 38 + "required": ["name"], 39 + "properties": { 40 + "name": { 41 + "type": "string", 42 + "knownValues": ["OutdatedCursor"] 43 + }, 44 + "message": { 45 + "type": "string" 46 + } 47 + } 48 + } 49 + } 50 + }
+90
resources/lexicons/com/atproto/moderation/createReport.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.moderation.createReport", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Submit a moderation report regarding an atproto account or record. Implemented by moderation services (with PDS proxying), and requires auth.", 8 + "input": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "required": ["reasonType", "subject"], 13 + "properties": { 14 + "reasonType": { 15 + "type": "ref", 16 + "description": "Indicates the broad category of violation the report is for.", 17 + "ref": "com.atproto.moderation.defs#reasonType" 18 + }, 19 + "reason": { 20 + "type": "string", 21 + "maxGraphemes": 2000, 22 + "maxLength": 20000, 23 + "description": "Additional context about the content and violation." 24 + }, 25 + "subject": { 26 + "type": "union", 27 + "refs": [ 28 + "com.atproto.admin.defs#repoRef", 29 + "com.atproto.repo.strongRef" 30 + ] 31 + }, 32 + "modTool": { 33 + "type": "ref", 34 + "ref": "#modTool" 35 + } 36 + } 37 + } 38 + }, 39 + "output": { 40 + "encoding": "application/json", 41 + "schema": { 42 + "type": "object", 43 + "required": [ 44 + "id", 45 + "reasonType", 46 + "subject", 47 + "reportedBy", 48 + "createdAt" 49 + ], 50 + "properties": { 51 + "id": { "type": "integer" }, 52 + "reasonType": { 53 + "type": "ref", 54 + "ref": "com.atproto.moderation.defs#reasonType" 55 + }, 56 + "reason": { 57 + "type": "string", 58 + "maxGraphemes": 2000, 59 + "maxLength": 20000 60 + }, 61 + "subject": { 62 + "type": "union", 63 + "refs": [ 64 + "com.atproto.admin.defs#repoRef", 65 + "com.atproto.repo.strongRef" 66 + ] 67 + }, 68 + "reportedBy": { "type": "string", "format": "did" }, 69 + "createdAt": { "type": "string", "format": "datetime" } 70 + } 71 + } 72 + } 73 + }, 74 + "modTool": { 75 + "type": "object", 76 + "description": "Moderation tool information for tracing the source of the action", 77 + "required": ["name"], 78 + "properties": { 79 + "name": { 80 + "type": "string", 81 + "description": "Name/identifier of the source (e.g., 'bsky-app/android', 'bsky-web/chrome')" 82 + }, 83 + "meta": { 84 + "type": "unknown", 85 + "description": "Additional arbitrary metadata about the source" 86 + } 87 + } 88 + } 89 + } 90 + }
+99
resources/lexicons/com/atproto/moderation/defs.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.moderation.defs", 4 + "defs": { 5 + "reasonType": { 6 + "type": "string", 7 + "knownValues": [ 8 + "com.atproto.moderation.defs#reasonSpam", 9 + "com.atproto.moderation.defs#reasonViolation", 10 + "com.atproto.moderation.defs#reasonMisleading", 11 + "com.atproto.moderation.defs#reasonSexual", 12 + "com.atproto.moderation.defs#reasonRude", 13 + "com.atproto.moderation.defs#reasonOther", 14 + "com.atproto.moderation.defs#reasonAppeal", 15 + 16 + "tools.ozone.report.defs#reasonAppeal", 17 + "tools.ozone.report.defs#reasonOther", 18 + 19 + "tools.ozone.report.defs#reasonViolenceAnimal", 20 + "tools.ozone.report.defs#reasonViolenceThreats", 21 + "tools.ozone.report.defs#reasonViolenceGraphicContent", 22 + "tools.ozone.report.defs#reasonViolenceGlorification", 23 + "tools.ozone.report.defs#reasonViolenceExtremistContent", 24 + "tools.ozone.report.defs#reasonViolenceTrafficking", 25 + "tools.ozone.report.defs#reasonViolenceOther", 26 + 27 + "tools.ozone.report.defs#reasonSexualAbuseContent", 28 + "tools.ozone.report.defs#reasonSexualNCII", 29 + "tools.ozone.report.defs#reasonSexualDeepfake", 30 + "tools.ozone.report.defs#reasonSexualAnimal", 31 + "tools.ozone.report.defs#reasonSexualUnlabeled", 32 + "tools.ozone.report.defs#reasonSexualOther", 33 + 34 + "tools.ozone.report.defs#reasonChildSafetyCSAM", 35 + "tools.ozone.report.defs#reasonChildSafetyGroom", 36 + "tools.ozone.report.defs#reasonChildSafetyPrivacy", 37 + "tools.ozone.report.defs#reasonChildSafetyHarassment", 38 + "tools.ozone.report.defs#reasonChildSafetyOther", 39 + 40 + "tools.ozone.report.defs#reasonHarassmentTroll", 41 + "tools.ozone.report.defs#reasonHarassmentTargeted", 42 + "tools.ozone.report.defs#reasonHarassmentHateSpeech", 43 + "tools.ozone.report.defs#reasonHarassmentDoxxing", 44 + "tools.ozone.report.defs#reasonHarassmentOther", 45 + 46 + "tools.ozone.report.defs#reasonMisleadingBot", 47 + "tools.ozone.report.defs#reasonMisleadingImpersonation", 48 + "tools.ozone.report.defs#reasonMisleadingSpam", 49 + "tools.ozone.report.defs#reasonMisleadingScam", 50 + "tools.ozone.report.defs#reasonMisleadingElections", 51 + "tools.ozone.report.defs#reasonMisleadingOther", 52 + 53 + "tools.ozone.report.defs#reasonRuleSiteSecurity", 54 + "tools.ozone.report.defs#reasonRuleProhibitedSales", 55 + "tools.ozone.report.defs#reasonRuleBanEvasion", 56 + "tools.ozone.report.defs#reasonRuleOther", 57 + 58 + "tools.ozone.report.defs#reasonSelfHarmContent", 59 + "tools.ozone.report.defs#reasonSelfHarmED", 60 + "tools.ozone.report.defs#reasonSelfHarmStunts", 61 + "tools.ozone.report.defs#reasonSelfHarmSubstances", 62 + "tools.ozone.report.defs#reasonSelfHarmOther" 63 + ] 64 + }, 65 + "reasonSpam": { 66 + "type": "token", 67 + "description": "Spam: frequent unwanted promotion, replies, mentions. Prefer new lexicon definition `tools.ozone.report.defs#reasonMisleadingSpam`." 68 + }, 69 + "reasonViolation": { 70 + "type": "token", 71 + "description": "Direct violation of server rules, laws, terms of service. Prefer new lexicon definition `tools.ozone.report.defs#reasonRuleOther`." 72 + }, 73 + "reasonMisleading": { 74 + "type": "token", 75 + "description": "Misleading identity, affiliation, or content. Prefer new lexicon definition `tools.ozone.report.defs#reasonMisleadingOther`." 76 + }, 77 + "reasonSexual": { 78 + "type": "token", 79 + "description": "Unwanted or mislabeled sexual content. Prefer new lexicon definition `tools.ozone.report.defs#reasonSexualUnlabeled`." 80 + }, 81 + "reasonRude": { 82 + "type": "token", 83 + "description": "Rude, harassing, explicit, or otherwise unwelcoming behavior. Prefer new lexicon definition `tools.ozone.report.defs#reasonHarassmentOther`." 84 + }, 85 + "reasonOther": { 86 + "type": "token", 87 + "description": "Reports not falling under another report category. Prefer new lexicon definition `tools.ozone.report.defs#reasonOther`." 88 + }, 89 + "reasonAppeal": { 90 + "type": "token", 91 + "description": "Appeal a previously taken moderation action" 92 + }, 93 + "subjectType": { 94 + "type": "string", 95 + "description": "Tag describing a type of subject that might be reported.", 96 + "knownValues": ["account", "record", "chat"] 97 + } 98 + } 99 + }
+131
resources/lexicons/com/atproto/repo/applyWrites.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.repo.applyWrites", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Apply a batch transaction of repository creates, updates, and deletes. Requires auth, implemented by PDS.", 8 + "input": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "required": ["repo", "writes"], 13 + "properties": { 14 + "repo": { 15 + "type": "string", 16 + "format": "at-identifier", 17 + "description": "The handle or DID of the repo (aka, current account)." 18 + }, 19 + "validate": { 20 + "type": "boolean", 21 + "description": "Can be set to 'false' to skip Lexicon schema validation of record data across all operations, 'true' to require it, or leave unset to validate only for known Lexicons." 22 + }, 23 + "writes": { 24 + "type": "array", 25 + "items": { 26 + "type": "union", 27 + "refs": ["#create", "#update", "#delete"], 28 + "closed": true 29 + } 30 + }, 31 + "swapCommit": { 32 + "type": "string", 33 + "description": "If provided, the entire operation will fail if the current repo commit CID does not match this value. Used to prevent conflicting repo mutations.", 34 + "format": "cid" 35 + } 36 + } 37 + } 38 + }, 39 + "output": { 40 + "encoding": "application/json", 41 + "schema": { 42 + "type": "object", 43 + "required": [], 44 + "properties": { 45 + "commit": { 46 + "type": "ref", 47 + "ref": "com.atproto.repo.defs#commitMeta" 48 + }, 49 + "results": { 50 + "type": "array", 51 + "items": { 52 + "type": "union", 53 + "refs": ["#createResult", "#updateResult", "#deleteResult"], 54 + "closed": true 55 + } 56 + } 57 + } 58 + } 59 + }, 60 + "errors": [ 61 + { 62 + "name": "InvalidSwap", 63 + "description": "Indicates that the 'swapCommit' parameter did not match current commit." 64 + } 65 + ] 66 + }, 67 + "create": { 68 + "type": "object", 69 + "description": "Operation which creates a new record.", 70 + "required": ["collection", "value"], 71 + "properties": { 72 + "collection": { "type": "string", "format": "nsid" }, 73 + "rkey": { 74 + "type": "string", 75 + "maxLength": 512, 76 + "format": "record-key", 77 + "description": "NOTE: maxLength is redundant with record-key format. Keeping it temporarily to ensure backwards compatibility." 78 + }, 79 + "value": { "type": "unknown" } 80 + } 81 + }, 82 + "update": { 83 + "type": "object", 84 + "description": "Operation which updates an existing record.", 85 + "required": ["collection", "rkey", "value"], 86 + "properties": { 87 + "collection": { "type": "string", "format": "nsid" }, 88 + "rkey": { "type": "string", "format": "record-key" }, 89 + "value": { "type": "unknown" } 90 + } 91 + }, 92 + "delete": { 93 + "type": "object", 94 + "description": "Operation which deletes an existing record.", 95 + "required": ["collection", "rkey"], 96 + "properties": { 97 + "collection": { "type": "string", "format": "nsid" }, 98 + "rkey": { "type": "string", "format": "record-key" } 99 + } 100 + }, 101 + "createResult": { 102 + "type": "object", 103 + "required": ["uri", "cid"], 104 + "properties": { 105 + "uri": { "type": "string", "format": "at-uri" }, 106 + "cid": { "type": "string", "format": "cid" }, 107 + "validationStatus": { 108 + "type": "string", 109 + "knownValues": ["valid", "unknown"] 110 + } 111 + } 112 + }, 113 + "updateResult": { 114 + "type": "object", 115 + "required": ["uri", "cid"], 116 + "properties": { 117 + "uri": { "type": "string", "format": "at-uri" }, 118 + "cid": { "type": "string", "format": "cid" }, 119 + "validationStatus": { 120 + "type": "string", 121 + "knownValues": ["valid", "unknown"] 122 + } 123 + } 124 + }, 125 + "deleteResult": { 126 + "type": "object", 127 + "required": [], 128 + "properties": {} 129 + } 130 + } 131 + }
+73
resources/lexicons/com/atproto/repo/createRecord.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.repo.createRecord", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Create a single new repository record. Requires auth, implemented by PDS.", 8 + "input": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "required": ["repo", "collection", "record"], 13 + "properties": { 14 + "repo": { 15 + "type": "string", 16 + "format": "at-identifier", 17 + "description": "The handle or DID of the repo (aka, current account)." 18 + }, 19 + "collection": { 20 + "type": "string", 21 + "format": "nsid", 22 + "description": "The NSID of the record collection." 23 + }, 24 + "rkey": { 25 + "type": "string", 26 + "format": "record-key", 27 + "description": "The Record Key.", 28 + "maxLength": 512 29 + }, 30 + "validate": { 31 + "type": "boolean", 32 + "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." 33 + }, 34 + "record": { 35 + "type": "unknown", 36 + "description": "The record itself. Must contain a $type field." 37 + }, 38 + "swapCommit": { 39 + "type": "string", 40 + "format": "cid", 41 + "description": "Compare and swap with the previous commit by CID." 42 + } 43 + } 44 + } 45 + }, 46 + "output": { 47 + "encoding": "application/json", 48 + "schema": { 49 + "type": "object", 50 + "required": ["uri", "cid"], 51 + "properties": { 52 + "uri": { "type": "string", "format": "at-uri" }, 53 + "cid": { "type": "string", "format": "cid" }, 54 + "commit": { 55 + "type": "ref", 56 + "ref": "com.atproto.repo.defs#commitMeta" 57 + }, 58 + "validationStatus": { 59 + "type": "string", 60 + "knownValues": ["valid", "unknown"] 61 + } 62 + } 63 + } 64 + }, 65 + "errors": [ 66 + { 67 + "name": "InvalidSwap", 68 + "description": "Indicates that 'swapCommit' didn't match current repo commit." 69 + } 70 + ] 71 + } 72 + } 73 + }
+14
resources/lexicons/com/atproto/repo/defs.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.repo.defs", 4 + "defs": { 5 + "commitMeta": { 6 + "type": "object", 7 + "required": ["cid", "rev"], 8 + "properties": { 9 + "cid": { "type": "string", "format": "cid" }, 10 + "rev": { "type": "string", "format": "tid" } 11 + } 12 + } 13 + } 14 + }
+57
resources/lexicons/com/atproto/repo/deleteRecord.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.repo.deleteRecord", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Delete a repository record, or ensure it doesn't exist. Requires auth, implemented by PDS.", 8 + "input": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "required": ["repo", "collection", "rkey"], 13 + "properties": { 14 + "repo": { 15 + "type": "string", 16 + "format": "at-identifier", 17 + "description": "The handle or DID of the repo (aka, current account)." 18 + }, 19 + "collection": { 20 + "type": "string", 21 + "format": "nsid", 22 + "description": "The NSID of the record collection." 23 + }, 24 + "rkey": { 25 + "type": "string", 26 + "format": "record-key", 27 + "description": "The Record Key." 28 + }, 29 + "swapRecord": { 30 + "type": "string", 31 + "format": "cid", 32 + "description": "Compare and swap with the previous record by CID." 33 + }, 34 + "swapCommit": { 35 + "type": "string", 36 + "format": "cid", 37 + "description": "Compare and swap with the previous commit by CID." 38 + } 39 + } 40 + } 41 + }, 42 + "output": { 43 + "encoding": "application/json", 44 + "schema": { 45 + "type": "object", 46 + "properties": { 47 + "commit": { 48 + "type": "ref", 49 + "ref": "com.atproto.repo.defs#commitMeta" 50 + } 51 + } 52 + } 53 + }, 54 + "errors": [{ "name": "InvalidSwap" }] 55 + } 56 + } 57 + }
+51
resources/lexicons/com/atproto/repo/describeRepo.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.repo.describeRepo", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Get information about an account and repository, including the list of collections. Does not require auth.", 8 + "parameters": { 9 + "type": "params", 10 + "required": ["repo"], 11 + "properties": { 12 + "repo": { 13 + "type": "string", 14 + "format": "at-identifier", 15 + "description": "The handle or DID of the repo." 16 + } 17 + } 18 + }, 19 + "output": { 20 + "encoding": "application/json", 21 + "schema": { 22 + "type": "object", 23 + "required": [ 24 + "handle", 25 + "did", 26 + "didDoc", 27 + "collections", 28 + "handleIsCorrect" 29 + ], 30 + "properties": { 31 + "handle": { "type": "string", "format": "handle" }, 32 + "did": { "type": "string", "format": "did" }, 33 + "didDoc": { 34 + "type": "unknown", 35 + "description": "The complete DID document for this account." 36 + }, 37 + "collections": { 38 + "type": "array", 39 + "description": "List of all the collections (NSIDs) for which this repo contains at least one record.", 40 + "items": { "type": "string", "format": "nsid" } 41 + }, 42 + "handleIsCorrect": { 43 + "type": "boolean", 44 + "description": "Indicates if handle is currently valid (resolves bi-directionally)" 45 + } 46 + } 47 + } 48 + } 49 + } 50 + } 51 + }
+49
resources/lexicons/com/atproto/repo/getRecord.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.repo.getRecord", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Get a single record from a repository. Does not require auth.", 8 + "parameters": { 9 + "type": "params", 10 + "required": ["repo", "collection", "rkey"], 11 + "properties": { 12 + "repo": { 13 + "type": "string", 14 + "format": "at-identifier", 15 + "description": "The handle or DID of the repo." 16 + }, 17 + "collection": { 18 + "type": "string", 19 + "format": "nsid", 20 + "description": "The NSID of the record collection." 21 + }, 22 + "rkey": { 23 + "type": "string", 24 + "description": "The Record Key.", 25 + "format": "record-key" 26 + }, 27 + "cid": { 28 + "type": "string", 29 + "format": "cid", 30 + "description": "The CID of the version of the record. If not specified, then return the most recent version." 31 + } 32 + } 33 + }, 34 + "output": { 35 + "encoding": "application/json", 36 + "schema": { 37 + "type": "object", 38 + "required": ["uri", "value"], 39 + "properties": { 40 + "uri": { "type": "string", "format": "at-uri" }, 41 + "cid": { "type": "string", "format": "cid" }, 42 + "value": { "type": "unknown" } 43 + } 44 + } 45 + }, 46 + "errors": [{ "name": "RecordNotFound" }] 47 + } 48 + } 49 + }
+13
resources/lexicons/com/atproto/repo/importRepo.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.repo.importRepo", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Import a repo in the form of a CAR file. Requires Content-Length HTTP header to be set.", 8 + "input": { 9 + "encoding": "application/vnd.ipld.car" 10 + } 11 + } 12 + } 13 + }
+44
resources/lexicons/com/atproto/repo/listMissingBlobs.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.repo.listMissingBlobs", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Returns a list of missing blobs for the requesting account. Intended to be used in the account migration flow.", 8 + "parameters": { 9 + "type": "params", 10 + "properties": { 11 + "limit": { 12 + "type": "integer", 13 + "minimum": 1, 14 + "maximum": 1000, 15 + "default": 500 16 + }, 17 + "cursor": { "type": "string" } 18 + } 19 + }, 20 + "output": { 21 + "encoding": "application/json", 22 + "schema": { 23 + "type": "object", 24 + "required": ["blobs"], 25 + "properties": { 26 + "cursor": { "type": "string" }, 27 + "blobs": { 28 + "type": "array", 29 + "items": { "type": "ref", "ref": "#recordBlob" } 30 + } 31 + } 32 + } 33 + } 34 + }, 35 + "recordBlob": { 36 + "type": "object", 37 + "required": ["cid", "recordUri"], 38 + "properties": { 39 + "cid": { "type": "string", "format": "cid" }, 40 + "recordUri": { "type": "string", "format": "at-uri" } 41 + } 42 + } 43 + } 44 + }
+61
resources/lexicons/com/atproto/repo/listRecords.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.repo.listRecords", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "List a range of records in a repository, matching a specific collection. Does not require auth.", 8 + "parameters": { 9 + "type": "params", 10 + "required": ["repo", "collection"], 11 + "properties": { 12 + "repo": { 13 + "type": "string", 14 + "format": "at-identifier", 15 + "description": "The handle or DID of the repo." 16 + }, 17 + "collection": { 18 + "type": "string", 19 + "format": "nsid", 20 + "description": "The NSID of the record type." 21 + }, 22 + "limit": { 23 + "type": "integer", 24 + "minimum": 1, 25 + "maximum": 100, 26 + "default": 50, 27 + "description": "The number of records to return." 28 + }, 29 + "cursor": { "type": "string" }, 30 + "reverse": { 31 + "type": "boolean", 32 + "description": "Flag to reverse the order of the returned records." 33 + } 34 + } 35 + }, 36 + "output": { 37 + "encoding": "application/json", 38 + "schema": { 39 + "type": "object", 40 + "required": ["records"], 41 + "properties": { 42 + "cursor": { "type": "string" }, 43 + "records": { 44 + "type": "array", 45 + "items": { "type": "ref", "ref": "#record" } 46 + } 47 + } 48 + } 49 + } 50 + }, 51 + "record": { 52 + "type": "object", 53 + "required": ["uri", "cid", "value"], 54 + "properties": { 55 + "uri": { "type": "string", "format": "at-uri" }, 56 + "cid": { "type": "string", "format": "cid" }, 57 + "value": { "type": "unknown" } 58 + } 59 + } 60 + } 61 + }
+74
resources/lexicons/com/atproto/repo/putRecord.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.repo.putRecord", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Write a repository record, creating or updating it as needed. Requires auth, implemented by PDS.", 8 + "input": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "required": ["repo", "collection", "rkey", "record"], 13 + "nullable": ["swapRecord"], 14 + "properties": { 15 + "repo": { 16 + "type": "string", 17 + "format": "at-identifier", 18 + "description": "The handle or DID of the repo (aka, current account)." 19 + }, 20 + "collection": { 21 + "type": "string", 22 + "format": "nsid", 23 + "description": "The NSID of the record collection." 24 + }, 25 + "rkey": { 26 + "type": "string", 27 + "format": "record-key", 28 + "description": "The Record Key.", 29 + "maxLength": 512 30 + }, 31 + "validate": { 32 + "type": "boolean", 33 + "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." 34 + }, 35 + "record": { 36 + "type": "unknown", 37 + "description": "The record to write." 38 + }, 39 + "swapRecord": { 40 + "type": "string", 41 + "format": "cid", 42 + "description": "Compare and swap with the previous record by CID. WARNING: nullable and optional field; may cause problems with golang implementation" 43 + }, 44 + "swapCommit": { 45 + "type": "string", 46 + "format": "cid", 47 + "description": "Compare and swap with the previous commit by CID." 48 + } 49 + } 50 + } 51 + }, 52 + "output": { 53 + "encoding": "application/json", 54 + "schema": { 55 + "type": "object", 56 + "required": ["uri", "cid"], 57 + "properties": { 58 + "uri": { "type": "string", "format": "at-uri" }, 59 + "cid": { "type": "string", "format": "cid" }, 60 + "commit": { 61 + "type": "ref", 62 + "ref": "com.atproto.repo.defs#commitMeta" 63 + }, 64 + "validationStatus": { 65 + "type": "string", 66 + "knownValues": ["valid", "unknown"] 67 + } 68 + } 69 + } 70 + }, 71 + "errors": [{ "name": "InvalidSwap" }] 72 + } 73 + } 74 + }
+15
resources/lexicons/com/atproto/repo/strongRef.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.repo.strongRef", 4 + "description": "A URI with a content-hash fingerprint.", 5 + "defs": { 6 + "main": { 7 + "type": "object", 8 + "required": ["uri", "cid"], 9 + "properties": { 10 + "uri": { "type": "string", "format": "at-uri" }, 11 + "cid": { "type": "string", "format": "cid" } 12 + } 13 + } 14 + } 15 + }
+23
resources/lexicons/com/atproto/repo/uploadBlob.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.repo.uploadBlob", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "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.", 8 + "input": { 9 + "encoding": "*/*" 10 + }, 11 + "output": { 12 + "encoding": "application/json", 13 + "schema": { 14 + "type": "object", 15 + "required": ["blob"], 16 + "properties": { 17 + "blob": { "type": "blob" } 18 + } 19 + } 20 + } 21 + } 22 + } 23 + }
+10
resources/lexicons/com/atproto/server/activateAccount.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.server.activateAccount", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Activates a currently deactivated account. Used to finalize account migration after the account's repo is imported and identity is setup." 8 + } 9 + } 10 + }
+38
resources/lexicons/com/atproto/server/checkAccountStatus.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.server.checkAccountStatus", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "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.", 8 + "output": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "required": [ 13 + "activated", 14 + "validDid", 15 + "repoCommit", 16 + "repoRev", 17 + "repoBlocks", 18 + "indexedRecords", 19 + "privateStateValues", 20 + "expectedBlobs", 21 + "importedBlobs" 22 + ], 23 + "properties": { 24 + "activated": { "type": "boolean" }, 25 + "validDid": { "type": "boolean" }, 26 + "repoCommit": { "type": "string", "format": "cid" }, 27 + "repoRev": { "type": "string" }, 28 + "repoBlocks": { "type": "integer" }, 29 + "indexedRecords": { "type": "integer" }, 30 + "privateStateValues": { "type": "integer" }, 31 + "expectedBlobs": { "type": "integer" }, 32 + "importedBlobs": { "type": "integer" } 33 + } 34 + } 35 + } 36 + } 37 + } 38 + }
+27
resources/lexicons/com/atproto/server/confirmEmail.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.server.confirmEmail", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Confirm an email using a token from com.atproto.server.requestEmailConfirmation.", 8 + "input": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "required": ["email", "token"], 13 + "properties": { 14 + "email": { "type": "string" }, 15 + "token": { "type": "string" } 16 + } 17 + } 18 + }, 19 + "errors": [ 20 + { "name": "AccountNotFound" }, 21 + { "name": "ExpiredToken" }, 22 + { "name": "InvalidToken" }, 23 + { "name": "InvalidEmail" } 24 + ] 25 + } 26 + } 27 + }
+76
resources/lexicons/com/atproto/server/createAccount.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.server.createAccount", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Create an account. Implemented by PDS.", 8 + "input": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "required": ["handle"], 13 + "properties": { 14 + "email": { "type": "string" }, 15 + "handle": { 16 + "type": "string", 17 + "format": "handle", 18 + "description": "Requested handle for the account." 19 + }, 20 + "did": { 21 + "type": "string", 22 + "format": "did", 23 + "description": "Pre-existing atproto DID, being imported to a new account." 24 + }, 25 + "inviteCode": { "type": "string" }, 26 + "verificationCode": { "type": "string" }, 27 + "verificationPhone": { "type": "string" }, 28 + "password": { 29 + "type": "string", 30 + "description": "Initial account password. May need to meet instance-specific password strength requirements." 31 + }, 32 + "recoveryKey": { 33 + "type": "string", 34 + "description": "DID PLC rotation key (aka, recovery key) to be included in PLC creation operation." 35 + }, 36 + "plcOp": { 37 + "type": "unknown", 38 + "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." 39 + } 40 + } 41 + } 42 + }, 43 + "output": { 44 + "encoding": "application/json", 45 + "schema": { 46 + "type": "object", 47 + "description": "Account login session returned on successful account creation.", 48 + "required": ["accessJwt", "refreshJwt", "handle", "did"], 49 + "properties": { 50 + "accessJwt": { "type": "string" }, 51 + "refreshJwt": { "type": "string" }, 52 + "handle": { "type": "string", "format": "handle" }, 53 + "did": { 54 + "type": "string", 55 + "format": "did", 56 + "description": "The DID of the new account." 57 + }, 58 + "didDoc": { 59 + "type": "unknown", 60 + "description": "Complete DID document." 61 + } 62 + } 63 + } 64 + }, 65 + "errors": [ 66 + { "name": "InvalidHandle" }, 67 + { "name": "InvalidPassword" }, 68 + { "name": "InvalidInviteCode" }, 69 + { "name": "HandleNotAvailable" }, 70 + { "name": "UnsupportedDomain" }, 71 + { "name": "UnresolvableDid" }, 72 + { "name": "IncompatibleDidDoc" } 73 + ] 74 + } 75 + } 76 + }
+45
resources/lexicons/com/atproto/server/createAppPassword.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.server.createAppPassword", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Create an App Password.", 8 + "input": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "required": ["name"], 13 + "properties": { 14 + "name": { 15 + "type": "string", 16 + "description": "A short name for the App Password, to help distinguish them." 17 + }, 18 + "privileged": { 19 + "type": "boolean", 20 + "description": "If an app password has 'privileged' access to possibly sensitive account state. Meant for use with trusted clients." 21 + } 22 + } 23 + } 24 + }, 25 + "output": { 26 + "encoding": "application/json", 27 + "schema": { 28 + "type": "ref", 29 + "ref": "#appPassword" 30 + } 31 + }, 32 + "errors": [{ "name": "AccountTakedown" }] 33 + }, 34 + "appPassword": { 35 + "type": "object", 36 + "required": ["name", "password", "createdAt"], 37 + "properties": { 38 + "name": { "type": "string" }, 39 + "password": { "type": "string" }, 40 + "createdAt": { "type": "string", "format": "datetime" }, 41 + "privileged": { "type": "boolean" } 42 + } 43 + } 44 + } 45 + }
+31
resources/lexicons/com/atproto/server/createInviteCode.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.server.createInviteCode", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Create an invite code.", 8 + "input": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "required": ["useCount"], 13 + "properties": { 14 + "useCount": { "type": "integer" }, 15 + "forAccount": { "type": "string", "format": "did" } 16 + } 17 + } 18 + }, 19 + "output": { 20 + "encoding": "application/json", 21 + "schema": { 22 + "type": "object", 23 + "required": ["code"], 24 + "properties": { 25 + "code": { "type": "string" } 26 + } 27 + } 28 + } 29 + } 30 + } 31 + }
+49
resources/lexicons/com/atproto/server/createInviteCodes.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.server.createInviteCodes", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Create invite codes.", 8 + "input": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "required": ["codeCount", "useCount"], 13 + "properties": { 14 + "codeCount": { "type": "integer", "default": 1 }, 15 + "useCount": { "type": "integer" }, 16 + "forAccounts": { 17 + "type": "array", 18 + "items": { "type": "string", "format": "did" } 19 + } 20 + } 21 + } 22 + }, 23 + "output": { 24 + "encoding": "application/json", 25 + "schema": { 26 + "type": "object", 27 + "required": ["codes"], 28 + "properties": { 29 + "codes": { 30 + "type": "array", 31 + "items": { "type": "ref", "ref": "#accountCodes" } 32 + } 33 + } 34 + } 35 + } 36 + }, 37 + "accountCodes": { 38 + "type": "object", 39 + "required": ["account", "codes"], 40 + "properties": { 41 + "account": { "type": "string" }, 42 + "codes": { 43 + "type": "array", 44 + "items": { "type": "string" } 45 + } 46 + } 47 + } 48 + } 49 + }
+56
resources/lexicons/com/atproto/server/createSession.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.server.createSession", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Create an authentication session.", 8 + "input": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "required": ["identifier", "password"], 13 + "properties": { 14 + "identifier": { 15 + "type": "string", 16 + "description": "Handle or other identifier supported by the server for the authenticating user." 17 + }, 18 + "password": { "type": "string" }, 19 + "authFactorToken": { "type": "string" }, 20 + "allowTakendown": { 21 + "type": "boolean", 22 + "description": "When true, instead of throwing error for takendown accounts, a valid response with a narrow scoped token will be returned" 23 + } 24 + } 25 + } 26 + }, 27 + "output": { 28 + "encoding": "application/json", 29 + "schema": { 30 + "type": "object", 31 + "required": ["accessJwt", "refreshJwt", "handle", "did"], 32 + "properties": { 33 + "accessJwt": { "type": "string" }, 34 + "refreshJwt": { "type": "string" }, 35 + "handle": { "type": "string", "format": "handle" }, 36 + "did": { "type": "string", "format": "did" }, 37 + "didDoc": { "type": "unknown" }, 38 + "email": { "type": "string" }, 39 + "emailConfirmed": { "type": "boolean" }, 40 + "emailAuthFactor": { "type": "boolean" }, 41 + "active": { "type": "boolean" }, 42 + "status": { 43 + "type": "string", 44 + "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.", 45 + "knownValues": ["takendown", "suspended", "deactivated"] 46 + } 47 + } 48 + } 49 + }, 50 + "errors": [ 51 + { "name": "AccountTakedown" }, 52 + { "name": "AuthFactorTokenRequired" } 53 + ] 54 + } 55 + } 56 + }
+23
resources/lexicons/com/atproto/server/deactivateAccount.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.server.deactivateAccount", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "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.", 8 + "input": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "properties": { 13 + "deleteAfter": { 14 + "type": "string", 15 + "format": "datetime", 16 + "description": "A recommendation to server as to how long they should hold onto the deactivated account before deleting." 17 + } 18 + } 19 + } 20 + } 21 + } 22 + } 23 + }
+38
resources/lexicons/com/atproto/server/defs.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.server.defs", 4 + "defs": { 5 + "inviteCode": { 6 + "type": "object", 7 + "required": [ 8 + "code", 9 + "available", 10 + "disabled", 11 + "forAccount", 12 + "createdBy", 13 + "createdAt", 14 + "uses" 15 + ], 16 + "properties": { 17 + "code": { "type": "string" }, 18 + "available": { "type": "integer" }, 19 + "disabled": { "type": "boolean" }, 20 + "forAccount": { "type": "string" }, 21 + "createdBy": { "type": "string" }, 22 + "createdAt": { "type": "string", "format": "datetime" }, 23 + "uses": { 24 + "type": "array", 25 + "items": { "type": "ref", "ref": "#inviteCodeUse" } 26 + } 27 + } 28 + }, 29 + "inviteCodeUse": { 30 + "type": "object", 31 + "required": ["usedBy", "usedAt"], 32 + "properties": { 33 + "usedBy": { "type": "string", "format": "did" }, 34 + "usedAt": { "type": "string", "format": "datetime" } 35 + } 36 + } 37 + } 38 + }
+23
resources/lexicons/com/atproto/server/deleteAccount.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.server.deleteAccount", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Delete an actor's account with a token and password. Can only be called after requesting a deletion token. Requires auth.", 8 + "input": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "required": ["did", "password", "token"], 13 + "properties": { 14 + "did": { "type": "string", "format": "did" }, 15 + "password": { "type": "string" }, 16 + "token": { "type": "string" } 17 + } 18 + } 19 + }, 20 + "errors": [{ "name": "ExpiredToken" }, { "name": "InvalidToken" }] 21 + } 22 + } 23 + }
+10
resources/lexicons/com/atproto/server/deleteSession.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.server.deleteSession", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Delete the current session. Requires auth." 8 + } 9 + } 10 + }
+59
resources/lexicons/com/atproto/server/describeServer.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.server.describeServer", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Describes the server's account creation requirements and capabilities. Implemented by PDS.", 8 + "output": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "required": ["did", "availableUserDomains"], 13 + "properties": { 14 + "inviteCodeRequired": { 15 + "type": "boolean", 16 + "description": "If true, an invite code must be supplied to create an account on this instance." 17 + }, 18 + "phoneVerificationRequired": { 19 + "type": "boolean", 20 + "description": "If true, a phone verification token must be supplied to create an account on this instance." 21 + }, 22 + "availableUserDomains": { 23 + "type": "array", 24 + "description": "List of domain suffixes that can be used in account handles.", 25 + "items": { "type": "string" } 26 + }, 27 + "links": { 28 + "type": "ref", 29 + "description": "URLs of service policy documents.", 30 + "ref": "#links" 31 + }, 32 + "contact": { 33 + "type": "ref", 34 + "description": "Contact information", 35 + "ref": "#contact" 36 + }, 37 + "did": { 38 + "type": "string", 39 + "format": "did" 40 + } 41 + } 42 + } 43 + } 44 + }, 45 + "links": { 46 + "type": "object", 47 + "properties": { 48 + "privacyPolicy": { "type": "string", "format": "uri" }, 49 + "termsOfService": { "type": "string", "format": "uri" } 50 + } 51 + }, 52 + "contact": { 53 + "type": "object", 54 + "properties": { 55 + "email": { "type": "string" } 56 + } 57 + } 58 + } 59 + }
+38
resources/lexicons/com/atproto/server/getAccountInviteCodes.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.server.getAccountInviteCodes", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Get all invite codes for the current account. Requires auth.", 8 + "parameters": { 9 + "type": "params", 10 + "properties": { 11 + "includeUsed": { "type": "boolean", "default": true }, 12 + "createAvailable": { 13 + "type": "boolean", 14 + "default": true, 15 + "description": "Controls whether any new 'earned' but not 'created' invites should be created." 16 + } 17 + } 18 + }, 19 + "output": { 20 + "encoding": "application/json", 21 + "schema": { 22 + "type": "object", 23 + "required": ["codes"], 24 + "properties": { 25 + "codes": { 26 + "type": "array", 27 + "items": { 28 + "type": "ref", 29 + "ref": "com.atproto.server.defs#inviteCode" 30 + } 31 + } 32 + } 33 + } 34 + }, 35 + "errors": [{ "name": "DuplicateCreate" }] 36 + } 37 + } 38 + }
+48
resources/lexicons/com/atproto/server/getServiceAuth.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.server.getServiceAuth", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Get a signed token on behalf of the requesting DID for the requested service.", 8 + "parameters": { 9 + "type": "params", 10 + "required": ["aud"], 11 + "properties": { 12 + "aud": { 13 + "type": "string", 14 + "format": "did", 15 + "description": "The DID of the service that the token will be used to authenticate with" 16 + }, 17 + "exp": { 18 + "type": "integer", 19 + "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." 20 + }, 21 + "lxm": { 22 + "type": "string", 23 + "format": "nsid", 24 + "description": "Lexicon (XRPC) method to bind the requested token to" 25 + } 26 + } 27 + }, 28 + "output": { 29 + "encoding": "application/json", 30 + "schema": { 31 + "type": "object", 32 + "required": ["token"], 33 + "properties": { 34 + "token": { 35 + "type": "string" 36 + } 37 + } 38 + } 39 + }, 40 + "errors": [ 41 + { 42 + "name": "BadExpiration", 43 + "description": "Indicates that the requested expiration date is not a valid. May be in the past or may be reliant on the requested scopes." 44 + } 45 + ] 46 + } 47 + } 48 + }
+31
resources/lexicons/com/atproto/server/getSession.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.server.getSession", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Get information about the current auth session. Requires auth.", 8 + "output": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "required": ["handle", "did"], 13 + "properties": { 14 + "handle": { "type": "string", "format": "handle" }, 15 + "did": { "type": "string", "format": "did" }, 16 + "email": { "type": "string" }, 17 + "emailConfirmed": { "type": "boolean" }, 18 + "emailAuthFactor": { "type": "boolean" }, 19 + "didDoc": { "type": "unknown" }, 20 + "active": { "type": "boolean" }, 21 + "status": { 22 + "type": "string", 23 + "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.", 24 + "knownValues": ["takendown", "suspended", "deactivated"] 25 + } 26 + } 27 + } 28 + } 29 + } 30 + } 31 + }
+33
resources/lexicons/com/atproto/server/listAppPasswords.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.server.listAppPasswords", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "List all App Passwords.", 8 + "output": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "required": ["passwords"], 13 + "properties": { 14 + "passwords": { 15 + "type": "array", 16 + "items": { "type": "ref", "ref": "#appPassword" } 17 + } 18 + } 19 + } 20 + }, 21 + "errors": [{ "name": "AccountTakedown" }] 22 + }, 23 + "appPassword": { 24 + "type": "object", 25 + "required": ["name", "createdAt"], 26 + "properties": { 27 + "name": { "type": "string" }, 28 + "createdAt": { "type": "string", "format": "datetime" }, 29 + "privileged": { "type": "boolean" } 30 + } 31 + } 32 + } 33 + }
+31
resources/lexicons/com/atproto/server/refreshSession.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.server.refreshSession", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Refresh an authentication session. Requires auth using the 'refreshJwt' (not the 'accessJwt').", 8 + "output": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "required": ["accessJwt", "refreshJwt", "handle", "did"], 13 + "properties": { 14 + "accessJwt": { "type": "string" }, 15 + "refreshJwt": { "type": "string" }, 16 + "handle": { "type": "string", "format": "handle" }, 17 + "did": { "type": "string", "format": "did" }, 18 + "didDoc": { "type": "unknown" }, 19 + "active": { "type": "boolean" }, 20 + "status": { 21 + "type": "string", 22 + "description": "Hosting status of the account. If not specified, then assume 'active'.", 23 + "knownValues": ["takendown", "suspended", "deactivated"] 24 + } 25 + } 26 + } 27 + }, 28 + "errors": [{ "name": "AccountTakedown" }] 29 + } 30 + } 31 + }
+10
resources/lexicons/com/atproto/server/requestAccountDelete.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.server.requestAccountDelete", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Initiate a user account deletion via email." 8 + } 9 + } 10 + }
+10
resources/lexicons/com/atproto/server/requestEmailConfirmation.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.server.requestEmailConfirmation", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Request an email with a code to confirm ownership of email." 8 + } 9 + } 10 + }
+20
resources/lexicons/com/atproto/server/requestEmailUpdate.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.server.requestEmailUpdate", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Request a token in order to update email.", 8 + "output": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "required": ["tokenRequired"], 13 + "properties": { 14 + "tokenRequired": { "type": "boolean" } 15 + } 16 + } 17 + } 18 + } 19 + } 20 + }
+20
resources/lexicons/com/atproto/server/requestPasswordReset.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.server.requestPasswordReset", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Initiate a user account password reset via email.", 8 + "input": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "required": ["email"], 13 + "properties": { 14 + "email": { "type": "string" } 15 + } 16 + } 17 + } 18 + } 19 + } 20 + }
+36
resources/lexicons/com/atproto/server/reserveSigningKey.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.server.reserveSigningKey", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "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.", 8 + "input": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "properties": { 13 + "did": { 14 + "type": "string", 15 + "format": "did", 16 + "description": "The DID to reserve a key for." 17 + } 18 + } 19 + } 20 + }, 21 + "output": { 22 + "encoding": "application/json", 23 + "schema": { 24 + "type": "object", 25 + "required": ["signingKey"], 26 + "properties": { 27 + "signingKey": { 28 + "type": "string", 29 + "description": "The public key for the reserved signing key, in did:key serialization." 30 + } 31 + } 32 + } 33 + } 34 + } 35 + } 36 + }
+22
resources/lexicons/com/atproto/server/resetPassword.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.server.resetPassword", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Reset a user account password using a token.", 8 + "input": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "required": ["token", "password"], 13 + "properties": { 14 + "token": { "type": "string" }, 15 + "password": { "type": "string" } 16 + } 17 + } 18 + }, 19 + "errors": [{ "name": "ExpiredToken" }, { "name": "InvalidToken" }] 20 + } 21 + } 22 + }
+20
resources/lexicons/com/atproto/server/revokeAppPassword.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.server.revokeAppPassword", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Revoke an App Password by name.", 8 + "input": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "required": ["name"], 13 + "properties": { 14 + "name": { "type": "string" } 15 + } 16 + } 17 + } 18 + } 19 + } 20 + }
+30
resources/lexicons/com/atproto/server/updateEmail.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.server.updateEmail", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Update an account's email.", 8 + "input": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "required": ["email"], 13 + "properties": { 14 + "email": { "type": "string" }, 15 + "emailAuthFactor": { "type": "boolean" }, 16 + "token": { 17 + "type": "string", 18 + "description": "Requires a token from com.atproto.sever.requestEmailUpdate if the account's email has been confirmed." 19 + } 20 + } 21 + } 22 + }, 23 + "errors": [ 24 + { "name": "ExpiredToken" }, 25 + { "name": "InvalidToken" }, 26 + { "name": "TokenRequired" } 27 + ] 28 + } 29 + } 30 + }
+10
resources/lexicons/com/atproto/sync/defs.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.sync.defs", 4 + "defs": { 5 + "hostStatus": { 6 + "type": "string", 7 + "knownValues": ["active", "idle", "offline", "throttled", "banned"] 8 + } 9 + } 10 + }
+36
resources/lexicons/com/atproto/sync/getBlob.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.sync.getBlob", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Get a blob associated with a given account. Returns the full blob as originally uploaded. Does not require auth; implemented by PDS.", 8 + "parameters": { 9 + "type": "params", 10 + "required": ["did", "cid"], 11 + "properties": { 12 + "did": { 13 + "type": "string", 14 + "format": "did", 15 + "description": "The DID of the account." 16 + }, 17 + "cid": { 18 + "type": "string", 19 + "format": "cid", 20 + "description": "The CID of the blob to fetch" 21 + } 22 + } 23 + }, 24 + "output": { 25 + "encoding": "*/*" 26 + }, 27 + "errors": [ 28 + { "name": "BlobNotFound" }, 29 + { "name": "RepoNotFound" }, 30 + { "name": "RepoTakendown" }, 31 + { "name": "RepoSuspended" }, 32 + { "name": "RepoDeactivated" } 33 + ] 34 + } 35 + } 36 + }
+35
resources/lexicons/com/atproto/sync/getBlocks.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.sync.getBlocks", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Get data blocks from a given repo, by CID. For example, intermediate MST nodes, or records. Does not require auth; implemented by PDS.", 8 + "parameters": { 9 + "type": "params", 10 + "required": ["did", "cids"], 11 + "properties": { 12 + "did": { 13 + "type": "string", 14 + "format": "did", 15 + "description": "The DID of the repo." 16 + }, 17 + "cids": { 18 + "type": "array", 19 + "items": { "type": "string", "format": "cid" } 20 + } 21 + } 22 + }, 23 + "output": { 24 + "encoding": "application/vnd.ipld.car" 25 + }, 26 + "errors": [ 27 + { "name": "BlockNotFound" }, 28 + { "name": "RepoNotFound" }, 29 + { "name": "RepoTakendown" }, 30 + { "name": "RepoSuspended" }, 31 + { "name": "RepoDeactivated" } 32 + ] 33 + } 34 + } 35 + }
+24
resources/lexicons/com/atproto/sync/getCheckout.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.sync.getCheckout", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "DEPRECATED - please use com.atproto.sync.getRepo instead", 8 + "parameters": { 9 + "type": "params", 10 + "required": ["did"], 11 + "properties": { 12 + "did": { 13 + "type": "string", 14 + "format": "did", 15 + "description": "The DID of the repo." 16 + } 17 + } 18 + }, 19 + "output": { 20 + "encoding": "application/vnd.ipld.car" 21 + } 22 + } 23 + } 24 + }
+32
resources/lexicons/com/atproto/sync/getHead.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.sync.getHead", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "DEPRECATED - please use com.atproto.sync.getLatestCommit instead", 8 + "parameters": { 9 + "type": "params", 10 + "required": ["did"], 11 + "properties": { 12 + "did": { 13 + "type": "string", 14 + "format": "did", 15 + "description": "The DID of the repo." 16 + } 17 + } 18 + }, 19 + "output": { 20 + "encoding": "application/json", 21 + "schema": { 22 + "type": "object", 23 + "required": ["root"], 24 + "properties": { 25 + "root": { "type": "string", "format": "cid" } 26 + } 27 + } 28 + }, 29 + "errors": [{ "name": "HeadNotFound" }] 30 + } 31 + } 32 + }
+43
resources/lexicons/com/atproto/sync/getHostStatus.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.sync.getHostStatus", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Returns information about a specified upstream host, as consumed by the server. Implemented by relays.", 8 + "parameters": { 9 + "type": "params", 10 + "required": ["hostname"], 11 + "properties": { 12 + "hostname": { 13 + "type": "string", 14 + "description": "Hostname of the host (eg, PDS or relay) being queried." 15 + } 16 + } 17 + }, 18 + "output": { 19 + "encoding": "application/json", 20 + "schema": { 21 + "type": "object", 22 + "required": ["hostname"], 23 + "properties": { 24 + "hostname": { "type": "string" }, 25 + "seq": { 26 + "type": "integer", 27 + "description": "Recent repo stream event sequence number. May be delayed from actual stream processing (eg, persisted cursor not in-memory cursor)." 28 + }, 29 + "accountCount": { 30 + "type": "integer", 31 + "description": "Number of accounts on the server which are associated with the upstream host. Note that the upstream may actually have more accounts." 32 + }, 33 + "status": { 34 + "type": "ref", 35 + "ref": "com.atproto.sync.defs#hostStatus" 36 + } 37 + } 38 + } 39 + }, 40 + "errors": [{ "name": "HostNotFound" }] 41 + } 42 + } 43 + }
+38
resources/lexicons/com/atproto/sync/getLatestCommit.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.sync.getLatestCommit", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Get the current commit CID & revision of the specified repo. Does not require auth.", 8 + "parameters": { 9 + "type": "params", 10 + "required": ["did"], 11 + "properties": { 12 + "did": { 13 + "type": "string", 14 + "format": "did", 15 + "description": "The DID of the repo." 16 + } 17 + } 18 + }, 19 + "output": { 20 + "encoding": "application/json", 21 + "schema": { 22 + "type": "object", 23 + "required": ["cid", "rev"], 24 + "properties": { 25 + "cid": { "type": "string", "format": "cid" }, 26 + "rev": { "type": "string", "format": "tid" } 27 + } 28 + } 29 + }, 30 + "errors": [ 31 + { "name": "RepoNotFound" }, 32 + { "name": "RepoTakendown" }, 33 + { "name": "RepoSuspended" }, 34 + { "name": "RepoDeactivated" } 35 + ] 36 + } 37 + } 38 + }
+37
resources/lexicons/com/atproto/sync/getRecord.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.sync.getRecord", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Get data blocks needed to prove the existence or non-existence of record in the current version of repo. Does not require auth.", 8 + "parameters": { 9 + "type": "params", 10 + "required": ["did", "collection", "rkey"], 11 + "properties": { 12 + "did": { 13 + "type": "string", 14 + "format": "did", 15 + "description": "The DID of the repo." 16 + }, 17 + "collection": { "type": "string", "format": "nsid" }, 18 + "rkey": { 19 + "type": "string", 20 + "description": "Record Key", 21 + "format": "record-key" 22 + } 23 + } 24 + }, 25 + "output": { 26 + "encoding": "application/vnd.ipld.car" 27 + }, 28 + "errors": [ 29 + { "name": "RecordNotFound" }, 30 + { "name": "RepoNotFound" }, 31 + { "name": "RepoTakendown" }, 32 + { "name": "RepoSuspended" }, 33 + { "name": "RepoDeactivated" } 34 + ] 35 + } 36 + } 37 + }
+35
resources/lexicons/com/atproto/sync/getRepo.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.sync.getRepo", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Download a repository export as CAR file. Optionally only a 'diff' since a previous revision. Does not require auth; implemented by PDS.", 8 + "parameters": { 9 + "type": "params", 10 + "required": ["did"], 11 + "properties": { 12 + "did": { 13 + "type": "string", 14 + "format": "did", 15 + "description": "The DID of the repo." 16 + }, 17 + "since": { 18 + "type": "string", 19 + "format": "tid", 20 + "description": "The revision ('rev') of the repo to create a diff from." 21 + } 22 + } 23 + }, 24 + "output": { 25 + "encoding": "application/vnd.ipld.car" 26 + }, 27 + "errors": [ 28 + { "name": "RepoNotFound" }, 29 + { "name": "RepoTakendown" }, 30 + { "name": "RepoSuspended" }, 31 + { "name": "RepoDeactivated" } 32 + ] 33 + } 34 + } 35 + }
+50
resources/lexicons/com/atproto/sync/getRepoStatus.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.sync.getRepoStatus", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Get the hosting status for a repository, on this server. Expected to be implemented by PDS and Relay.", 8 + "parameters": { 9 + "type": "params", 10 + "required": ["did"], 11 + "properties": { 12 + "did": { 13 + "type": "string", 14 + "format": "did", 15 + "description": "The DID of the repo." 16 + } 17 + } 18 + }, 19 + "output": { 20 + "encoding": "application/json", 21 + "schema": { 22 + "type": "object", 23 + "required": ["did", "active"], 24 + "properties": { 25 + "did": { "type": "string", "format": "did" }, 26 + "active": { "type": "boolean" }, 27 + "status": { 28 + "type": "string", 29 + "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.", 30 + "knownValues": [ 31 + "takendown", 32 + "suspended", 33 + "deleted", 34 + "deactivated", 35 + "desynchronized", 36 + "throttled" 37 + ] 38 + }, 39 + "rev": { 40 + "type": "string", 41 + "format": "tid", 42 + "description": "Optional field, the current rev of the repo, if active=true" 43 + } 44 + } 45 + } 46 + }, 47 + "errors": [{ "name": "RepoNotFound" }] 48 + } 49 + } 50 + }
+53
resources/lexicons/com/atproto/sync/listBlobs.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.sync.listBlobs", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "List blob CIDs for an account, since some repo revision. Does not require auth; implemented by PDS.", 8 + "parameters": { 9 + "type": "params", 10 + "required": ["did"], 11 + "properties": { 12 + "did": { 13 + "type": "string", 14 + "format": "did", 15 + "description": "The DID of the repo." 16 + }, 17 + "since": { 18 + "type": "string", 19 + "format": "tid", 20 + "description": "Optional revision of the repo to list blobs since." 21 + }, 22 + "limit": { 23 + "type": "integer", 24 + "minimum": 1, 25 + "maximum": 1000, 26 + "default": 500 27 + }, 28 + "cursor": { "type": "string" } 29 + } 30 + }, 31 + "output": { 32 + "encoding": "application/json", 33 + "schema": { 34 + "type": "object", 35 + "required": ["cids"], 36 + "properties": { 37 + "cursor": { "type": "string" }, 38 + "cids": { 39 + "type": "array", 40 + "items": { "type": "string", "format": "cid" } 41 + } 42 + } 43 + } 44 + }, 45 + "errors": [ 46 + { "name": "RepoNotFound" }, 47 + { "name": "RepoTakendown" }, 48 + { "name": "RepoSuspended" }, 49 + { "name": "RepoDeactivated" } 50 + ] 51 + } 52 + } 53 + }
+56
resources/lexicons/com/atproto/sync/listHosts.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.sync.listHosts", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Enumerates upstream hosts (eg, PDS or relay instances) that this service consumes from. Implemented by relays.", 8 + "parameters": { 9 + "type": "params", 10 + "properties": { 11 + "limit": { 12 + "type": "integer", 13 + "minimum": 1, 14 + "maximum": 1000, 15 + "default": 200 16 + }, 17 + "cursor": { "type": "string" } 18 + } 19 + }, 20 + "output": { 21 + "encoding": "application/json", 22 + "schema": { 23 + "type": "object", 24 + "required": ["hosts"], 25 + "properties": { 26 + "cursor": { "type": "string" }, 27 + "hosts": { 28 + "type": "array", 29 + "items": { "type": "ref", "ref": "#host" }, 30 + "description": "Sort order is not formally specified. Recommended order is by time host was first seen by the server, with oldest first." 31 + } 32 + } 33 + } 34 + } 35 + }, 36 + "host": { 37 + "type": "object", 38 + "required": ["hostname"], 39 + "properties": { 40 + "hostname": { 41 + "type": "string", 42 + "description": "hostname of server; not a URL (no scheme)" 43 + }, 44 + "seq": { 45 + "type": "integer", 46 + "description": "Recent repo stream event sequence number. May be delayed from actual stream processing (eg, persisted cursor not in-memory cursor)." 47 + }, 48 + "accountCount": { "type": "integer" }, 49 + "status": { 50 + "type": "ref", 51 + "ref": "com.atproto.sync.defs#hostStatus" 52 + } 53 + } 54 + } 55 + } 56 + }
+62
resources/lexicons/com/atproto/sync/listRepos.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.sync.listRepos", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "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.", 8 + "parameters": { 9 + "type": "params", 10 + "properties": { 11 + "limit": { 12 + "type": "integer", 13 + "minimum": 1, 14 + "maximum": 1000, 15 + "default": 500 16 + }, 17 + "cursor": { "type": "string" } 18 + } 19 + }, 20 + "output": { 21 + "encoding": "application/json", 22 + "schema": { 23 + "type": "object", 24 + "required": ["repos"], 25 + "properties": { 26 + "cursor": { "type": "string" }, 27 + "repos": { 28 + "type": "array", 29 + "items": { "type": "ref", "ref": "#repo" } 30 + } 31 + } 32 + } 33 + } 34 + }, 35 + "repo": { 36 + "type": "object", 37 + "required": ["did", "head", "rev"], 38 + "properties": { 39 + "did": { "type": "string", "format": "did" }, 40 + "head": { 41 + "type": "string", 42 + "format": "cid", 43 + "description": "Current repo commit CID" 44 + }, 45 + "rev": { "type": "string", "format": "tid" }, 46 + "active": { "type": "boolean" }, 47 + "status": { 48 + "type": "string", 49 + "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.", 50 + "knownValues": [ 51 + "takendown", 52 + "suspended", 53 + "deleted", 54 + "deactivated", 55 + "desynchronized", 56 + "throttled" 57 + ] 58 + } 59 + } 60 + } 61 + } 62 + }
+46
resources/lexicons/com/atproto/sync/listReposByCollection.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.sync.listReposByCollection", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Enumerates all the DIDs which have records with the given collection NSID.", 8 + "parameters": { 9 + "type": "params", 10 + "required": ["collection"], 11 + "properties": { 12 + "collection": { "type": "string", "format": "nsid" }, 13 + "limit": { 14 + "type": "integer", 15 + "description": "Maximum size of response set. Recommend setting a large maximum (1000+) when enumerating large DID lists.", 16 + "minimum": 1, 17 + "maximum": 2000, 18 + "default": 500 19 + }, 20 + "cursor": { "type": "string" } 21 + } 22 + }, 23 + "output": { 24 + "encoding": "application/json", 25 + "schema": { 26 + "type": "object", 27 + "required": ["repos"], 28 + "properties": { 29 + "cursor": { "type": "string" }, 30 + "repos": { 31 + "type": "array", 32 + "items": { "type": "ref", "ref": "#repo" } 33 + } 34 + } 35 + } 36 + } 37 + }, 38 + "repo": { 39 + "type": "object", 40 + "required": ["did"], 41 + "properties": { 42 + "did": { "type": "string", "format": "did" } 43 + } 44 + } 45 + } 46 + }
+23
resources/lexicons/com/atproto/sync/notifyOfUpdate.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.sync.notifyOfUpdate", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "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. DEPRECATED: just use com.atproto.sync.requestCrawl", 8 + "input": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "required": ["hostname"], 13 + "properties": { 14 + "hostname": { 15 + "type": "string", 16 + "description": "Hostname of the current service (usually a PDS) that is notifying of update." 17 + } 18 + } 19 + } 20 + } 21 + } 22 + } 23 + }
+24
resources/lexicons/com/atproto/sync/requestCrawl.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.sync.requestCrawl", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Request a service to persistently crawl hosted repos. Expected use is new PDS instances declaring their existence to Relays. Does not require auth.", 8 + "input": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "required": ["hostname"], 13 + "properties": { 14 + "hostname": { 15 + "type": "string", 16 + "description": "Hostname of the current service (eg, PDS) that is requesting to be crawled." 17 + } 18 + } 19 + } 20 + }, 21 + "errors": [{ "name": "HostBanned" }] 22 + } 23 + } 24 + }
+215
resources/lexicons/com/atproto/sync/subscribeRepos.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.sync.subscribeRepos", 4 + "defs": { 5 + "main": { 6 + "type": "subscription", 7 + "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.", 8 + "parameters": { 9 + "type": "params", 10 + "properties": { 11 + "cursor": { 12 + "type": "integer", 13 + "description": "The last known event seq number to backfill from." 14 + } 15 + } 16 + }, 17 + "message": { 18 + "schema": { 19 + "type": "union", 20 + "refs": ["#commit", "#sync", "#identity", "#account", "#info"] 21 + } 22 + }, 23 + "errors": [ 24 + { "name": "FutureCursor" }, 25 + { 26 + "name": "ConsumerTooSlow", 27 + "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." 28 + } 29 + ] 30 + }, 31 + "commit": { 32 + "type": "object", 33 + "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.", 34 + "required": [ 35 + "seq", 36 + "rebase", 37 + "tooBig", 38 + "repo", 39 + "commit", 40 + "rev", 41 + "since", 42 + "blocks", 43 + "ops", 44 + "blobs", 45 + "time" 46 + ], 47 + "nullable": ["since"], 48 + "properties": { 49 + "seq": { 50 + "type": "integer", 51 + "description": "The stream sequence number of this message." 52 + }, 53 + "rebase": { "type": "boolean", "description": "DEPRECATED -- unused" }, 54 + "tooBig": { 55 + "type": "boolean", 56 + "description": "DEPRECATED -- replaced by #sync event and data limits. 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." 57 + }, 58 + "repo": { 59 + "type": "string", 60 + "format": "did", 61 + "description": "The repo this event comes from. Note that all other message types name this field 'did'." 62 + }, 63 + "commit": { 64 + "type": "cid-link", 65 + "description": "Repo commit object CID." 66 + }, 67 + "rev": { 68 + "type": "string", 69 + "format": "tid", 70 + "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." 71 + }, 72 + "since": { 73 + "type": "string", 74 + "format": "tid", 75 + "description": "The rev of the last emitted commit from this repo (if any)." 76 + }, 77 + "blocks": { 78 + "type": "bytes", 79 + "description": "CAR file containing relevant blocks, as a diff since the previous repo state. The commit must be included as a block, and the commit block CID must be the first entry in the CAR header 'roots' list.", 80 + "maxLength": 2000000 81 + }, 82 + "ops": { 83 + "type": "array", 84 + "items": { 85 + "type": "ref", 86 + "ref": "#repoOp", 87 + "description": "List of repo mutation operations in this commit (eg, records created, updated, or deleted)." 88 + }, 89 + "maxLength": 200 90 + }, 91 + "blobs": { 92 + "type": "array", 93 + "items": { 94 + "type": "cid-link", 95 + "description": "DEPRECATED -- will soon always be empty. List of new blobs (by CID) referenced by records in this commit." 96 + } 97 + }, 98 + "prevData": { 99 + "type": "cid-link", 100 + "description": "The root CID of the MST tree for the previous commit from this repo (indicated by the 'since' revision field in this message). Corresponds to the 'data' field in the repo commit object. NOTE: this field is effectively required for the 'inductive' version of firehose." 101 + }, 102 + "time": { 103 + "type": "string", 104 + "format": "datetime", 105 + "description": "Timestamp of when this message was originally broadcast." 106 + } 107 + } 108 + }, 109 + "sync": { 110 + "type": "object", 111 + "description": "Updates the repo to a new state, without necessarily including that state on the firehose. Used to recover from broken commit streams, data loss incidents, or in situations where upstream host does not know recent state of the repository.", 112 + "required": ["seq", "did", "blocks", "rev", "time"], 113 + "properties": { 114 + "seq": { 115 + "type": "integer", 116 + "description": "The stream sequence number of this message." 117 + }, 118 + "did": { 119 + "type": "string", 120 + "format": "did", 121 + "description": "The account this repo event corresponds to. Must match that in the commit object." 122 + }, 123 + "blocks": { 124 + "type": "bytes", 125 + "description": "CAR file containing the commit, as a block. The CAR header must include the commit block CID as the first 'root'.", 126 + "maxLength": 10000 127 + }, 128 + "rev": { 129 + "type": "string", 130 + "description": "The rev of the commit. This value must match that in the commit object." 131 + }, 132 + "time": { 133 + "type": "string", 134 + "format": "datetime", 135 + "description": "Timestamp of when this message was originally broadcast." 136 + } 137 + } 138 + }, 139 + "identity": { 140 + "type": "object", 141 + "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.", 142 + "required": ["seq", "did", "time"], 143 + "properties": { 144 + "seq": { "type": "integer" }, 145 + "did": { "type": "string", "format": "did" }, 146 + "time": { "type": "string", "format": "datetime" }, 147 + "handle": { 148 + "type": "string", 149 + "format": "handle", 150 + "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." 151 + } 152 + } 153 + }, 154 + "account": { 155 + "type": "object", 156 + "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.", 157 + "required": ["seq", "did", "time", "active"], 158 + "properties": { 159 + "seq": { "type": "integer" }, 160 + "did": { "type": "string", "format": "did" }, 161 + "time": { "type": "string", "format": "datetime" }, 162 + "active": { 163 + "type": "boolean", 164 + "description": "Indicates that the account has a repository which can be fetched from the host that emitted this event." 165 + }, 166 + "status": { 167 + "type": "string", 168 + "description": "If active=false, this optional field indicates a reason for why the account is not active.", 169 + "knownValues": [ 170 + "takendown", 171 + "suspended", 172 + "deleted", 173 + "deactivated", 174 + "desynchronized", 175 + "throttled" 176 + ] 177 + } 178 + } 179 + }, 180 + "info": { 181 + "type": "object", 182 + "required": ["name"], 183 + "properties": { 184 + "name": { 185 + "type": "string", 186 + "knownValues": ["OutdatedCursor"] 187 + }, 188 + "message": { 189 + "type": "string" 190 + } 191 + } 192 + }, 193 + "repoOp": { 194 + "type": "object", 195 + "description": "A repo operation, ie a mutation of a single record.", 196 + "required": ["action", "path", "cid"], 197 + "nullable": ["cid"], 198 + "properties": { 199 + "action": { 200 + "type": "string", 201 + "knownValues": ["create", "update", "delete"] 202 + }, 203 + "path": { "type": "string" }, 204 + "cid": { 205 + "type": "cid-link", 206 + "description": "For creates and updates, the new record CID. For deletions, null." 207 + }, 208 + "prev": { 209 + "type": "cid-link", 210 + "description": "For updates and deletes, the previous record CID (required for inductive firehose). For creations, field should not be defined." 211 + } 212 + } 213 + } 214 + } 215 + }
+43
resources/lexicons/tools/ozone/communication/defs.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "tools.ozone.communication.defs", 4 + "defs": { 5 + "templateView": { 6 + "type": "object", 7 + "required": [ 8 + "id", 9 + "name", 10 + "contentMarkdown", 11 + "disabled", 12 + "lastUpdatedBy", 13 + "createdAt", 14 + "updatedAt" 15 + ], 16 + "properties": { 17 + "id": { "type": "string" }, 18 + "name": { "type": "string", "description": "Name of the template." }, 19 + "subject": { 20 + "type": "string", 21 + "description": "Content of the template, can contain markdown and variable placeholders." 22 + }, 23 + "contentMarkdown": { 24 + "type": "string", 25 + "description": "Subject of the message, used in emails." 26 + }, 27 + "disabled": { "type": "boolean" }, 28 + "lang": { 29 + "type": "string", 30 + "format": "language", 31 + "description": "Message language." 32 + }, 33 + "lastUpdatedBy": { 34 + "type": "string", 35 + "format": "did", 36 + "description": "DID of the user who last updated the template." 37 + }, 38 + "createdAt": { "type": "string", "format": "datetime" }, 39 + "updatedAt": { "type": "string", "format": "datetime" } 40 + } 41 + } 42 + } 43 + }
+1190
resources/lexicons/tools/ozone/moderation/defs.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "tools.ozone.moderation.defs", 4 + "defs": { 5 + "modEventView": { 6 + "type": "object", 7 + "required": [ 8 + "id", 9 + "event", 10 + "subject", 11 + "subjectBlobCids", 12 + "createdBy", 13 + "createdAt" 14 + ], 15 + "properties": { 16 + "id": { "type": "integer" }, 17 + "event": { 18 + "type": "union", 19 + "refs": [ 20 + "#modEventTakedown", 21 + "#modEventReverseTakedown", 22 + "#modEventComment", 23 + "#modEventReport", 24 + "#modEventLabel", 25 + "#modEventAcknowledge", 26 + "#modEventEscalate", 27 + "#modEventMute", 28 + "#modEventUnmute", 29 + "#modEventMuteReporter", 30 + "#modEventUnmuteReporter", 31 + "#modEventEmail", 32 + "#modEventResolveAppeal", 33 + "#modEventDivert", 34 + "#modEventTag", 35 + "#accountEvent", 36 + "#identityEvent", 37 + "#recordEvent", 38 + "#modEventPriorityScore", 39 + "#ageAssuranceEvent", 40 + "#ageAssuranceOverrideEvent", 41 + "#revokeAccountCredentialsEvent", 42 + "#scheduleTakedownEvent", 43 + "#cancelScheduledTakedownEvent" 44 + ] 45 + }, 46 + "subject": { 47 + "type": "union", 48 + "refs": [ 49 + "com.atproto.admin.defs#repoRef", 50 + "com.atproto.repo.strongRef", 51 + "chat.bsky.convo.defs#messageRef" 52 + ] 53 + }, 54 + "subjectBlobCids": { "type": "array", "items": { "type": "string" } }, 55 + "createdBy": { "type": "string", "format": "did" }, 56 + "createdAt": { "type": "string", "format": "datetime" }, 57 + "creatorHandle": { "type": "string" }, 58 + "subjectHandle": { "type": "string" }, 59 + "modTool": { "type": "ref", "ref": "#modTool" } 60 + } 61 + }, 62 + "modEventViewDetail": { 63 + "type": "object", 64 + "required": [ 65 + "id", 66 + "event", 67 + "subject", 68 + "subjectBlobs", 69 + "createdBy", 70 + "createdAt" 71 + ], 72 + "properties": { 73 + "id": { "type": "integer" }, 74 + "event": { 75 + "type": "union", 76 + "refs": [ 77 + "#modEventTakedown", 78 + "#modEventReverseTakedown", 79 + "#modEventComment", 80 + "#modEventReport", 81 + "#modEventLabel", 82 + "#modEventAcknowledge", 83 + "#modEventEscalate", 84 + "#modEventMute", 85 + "#modEventUnmute", 86 + "#modEventMuteReporter", 87 + "#modEventUnmuteReporter", 88 + "#modEventEmail", 89 + "#modEventResolveAppeal", 90 + "#modEventDivert", 91 + "#modEventTag", 92 + "#accountEvent", 93 + "#identityEvent", 94 + "#recordEvent", 95 + "#modEventPriorityScore", 96 + "#ageAssuranceEvent", 97 + "#ageAssuranceOverrideEvent", 98 + "#revokeAccountCredentialsEvent", 99 + "#scheduleTakedownEvent", 100 + "#cancelScheduledTakedownEvent" 101 + ] 102 + }, 103 + "subject": { 104 + "type": "union", 105 + "refs": [ 106 + "#repoView", 107 + "#repoViewNotFound", 108 + "#recordView", 109 + "#recordViewNotFound" 110 + ] 111 + }, 112 + "subjectBlobs": { 113 + "type": "array", 114 + "items": { "type": "ref", "ref": "#blobView" } 115 + }, 116 + "createdBy": { "type": "string", "format": "did" }, 117 + "createdAt": { "type": "string", "format": "datetime" }, 118 + "modTool": { "type": "ref", "ref": "#modTool" } 119 + } 120 + }, 121 + "subjectStatusView": { 122 + "type": "object", 123 + "required": ["id", "subject", "createdAt", "updatedAt", "reviewState"], 124 + "properties": { 125 + "id": { "type": "integer" }, 126 + "subject": { 127 + "type": "union", 128 + "refs": [ 129 + "com.atproto.admin.defs#repoRef", 130 + "com.atproto.repo.strongRef", 131 + "chat.bsky.convo.defs#messageRef" 132 + ] 133 + }, 134 + "hosting": { 135 + "type": "union", 136 + "refs": ["#accountHosting", "#recordHosting"] 137 + }, 138 + "subjectBlobCids": { 139 + "type": "array", 140 + "items": { "type": "string", "format": "cid" } 141 + }, 142 + "subjectRepoHandle": { "type": "string" }, 143 + "updatedAt": { 144 + "type": "string", 145 + "format": "datetime", 146 + "description": "Timestamp referencing when the last update was made to the moderation status of the subject" 147 + }, 148 + "createdAt": { 149 + "type": "string", 150 + "format": "datetime", 151 + "description": "Timestamp referencing the first moderation status impacting event was emitted on the subject" 152 + }, 153 + "reviewState": { 154 + "type": "ref", 155 + "ref": "#subjectReviewState" 156 + }, 157 + "comment": { 158 + "type": "string", 159 + "description": "Sticky comment on the subject." 160 + }, 161 + "priorityScore": { 162 + "type": "integer", 163 + "description": "Numeric value representing the level of priority. Higher score means higher priority.", 164 + "minimum": 0, 165 + "maximum": 100 166 + }, 167 + "muteUntil": { 168 + "type": "string", 169 + "format": "datetime" 170 + }, 171 + "muteReportingUntil": { 172 + "type": "string", 173 + "format": "datetime" 174 + }, 175 + "lastReviewedBy": { 176 + "type": "string", 177 + "format": "did" 178 + }, 179 + "lastReviewedAt": { 180 + "type": "string", 181 + "format": "datetime" 182 + }, 183 + "lastReportedAt": { 184 + "type": "string", 185 + "format": "datetime" 186 + }, 187 + "lastAppealedAt": { 188 + "type": "string", 189 + "format": "datetime", 190 + "description": "Timestamp referencing when the author of the subject appealed a moderation action" 191 + }, 192 + "takendown": { 193 + "type": "boolean" 194 + }, 195 + "appealed": { 196 + "type": "boolean", 197 + "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." 198 + }, 199 + "suspendUntil": { 200 + "type": "string", 201 + "format": "datetime" 202 + }, 203 + "tags": { 204 + "type": "array", 205 + "items": { "type": "string" } 206 + }, 207 + "accountStats": { 208 + "description": "Statistics related to the account subject", 209 + "type": "ref", 210 + "ref": "#accountStats" 211 + }, 212 + "recordsStats": { 213 + "description": "Statistics related to the record subjects authored by the subject's account", 214 + "type": "ref", 215 + "ref": "#recordsStats" 216 + }, 217 + "accountStrike": { 218 + "description": "Strike information for the account (account-level only)", 219 + "type": "ref", 220 + "ref": "#accountStrike" 221 + }, 222 + "ageAssuranceState": { 223 + "type": "string", 224 + "description": "Current age assurance state of the subject.", 225 + "knownValues": ["pending", "assured", "unknown", "reset", "blocked"] 226 + }, 227 + "ageAssuranceUpdatedBy": { 228 + "type": "string", 229 + "description": "Whether or not the last successful update to age assurance was made by the user or admin.", 230 + "knownValues": ["admin", "user"] 231 + } 232 + } 233 + }, 234 + "subjectView": { 235 + "description": "Detailed view of a subject. For record subjects, the author's repo and profile will be returned.", 236 + "type": "object", 237 + "required": ["type", "subject"], 238 + "properties": { 239 + "type": { 240 + "type": "ref", 241 + "ref": "com.atproto.moderation.defs#subjectType" 242 + }, 243 + "subject": { 244 + "type": "string" 245 + }, 246 + "status": { 247 + "type": "ref", 248 + "ref": "#subjectStatusView" 249 + }, 250 + "repo": { 251 + "type": "ref", 252 + "ref": "#repoViewDetail" 253 + }, 254 + "profile": { 255 + "type": "union", 256 + "refs": [] 257 + }, 258 + "record": { 259 + "type": "ref", 260 + "ref": "#recordViewDetail" 261 + } 262 + } 263 + }, 264 + "accountStats": { 265 + "description": "Statistics about a particular account subject", 266 + "type": "object", 267 + "properties": { 268 + "reportCount": { 269 + "description": "Total number of reports on the account", 270 + "type": "integer" 271 + }, 272 + "appealCount": { 273 + "description": "Total number of appeals against a moderation action on the account", 274 + "type": "integer" 275 + }, 276 + "suspendCount": { 277 + "description": "Number of times the account was suspended", 278 + "type": "integer" 279 + }, 280 + "escalateCount": { 281 + "description": "Number of times the account was escalated", 282 + "type": "integer" 283 + }, 284 + "takedownCount": { 285 + "description": "Number of times the account was taken down", 286 + "type": "integer" 287 + } 288 + } 289 + }, 290 + "recordsStats": { 291 + "description": "Statistics about a set of record subject items", 292 + "type": "object", 293 + "properties": { 294 + "totalReports": { 295 + "description": "Cumulative sum of the number of reports on the items in the set", 296 + "type": "integer" 297 + }, 298 + "reportedCount": { 299 + "description": "Number of items that were reported at least once", 300 + "type": "integer" 301 + }, 302 + "escalatedCount": { 303 + "description": "Number of items that were escalated at least once", 304 + "type": "integer" 305 + }, 306 + "appealedCount": { 307 + "description": "Number of items that were appealed at least once", 308 + "type": "integer" 309 + }, 310 + "subjectCount": { 311 + "description": "Total number of item in the set", 312 + "type": "integer" 313 + }, 314 + "pendingCount": { 315 + "description": "Number of item currently in \"reviewOpen\" or \"reviewEscalated\" state", 316 + "type": "integer" 317 + }, 318 + "processedCount": { 319 + "description": "Number of item currently in \"reviewNone\" or \"reviewClosed\" state", 320 + "type": "integer" 321 + }, 322 + "takendownCount": { 323 + "description": "Number of item currently taken down", 324 + "type": "integer" 325 + } 326 + } 327 + }, 328 + "accountStrike": { 329 + "description": "Strike information for an account", 330 + "type": "object", 331 + "properties": { 332 + "activeStrikeCount": { 333 + "description": "Current number of active strikes (excluding expired strikes)", 334 + "type": "integer" 335 + }, 336 + "totalStrikeCount": { 337 + "description": "Total number of strikes ever received (including expired strikes)", 338 + "type": "integer" 339 + }, 340 + "firstStrikeAt": { 341 + "description": "Timestamp of the first strike received", 342 + "type": "string", 343 + "format": "datetime" 344 + }, 345 + "lastStrikeAt": { 346 + "description": "Timestamp of the most recent strike received", 347 + "type": "string", 348 + "format": "datetime" 349 + } 350 + } 351 + }, 352 + "subjectReviewState": { 353 + "type": "string", 354 + "knownValues": [ 355 + "#reviewOpen", 356 + "#reviewEscalated", 357 + "#reviewClosed", 358 + "#reviewNone" 359 + ] 360 + }, 361 + "reviewOpen": { 362 + "type": "token", 363 + "description": "Moderator review status of a subject: Open. Indicates that the subject needs to be reviewed by a moderator" 364 + }, 365 + "reviewEscalated": { 366 + "type": "token", 367 + "description": "Moderator review status of a subject: Escalated. Indicates that the subject was escalated for review by a moderator" 368 + }, 369 + "reviewClosed": { 370 + "type": "token", 371 + "description": "Moderator review status of a subject: Closed. Indicates that the subject was already reviewed and resolved by a moderator" 372 + }, 373 + "reviewNone": { 374 + "type": "token", 375 + "description": "Moderator review status of a subject: Unnecessary. Indicates that the subject does not need a review at the moment but there is probably some moderation related metadata available for it" 376 + }, 377 + "modEventTakedown": { 378 + "type": "object", 379 + "description": "Take down a subject permanently or temporarily", 380 + "properties": { 381 + "comment": { 382 + "type": "string" 383 + }, 384 + "durationInHours": { 385 + "type": "integer", 386 + "description": "Indicates how long the takedown should be in effect before automatically expiring." 387 + }, 388 + "acknowledgeAccountSubjects": { 389 + "type": "boolean", 390 + "description": "If true, all other reports on content authored by this account will be resolved (acknowledged)." 391 + }, 392 + "policies": { 393 + "type": "array", 394 + "maxLength": 5, 395 + "items": { "type": "string" }, 396 + "description": "Names/Keywords of the policies that drove the decision." 397 + }, 398 + "severityLevel": { 399 + "type": "string", 400 + "description": "Severity level of the violation (e.g., 'sev-0', 'sev-1', 'sev-2', etc.)." 401 + }, 402 + "targetServices": { 403 + "type": "array", 404 + "items": { "type": "string", "knownValues": ["appview", "pds"] }, 405 + "description": "List of services where the takedown should be applied. If empty or not provided, takedown is applied on all configured services." 406 + }, 407 + "strikeCount": { 408 + "type": "integer", 409 + "description": "Number of strikes to assign to the user for this violation." 410 + }, 411 + "strikeExpiresAt": { 412 + "type": "string", 413 + "format": "datetime", 414 + "description": "When the strike should expire. If not provided, the strike never expires." 415 + } 416 + } 417 + }, 418 + "modEventReverseTakedown": { 419 + "type": "object", 420 + "description": "Revert take down action on a subject", 421 + "properties": { 422 + "comment": { 423 + "type": "string", 424 + "description": "Describe reasoning behind the reversal." 425 + }, 426 + "policies": { 427 + "type": "array", 428 + "maxLength": 5, 429 + "items": { "type": "string" }, 430 + "description": "Names/Keywords of the policy infraction for which takedown is being reversed." 431 + }, 432 + "severityLevel": { 433 + "type": "string", 434 + "description": "Severity level of the violation. Usually set from the last policy infraction's severity." 435 + }, 436 + "strikeCount": { 437 + "type": "integer", 438 + "description": "Number of strikes to subtract from the user's strike count. Usually set from the last policy infraction's severity." 439 + } 440 + } 441 + }, 442 + "modEventResolveAppeal": { 443 + "type": "object", 444 + "description": "Resolve appeal on a subject", 445 + "properties": { 446 + "comment": { 447 + "type": "string", 448 + "description": "Describe resolution." 449 + } 450 + } 451 + }, 452 + "modEventComment": { 453 + "type": "object", 454 + "description": "Add a comment to a subject. An empty comment will clear any previously set sticky comment.", 455 + "properties": { 456 + "comment": { 457 + "type": "string" 458 + }, 459 + "sticky": { 460 + "type": "boolean", 461 + "description": "Make the comment persistent on the subject" 462 + } 463 + } 464 + }, 465 + "modEventReport": { 466 + "type": "object", 467 + "description": "Report a subject", 468 + "required": ["reportType"], 469 + "properties": { 470 + "comment": { 471 + "type": "string" 472 + }, 473 + "isReporterMuted": { 474 + "type": "boolean", 475 + "description": "Set to true if the reporter was muted from reporting at the time of the event. These reports won't impact the reviewState of the subject." 476 + }, 477 + "reportType": { 478 + "type": "ref", 479 + "ref": "com.atproto.moderation.defs#reasonType" 480 + } 481 + } 482 + }, 483 + "modEventLabel": { 484 + "type": "object", 485 + "description": "Apply/Negate labels on a subject", 486 + "required": ["createLabelVals", "negateLabelVals"], 487 + "properties": { 488 + "comment": { 489 + "type": "string" 490 + }, 491 + "createLabelVals": { 492 + "type": "array", 493 + "items": { "type": "string" } 494 + }, 495 + "negateLabelVals": { 496 + "type": "array", 497 + "items": { "type": "string" } 498 + }, 499 + "durationInHours": { 500 + "type": "integer", 501 + "description": "Indicates how long the label will remain on the subject. Only applies on labels that are being added." 502 + } 503 + } 504 + }, 505 + "modEventPriorityScore": { 506 + "type": "object", 507 + "description": "Set priority score of the subject. Higher score means higher priority.", 508 + "required": ["score"], 509 + "properties": { 510 + "comment": { 511 + "type": "string" 512 + }, 513 + "score": { 514 + "type": "integer", 515 + "minimum": 0, 516 + "maximum": 100 517 + } 518 + } 519 + }, 520 + "ageAssuranceEvent": { 521 + "type": "object", 522 + "description": "Age assurance info coming directly from users. Only works on DID subjects.", 523 + "required": ["createdAt", "status", "attemptId"], 524 + "properties": { 525 + "createdAt": { 526 + "type": "string", 527 + "format": "datetime", 528 + "description": "The date and time of this write operation." 529 + }, 530 + "status": { 531 + "type": "string", 532 + "description": "The status of the age assurance process.", 533 + "knownValues": ["unknown", "pending", "assured"] 534 + }, 535 + "attemptId": { 536 + "type": "string", 537 + "description": "The unique identifier for this instance of the age assurance flow, in UUID format." 538 + }, 539 + "initIp": { 540 + "type": "string", 541 + "description": "The IP address used when initiating the AA flow." 542 + }, 543 + "initUa": { 544 + "type": "string", 545 + "description": "The user agent used when initiating the AA flow." 546 + }, 547 + "completeIp": { 548 + "type": "string", 549 + "description": "The IP address used when completing the AA flow." 550 + }, 551 + "completeUa": { 552 + "type": "string", 553 + "description": "The user agent used when completing the AA flow." 554 + } 555 + } 556 + }, 557 + "ageAssuranceOverrideEvent": { 558 + "type": "object", 559 + "description": "Age assurance status override by moderators. Only works on DID subjects.", 560 + "required": ["comment", "status"], 561 + "properties": { 562 + "status": { 563 + "type": "string", 564 + "description": "The status to be set for the user decided by a moderator, overriding whatever value the user had previously. Use reset to default to original state.", 565 + "knownValues": ["assured", "reset", "blocked"] 566 + }, 567 + "comment": { 568 + "type": "string", 569 + "description": "Comment describing the reason for the override." 570 + } 571 + } 572 + }, 573 + "revokeAccountCredentialsEvent": { 574 + "type": "object", 575 + "description": "Account credentials revocation by moderators. Only works on DID subjects.", 576 + "required": ["comment"], 577 + "properties": { 578 + "comment": { 579 + "type": "string", 580 + "description": "Comment describing the reason for the revocation." 581 + } 582 + } 583 + }, 584 + "modEventAcknowledge": { 585 + "type": "object", 586 + "properties": { 587 + "comment": { "type": "string" }, 588 + "acknowledgeAccountSubjects": { 589 + "type": "boolean", 590 + "description": "If true, all other reports on content authored by this account will be resolved (acknowledged)." 591 + } 592 + } 593 + }, 594 + "modEventEscalate": { 595 + "type": "object", 596 + "properties": { 597 + "comment": { "type": "string" } 598 + } 599 + }, 600 + "modEventMute": { 601 + "type": "object", 602 + "description": "Mute incoming reports on a subject", 603 + "required": ["durationInHours"], 604 + "properties": { 605 + "comment": { "type": "string" }, 606 + "durationInHours": { 607 + "type": "integer", 608 + "description": "Indicates how long the subject should remain muted." 609 + } 610 + } 611 + }, 612 + "modEventUnmute": { 613 + "type": "object", 614 + "description": "Unmute action on a subject", 615 + "properties": { 616 + "comment": { 617 + "type": "string", 618 + "description": "Describe reasoning behind the reversal." 619 + } 620 + } 621 + }, 622 + "modEventMuteReporter": { 623 + "type": "object", 624 + "description": "Mute incoming reports from an account", 625 + "properties": { 626 + "comment": { "type": "string" }, 627 + "durationInHours": { 628 + "type": "integer", 629 + "description": "Indicates how long the account should remain muted. Falsy value here means a permanent mute." 630 + } 631 + } 632 + }, 633 + "modEventUnmuteReporter": { 634 + "type": "object", 635 + "description": "Unmute incoming reports from an account", 636 + "properties": { 637 + "comment": { 638 + "type": "string", 639 + "description": "Describe reasoning behind the reversal." 640 + } 641 + } 642 + }, 643 + "modEventEmail": { 644 + "type": "object", 645 + "description": "Keep a log of outgoing email to a user", 646 + "required": ["subjectLine"], 647 + "properties": { 648 + "subjectLine": { 649 + "type": "string", 650 + "description": "The subject line of the email sent to the user." 651 + }, 652 + "content": { 653 + "type": "string", 654 + "description": "The content of the email sent to the user." 655 + }, 656 + "comment": { 657 + "type": "string", 658 + "description": "Additional comment about the outgoing comm." 659 + }, 660 + "policies": { 661 + "type": "array", 662 + "maxLength": 5, 663 + "items": { "type": "string" }, 664 + "description": "Names/Keywords of the policies that necessitated the email." 665 + }, 666 + "severityLevel": { 667 + "type": "string", 668 + "description": "Severity level of the violation. Normally 'sev-1' that adds strike on repeat offense" 669 + }, 670 + "strikeCount": { 671 + "type": "integer", 672 + "description": "Number of strikes to assign to the user for this violation. Normally 0 as an indicator of a warning and only added as a strike on a repeat offense." 673 + }, 674 + "strikeExpiresAt": { 675 + "type": "string", 676 + "format": "datetime", 677 + "description": "When the strike should expire. If not provided, the strike never expires." 678 + }, 679 + "isDelivered": { 680 + "type": "boolean", 681 + "description": "Indicates whether the email was successfully delivered to the user's inbox." 682 + } 683 + } 684 + }, 685 + "modEventDivert": { 686 + "type": "object", 687 + "description": "Divert a record's blobs to a 3rd party service for further scanning/tagging", 688 + "properties": { 689 + "comment": { "type": "string" } 690 + } 691 + }, 692 + "modEventTag": { 693 + "type": "object", 694 + "description": "Add/Remove a tag on a subject", 695 + "required": ["add", "remove"], 696 + "properties": { 697 + "add": { 698 + "type": "array", 699 + "items": { "type": "string" }, 700 + "description": "Tags to be added to the subject. If already exists, won't be duplicated." 701 + }, 702 + "remove": { 703 + "type": "array", 704 + "items": { "type": "string" }, 705 + "description": "Tags to be removed to the subject. Ignores a tag If it doesn't exist, won't be duplicated." 706 + }, 707 + "comment": { 708 + "type": "string", 709 + "description": "Additional comment about added/removed tags." 710 + } 711 + } 712 + }, 713 + "accountEvent": { 714 + "type": "object", 715 + "description": "Logs account status related events on a repo subject. Normally captured by automod from the firehose and emitted to ozone for historical tracking.", 716 + "required": ["timestamp", "active"], 717 + "properties": { 718 + "comment": { "type": "string" }, 719 + "active": { 720 + "type": "boolean", 721 + "description": "Indicates that the account has a repository which can be fetched from the host that emitted this event." 722 + }, 723 + "status": { 724 + "type": "string", 725 + "knownValues": [ 726 + "unknown", 727 + "deactivated", 728 + "deleted", 729 + "takendown", 730 + "suspended", 731 + "tombstoned" 732 + ] 733 + }, 734 + "timestamp": { 735 + "type": "string", 736 + "format": "datetime" 737 + } 738 + } 739 + }, 740 + "identityEvent": { 741 + "type": "object", 742 + "description": "Logs identity related events on a repo subject. Normally captured by automod from the firehose and emitted to ozone for historical tracking.", 743 + "required": ["timestamp"], 744 + "properties": { 745 + "comment": { "type": "string" }, 746 + "handle": { "type": "string", "format": "handle" }, 747 + "pdsHost": { "type": "string", "format": "uri" }, 748 + "tombstone": { "type": "boolean" }, 749 + "timestamp": { 750 + "type": "string", 751 + "format": "datetime" 752 + } 753 + } 754 + }, 755 + "recordEvent": { 756 + "type": "object", 757 + "description": "Logs lifecycle event on a record subject. Normally captured by automod from the firehose and emitted to ozone for historical tracking.", 758 + "required": ["timestamp", "op"], 759 + "properties": { 760 + "comment": { "type": "string" }, 761 + "op": { 762 + "type": "string", 763 + "knownValues": ["create", "update", "delete"] 764 + }, 765 + "cid": { "type": "string", "format": "cid" }, 766 + "timestamp": { "type": "string", "format": "datetime" } 767 + } 768 + }, 769 + "scheduleTakedownEvent": { 770 + "type": "object", 771 + "description": "Logs a scheduled takedown action for an account.", 772 + "properties": { 773 + "comment": { "type": "string" }, 774 + "executeAt": { "type": "string", "format": "datetime" }, 775 + "executeAfter": { "type": "string", "format": "datetime" }, 776 + "executeUntil": { "type": "string", "format": "datetime" } 777 + } 778 + }, 779 + "cancelScheduledTakedownEvent": { 780 + "type": "object", 781 + "description": "Logs cancellation of a scheduled takedown action for an account.", 782 + "properties": { 783 + "comment": { "type": "string" } 784 + } 785 + }, 786 + "repoView": { 787 + "type": "object", 788 + "required": [ 789 + "did", 790 + "handle", 791 + "relatedRecords", 792 + "indexedAt", 793 + "moderation" 794 + ], 795 + "properties": { 796 + "did": { "type": "string", "format": "did" }, 797 + "handle": { "type": "string", "format": "handle" }, 798 + "email": { "type": "string" }, 799 + "relatedRecords": { "type": "array", "items": { "type": "unknown" } }, 800 + "indexedAt": { "type": "string", "format": "datetime" }, 801 + "moderation": { "type": "ref", "ref": "#moderation" }, 802 + "invitedBy": { 803 + "type": "ref", 804 + "ref": "com.atproto.server.defs#inviteCode" 805 + }, 806 + "invitesDisabled": { "type": "boolean" }, 807 + "inviteNote": { "type": "string" }, 808 + "deactivatedAt": { "type": "string", "format": "datetime" }, 809 + "threatSignatures": { 810 + "type": "array", 811 + "items": { 812 + "type": "ref", 813 + "ref": "com.atproto.admin.defs#threatSignature" 814 + } 815 + } 816 + } 817 + }, 818 + "repoViewDetail": { 819 + "type": "object", 820 + "required": [ 821 + "did", 822 + "handle", 823 + "relatedRecords", 824 + "indexedAt", 825 + "moderation" 826 + ], 827 + "properties": { 828 + "did": { "type": "string", "format": "did" }, 829 + "handle": { "type": "string", "format": "handle" }, 830 + "email": { "type": "string" }, 831 + "relatedRecords": { "type": "array", "items": { "type": "unknown" } }, 832 + "indexedAt": { "type": "string", "format": "datetime" }, 833 + "moderation": { "type": "ref", "ref": "#moderationDetail" }, 834 + "labels": { 835 + "type": "array", 836 + "items": { "type": "ref", "ref": "com.atproto.label.defs#label" } 837 + }, 838 + "invitedBy": { 839 + "type": "ref", 840 + "ref": "com.atproto.server.defs#inviteCode" 841 + }, 842 + "invites": { 843 + "type": "array", 844 + "items": { 845 + "type": "ref", 846 + "ref": "com.atproto.server.defs#inviteCode" 847 + } 848 + }, 849 + "invitesDisabled": { "type": "boolean" }, 850 + "inviteNote": { "type": "string" }, 851 + "emailConfirmedAt": { "type": "string", "format": "datetime" }, 852 + "deactivatedAt": { "type": "string", "format": "datetime" }, 853 + "threatSignatures": { 854 + "type": "array", 855 + "items": { 856 + "type": "ref", 857 + "ref": "com.atproto.admin.defs#threatSignature" 858 + } 859 + } 860 + } 861 + }, 862 + "repoViewNotFound": { 863 + "type": "object", 864 + "required": ["did"], 865 + "properties": { 866 + "did": { "type": "string", "format": "did" } 867 + } 868 + }, 869 + "recordView": { 870 + "type": "object", 871 + "required": [ 872 + "uri", 873 + "cid", 874 + "value", 875 + "blobCids", 876 + "indexedAt", 877 + "moderation", 878 + "repo" 879 + ], 880 + "properties": { 881 + "uri": { "type": "string", "format": "at-uri" }, 882 + "cid": { "type": "string", "format": "cid" }, 883 + "value": { "type": "unknown" }, 884 + "blobCids": { 885 + "type": "array", 886 + "items": { "type": "string", "format": "cid" } 887 + }, 888 + "indexedAt": { "type": "string", "format": "datetime" }, 889 + "moderation": { "type": "ref", "ref": "#moderation" }, 890 + "repo": { "type": "ref", "ref": "#repoView" } 891 + } 892 + }, 893 + "recordViewDetail": { 894 + "type": "object", 895 + "required": [ 896 + "uri", 897 + "cid", 898 + "value", 899 + "blobs", 900 + "indexedAt", 901 + "moderation", 902 + "repo" 903 + ], 904 + "properties": { 905 + "uri": { "type": "string", "format": "at-uri" }, 906 + "cid": { "type": "string", "format": "cid" }, 907 + "value": { "type": "unknown" }, 908 + "blobs": { 909 + "type": "array", 910 + "items": { "type": "ref", "ref": "#blobView" } 911 + }, 912 + "labels": { 913 + "type": "array", 914 + "items": { "type": "ref", "ref": "com.atproto.label.defs#label" } 915 + }, 916 + "indexedAt": { "type": "string", "format": "datetime" }, 917 + "moderation": { "type": "ref", "ref": "#moderationDetail" }, 918 + "repo": { "type": "ref", "ref": "#repoView" } 919 + } 920 + }, 921 + "recordViewNotFound": { 922 + "type": "object", 923 + "required": ["uri"], 924 + "properties": { 925 + "uri": { "type": "string", "format": "at-uri" } 926 + } 927 + }, 928 + "moderation": { 929 + "type": "object", 930 + "properties": { 931 + "subjectStatus": { "type": "ref", "ref": "#subjectStatusView" } 932 + } 933 + }, 934 + "moderationDetail": { 935 + "type": "object", 936 + "properties": { 937 + "subjectStatus": { 938 + "type": "ref", 939 + "ref": "#subjectStatusView" 940 + } 941 + } 942 + }, 943 + "blobView": { 944 + "type": "object", 945 + "required": ["cid", "mimeType", "size", "createdAt"], 946 + "properties": { 947 + "cid": { "type": "string", "format": "cid" }, 948 + "mimeType": { "type": "string" }, 949 + "size": { "type": "integer" }, 950 + "createdAt": { "type": "string", "format": "datetime" }, 951 + "details": { 952 + "type": "union", 953 + "refs": ["#imageDetails", "#videoDetails"] 954 + }, 955 + "moderation": { "type": "ref", "ref": "#moderation" } 956 + } 957 + }, 958 + "imageDetails": { 959 + "type": "object", 960 + "required": ["width", "height"], 961 + "properties": { 962 + "width": { "type": "integer" }, 963 + "height": { "type": "integer" } 964 + } 965 + }, 966 + "videoDetails": { 967 + "type": "object", 968 + "required": ["width", "height", "length"], 969 + "properties": { 970 + "width": { "type": "integer" }, 971 + "height": { "type": "integer" }, 972 + "length": { "type": "integer" } 973 + } 974 + }, 975 + "accountHosting": { 976 + "type": "object", 977 + "required": ["status"], 978 + "properties": { 979 + "status": { 980 + "type": "string", 981 + "knownValues": [ 982 + "takendown", 983 + "suspended", 984 + "deleted", 985 + "deactivated", 986 + "unknown" 987 + ] 988 + }, 989 + "updatedAt": { 990 + "type": "string", 991 + "format": "datetime" 992 + }, 993 + "createdAt": { 994 + "type": "string", 995 + "format": "datetime" 996 + }, 997 + "deletedAt": { 998 + "type": "string", 999 + "format": "datetime" 1000 + }, 1001 + "deactivatedAt": { 1002 + "type": "string", 1003 + "format": "datetime" 1004 + }, 1005 + "reactivatedAt": { 1006 + "type": "string", 1007 + "format": "datetime" 1008 + } 1009 + } 1010 + }, 1011 + "recordHosting": { 1012 + "type": "object", 1013 + "required": ["status"], 1014 + "properties": { 1015 + "status": { 1016 + "type": "string", 1017 + "knownValues": ["deleted", "unknown"] 1018 + }, 1019 + "updatedAt": { 1020 + "type": "string", 1021 + "format": "datetime" 1022 + }, 1023 + "createdAt": { 1024 + "type": "string", 1025 + "format": "datetime" 1026 + }, 1027 + "deletedAt": { 1028 + "type": "string", 1029 + "format": "datetime" 1030 + } 1031 + } 1032 + }, 1033 + "reporterStats": { 1034 + "type": "object", 1035 + "required": [ 1036 + "did", 1037 + "accountReportCount", 1038 + "recordReportCount", 1039 + "reportedAccountCount", 1040 + "reportedRecordCount", 1041 + "takendownAccountCount", 1042 + "takendownRecordCount", 1043 + "labeledAccountCount", 1044 + "labeledRecordCount" 1045 + ], 1046 + "properties": { 1047 + "did": { 1048 + "type": "string", 1049 + "format": "did" 1050 + }, 1051 + "accountReportCount": { 1052 + "type": "integer", 1053 + "description": "The total number of reports made by the user on accounts." 1054 + }, 1055 + "recordReportCount": { 1056 + "type": "integer", 1057 + "description": "The total number of reports made by the user on records." 1058 + }, 1059 + "reportedAccountCount": { 1060 + "type": "integer", 1061 + "description": "The total number of accounts reported by the user." 1062 + }, 1063 + "reportedRecordCount": { 1064 + "type": "integer", 1065 + "description": "The total number of records reported by the user." 1066 + }, 1067 + "takendownAccountCount": { 1068 + "type": "integer", 1069 + "description": "The total number of accounts taken down as a result of the user's reports." 1070 + }, 1071 + "takendownRecordCount": { 1072 + "type": "integer", 1073 + "description": "The total number of records taken down as a result of the user's reports." 1074 + }, 1075 + "labeledAccountCount": { 1076 + "type": "integer", 1077 + "description": "The total number of accounts labeled as a result of the user's reports." 1078 + }, 1079 + "labeledRecordCount": { 1080 + "type": "integer", 1081 + "description": "The total number of records labeled as a result of the user's reports." 1082 + } 1083 + } 1084 + }, 1085 + "modTool": { 1086 + "type": "object", 1087 + "description": "Moderation tool information for tracing the source of the action", 1088 + "required": ["name"], 1089 + "properties": { 1090 + "name": { 1091 + "type": "string", 1092 + "description": "Name/identifier of the source (e.g., 'automod', 'ozone/workspace')" 1093 + }, 1094 + "meta": { 1095 + "type": "unknown", 1096 + "description": "Additional arbitrary metadata about the source" 1097 + } 1098 + } 1099 + }, 1100 + "timelineEventPlcCreate": { 1101 + "type": "token", 1102 + "description": "Moderation event timeline event for a PLC create operation" 1103 + }, 1104 + "timelineEventPlcOperation": { 1105 + "type": "token", 1106 + "description": "Moderation event timeline event for generic PLC operation" 1107 + }, 1108 + "timelineEventPlcTombstone": { 1109 + "type": "token", 1110 + "description": "Moderation event timeline event for a PLC tombstone operation" 1111 + }, 1112 + "scheduledActionView": { 1113 + "type": "object", 1114 + "description": "View of a scheduled moderation action", 1115 + "required": ["id", "action", "did", "createdBy", "createdAt", "status"], 1116 + "properties": { 1117 + "id": { 1118 + "type": "integer", 1119 + "description": "Auto-incrementing row ID" 1120 + }, 1121 + "action": { 1122 + "type": "string", 1123 + "knownValues": ["takedown"], 1124 + "description": "Type of action to be executed" 1125 + }, 1126 + "eventData": { 1127 + "type": "unknown", 1128 + "description": "Serialized event object that will be propagated to the event when performed" 1129 + }, 1130 + "did": { 1131 + "type": "string", 1132 + "format": "did", 1133 + "description": "Subject DID for the action" 1134 + }, 1135 + "executeAt": { 1136 + "type": "string", 1137 + "format": "datetime", 1138 + "description": "Exact time to execute the action" 1139 + }, 1140 + "executeAfter": { 1141 + "type": "string", 1142 + "format": "datetime", 1143 + "description": "Earliest time to execute the action (for randomized scheduling)" 1144 + }, 1145 + "executeUntil": { 1146 + "type": "string", 1147 + "format": "datetime", 1148 + "description": "Latest time to execute the action (for randomized scheduling)" 1149 + }, 1150 + "randomizeExecution": { 1151 + "type": "boolean", 1152 + "description": "Whether execution time should be randomized within the specified range" 1153 + }, 1154 + "createdBy": { 1155 + "type": "string", 1156 + "format": "did", 1157 + "description": "DID of the user who created this scheduled action" 1158 + }, 1159 + "createdAt": { 1160 + "type": "string", 1161 + "format": "datetime", 1162 + "description": "When the scheduled action was created" 1163 + }, 1164 + "updatedAt": { 1165 + "type": "string", 1166 + "format": "datetime", 1167 + "description": "When the scheduled action was last updated" 1168 + }, 1169 + "status": { 1170 + "type": "string", 1171 + "knownValues": ["pending", "executed", "cancelled", "failed"], 1172 + "description": "Current status of the scheduled action" 1173 + }, 1174 + "lastExecutedAt": { 1175 + "type": "string", 1176 + "format": "datetime", 1177 + "description": "When the action was last attempted to be executed" 1178 + }, 1179 + "lastFailureReason": { 1180 + "type": "string", 1181 + "description": "Reason for the last execution failure" 1182 + }, 1183 + "executionEventId": { 1184 + "type": "integer", 1185 + "description": "ID of the moderation event created when action was successfully executed" 1186 + } 1187 + } 1188 + } 1189 + } 1190 + }
+90
resources/lexicons/tools/ozone/moderation/emitEvent.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "tools.ozone.moderation.emitEvent", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Take a moderation action on an actor.", 8 + "input": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "required": ["event", "subject", "createdBy"], 13 + "properties": { 14 + "event": { 15 + "type": "union", 16 + "refs": [ 17 + "tools.ozone.moderation.defs#modEventTakedown", 18 + "tools.ozone.moderation.defs#modEventAcknowledge", 19 + "tools.ozone.moderation.defs#modEventEscalate", 20 + "tools.ozone.moderation.defs#modEventComment", 21 + "tools.ozone.moderation.defs#modEventLabel", 22 + "tools.ozone.moderation.defs#modEventReport", 23 + "tools.ozone.moderation.defs#modEventMute", 24 + "tools.ozone.moderation.defs#modEventUnmute", 25 + "tools.ozone.moderation.defs#modEventMuteReporter", 26 + "tools.ozone.moderation.defs#modEventUnmuteReporter", 27 + "tools.ozone.moderation.defs#modEventReverseTakedown", 28 + "tools.ozone.moderation.defs#modEventResolveAppeal", 29 + "tools.ozone.moderation.defs#modEventEmail", 30 + "tools.ozone.moderation.defs#modEventDivert", 31 + "tools.ozone.moderation.defs#modEventTag", 32 + "tools.ozone.moderation.defs#accountEvent", 33 + "tools.ozone.moderation.defs#identityEvent", 34 + "tools.ozone.moderation.defs#recordEvent", 35 + "tools.ozone.moderation.defs#modEventPriorityScore", 36 + "tools.ozone.moderation.defs#ageAssuranceEvent", 37 + "tools.ozone.moderation.defs#ageAssuranceOverrideEvent", 38 + "tools.ozone.moderation.defs#revokeAccountCredentialsEvent", 39 + "tools.ozone.moderation.defs#scheduleTakedownEvent", 40 + "tools.ozone.moderation.defs#cancelScheduledTakedownEvent" 41 + ] 42 + }, 43 + "subject": { 44 + "type": "union", 45 + "refs": [ 46 + "com.atproto.admin.defs#repoRef", 47 + "com.atproto.repo.strongRef" 48 + ] 49 + }, 50 + "subjectBlobCids": { 51 + "type": "array", 52 + "items": { 53 + "type": "string", 54 + "format": "cid" 55 + } 56 + }, 57 + "createdBy": { 58 + "type": "string", 59 + "format": "did" 60 + }, 61 + "modTool": { 62 + "type": "ref", 63 + "ref": "tools.ozone.moderation.defs#modTool" 64 + }, 65 + "externalId": { 66 + "type": "string", 67 + "description": "An optional external ID for the event, used to deduplicate events from external systems. Fails when an event of same type with the same external ID exists for the same subject." 68 + } 69 + } 70 + } 71 + }, 72 + "output": { 73 + "encoding": "application/json", 74 + "schema": { 75 + "type": "ref", 76 + "ref": "tools.ozone.moderation.defs#modEventView" 77 + } 78 + }, 79 + "errors": [ 80 + { 81 + "name": "SubjectHasAction" 82 + }, 83 + { 84 + "name": "DuplicateExternalId", 85 + "description": "An event with the same external ID already exists for the subject." 86 + } 87 + ] 88 + } 89 + } 90 + }
+24
resources/lexicons/tools/ozone/moderation/getEvent.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "tools.ozone.moderation.getEvent", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Get details about a moderation event.", 8 + "parameters": { 9 + "type": "params", 10 + "required": ["id"], 11 + "properties": { 12 + "id": { "type": "integer" } 13 + } 14 + }, 15 + "output": { 16 + "encoding": "application/json", 17 + "schema": { 18 + "type": "ref", 19 + "ref": "tools.ozone.moderation.defs#modEventViewDetail" 20 + } 21 + } 22 + } 23 + } 24 + }
+26
resources/lexicons/tools/ozone/moderation/getRecord.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "tools.ozone.moderation.getRecord", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Get details about a record.", 8 + "parameters": { 9 + "type": "params", 10 + "required": ["uri"], 11 + "properties": { 12 + "uri": { "type": "string", "format": "at-uri" }, 13 + "cid": { "type": "string", "format": "cid" } 14 + } 15 + }, 16 + "output": { 17 + "encoding": "application/json", 18 + "schema": { 19 + "type": "ref", 20 + "ref": "tools.ozone.moderation.defs#recordViewDetail" 21 + } 22 + }, 23 + "errors": [{ "name": "RecordNotFound" }] 24 + } 25 + } 26 + }
+162
resources/lexicons/tools/ozone/moderation/queryEvents.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "tools.ozone.moderation.queryEvents", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "List moderation events related to a subject.", 8 + "parameters": { 9 + "type": "params", 10 + "properties": { 11 + "types": { 12 + "type": "array", 13 + "items": { 14 + "type": "string" 15 + }, 16 + "description": "The types of events (fully qualified string in the format of tools.ozone.moderation.defs#modEvent<name>) to filter by. If not specified, all events are returned." 17 + }, 18 + "createdBy": { 19 + "type": "string", 20 + "format": "did" 21 + }, 22 + "sortDirection": { 23 + "type": "string", 24 + "default": "desc", 25 + "enum": ["asc", "desc"], 26 + "description": "Sort direction for the events. Defaults to descending order of created at timestamp." 27 + }, 28 + "createdAfter": { 29 + "type": "string", 30 + "format": "datetime", 31 + "description": "Retrieve events created after a given timestamp" 32 + }, 33 + "createdBefore": { 34 + "type": "string", 35 + "format": "datetime", 36 + "description": "Retrieve events created before a given timestamp" 37 + }, 38 + "subject": { 39 + "type": "string", 40 + "format": "uri" 41 + }, 42 + "collections": { 43 + "type": "array", 44 + "maxLength": 20, 45 + "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.", 46 + "items": { 47 + "type": "string", 48 + "format": "nsid" 49 + } 50 + }, 51 + "subjectType": { 52 + "type": "string", 53 + "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.", 54 + "knownValues": ["account", "record"] 55 + }, 56 + "includeAllUserRecords": { 57 + "type": "boolean", 58 + "default": false, 59 + "description": "If true, events on all record types (posts, lists, profile etc.) or records from given 'collections' param, owned by the did are returned." 60 + }, 61 + "limit": { 62 + "type": "integer", 63 + "minimum": 1, 64 + "maximum": 100, 65 + "default": 50 66 + }, 67 + "hasComment": { 68 + "type": "boolean", 69 + "description": "If true, only events with comments are returned" 70 + }, 71 + "comment": { 72 + "type": "string", 73 + "description": "If specified, only events with comments containing the keyword are returned. Apply || separator to use multiple keywords and match using OR condition." 74 + }, 75 + "addedLabels": { 76 + "type": "array", 77 + "items": { 78 + "type": "string" 79 + }, 80 + "description": "If specified, only events where all of these labels were added are returned" 81 + }, 82 + "removedLabels": { 83 + "type": "array", 84 + "items": { 85 + "type": "string" 86 + }, 87 + "description": "If specified, only events where all of these labels were removed are returned" 88 + }, 89 + "addedTags": { 90 + "type": "array", 91 + "items": { 92 + "type": "string" 93 + }, 94 + "description": "If specified, only events where all of these tags were added are returned" 95 + }, 96 + "removedTags": { 97 + "type": "array", 98 + "items": { 99 + "type": "string" 100 + }, 101 + "description": "If specified, only events where all of these tags were removed are returned" 102 + }, 103 + "reportTypes": { 104 + "type": "array", 105 + "items": { 106 + "type": "string" 107 + } 108 + }, 109 + "policies": { 110 + "type": "array", 111 + "items": { 112 + "type": "string", 113 + "description": "If specified, only events where the action policies match any of the given policies are returned" 114 + } 115 + }, 116 + "modTool": { 117 + "type": "array", 118 + "items": { 119 + "type": "string" 120 + }, 121 + "description": "If specified, only events where the modTool name matches any of the given values are returned" 122 + }, 123 + "batchId": { 124 + "type": "string", 125 + "description": "If specified, only events where the batchId matches the given value are returned" 126 + }, 127 + "ageAssuranceState": { 128 + "type": "string", 129 + "description": "If specified, only events where the age assurance state matches the given value are returned", 130 + "knownValues": ["pending", "assured", "unknown", "reset", "blocked"] 131 + }, 132 + "withStrike": { 133 + "type": "boolean", 134 + "description": "If specified, only events where strikeCount value is set are returned." 135 + }, 136 + "cursor": { 137 + "type": "string" 138 + } 139 + } 140 + }, 141 + "output": { 142 + "encoding": "application/json", 143 + "schema": { 144 + "type": "object", 145 + "required": ["events"], 146 + "properties": { 147 + "cursor": { 148 + "type": "string" 149 + }, 150 + "events": { 151 + "type": "array", 152 + "items": { 153 + "type": "ref", 154 + "ref": "tools.ozone.moderation.defs#modEventView" 155 + } 156 + } 157 + } 158 + } 159 + } 160 + } 161 + } 162 + }
+225
resources/lexicons/tools/ozone/moderation/queryStatuses.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "tools.ozone.moderation.queryStatuses", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "View moderation statuses of subjects (record or repo).", 8 + "parameters": { 9 + "type": "params", 10 + "properties": { 11 + "queueCount": { 12 + "type": "integer", 13 + "description": "Number of queues being used by moderators. Subjects will be split among all queues." 14 + }, 15 + "queueIndex": { 16 + "type": "integer", 17 + "description": "Index of the queue to fetch subjects from. Works only when queueCount value is specified." 18 + }, 19 + "queueSeed": { 20 + "type": "string", 21 + "description": "A seeder to shuffle/balance the queue items." 22 + }, 23 + "includeAllUserRecords": { 24 + "type": "boolean", 25 + "description": "All subjects, or subjects from given 'collections' param, belonging to the account specified in the 'subject' param will be returned." 26 + }, 27 + "subject": { 28 + "type": "string", 29 + "format": "uri", 30 + "description": "The subject to get the status for." 31 + }, 32 + "comment": { 33 + "type": "string", 34 + "description": "Search subjects by keyword from comments" 35 + }, 36 + "reportedAfter": { 37 + "type": "string", 38 + "format": "datetime", 39 + "description": "Search subjects reported after a given timestamp" 40 + }, 41 + "reportedBefore": { 42 + "type": "string", 43 + "format": "datetime", 44 + "description": "Search subjects reported before a given timestamp" 45 + }, 46 + "reviewedAfter": { 47 + "type": "string", 48 + "format": "datetime", 49 + "description": "Search subjects reviewed after a given timestamp" 50 + }, 51 + "hostingDeletedAfter": { 52 + "type": "string", 53 + "format": "datetime", 54 + "description": "Search subjects where the associated record/account was deleted after a given timestamp" 55 + }, 56 + "hostingDeletedBefore": { 57 + "type": "string", 58 + "format": "datetime", 59 + "description": "Search subjects where the associated record/account was deleted before a given timestamp" 60 + }, 61 + "hostingUpdatedAfter": { 62 + "type": "string", 63 + "format": "datetime", 64 + "description": "Search subjects where the associated record/account was updated after a given timestamp" 65 + }, 66 + "hostingUpdatedBefore": { 67 + "type": "string", 68 + "format": "datetime", 69 + "description": "Search subjects where the associated record/account was updated before a given timestamp" 70 + }, 71 + "hostingStatuses": { 72 + "type": "array", 73 + "items": { 74 + "type": "string" 75 + }, 76 + "description": "Search subjects by the status of the associated record/account" 77 + }, 78 + "reviewedBefore": { 79 + "type": "string", 80 + "format": "datetime", 81 + "description": "Search subjects reviewed before a given timestamp" 82 + }, 83 + "includeMuted": { 84 + "type": "boolean", 85 + "description": "By default, we don't include muted subjects in the results. Set this to true to include them." 86 + }, 87 + "onlyMuted": { 88 + "type": "boolean", 89 + "description": "When set to true, only muted subjects and reporters will be returned." 90 + }, 91 + "reviewState": { 92 + "type": "string", 93 + "description": "Specify when fetching subjects in a certain state", 94 + "knownValues": [ 95 + "tools.ozone.moderation.defs#reviewOpen", 96 + "tools.ozone.moderation.defs#reviewClosed", 97 + "tools.ozone.moderation.defs#reviewEscalated", 98 + "tools.ozone.moderation.defs#reviewNone" 99 + ] 100 + }, 101 + "ignoreSubjects": { 102 + "type": "array", 103 + "items": { 104 + "type": "string", 105 + "format": "uri" 106 + } 107 + }, 108 + "lastReviewedBy": { 109 + "type": "string", 110 + "format": "did", 111 + "description": "Get all subject statuses that were reviewed by a specific moderator" 112 + }, 113 + "sortField": { 114 + "type": "string", 115 + "default": "lastReportedAt", 116 + "enum": [ 117 + "lastReviewedAt", 118 + "lastReportedAt", 119 + "reportedRecordsCount", 120 + "takendownRecordsCount", 121 + "priorityScore" 122 + ] 123 + }, 124 + "sortDirection": { 125 + "type": "string", 126 + "default": "desc", 127 + "enum": ["asc", "desc"] 128 + }, 129 + "takendown": { 130 + "type": "boolean", 131 + "description": "Get subjects that were taken down" 132 + }, 133 + "appealed": { 134 + "type": "boolean", 135 + "description": "Get subjects in unresolved appealed status" 136 + }, 137 + "limit": { 138 + "type": "integer", 139 + "minimum": 1, 140 + "maximum": 100, 141 + "default": 50 142 + }, 143 + "tags": { 144 + "type": "array", 145 + "maxLength": 25, 146 + "items": { 147 + "type": "string", 148 + "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" 149 + } 150 + }, 151 + "excludeTags": { 152 + "type": "array", 153 + "items": { 154 + "type": "string" 155 + } 156 + }, 157 + "cursor": { 158 + "type": "string" 159 + }, 160 + "collections": { 161 + "type": "array", 162 + "maxLength": 20, 163 + "description": "If specified, subjects belonging to the given collections will be returned. When subjectType is set to 'account', this will be ignored.", 164 + "items": { 165 + "type": "string", 166 + "format": "nsid" 167 + } 168 + }, 169 + "subjectType": { 170 + "type": "string", 171 + "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.", 172 + "knownValues": ["account", "record"] 173 + }, 174 + "minAccountSuspendCount": { 175 + "type": "integer", 176 + "description": "If specified, only subjects that belong to an account that has at least this many suspensions will be returned." 177 + }, 178 + "minReportedRecordsCount": { 179 + "type": "integer", 180 + "description": "If specified, only subjects that belong to an account that has at least this many reported records will be returned." 181 + }, 182 + "minTakendownRecordsCount": { 183 + "type": "integer", 184 + "description": "If specified, only subjects that belong to an account that has at least this many taken down records will be returned." 185 + }, 186 + "minPriorityScore": { 187 + "minimum": 0, 188 + "maximum": 100, 189 + "type": "integer", 190 + "description": "If specified, only subjects that have priority score value above the given value will be returned." 191 + }, 192 + "minStrikeCount": { 193 + "type": "integer", 194 + "minimum": 1, 195 + "description": "If specified, only subjects that belong to an account that has at least this many active strikes will be returned." 196 + }, 197 + "ageAssuranceState": { 198 + "type": "string", 199 + "description": "If specified, only subjects with the given age assurance state will be returned.", 200 + "knownValues": ["pending", "assured", "unknown", "reset", "blocked"] 201 + } 202 + } 203 + }, 204 + "output": { 205 + "encoding": "application/json", 206 + "schema": { 207 + "type": "object", 208 + "required": ["subjectStatuses"], 209 + "properties": { 210 + "cursor": { 211 + "type": "string" 212 + }, 213 + "subjectStatuses": { 214 + "type": "array", 215 + "items": { 216 + "type": "ref", 217 + "ref": "tools.ozone.moderation.defs#subjectStatusView" 218 + } 219 + } 220 + } 221 + } 222 + } 223 + } 224 + } 225 + }
+44
resources/lexicons/tools/ozone/moderation/searchRepos.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "tools.ozone.moderation.searchRepos", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Find repositories based on a search term.", 8 + "parameters": { 9 + "type": "params", 10 + "properties": { 11 + "term": { 12 + "type": "string", 13 + "description": "DEPRECATED: use 'q' instead" 14 + }, 15 + "q": { "type": "string" }, 16 + "limit": { 17 + "type": "integer", 18 + "minimum": 1, 19 + "maximum": 100, 20 + "default": 50 21 + }, 22 + "cursor": { "type": "string" } 23 + } 24 + }, 25 + "output": { 26 + "encoding": "application/json", 27 + "schema": { 28 + "type": "object", 29 + "required": ["repos"], 30 + "properties": { 31 + "cursor": { "type": "string" }, 32 + "repos": { 33 + "type": "array", 34 + "items": { 35 + "type": "ref", 36 + "ref": "tools.ozone.moderation.defs#repoView" 37 + } 38 + } 39 + } 40 + } 41 + } 42 + } 43 + } 44 + }
+66
resources/lexicons/tools/ozone/server/getConfig.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "tools.ozone.server.getConfig", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Get details about ozone's server configuration.", 8 + "output": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "properties": { 13 + "appview": { 14 + "type": "ref", 15 + "ref": "#serviceConfig" 16 + }, 17 + "pds": { 18 + "type": "ref", 19 + "ref": "#serviceConfig" 20 + }, 21 + "blobDivert": { 22 + "type": "ref", 23 + "ref": "#serviceConfig" 24 + }, 25 + "chat": { 26 + "type": "ref", 27 + "ref": "#serviceConfig" 28 + }, 29 + "viewer": { 30 + "type": "ref", 31 + "ref": "#viewerConfig" 32 + }, 33 + "verifierDid": { 34 + "type": "string", 35 + "format": "did", 36 + "description": "The did of the verifier used for verification." 37 + } 38 + } 39 + } 40 + } 41 + }, 42 + "serviceConfig": { 43 + "type": "object", 44 + "properties": { 45 + "url": { 46 + "type": "string", 47 + "format": "uri" 48 + } 49 + } 50 + }, 51 + "viewerConfig": { 52 + "type": "object", 53 + "properties": { 54 + "role": { 55 + "type": "string", 56 + "knownValues": [ 57 + "tools.ozone.team.defs#roleAdmin", 58 + "tools.ozone.team.defs#roleModerator", 59 + "tools.ozone.team.defs#roleTriage", 60 + "tools.ozone.team.defs#roleVerifier" 61 + ] 62 + } 63 + } 64 + } 65 + } 66 + }