···149149 "activitySubscription": {
150150 "type": "ref",
151151 "ref": "#profileAssociatedActivitySubscription"
152152- }
152152+ },
153153+ "germ": { "type": "ref", "ref": "#profileAssociatedGerm" }
153154 }
154155 },
155156 "profileAssociatedChat": {
···159160 "allowIncoming": {
160161 "type": "string",
161162 "knownValues": ["all", "none", "following"]
163163+ }
164164+ }
165165+ },
166166+ "profileAssociatedGerm": {
167167+ "type": "object",
168168+ "required": ["showButtonTo", "messageMeUrl"],
169169+ "properties": {
170170+ "messageMeUrl": {
171171+ "type": "string",
172172+ "format": "uri"
173173+ },
174174+ "showButtonTo": {
175175+ "type": "string",
176176+ "knownValues": ["usersIFollow", "everyone"]
162177 }
163178 }
164179 },
···276291 "#savedFeedsPref",
277292 "#savedFeedsPrefV2",
278293 "#personalDetailsPref",
294294+ "#declaredAgePref",
279295 "#feedViewPref",
280296 "#threadViewPref",
281297 "#interestsPref",
···284300 "#bskyAppStatePref",
285301 "#labelersPref",
286302 "#postInteractionSettingsPref",
287287- "#verificationPrefs"
303303+ "#verificationPrefs",
304304+ "#liveEventPreferences"
288305 ]
289306 }
290307 },
···376393 }
377394 }
378395 },
396396+ "declaredAgePref": {
397397+ "type": "object",
398398+ "description": "Read-only preference containing value(s) inferred from the user's declared birthdate. Absence of this preference object in the response indicates that the user has not made a declaration.",
399399+ "properties": {
400400+ "isOverAge13": {
401401+ "type": "boolean",
402402+ "description": "Indicates if the user has declared that they are over 13 years of age."
403403+ },
404404+ "isOverAge16": {
405405+ "type": "boolean",
406406+ "description": "Indicates if the user has declared that they are over 16 years of age."
407407+ },
408408+ "isOverAge18": {
409409+ "type": "boolean",
410410+ "description": "Indicates if the user has declared that they are over 18 years of age."
411411+ }
412412+ }
413413+ },
379414 "feedViewPref": {
380415 "type": "object",
381416 "required": ["feed"],
···587622 }
588623 }
589624 },
625625+ "liveEventPreferences": {
626626+ "type": "object",
627627+ "description": "Preferences for live events.",
628628+ "properties": {
629629+ "hiddenFeedIds": {
630630+ "description": "A list of feed IDs that the user has hidden from live events.",
631631+ "type": "array",
632632+ "items": { "type": "string" }
633633+ },
634634+ "hideAllFeeds": {
635635+ "description": "Whether to hide all feeds from live events.",
636636+ "type": "boolean",
637637+ "default": false
638638+ }
639639+ }
640640+ },
590641 "postInteractionSettingsPref": {
591642 "type": "object",
592643 "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.",
···621672 "type": "object",
622673 "required": ["status", "record"],
623674 "properties": {
675675+ "uri": { "type": "string", "format": "at-uri" },
676676+ "cid": { "type": "string", "format": "cid" },
624677 "status": {
625678 "type": "string",
626679 "description": "The status for the account.",
···632685 "description": "An optional embed associated with the status.",
633686 "refs": ["app.bsky.embed.external#view"]
634687 },
688688+ "labels": {
689689+ "type": "array",
690690+ "items": { "type": "ref", "ref": "com.atproto.label.defs#label" }
691691+ },
635692 "expiresAt": {
636693 "type": "string",
637694 "description": "The date when this status will expire. The application might choose to no longer return the status after expiration.",
···640697 "isActive": {
641698 "type": "boolean",
642699 "description": "True if the status is not expired, false if it is expired. Only present if expiration was set."
700700+ },
701701+ "isDisabled": {
702702+ "type": "boolean",
703703+ "description": "True if the user's go-live access has been disabled by a moderator, false otherwise."
643704 }
644705 }
645706 }
+4
lexicons/app/bsky/actor/getSuggestions.json
···3333 },
3434 "recId": {
3535 "type": "integer",
3636+ "description": "DEPRECATED: use recIdStr instead."
3737+ },
3838+ "recIdStr": {
3939+ "type": "string",
3640 "description": "Snowflake for this recommendation, use when submitting recommendation events."
3741 }
3842 }
+5-1
lexicons/app/bsky/ageassurance/defs.json
···6262 "configRegion": {
6363 "type": "object",
6464 "description": "The Age Assurance configuration for a specific region.",
6565- "required": ["countryCode", "rules"],
6565+ "required": ["countryCode", "minAccessAge", "rules"],
6666 "properties": {
6767 "countryCode": {
6868 "type": "string",
···7171 "regionCode": {
7272 "type": "string",
7373 "description": "The ISO 3166-2 region code this configuration applies to. If omitted, the configuration applies to the entire country."
7474+ },
7575+ "minAccessAge": {
7676+ "type": "integer",
7777+ "description": "The minimum age (as a whole integer) required to use Bluesky in this region."
7478 },
7579 "rules": {
7680 "type": "array",
···11+{
22+ "lexicon": 1,
33+ "id": "app.bsky.contact.defs",
44+ "defs": {
55+ "matchAndContactIndex": {
66+ "description": "Associates a profile with the positional index of the contact import input in the call to `app.bsky.contact.importContacts`, so clients can know which phone caused a particular match.",
77+ "type": "object",
88+ "required": ["match", "contactIndex"],
99+ "properties": {
1010+ "match": {
1111+ "description": "Profile of the matched user.",
1212+ "type": "ref",
1313+ "ref": "app.bsky.actor.defs#profileView"
1414+ },
1515+ "contactIndex": {
1616+ "description": "The index of this match in the import contact input.",
1717+ "type": "integer",
1818+ "minimum": 0,
1919+ "maximum": 999
2020+ }
2121+ }
2222+ },
2323+ "syncStatus": {
2424+ "type": "object",
2525+ "required": ["syncedAt", "matchesCount"],
2626+ "properties": {
2727+ "syncedAt": {
2828+ "description": "Last date when contacts where imported.",
2929+ "type": "string",
3030+ "format": "datetime"
3131+ },
3232+ "matchesCount": {
3333+ "description": "Number of existing contact matches resulting of the user imports and of their imported contacts having imported the user. Matches stop being counted when the user either follows the matched contact or dismisses the match.",
3434+ "type": "integer",
3535+ "minimum": 0
3636+ }
3737+ }
3838+ },
3939+ "notification": {
4040+ "description": "A stash object to be sent via bsync representing a notification to be created.",
4141+ "type": "object",
4242+ "required": ["from", "to"],
4343+ "properties": {
4444+ "from": {
4545+ "description": "The DID of who this notification comes from.",
4646+ "type": "string",
4747+ "format": "did"
4848+ },
4949+ "to": {
5050+ "description": "The DID of who this notification should go to.",
5151+ "type": "string",
5252+ "format": "did"
5353+ }
5454+ }
5555+ }
5656+ }
5757+}
+39
lexicons/app/bsky/contact/dismissMatch.json
···11+{
22+ "lexicon": 1,
33+ "id": "app.bsky.contact.dismissMatch",
44+ "defs": {
55+ "main": {
66+ "type": "procedure",
77+ "description": "Removes a match that was found via contact import. It shouldn't appear again if the same contact is re-imported. Requires authentication.",
88+ "input": {
99+ "encoding": "application/json",
1010+ "schema": {
1111+ "type": "object",
1212+ "required": ["subject"],
1313+ "properties": {
1414+ "subject": {
1515+ "description": "The subject's DID to dismiss the match with.",
1616+ "type": "string",
1717+ "format": "did"
1818+ }
1919+ }
2020+ }
2121+ },
2222+ "output": {
2323+ "encoding": "application/json",
2424+ "schema": {
2525+ "type": "object",
2626+ "properties": {}
2727+ }
2828+ },
2929+ "errors": [
3030+ {
3131+ "name": "InvalidDid"
3232+ },
3333+ {
3434+ "name": "InternalError"
3535+ }
3636+ ]
3737+ }
3838+ }
3939+}
···11+{
22+ "lexicon": 1,
33+ "id": "app.bsky.contact.startPhoneVerification",
44+ "defs": {
55+ "main": {
66+ "type": "procedure",
77+ "description": "Starts a phone verification flow. The phone passed will receive a code via SMS that should be passed to `app.bsky.contact.verifyPhone`. Requires authentication.",
88+ "input": {
99+ "encoding": "application/json",
1010+ "schema": {
1111+ "type": "object",
1212+ "required": ["phone"],
1313+ "properties": {
1414+ "phone": {
1515+ "description": "The phone number to receive the code via SMS.",
1616+ "type": "string"
1717+ }
1818+ }
1919+ }
2020+ },
2121+ "output": {
2222+ "encoding": "application/json",
2323+ "schema": {
2424+ "type": "object",
2525+ "properties": {}
2626+ }
2727+ },
2828+ "errors": [
2929+ {
3030+ "name": "RateLimitExceeded"
3131+ },
3232+ {
3333+ "name": "InvalidDid"
3434+ },
3535+ {
3636+ "name": "InvalidPhone"
3737+ },
3838+ {
3939+ "name": "InternalError"
4040+ }
4141+ ]
4242+ }
4343+ }
4444+}
+57
lexicons/app/bsky/contact/verifyPhone.json
···11+{
22+ "lexicon": 1,
33+ "id": "app.bsky.contact.verifyPhone",
44+ "defs": {
55+ "main": {
66+ "type": "procedure",
77+ "description": "Verifies control over a phone number with a code received via SMS and starts a contact import session. Requires authentication.",
88+ "input": {
99+ "encoding": "application/json",
1010+ "schema": {
1111+ "type": "object",
1212+ "required": ["phone", "code"],
1313+ "properties": {
1414+ "phone": {
1515+ "description": "The phone number to verify. Should be the same as the one passed to `app.bsky.contact.startPhoneVerification`.",
1616+ "type": "string"
1717+ },
1818+ "code": {
1919+ "description": "The code received via SMS as a result of the call to `app.bsky.contact.startPhoneVerification`.",
2020+ "type": "string"
2121+ }
2222+ }
2323+ }
2424+ },
2525+ "output": {
2626+ "encoding": "application/json",
2727+ "schema": {
2828+ "type": "object",
2929+ "required": ["token"],
3030+ "properties": {
3131+ "token": {
3232+ "description": "JWT to be used in a call to `app.bsky.contact.importContacts`. It is only valid for a single call.",
3333+ "type": "string"
3434+ }
3535+ }
3636+ }
3737+ },
3838+ "errors": [
3939+ {
4040+ "name": "RateLimitExceeded"
4141+ },
4242+ {
4343+ "name": "InvalidDid"
4444+ },
4545+ {
4646+ "name": "InvalidPhone"
4747+ },
4848+ {
4949+ "name": "InvalidCode"
5050+ },
5151+ {
5252+ "name": "InternalError"
5353+ }
5454+ ]
5555+ }
5656+ }
5757+}
+42
lexicons/app/bsky/draft/createDraft.json
···11+{
22+ "lexicon": 1,
33+ "id": "app.bsky.draft.createDraft",
44+ "defs": {
55+ "main": {
66+ "type": "procedure",
77+ "description": "Inserts a draft using private storage (stash). An upper limit of drafts might be enforced. Requires authentication.",
88+ "input": {
99+ "encoding": "application/json",
1010+ "schema": {
1111+ "type": "object",
1212+ "required": ["draft"],
1313+ "properties": {
1414+ "draft": {
1515+ "type": "ref",
1616+ "ref": "app.bsky.draft.defs#draft"
1717+ }
1818+ }
1919+ }
2020+ },
2121+ "output": {
2222+ "encoding": "application/json",
2323+ "schema": {
2424+ "type": "object",
2525+ "required": ["id"],
2626+ "properties": {
2727+ "id": {
2828+ "type": "string",
2929+ "description": "The ID of the created draft."
3030+ }
3131+ }
3232+ }
3333+ },
3434+ "errors": [
3535+ {
3636+ "name": "DraftLimitReached",
3737+ "description": "Trying to insert a new draft when the limit was already reached."
3838+ }
3939+ ]
4040+ }
4141+ }
4242+}
+221
lexicons/app/bsky/draft/defs.json
···11+{
22+ "lexicon": 1,
33+ "id": "app.bsky.draft.defs",
44+ "defs": {
55+ "draftWithId": {
66+ "description": "A draft with an identifier, used to store drafts in private storage (stash).",
77+ "type": "object",
88+ "required": ["id", "draft"],
99+ "properties": {
1010+ "id": {
1111+ "description": "A TID to be used as a draft identifier.",
1212+ "type": "string",
1313+ "format": "tid"
1414+ },
1515+ "draft": {
1616+ "type": "ref",
1717+ "ref": "#draft"
1818+ }
1919+ }
2020+ },
2121+ "draft": {
2222+ "description": "A draft containing an array of draft posts.",
2323+ "type": "object",
2424+ "required": ["posts"],
2525+ "properties": {
2626+ "deviceId": {
2727+ "type": "string",
2828+ "description": "UUIDv4 identifier of the device that created this draft.",
2929+ "maxLength": 100
3030+ },
3131+ "deviceName": {
3232+ "type": "string",
3333+ "description": "The device and/or platform on which the draft was created.",
3434+ "maxLength": 100
3535+ },
3636+ "posts": {
3737+ "description": "Array of draft posts that compose this draft.",
3838+ "type": "array",
3939+ "minLength": 1,
4040+ "maxLength": 100,
4141+ "items": {
4242+ "type": "ref",
4343+ "ref": "#draftPost"
4444+ }
4545+ },
4646+ "langs": {
4747+ "type": "array",
4848+ "description": "Indicates human language of posts primary text content.",
4949+ "maxLength": 3,
5050+ "items": { "type": "string", "format": "language" }
5151+ },
5252+ "postgateEmbeddingRules": {
5353+ "description": "Embedding rules for the postgates to be created when this draft is published.",
5454+ "type": "array",
5555+ "maxLength": 5,
5656+ "items": {
5757+ "type": "union",
5858+ "refs": ["app.bsky.feed.postgate#disableRule"]
5959+ }
6060+ },
6161+ "threadgateAllow": {
6262+ "description": "Allow-rules for the threadgate to be created when this draft is published.",
6363+ "type": "array",
6464+ "maxLength": 5,
6565+ "items": {
6666+ "type": "union",
6767+ "refs": [
6868+ "app.bsky.feed.threadgate#mentionRule",
6969+ "app.bsky.feed.threadgate#followerRule",
7070+ "app.bsky.feed.threadgate#followingRule",
7171+ "app.bsky.feed.threadgate#listRule"
7272+ ]
7373+ }
7474+ }
7575+ }
7676+ },
7777+ "draftPost": {
7878+ "description": "One of the posts that compose a draft.",
7979+ "type": "object",
8080+ "required": ["text"],
8181+ "properties": {
8282+ "text": {
8383+ "type": "string",
8484+ "maxLength": 10000,
8585+ "maxGraphemes": 1000,
8686+ "description": "The primary post content. It has a higher limit than post contents to allow storing a larger text that can later be refined into smaller posts."
8787+ },
8888+ "labels": {
8989+ "type": "union",
9090+ "description": "Self-label values for this post. Effectively content warnings.",
9191+ "refs": ["com.atproto.label.defs#selfLabels"]
9292+ },
9393+ "embedImages": {
9494+ "type": "array",
9595+ "items": { "type": "ref", "ref": "#draftEmbedImage" },
9696+ "maxLength": 4
9797+ },
9898+ "embedVideos": {
9999+ "type": "array",
100100+ "items": { "type": "ref", "ref": "#draftEmbedVideo" },
101101+ "maxLength": 1
102102+ },
103103+ "embedExternals": {
104104+ "type": "array",
105105+ "items": { "type": "ref", "ref": "#draftEmbedExternal" },
106106+ "maxLength": 1
107107+ },
108108+ "embedRecords": {
109109+ "type": "array",
110110+ "items": { "type": "ref", "ref": "#draftEmbedRecord" },
111111+ "maxLength": 1
112112+ }
113113+ }
114114+ },
115115+116116+ "draftView": {
117117+ "description": "View to present drafts data to users.",
118118+ "type": "object",
119119+ "required": ["id", "draft", "createdAt", "updatedAt"],
120120+ "properties": {
121121+ "id": {
122122+ "description": "A TID to be used as a draft identifier.",
123123+ "type": "string",
124124+ "format": "tid"
125125+ },
126126+ "draft": {
127127+ "type": "ref",
128128+ "ref": "#draft"
129129+ },
130130+ "createdAt": {
131131+ "description": "The time the draft was created.",
132132+ "type": "string",
133133+ "format": "datetime"
134134+ },
135135+ "updatedAt": {
136136+ "description": "The time the draft was last updated.",
137137+ "type": "string",
138138+ "format": "datetime"
139139+ }
140140+ }
141141+ },
142142+143143+ "draftEmbedLocalRef": {
144144+ "type": "object",
145145+ "required": ["path"],
146146+ "properties": {
147147+ "path": {
148148+ "type": "string",
149149+ "description": "Local, on-device ref to file to be embedded. Embeds are currently device-bound for drafts.",
150150+ "minLength": 1,
151151+ "maxLength": 1024
152152+ }
153153+ }
154154+ },
155155+ "draftEmbedCaption": {
156156+ "type": "object",
157157+ "required": ["lang", "content"],
158158+ "properties": {
159159+ "lang": {
160160+ "type": "string",
161161+ "format": "language"
162162+ },
163163+ "content": {
164164+ "type": "string",
165165+ "maxLength": 10000
166166+ }
167167+ }
168168+ },
169169+170170+ "draftEmbedImage": {
171171+ "type": "object",
172172+ "required": ["localRef"],
173173+ "properties": {
174174+ "localRef": {
175175+ "type": "ref",
176176+ "ref": "#draftEmbedLocalRef"
177177+ },
178178+ "alt": {
179179+ "type": "string",
180180+ "maxGraphemes": 2000
181181+ }
182182+ }
183183+ },
184184+ "draftEmbedVideo": {
185185+ "type": "object",
186186+ "required": ["localRef"],
187187+ "properties": {
188188+ "localRef": {
189189+ "type": "ref",
190190+ "ref": "#draftEmbedLocalRef"
191191+ },
192192+ "alt": {
193193+ "type": "string",
194194+ "maxGraphemes": 2000
195195+ },
196196+ "captions": {
197197+ "type": "array",
198198+ "items": {
199199+ "type": "ref",
200200+ "ref": "#draftEmbedCaption"
201201+ },
202202+ "maxLength": 20
203203+ }
204204+ }
205205+ },
206206+ "draftEmbedExternal": {
207207+ "type": "object",
208208+ "required": ["uri"],
209209+ "properties": {
210210+ "uri": { "type": "string", "format": "uri" }
211211+ }
212212+ },
213213+ "draftEmbedRecord": {
214214+ "type": "object",
215215+ "required": ["record"],
216216+ "properties": {
217217+ "record": { "type": "ref", "ref": "com.atproto.repo.strongRef" }
218218+ }
219219+ }
220220+ }
221221+}
···11+{
22+ "lexicon": 1,
33+ "id": "app.bsky.draft.updateDraft",
44+ "defs": {
55+ "main": {
66+ "type": "procedure",
77+ "description": "Updates a draft using private storage (stash). If the draft ID points to a non-existing ID, the update will be silently ignored. This is done because updates don't enforce draft limit, so it accepts all writes, but will ignore invalid ones. Requires authentication.",
88+ "input": {
99+ "encoding": "application/json",
1010+ "schema": {
1111+ "type": "object",
1212+ "required": ["draft"],
1313+ "properties": {
1414+ "draft": {
1515+ "type": "ref",
1616+ "ref": "app.bsky.draft.defs#draftWithId"
1717+ }
1818+ }
1919+ }
2020+ }
2121+ }
2222+ }
2323+}
+2-1
lexicons/app/bsky/embed/images.json
···2020 "properties": {
2121 "image": {
2222 "type": "blob",
2323+ "description": "The raw image file. May be up to 2 MB, formerly limited to 1 MB.",
2324 "accept": ["image/*"],
2424- "maxSize": 1000000
2525+ "maxSize": 2000000
2526 },
2627 "alt": {
2728 "type": "string",
+10
lexicons/app/bsky/embed/video.json
···2727 "aspectRatio": {
2828 "type": "ref",
2929 "ref": "app.bsky.embed.defs#aspectRatio"
3030+ },
3131+ "presentation": {
3232+ "type": "string",
3333+ "description": "A hint to the client about how to present the video.",
3434+ "knownValues": ["default", "gif"]
3035 }
3136 }
3237 },
···6065 "aspectRatio": {
6166 "type": "ref",
6267 "ref": "app.bsky.embed.defs#aspectRatio"
6868+ },
6969+ "presentation": {
7070+ "type": "string",
7171+ "description": "A hint to the client about how to present the video.",
7272+ "knownValues": ["default", "gif"]
6373 }
6474 }
6575 }
···159159 "type": "string",
160160 "format": "at-uri",
161161 "description": "if the actor is followed by this DID, contains the AT-URI of the follow record"
162162+ },
163163+ "blocking": {
164164+ "type": "string",
165165+ "format": "at-uri",
166166+ "description": "if the actor blocks this DID, this is the AT-URI of the block record"
167167+ },
168168+ "blockedBy": {
169169+ "type": "string",
170170+ "format": "at-uri",
171171+ "description": "if the actor is blocked by this DID, contains the AT-URI of the block record"
172172+ },
173173+ "blockingByList": {
174174+ "type": "string",
175175+ "format": "at-uri",
176176+ "description": "if the actor blocks this DID via a block list, this is the AT-URI of the listblock record"
177177+ },
178178+ "blockedByList": {
179179+ "type": "string",
180180+ "format": "at-uri",
181181+ "description": "if the actor is blocked by this DID via a block list, contains the AT-URI of the listblock record"
162182 }
163183 }
164184 }
···2525 "ref": "app.bsky.actor.defs#profileView"
2626 }
2727 },
2828+ "recIdStr": {
2929+ "type": "string",
3030+ "description": "Snowflake for this recommendation, use when submitting recommendation events."
3131+ },
2832 "isFallback": {
2933 "type": "boolean",
3030- "description": "If true, response has fallen-back to generic results, and is not scoped using relativeToDid",
3434+ "description": "DEPRECATED, unused. Previously: if true, response has fallen-back to generic results, and is not scoped using relativeToDid",
3135 "default": false
3236 },
3337 "recId": {
3438 "type": "integer",
3535- "description": "Snowflake for this recommendation, use when submitting recommendation events."
3939+ "description": "DEPRECATED: use recIdStr instead."
3640 }
3741 }
3842 }