1{
2  "protocol": "user",
3  "imports": [
4    {
5      "path": "common.avdl",
6      "type": "idl"
7    }
8  ],
9  "types": [
10    {
11      "type": "record",
12      "name": "TrackProof",
13      "fields": [
14        {
15          "type": "string",
16          "name": "proofType"
17        },
18        {
19          "type": "string",
20          "name": "proofName"
21        },
22        {
23          "type": "string",
24          "name": "idString"
25        }
26      ]
27    },
28    {
29      "type": "record",
30      "name": "WebProof",
31      "fields": [
32        {
33          "type": "string",
34          "name": "hostname"
35        },
36        {
37          "type": {
38            "type": "array",
39            "items": "string"
40          },
41          "name": "protocols"
42        }
43      ]
44    },
45    {
46      "type": "record",
47      "name": "Proofs",
48      "fields": [
49        {
50          "type": {
51            "type": "array",
52            "items": "TrackProof"
53          },
54          "name": "social"
55        },
56        {
57          "type": {
58            "type": "array",
59            "items": "WebProof"
60          },
61          "name": "web"
62        },
63        {
64          "type": {
65            "type": "array",
66            "items": "PublicKey"
67          },
68          "name": "publicKeys"
69        }
70      ]
71    },
72    {
73      "type": "record",
74      "name": "UserSummary",
75      "fields": [
76        {
77          "type": "UID",
78          "name": "uid"
79        },
80        {
81          "type": "string",
82          "name": "username"
83        },
84        {
85          "type": "string",
86          "name": "fullName"
87        },
88        {
89          "type": [
90            null,
91            "LinkID"
92          ],
93          "name": "linkID"
94        }
95      ]
96    },
97    {
98      "type": "record",
99      "name": "UserSummarySet",
100      "fields": [
101        {
102          "type": {
103            "type": "array",
104            "items": "UserSummary"
105          },
106          "name": "users"
107        },
108        {
109          "type": "Time",
110          "name": "time"
111        },
112        {
113          "type": "int",
114          "name": "version"
115        }
116      ]
117    },
118    {
119      "type": "record",
120      "name": "EmailAddress",
121      "fields": [],
122      "typedef": "string"
123    },
124    {
125      "type": "record",
126      "name": "Email",
127      "fields": [
128        {
129          "type": "EmailAddress",
130          "name": "email"
131        },
132        {
133          "type": "boolean",
134          "name": "isVerified"
135        },
136        {
137          "type": "boolean",
138          "name": "isPrimary"
139        },
140        {
141          "type": "IdentityVisibility",
142          "name": "visibility"
143        },
144        {
145          "type": "UnixTime",
146          "name": "lastVerifyEmailDate"
147        }
148      ]
149    },
150    {
151      "type": "record",
152      "name": "UserSettings",
153      "fields": [
154        {
155          "type": {
156            "type": "array",
157            "items": "Email"
158          },
159          "name": "emails"
160        },
161        {
162          "type": {
163            "type": "array",
164            "items": "UserPhoneNumber"
165          },
166          "name": "phoneNumbers"
167        }
168      ]
169    },
170    {
171      "type": "record",
172      "name": "InterestingPerson",
173      "fields": [
174        {
175          "type": "UID",
176          "name": "uid"
177        },
178        {
179          "type": "string",
180          "name": "username"
181        },
182        {
183          "type": "string",
184          "name": "fullname"
185        },
186        {
187          "type": {
188            "type": "map",
189            "values": "string",
190            "keys": "string"
191          },
192          "name": "serviceMap"
193        }
194      ]
195    },
196    {
197      "type": "record",
198      "name": "ProofSuggestionsRes",
199      "fields": [
200        {
201          "type": {
202            "type": "array",
203            "items": "ProofSuggestion"
204          },
205          "name": "suggestions"
206        },
207        {
208          "type": "boolean",
209          "name": "showMore"
210        }
211      ]
212    },
213    {
214      "type": "record",
215      "name": "ProofSuggestion",
216      "fields": [
217        {
218          "type": "string",
219          "name": "key"
220        },
221        {
222          "type": "boolean",
223          "name": "belowFold"
224        },
225        {
226          "type": "string",
227          "name": "profileText"
228        },
229        {
230          "type": {
231            "type": "array",
232            "items": "SizedImage"
233          },
234          "name": "profileIcon"
235        },
236        {
237          "type": {
238            "type": "array",
239            "items": "SizedImage"
240          },
241          "name": "profileIconDarkmode"
242        },
243        {
244          "type": "string",
245          "name": "pickerText"
246        },
247        {
248          "type": "string",
249          "name": "pickerSubtext"
250        },
251        {
252          "type": {
253            "type": "array",
254            "items": "SizedImage"
255          },
256          "name": "pickerIcon"
257        },
258        {
259          "type": {
260            "type": "array",
261            "items": "SizedImage"
262          },
263          "name": "pickerIconDarkmode"
264        },
265        {
266          "type": {
267            "type": "array",
268            "items": "Identify3RowMeta"
269          },
270          "name": "metas"
271        }
272      ]
273    },
274    {
275      "type": "record",
276      "name": "NextMerkleRootRes",
277      "fields": [
278        {
279          "type": [
280            null,
281            "MerkleRootV2"
282          ],
283          "name": "res"
284        }
285      ]
286    },
287    {
288      "type": "enum",
289      "name": "PassphraseState",
290      "symbols": [
291        "KNOWN_0",
292        "RANDOM_1"
293      ],
294      "doc": "PassphraseState values are used in .config.json, so should not be changed without a migration strategy"
295    },
296    {
297      "type": "record",
298      "name": "CanLogoutRes",
299      "fields": [
300        {
301          "type": "boolean",
302          "name": "canLogout"
303        },
304        {
305          "type": "string",
306          "name": "reason"
307        },
308        {
309          "type": "PassphraseState",
310          "name": "passphraseState"
311        }
312      ]
313    },
314    {
315      "type": "record",
316      "name": "UserPassphraseStateMsg",
317      "fields": [
318        {
319          "type": "PassphraseState",
320          "name": "passphraseState",
321          "jsonkey": "state"
322        }
323      ],
324      "lint": "ignore"
325    },
326    {
327      "type": "record",
328      "name": "UserBlockedRow",
329      "fields": [
330        {
331          "type": "UID",
332          "name": "uid",
333          "jsonkey": "block_uid"
334        },
335        {
336          "type": "string",
337          "name": "username",
338          "jsonkey": "block_username"
339        },
340        {
341          "type": [
342            null,
343            "boolean"
344          ],
345          "name": "chat",
346          "jsonkey": "chat"
347        },
348        {
349          "type": [
350            null,
351            "boolean"
352          ],
353          "name": "follow",
354          "jsonkey": "follow"
355        }
356      ]
357    },
358    {
359      "type": "enum",
360      "name": "UserBlockType",
361      "symbols": [
362        "CHAT_0",
363        "FOLLOW_1"
364      ]
365    },
366    {
367      "type": "record",
368      "name": "UserBlockedBody",
369      "fields": [
370        {
371          "type": {
372            "type": "array",
373            "items": "UserBlockedRow"
374          },
375          "name": "blocks",
376          "jsonkey": "blocks"
377        },
378        {
379          "type": "UID",
380          "name": "uid",
381          "jsonkey": "blocker_uid"
382        },
383        {
384          "type": "string",
385          "name": "username",
386          "jsonkey": "blocker_username"
387        }
388      ]
389    },
390    {
391      "type": "record",
392      "name": "UserBlockState",
393      "fields": [
394        {
395          "type": "UserBlockType",
396          "name": "blockType"
397        },
398        {
399          "type": "boolean",
400          "name": "blocked"
401        }
402      ]
403    },
404    {
405      "type": "record",
406      "name": "UserBlockedSummary",
407      "fields": [
408        {
409          "type": "string",
410          "name": "blocker"
411        },
412        {
413          "type": {
414            "type": "map",
415            "values": {
416              "type": "array",
417              "items": "UserBlockState"
418            },
419            "keys": "string"
420          },
421          "name": "blocks"
422        }
423      ]
424    },
425    {
426      "type": "record",
427      "name": "UserBlock",
428      "fields": [
429        {
430          "type": "string",
431          "name": "username"
432        },
433        {
434          "type": "boolean",
435          "name": "chatBlocked"
436        },
437        {
438          "type": "boolean",
439          "name": "followBlocked"
440        },
441        {
442          "type": [
443            null,
444            "Time"
445          ],
446          "name": "createTime"
447        },
448        {
449          "type": [
450            null,
451            "Time"
452          ],
453          "name": "modifyTime"
454        }
455      ]
456    },
457    {
458      "type": "record",
459      "name": "UserBlockArg",
460      "fields": [
461        {
462          "type": "string",
463          "name": "username"
464        },
465        {
466          "type": [
467            null,
468            "boolean"
469          ],
470          "name": "setChatBlock"
471        },
472        {
473          "type": [
474            null,
475            "boolean"
476          ],
477          "name": "setFollowBlock"
478        }
479      ]
480    },
481    {
482      "type": "record",
483      "name": "TeamBlock",
484      "fields": [
485        {
486          "type": "string",
487          "name": "teamName",
488          "jsonkey": "fq_name"
489        },
490        {
491          "type": "Time",
492          "name": "createTime",
493          "jsonkey": "ctime"
494        }
495      ]
496    }
497  ],
498  "messages": {
499    "listTracking": {
500      "request": [
501        {
502          "name": "sessionID",
503          "type": "int"
504        },
505        {
506          "name": "filter",
507          "type": "string"
508        },
509        {
510          "name": "assertion",
511          "type": "string"
512        }
513      ],
514      "response": "UserSummarySet",
515      "doc": "listTracking gets verified data from the tracking statements in the user's\n    sigchain. However, it does not check to make sure the tracked users have\n    not reset since the track statement.\n\n    If assertion is empty, it will use the current logged in user."
516    },
517    "listTrackingJSON": {
518      "request": [
519        {
520          "name": "sessionID",
521          "type": "int"
522        },
523        {
524          "name": "filter",
525          "type": "string"
526        },
527        {
528          "name": "verbose",
529          "type": "boolean"
530        },
531        {
532          "name": "assertion",
533          "type": "string"
534        }
535      ],
536      "response": "string"
537    },
538    "listTrackersUnverified": {
539      "request": [
540        {
541          "name": "sessionID",
542          "type": "int"
543        },
544        {
545          "name": "assertion",
546          "type": "string"
547        }
548      ],
549      "response": "UserSummarySet",
550      "doc": "listTrackersUnverified returns the users following the given user, and is unverified\n    and server-trust."
551    },
552    "loadUser": {
553      "request": [
554        {
555          "name": "sessionID",
556          "type": "int"
557        },
558        {
559          "name": "uid",
560          "type": "UID"
561        }
562      ],
563      "response": "User",
564      "doc": "Load a user from the server."
565    },
566    "loadUserByName": {
567      "request": [
568        {
569          "name": "sessionID",
570          "type": "int"
571        },
572        {
573          "name": "username",
574          "type": "string"
575        }
576      ],
577      "response": "User"
578    },
579    "loadUserPlusKeys": {
580      "request": [
581        {
582          "name": "sessionID",
583          "type": "int"
584        },
585        {
586          "name": "uid",
587          "type": "UID"
588        },
589        {
590          "name": "pollForKID",
591          "type": "KID"
592        }
593      ],
594      "response": "UserPlusKeys",
595      "doc": "Load a user + device keys from the server."
596    },
597    "loadUserPlusKeysV2": {
598      "request": [
599        {
600          "name": "sessionID",
601          "type": "int"
602        },
603        {
604          "name": "uid",
605          "type": "UID"
606        },
607        {
608          "name": "pollForKID",
609          "type": "KID"
610        },
611        {
612          "name": "oa",
613          "type": "OfflineAvailability"
614        }
615      ],
616      "response": "UserPlusKeysV2AllIncarnations"
617    },
618    "loadPublicKeys": {
619      "request": [
620        {
621          "name": "sessionID",
622          "type": "int"
623        },
624        {
625          "name": "uid",
626          "type": "UID"
627        }
628      ],
629      "response": {
630        "type": "array",
631        "items": "PublicKey"
632      },
633      "doc": "Load public keys for a user."
634    },
635    "loadMyPublicKeys": {
636      "request": [
637        {
638          "name": "sessionID",
639          "type": "int"
640        }
641      ],
642      "response": {
643        "type": "array",
644        "items": "PublicKey"
645      },
646      "doc": "Load my public keys (for logged in user)."
647    },
648    "loadMySettings": {
649      "request": [
650        {
651          "name": "sessionID",
652          "type": "int"
653        }
654      ],
655      "response": "UserSettings",
656      "doc": "Load user settings (for logged in user)."
657    },
658    "loadAllPublicKeysUnverified": {
659      "request": [
660        {
661          "name": "sessionID",
662          "type": "int"
663        },
664        {
665          "name": "uid",
666          "type": "UID"
667        }
668      ],
669      "response": {
670        "type": "array",
671        "items": "PublicKey"
672      },
673      "doc": "Load all the user's public keys (even those in reset key families)\n    from the server with no verification"
674    },
675    "profileEdit": {
676      "request": [
677        {
678          "name": "sessionID",
679          "type": "int"
680        },
681        {
682          "name": "fullName",
683          "type": "string"
684        },
685        {
686          "name": "location",
687          "type": "string"
688        },
689        {
690          "name": "bio",
691          "type": "string"
692        }
693      ],
694      "response": null
695    },
696    "interestingPeople": {
697      "request": [
698        {
699          "name": "maxUsers",
700          "type": "int"
701        },
702        {
703          "name": "namespace",
704          "type": "string"
705        }
706      ],
707      "response": {
708        "type": "array",
709        "items": "InterestingPerson"
710      }
711    },
712    "meUserVersion": {
713      "request": [
714        {
715          "name": "sessionID",
716          "type": "int"
717        },
718        {
719          "name": "forcePoll",
720          "type": "boolean"
721        }
722      ],
723      "response": "UserVersion"
724    },
725    "getUPAK": {
726      "request": [
727        {
728          "name": "uid",
729          "type": "UID"
730        },
731        {
732          "name": "unstubbed",
733          "type": "boolean"
734        }
735      ],
736      "response": "UPAKVersioned",
737      "doc": "getUPAK returns a UPAK. Used mainly for debugging.",
738      "lint": "ignore"
739    },
740    "getUPAKLite": {
741      "request": [
742        {
743          "name": "uid",
744          "type": "UID"
745        }
746      ],
747      "response": "UPKLiteV1AllIncarnations",
748      "doc": "getUPAKLite returns a UPKLiteV1AllIncarnations. Used mainly for debugging.",
749      "lint": "ignore"
750    },
751    "uploadUserAvatar": {
752      "request": [
753        {
754          "name": "filename",
755          "type": "string"
756        },
757        {
758          "name": "crop",
759          "type": [
760            null,
761            "ImageCropRect"
762          ]
763        }
764      ],
765      "response": null
766    },
767    "proofSuggestions": {
768      "request": [
769        {
770          "name": "sessionID",
771          "type": "int"
772        }
773      ],
774      "response": "ProofSuggestionsRes"
775    },
776    "findNextMerkleRootAfterRevoke": {
777      "request": [
778        {
779          "name": "uid",
780          "type": "UID"
781        },
782        {
783          "name": "kid",
784          "type": "KID"
785        },
786        {
787          "name": "loc",
788          "type": "SigChainLocation"
789        },
790        {
791          "name": "prev",
792          "type": "MerkleRootV2"
793        }
794      ],
795      "response": "NextMerkleRootRes",
796      "doc": "FindNextMerkleRootAfterRevoke finds the first Merkle Root that contains the UID/KID\n   revocation at the given SigChainLocataion. The MerkleRootV2 prev is a hint as to where\n   we'll start our search. Usually it's the next one, but not always"
797    },
798    "findNextMerkleRootAfterReset": {
799      "request": [
800        {
801          "name": "uid",
802          "type": "UID"
803        },
804        {
805          "name": "resetSeqno",
806          "type": "Seqno"
807        },
808        {
809          "name": "prev",
810          "type": "ResetMerkleRoot"
811        }
812      ],
813      "response": "NextMerkleRootRes",
814      "doc": "FindNextMerkleRootAfterReset finds the first Merkle root that contains the UID reset\n   at resetSeqno. You should pass it prev, which was the last known Merkle root at the time of\n   the reset. Usually, we'll just turn up the next Merkle root, but not always."
815    },
816    "canLogout": {
817      "request": [
818        {
819          "name": "sessionID",
820          "type": "int"
821        }
822      ],
823      "response": "CanLogoutRes"
824    },
825    "loadPassphraseState": {
826      "request": [
827        {
828          "name": "sessionID",
829          "type": "int"
830        }
831      ],
832      "response": "PassphraseState"
833    },
834    "userCard": {
835      "request": [
836        {
837          "name": "sessionID",
838          "type": "int"
839        },
840        {
841          "name": "username",
842          "type": "string"
843        },
844        {
845          "name": "useSession",
846          "type": "boolean"
847        }
848      ],
849      "response": [
850        null,
851        "UserCard"
852      ]
853    },
854    "setUserBlocks": {
855      "request": [
856        {
857          "name": "sessionID",
858          "type": "int"
859        },
860        {
861          "name": "blocks",
862          "type": {
863            "type": "array",
864            "items": "UserBlockArg"
865          }
866        }
867      ],
868      "response": null
869    },
870    "getUserBlocks": {
871      "request": [
872        {
873          "name": "sessionID",
874          "type": "int"
875        },
876        {
877          "name": "usernames",
878          "type": {
879            "type": "array",
880            "items": "string"
881          }
882        }
883      ],
884      "response": {
885        "type": "array",
886        "items": "UserBlock"
887      }
888    },
889    "reportUser": {
890      "request": [
891        {
892          "name": "sessionID",
893          "type": "int"
894        },
895        {
896          "name": "username",
897          "type": "string"
898        },
899        {
900          "name": "reason",
901          "type": "string"
902        },
903        {
904          "name": "comment",
905          "type": "string"
906        },
907        {
908          "name": "includeTranscript",
909          "type": "boolean"
910        },
911        {
912          "name": "convID",
913          "type": [
914            null,
915            "string"
916          ]
917        }
918      ],
919      "response": null
920    },
921    "dismissBlockButtons": {
922      "request": [
923        {
924          "name": "tlfID",
925          "type": "TLFID"
926        }
927      ],
928      "response": null
929    },
930    "blockUser": {
931      "request": [
932        {
933          "name": "username",
934          "type": "string"
935        }
936      ],
937      "response": null
938    },
939    "unblockUser": {
940      "request": [
941        {
942          "name": "username",
943          "type": "string"
944        }
945      ],
946      "response": null
947    },
948    "getTeamBlocks": {
949      "request": [
950        {
951          "name": "sessionID",
952          "type": "int"
953        }
954      ],
955      "response": {
956        "type": "array",
957        "items": "TeamBlock"
958      }
959    }
960  },
961  "namespace": "keybase.1"
962}