From 4e7a2fe7c70033fadd8951bd6d46b2dd14bc3dc7 Mon Sep 17 00:00:00 2001 From: finn Date: Thu, 11 Aug 2022 15:38:59 -0700 Subject: [PATCH] Update protocol to call-signaling branch --- protocol.json | 5525 +----------------------- signald/client-protocol/v1/errors.go | 16 + signald/client-protocol/v1/requests.go | 96 + signald/client-protocol/v1/structs.go | 51 +- 4 files changed, 161 insertions(+), 5527 deletions(-) diff --git a/protocol.json b/protocol.json index edf0bcb..b9ed7d8 100644 --- a/protocol.json +++ b/protocol.json @@ -1,5524 +1 @@ -{ - "doc_version": "v1", - "version": { - "name": "signald", - "version": "0.18.3", - "branch": "main", - "commit": "2d898baa70a20c44ae918d2ce6e1f108579ee271" - }, - "info": "This document describes objects that may be used when communicating with signald.", - "types": { - "v0": { - "JsonAccountList": { - "fields": { - "accounts": { - "list": true, - "type": "JsonAccount", - "version": "v0" - } - }, - "deprecated": true, - "removal_date": 1641027661 - }, - "JsonMessageEnvelope": { - "fields": { - "username": { - "type": "String", - "example": "\"+12024561414\"" - }, - "uuid": { - "type": "String", - "example": "\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"" - }, - "source": { - "type": "JsonAddress", - "version": "v0" - }, - "sourceDevice": { - "type": "int" - }, - "type": { - "type": "String" - }, - "relay": { - "type": "String", - "doc": "this field is no longer available and will never be populated" - }, - "timestamp": { - "type": "long", - "example": "1615576442475" - }, - "timestampISO": { - "type": "String" - }, - "serverTimestamp": { - "type": "long" - }, - "serverDeliveredTimestamp": { - "type": "long", - "example": "161557644247580" - }, - "hasLegacyMessage": { - "type": "boolean" - }, - "hasContent": { - "type": "boolean" - }, - "isUnidentifiedSender": { - "type": "boolean" - }, - "dataMessage": { - "type": "JsonDataMessage", - "version": "v0" - }, - "syncMessage": { - "type": "JsonSyncMessage", - "version": "v0" - }, - "callMessage": { - "type": "JsonCallMessage", - "version": "v0" - }, - "receipt": { - "type": "JsonReceiptMessage", - "version": "v0" - }, - "typing": { - "type": "JsonTypingMessage", - "version": "v0" - } - }, - "deprecated": true, - "removal_date": 1641027661 - }, - "JsonAccount": { - "fields": { - "deviceId": { - "type": "int" - }, - "username": { - "type": "String" - }, - "filename": { - "type": "String" - }, - "uuid": { - "type": "String" - }, - "registered": { - "type": "boolean" - }, - "has_keys": { - "type": "boolean" - }, - "subscribed": { - "type": "boolean" - } - }, - "deprecated": true, - "removal_date": 1641027661 - }, - "JsonAddress": { - "fields": { - "number": { - "type": "String" - }, - "uuid": { - "type": "UUID" - }, - "relay": { - "type": "String" - } - }, - "deprecated": true, - "removal_date": 1641027661 - }, - "JsonDataMessage": { - "fields": { - "timestamp": { - "type": "long", - "doc": "the timestamp that the message was sent at, according to the sender's device. This is used to uniquely identify this message for things like reactions and quotes.", - "example": "1615576442475" - }, - "attachments": { - "list": true, - "type": "JsonAttachment", - "version": "v0", - "doc": "files attached to the incoming message" - }, - "body": { - "type": "String", - "doc": "the text body of the incoming message.", - "example": "\"hello\"" - }, - "group": { - "type": "JsonGroupInfo", - "version": "v0", - "doc": "if the incoming message was sent to a v1 group, information about that group will be here" - }, - "groupV2": { - "type": "JsonGroupV2Info", - "version": "v0", - "doc": "is the incoming message was sent to a v2 group, basic identifying information about that group will be here. For full information, use list_groups" - }, - "endSession": { - "type": "boolean" - }, - "expiresInSeconds": { - "type": "int", - "doc": "the expiry timer on the incoming message. Clients should delete records of the message within this number of seconds" - }, - "profileKeyUpdate": { - "type": "boolean" - }, - "quote": { - "type": "JsonQuote", - "version": "v0", - "doc": "if the incoming message is a quote or reply to another message, this will contain information about that message" - }, - "contacts": { - "list": true, - "type": "SharedContact", - "version": "v0", - "doc": "if the incoming message has a shared contact, the contact's information will be here" - }, - "previews": { - "list": true, - "type": "JsonPreview", - "version": "v0", - "doc": "if the incoming message has a link preview, information about that preview will be here" - }, - "sticker": { - "type": "JsonSticker", - "version": "v0", - "doc": "if the incoming message is a sticker, information about the sicker will be here" - }, - "viewOnce": { - "type": "boolean", - "doc": "indicates the message is a view once message. View once messages typically include no body and a single image attachment. Official Signal clients will prevent the user from saving the image, and once the user has viewed the image once they will destroy the image." - }, - "reaction": { - "type": "JsonReaction", - "version": "v0", - "doc": "if the message adds or removes a reaction to another message, this will indicate what change is being made" - }, - "remoteDelete": { - "type": "RemoteDelete", - "version": "v0", - "doc": "if the inbound message is deleting a previously sent message, indicates which message should be deleted" - }, - "mentions": { - "list": true, - "type": "JsonMention", - "version": "v0", - "doc": "list of mentions in the message" - } - }, - "deprecated": true, - "removal_date": 1641027661 - }, - "JsonSyncMessage": { - "fields": { - "sent": { - "type": "JsonSentTranscriptMessage", - "version": "v0" - }, - "contacts": { - "type": "JsonAttachment", - "version": "v0" - }, - "contactsComplete": { - "type": "boolean" - }, - "groups": { - "type": "JsonAttachment", - "version": "v0" - }, - "blockedList": { - "type": "JsonBlockedListMessage", - "version": "v0" - }, - "request": { - "type": "String" - }, - "readMessages": { - "list": true, - "type": "JsonReadMessage", - "version": "v0" - }, - "viewOnceOpen": { - "type": "JsonViewOnceOpenMessage", - "version": "v0" - }, - "verified": { - "type": "JsonVerifiedMessage", - "version": "v0" - }, - "configuration": { - "type": "ConfigurationMessage", - "version": "v0" - }, - "stickerPackOperations": { - "list": true, - "type": "JsonStickerPackOperationMessage", - "version": "v0" - }, - "fetchType": { - "type": "String" - }, - "messageRequestResponse": { - "type": "JsonMessageRequestResponseMessage", - "version": "v0" - } - }, - "deprecated": true, - "removal_date": 1641027661 - }, - "JsonCallMessage": { - "fields": { - "offerMessage": { - "type": "OfferMessage", - "version": "v0" - }, - "answerMessage": { - "type": "AnswerMessage", - "version": "v0" - }, - "busyMessage": { - "type": "BusyMessage", - "version": "v0" - }, - "hangupMessage": { - "type": "HangupMessage", - "version": "v0" - }, - "iceUpdateMessages": { - "list": true, - "type": "IceUpdateMessage", - "version": "v0" - }, - "destinationDeviceId": { - "type": "int" - }, - "isMultiRing": { - "type": "boolean" - } - }, - "deprecated": true, - "removal_date": 1641027661 - }, - "JsonReceiptMessage": { - "fields": { - "type": { - "type": "String" - }, - "timestamps": { - "list": true, - "type": "Long" - }, - "when": { - "type": "long" - } - }, - "deprecated": true, - "removal_date": 1641027661 - }, - "JsonTypingMessage": { - "fields": { - "action": { - "type": "String" - }, - "timestamp": { - "type": "long" - }, - "groupId": { - "type": "String" - } - }, - "deprecated": true, - "removal_date": 1641027661 - }, - "JsonAttachment": { - "fields": { - "contentType": { - "type": "String" - }, - "id": { - "type": "String" - }, - "size": { - "type": "int" - }, - "storedFilename": { - "type": "String" - }, - "filename": { - "type": "String" - }, - "customFilename": { - "type": "String" - }, - "caption": { - "type": "String" - }, - "width": { - "type": "int" - }, - "height": { - "type": "int" - }, - "voiceNote": { - "type": "boolean" - }, - "key": { - "type": "String" - }, - "digest": { - "type": "String" - }, - "blurhash": { - "type": "String" - } - }, - "deprecated": true, - "removal_date": 1641027661 - }, - "JsonGroupInfo": { - "fields": { - "groupId": { - "type": "String" - }, - "members": { - "list": true, - "type": "JsonAddress", - "version": "v0" - }, - "name": { - "type": "String" - }, - "type": { - "type": "String" - }, - "avatarId": { - "type": "long" - } - }, - "deprecated": true, - "removal_date": 1641027661 - }, - "JsonGroupV2Info": { - "fields": { - "id": { - "type": "String", - "example": "\"EdSqI90cS0UomDpgUXOlCoObWvQOXlH5G3Z2d3f4ayE=\"" - }, - "revision": { - "type": "int", - "example": "5" - }, - "title": { - "type": "String", - "example": "\"Parkdale Run Club\"" - }, - "description": { - "type": "String" - }, - "avatar": { - "type": "String", - "doc": "path to the group's avatar on local disk, if available", - "example": "\"/var/lib/signald/avatars/group-EdSqI90cS0UomDpgUXOlCoObWvQOXlH5G3Z2d3f4ayE=\"" - }, - "timer": { - "type": "int", - "example": "604800" - }, - "members": { - "list": true, - "type": "JsonAddress", - "version": "v0" - }, - "pendingMembers": { - "list": true, - "type": "JsonAddress", - "version": "v0" - }, - "requestingMembers": { - "list": true, - "type": "JsonAddress", - "version": "v0" - }, - "inviteLink": { - "type": "String", - "doc": "the signal.group link, if applicable" - }, - "accessControl": { - "type": "GroupAccessControl", - "version": "v0", - "doc": "current access control settings for this group" - }, - "memberDetail": { - "list": true, - "type": "GroupMember", - "version": "v0", - "doc": "detailed member list" - }, - "pendingMemberDetail": { - "list": true, - "type": "GroupMember", - "version": "v0", - "doc": "detailed pending member list" - } - }, - "deprecated": true, - "removal_date": 1641027661 - }, - "JsonQuote": { - "fields": { - "id": { - "type": "long", - "doc": "the client timestamp of the message being quoted", - "example": "1615576442475" - }, - "author": { - "type": "JsonAddress", - "version": "v0", - "doc": "the author of the message being quoted" - }, - "text": { - "type": "String", - "doc": "the body of the message being quoted", - "example": "\"hey  what's up?\"" - }, - "attachments": { - "list": true, - "type": "JsonQuotedAttachment", - "version": "v0", - "doc": "list of files attached to the quoted message" - }, - "mentions": { - "list": true, - "type": "JsonMention", - "version": "v0", - "doc": "list of mentions in the quoted message" - } - }, - "doc": "A quote is a reply to a previous message. ID is the sent time of the message being replied to", - "deprecated": true, - "removal_date": 1641027661 - }, - "SharedContact": { - "fields": { - "name": { - "type": "Name", - "version": "v0" - }, - "avatar": { - "type": "Optional", - "version": "v0" - }, - "phone": { - "type": "Optional", - "version": "v0" - }, - "email": { - "type": "Optional", - "version": "v0" - }, - "address": { - "type": "Optional", - "version": "v0" - }, - "organization": { - "type": "Optional", - "version": "v0" - } - } - }, - "JsonPreview": { - "fields": { - "url": { - "type": "String" - }, - "title": { - "type": "String" - }, - "attachment": { - "type": "JsonAttachment", - "version": "v0" - } - }, - "deprecated": true, - "removal_date": 1641027661 - }, - "JsonSticker": { - "fields": { - "packID": { - "type": "String" - }, - "packKey": { - "type": "String" - }, - "stickerID": { - "type": "int" - }, - "attachment": { - "type": "JsonAttachment", - "version": "v0" - }, - "image": { - "type": "String" - } - }, - "deprecated": true, - "removal_date": 1641027661 - }, - "JsonReaction": { - "fields": { - "emoji": { - "type": "String", - "doc": "the emoji to react with", - "example": "\"👍\"" - }, - "remove": { - "type": "boolean", - "doc": "set to true to remove the reaction. requires emoji be set to previously reacted emoji" - }, - "targetAuthor": { - "type": "JsonAddress", - "version": "v0", - "doc": "the author of the message being reacted to" - }, - "targetSentTimestamp": { - "type": "long", - "doc": "the client timestamp of the message being reacted to", - "example": "1615576442475" - } - }, - "deprecated": true, - "removal_date": 1641027661 - }, - "RemoteDelete": { - "fields": { - "targetSentTimestamp": { - "type": "long" - } - } - }, - "JsonMention": { - "fields": { - "uuid": { - "type": "String", - "doc": "The UUID of the account being mentioned", - "example": "\"aeed01f0-a234-478e-8cf7-261c283151e7\"" - }, - "start": { - "type": "int", - "doc": "The number of characters in that the mention starts at. Note that due to a quirk of how signald encodes JSON, if this value is 0 (for example if the first character in the message is the mention) the field won't show up.", - "example": "4" - }, - "length": { - "type": "int", - "doc": "The length of the mention represented in the message. Seems to always be 1 but included here in case that changes.", - "example": "1" - } - }, - "deprecated": true, - "removal_date": 1641027661 - }, - "JsonSentTranscriptMessage": { - "fields": { - "destination": { - "type": "JsonAddress", - "version": "v0" - }, - "timestamp": { - "type": "long", - "example": "1615576442475" - }, - "expirationStartTimestamp": { - "type": "long" - }, - "message": { - "type": "JsonDataMessage", - "version": "v0" - }, - "unidentifiedStatus": { - "type": "Map" - }, - "isRecipientUpdate": { - "type": "boolean" - } - }, - "deprecated": true, - "removal_date": 1641027661 - }, - "JsonBlockedListMessage": { - "fields": { - "addresses": { - "list": true, - "type": "JsonAddress", - "version": "v0" - }, - "groupIds": { - "list": true, - "type": "String" - } - }, - "deprecated": true, - "removal_date": 1641027661 - }, - "JsonReadMessage": { - "fields": { - "sender": { - "type": "JsonAddress", - "version": "v0" - }, - "timestamp": { - "type": "long", - "example": "1615576442475" - } - }, - "deprecated": true, - "removal_date": 1641027661 - }, - "JsonViewOnceOpenMessage": { - "fields": { - "sender": { - "type": "JsonAddress", - "version": "v0" - }, - "timestamp": { - "type": "long", - "example": "1615576442475" - } - }, - "deprecated": true, - "removal_date": 1641027661 - }, - "JsonVerifiedMessage": { - "fields": { - "destination": { - "type": "JsonAddress", - "version": "v0" - }, - "identityKey": { - "type": "String" - }, - "verified": { - "type": "String" - }, - "timestamp": { - "type": "long" - } - }, - "deprecated": true, - "removal_date": 1641027661 - }, - "ConfigurationMessage": { - "fields": { - "readReceipts": { - "type": "Optional", - "version": "v0" - }, - "unidentifiedDeliveryIndicators": { - "type": "Optional", - "version": "v0" - }, - "typingIndicators": { - "type": "Optional", - "version": "v0" - }, - "linkPreviews": { - "type": "Optional", - "version": "v0" - } - } - }, - "JsonStickerPackOperationMessage": { - "fields": { - "packID": { - "type": "String" - }, - "packKey": { - "type": "String" - }, - "type": { - "type": "String" - } - }, - "deprecated": true, - "removal_date": 1641027661 - }, - "JsonMessageRequestResponseMessage": { - "fields": { - "person": { - "type": "JsonAddress", - "version": "v0" - }, - "groupId": { - "type": "String" - }, - "type": { - "type": "String" - } - }, - "deprecated": true, - "removal_date": 1641027661 - }, - "OfferMessage": { - "fields": { - "id": { - "type": "long" - }, - "sdp": { - "type": "String" - }, - "type": { - "type": "Type", - "version": "v0" - }, - "opaque": { - "type": "String" - } - } - }, - "AnswerMessage": { - "fields": { - "id": { - "type": "long" - }, - "sdp": { - "type": "String" - }, - "opaque": { - "type": "String" - } - } - }, - "BusyMessage": { - "fields": { - "id": { - "type": "long" - } - } - }, - "HangupMessage": { - "fields": { - "id": { - "type": "long" - }, - "type": { - "type": "Type", - "version": "v0" - }, - "deviceId": { - "type": "int" - }, - "legacy": { - "type": "boolean" - } - } - }, - "IceUpdateMessage": { - "fields": { - "id": { - "type": "long" - }, - "opaque": { - "type": "String" - }, - "sdp": { - "type": "String" - } - } - }, - "JsonQuotedAttachment": { - "fields": { - "contentType": { - "type": "String" - }, - "fileName": { - "type": "String" - }, - "thumbnail": { - "type": "JsonAttachment", - "version": "v0" - } - }, - "deprecated": true, - "removal_date": 1641027661 - }, - "GroupAccessControl": { - "fields": { - "link": { - "type": "String", - "doc": "UNSATISFIABLE when the group link is disabled, ADMINISTRATOR when the group link is enabled but an administrator must approve new members, ANY when the group link is enabled and no approval is required", - "example": "\"ANY\"" - }, - "attributes": { - "type": "String", - "doc": "who can edit group info" - }, - "members": { - "type": "String", - "doc": "who can add members" - } - }, - "doc": "group access control settings. Options for each controlled action are: UNKNOWN, ANY, MEMBER, ADMINISTRATOR, UNSATISFIABLE and UNRECOGNIZED", - "deprecated": true, - "removal_date": 1641027661 - }, - "GroupMember": { - "fields": { - "uuid": { - "type": "String", - "example": "\"aeed01f0-a234-478e-8cf7-261c283151e7\"" - }, - "role": { - "type": "String", - "doc": "possible values are: UNKNOWN, DEFAULT, ADMINISTRATOR and UNRECOGNIZED", - "example": "\"DEFAULT\"" - }, - "joined_revision": { - "type": "int" - } - }, - "deprecated": true, - "removal_date": 1641027661 - }, - "Name": { - "fields": { - "display": { - "type": "Optional", - "version": "v0" - }, - "given": { - "type": "Optional", - "version": "v0" - }, - "family": { - "type": "Optional", - "version": "v0" - }, - "prefix": { - "type": "Optional", - "version": "v0" - }, - "suffix": { - "type": "Optional", - "version": "v0" - }, - "middle": { - "type": "Optional", - "version": "v0" - } - } - }, - "Optional": { - "fields": { - "empty": { - "type": "boolean" - }, - "present": { - "type": "boolean" - } - } - }, - "Type": { - "fields": {} - } - }, - "v1": { - "ClientMessageWrapper": { - "fields": { - "type": { - "type": "String", - "doc": "the type of object to expect in the `data` field" - }, - "version": { - "type": "String", - "doc": "the version of the object in the `data` field" - }, - "data": { - "type": "Object", - "doc": "the incoming object. The structure will vary from message to message, see `type` and `version` fields" - }, - "error": { - "type": "Boolean", - "doc": "true if the incoming message represents an error" - }, - "account": { - "type": "String", - "doc": "the account this message is from" - } - }, - "doc": "Wraps all incoming messages sent to the client after a v1 subscribe request is issued" - }, - "ProtocolInvalidMessageError": { - "fields": { - "sender": { - "type": "String" - }, - "timestamp": { - "type": "long" - }, - "message": { - "type": "String" - }, - "sender_device": { - "type": "int" - }, - "content_hint": { - "type": "int" - }, - "group_id": { - "type": "String" - } - }, - "error": true - }, - "UntrustedIdentityError": { - "fields": { - "identifier": { - "type": "String" - }, - "message": { - "type": "String" - }, - "identity_key": { - "type": "IdentityKey", - "version": "v1" - } - }, - "error": true - }, - "ProtocolNoSessionError": { - "fields": { - "sender": { - "type": "String" - }, - "timestamp": { - "type": "long" - }, - "message": { - "type": "String" - }, - "sender_device": { - "type": "int" - }, - "content_hint": { - "type": "int" - }, - "group_id": { - "type": "String" - } - }, - "error": true - }, - "ProtocolInvalidKeyIdError": { - "fields": { - "sender": { - "type": "String" - }, - "timestamp": { - "type": "long" - }, - "message": { - "type": "String" - }, - "sender_device": { - "type": "int" - }, - "content_hint": { - "type": "int" - }, - "group_id": { - "type": "String" - } - }, - "error": true - }, - "DuplicateMessageError": { - "fields": { - "timestamp": { - "type": "long" - }, - "message": { - "type": "String" - } - }, - "error": true - }, - "IncomingMessage": { - "fields": { - "account": { - "type": "String", - "example": "\"+12024561414\"" - }, - "source": { - "type": "JsonAddress", - "version": "v1" - }, - "type": { - "type": "String" - }, - "timestamp": { - "type": "long", - "example": "1615576442475" - }, - "source_device": { - "type": "int" - }, - "server_receiver_timestamp": { - "type": "long", - "example": "1615576442475" - }, - "server_deliver_timestamp": { - "type": "long", - "example": "1615576442475" - }, - "has_legacy_message": { - "type": "boolean" - }, - "has_content": { - "type": "boolean" - }, - "unidentified_sender": { - "type": "boolean" - }, - "data_message": { - "type": "JsonDataMessage", - "version": "v1" - }, - "sync_message": { - "type": "JsonSyncMessage", - "version": "v1" - }, - "call_message": { - "type": "CallMessage", - "version": "v1" - }, - "receipt_message": { - "type": "ReceiptMessage", - "version": "v1" - }, - "typing_message": { - "type": "TypingMessage", - "version": "v1" - }, - "story_message": { - "type": "StoryMessage", - "version": "v1" - }, - "server_guid": { - "type": "String" - } - } - }, - "ListenerState": { - "fields": { - "connected": { - "type": "boolean" - } - }, - "doc": "prior attempt to indicate signald connectivity state. WebSocketConnectionState messages will be delivered at the same time as well as in other parts of the websocket lifecycle." - }, - "WebSocketConnectionState": { - "fields": { - "state": { - "type": "String", - "doc": "One of: DISCONNECTED, CONNECTING, CONNECTED, RECONNECTING, DISCONNECTING, AUTHENTICATION_FAILED, FAILED" - }, - "socket": { - "type": "String", - "doc": "One of: UNIDENTIFIED, IDENTIFIED" - } - }, - "doc": "indicates when the websocket connection state to the signal server has changed" - }, - "StorageChange": { - "fields": { - "version": { - "type": "long", - "doc": "Seems to behave like the group version numbers and increments every time the state changes" - } - }, - "doc": "Broadcast to subscribed clients when there is a state change from the storage service" - }, - "SendRequest": { - "fields": { - "username": { - "type": "String", - "example": "\"+12024561414\"" - }, - "account": { - "type": "String", - "example": "\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"" - }, - "recipientAddress": { - "type": "JsonAddress", - "version": "v1" - }, - "recipientGroupId": { - "type": "String", - "example": "\"EdSqI90cS0UomDpgUXOlCoObWvQOXlH5G3Z2d3f4ayE=\"" - }, - "messageBody": { - "type": "String", - "example": "\"hello\"" - }, - "attachments": { - "list": true, - "type": "JsonAttachment", - "version": "v1" - }, - "quote": { - "type": "JsonQuote", - "version": "v1" - }, - "timestamp": { - "type": "Long" - }, - "mentions": { - "list": true, - "type": "JsonMention", - "version": "v1" - }, - "previews": { - "list": true, - "type": "JsonPreview", - "version": "v1" - }, - "members": { - "list": true, - "type": "JsonAddress", - "version": "v1", - "doc": "Optionally set to a sub-set of group members. Ignored if recipientGroupId isn't specified" - } - } - }, - "SendResponse": { - "fields": { - "results": { - "list": true, - "type": "JsonSendMessageResult", - "version": "v1" - }, - "timestamp": { - "type": "long", - "example": "1615576442475" - } - } - }, - "NoSuchAccountError": { - "fields": { - "account": { - "type": "String" - }, - "message": { - "type": "String" - } - }, - "error": true - }, - "ServerNotFoundError": { - "fields": { - "uuid": { - "type": "String" - }, - "message": { - "type": "String" - } - }, - "error": true - }, - "InvalidProxyError": { - "fields": { - "message": { - "type": "String" - } - }, - "error": true - }, - "NoSendPermissionError": { - "fields": { - "message": { - "type": "String" - } - }, - "error": true - }, - "InvalidAttachmentError": { - "fields": { - "filename": { - "type": "String" - }, - "message": { - "type": "String" - } - }, - "error": true - }, - "InternalError": { - "fields": { - "exceptions": { - "list": true, - "type": "String" - }, - "message": { - "type": "String" - } - }, - "doc": "an internal error in signald has occurred. typically these are things that \"should never happen\" such as issues saving to the local disk, but it is also the default error type and may catch some things that should have their own error type. If you find tht your code is depending on the exception list for any particular behavior, please file an issue so we can pull those errors out to a separate error type: https://gitlab.com/signald/signald/-/issues/new", - "error": true - }, - "InvalidRequestError": { - "fields": { - "message": { - "type": "String" - } - }, - "error": true - }, - "UnknownGroupError": { - "fields": { - "message": { - "type": "String" - } - }, - "error": true - }, - "RateLimitError": { - "fields": { - "message": { - "type": "String" - } - }, - "error": true - }, - "InvalidRecipientError": { - "fields": { - "message": { - "type": "String" - } - }, - "error": true - }, - "AttachmentTooLargeError": { - "fields": { - "filename": { - "type": "String" - }, - "message": { - "type": "String" - } - }, - "error": true - }, - "AuthorizationFailedError": { - "fields": { - "message": { - "type": "String" - } - }, - "doc": "Indicates the server rejected our credentials or a failed group update. Typically means the linked device was removed by the primary device, or that the account was re-registered. For group updates, this can indicate that we lack permissions.", - "error": true - }, - "SQLError": { - "fields": { - "message": { - "type": "String" - } - }, - "error": true - }, - "ReactRequest": { - "fields": { - "username": { - "type": "String", - "example": "\"+12024561414\"", - "required": true - }, - "recipientAddress": { - "type": "JsonAddress", - "version": "v1" - }, - "recipientGroupId": { - "type": "String", - "example": "\"EdSqI90cS0UomDpgUXOlCoObWvQOXlH5G3Z2d3f4ayE=\"" - }, - "reaction": { - "type": "JsonReaction", - "version": "v1", - "required": true - }, - "timestamp": { - "type": "long" - }, - "members": { - "list": true, - "type": "JsonAddress", - "version": "v1", - "doc": "Optionally set to a sub-set of group members. Ignored if recipientGroupId isn't specified" - } - }, - "doc": "react to a previous message" - }, - "UnregisteredUserError": { - "fields": { - "message": { - "type": "String" - }, - "e164_number": { - "type": "String" - } - }, - "error": true - }, - "VersionRequest": { - "fields": {} - }, - "JsonVersionMessage": { - "fields": { - "name": { - "type": "String", - "example": "\"signald\"" - }, - "version": { - "type": "String", - "example": "\"0.18.3\"" - }, - "branch": { - "type": "String", - "example": "\"main\"" - }, - "commit": { - "type": "String", - "example": "\"2d898baa70a20c44ae918d2ce6e1f108579ee271\"" - } - } - }, - "AcceptInvitationRequest": { - "fields": { - "account": { - "type": "String", - "doc": "The account to interact with", - "example": "\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"", - "required": true - }, - "groupID": { - "type": "String", - "example": "\"EdSqI90cS0UomDpgUXOlCoObWvQOXlH5G3Z2d3f4ayE=\"", - "required": true - } - }, - "doc": "Accept a v2 group invitation. Note that you must have a profile name set to join groups." - }, - "JsonGroupV2Info": { - "fields": { - "id": { - "type": "String", - "example": "\"EdSqI90cS0UomDpgUXOlCoObWvQOXlH5G3Z2d3f4ayE=\"" - }, - "revision": { - "type": "int", - "example": "5" - }, - "title": { - "type": "String", - "example": "\"Parkdale Run Club\"" - }, - "description": { - "type": "String" - }, - "avatar": { - "type": "String", - "doc": "path to the group's avatar on local disk, if available", - "example": "\"/var/lib/signald/avatars/group-EdSqI90cS0UomDpgUXOlCoObWvQOXlH5G3Z2d3f4ayE=\"" - }, - "timer": { - "type": "int", - "example": "604800" - }, - "members": { - "list": true, - "type": "JsonAddress", - "version": "v1" - }, - "pendingMembers": { - "list": true, - "type": "JsonAddress", - "version": "v1" - }, - "requestingMembers": { - "list": true, - "type": "JsonAddress", - "version": "v1" - }, - "inviteLink": { - "type": "String", - "doc": "the signal.group link, if applicable" - }, - "accessControl": { - "type": "GroupAccessControl", - "version": "v1", - "doc": "current access control settings for this group" - }, - "memberDetail": { - "list": true, - "type": "GroupMember", - "version": "v1", - "doc": "detailed member list" - }, - "pendingMemberDetail": { - "list": true, - "type": "GroupMember", - "version": "v1", - "doc": "detailed pending member list" - }, - "announcements": { - "type": "String", - "doc": "indicates if the group is an announcements group. Only admins are allowed to send messages to announcements groups. Options are UNKNOWN, ENABLED or DISABLED" - }, - "removed": { - "type": "boolean", - "doc": "will be set to true for incoming messages to indicate the user has been removed from the group" - }, - "banned_members": { - "list": true, - "type": "BannedGroupMember", - "version": "v1" - }, - "group_change": { - "type": "GroupChange", - "version": "v1", - "doc": "Represents a peer-to-peer group change done by a user. Will not be set if the group change signature fails verification. This is usually only set inside of incoming messages." - } - }, - "doc": "Information about a Signal group" - }, - "OwnProfileKeyDoesNotExistError": { - "fields": { - "message": { - "type": "String" - } - }, - "error": true - }, - "GroupPatchNotAcceptedError": { - "fields": { - "message": { - "type": "String" - } - }, - "doc": "Indicates the server rejected our group update. This can be due to errors such as trying to add a user that's already in the group.", - "error": true - }, - "ApproveMembershipRequest": { - "fields": { - "account": { - "type": "String", - "doc": "The account to interact with", - "example": "\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"", - "required": true - }, - "groupID": { - "type": "String", - "example": "\"EdSqI90cS0UomDpgUXOlCoObWvQOXlH5G3Z2d3f4ayE=\"", - "required": true - }, - "members": { - "list": true, - "type": "JsonAddress", - "version": "v1", - "doc": "list of requesting members to approve", - "required": true - } - }, - "doc": "approve a request to join a group" - }, - "GroupVerificationError": { - "fields": { - "message": { - "type": "String" - } - }, - "error": true - }, - "GetGroupRequest": { - "fields": { - "account": { - "type": "String", - "doc": "The account to interact with", - "example": "\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"", - "required": true - }, - "groupID": { - "type": "String", - "example": "\"EdSqI90cS0UomDpgUXOlCoObWvQOXlH5G3Z2d3f4ayE=\"", - "required": true - }, - "revision": { - "type": "int", - "doc": "the latest known revision, default value (-1) forces fetch from server" - } - }, - "doc": "Query the server for the latest state of a known group. If the account is not a member of the group, an UnknownGroupError is returned." - }, - "InvalidGroupStateError": { - "fields": { - "message": { - "type": "String" - } - }, - "error": true - }, - "GetLinkedDevicesRequest": { - "fields": { - "account": { - "type": "String", - "doc": "The account to interact with", - "example": "\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"", - "required": true - } - }, - "doc": "list all linked devices on a Signal account" - }, - "LinkedDevices": { - "fields": { - "devices": { - "list": true, - "type": "DeviceInfo", - "version": "v1" - } - } - }, - "JoinGroupRequest": { - "fields": { - "account": { - "type": "String", - "doc": "The account to interact with", - "example": "\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"", - "required": true - }, - "uri": { - "type": "String", - "doc": "The signal.group URL", - "example": "\"https://signal.group/#CjQKINH_GZhXhfifTcnBkaKTNRxW-hHKnGSq-cJNyPVqHRp8EhDUB7zjKNEl0NaULhsqJCX3\"", - "required": true - } - }, - "doc": "Join a group using the a signal.group URL. Note that you must have a profile name set to join groups." - }, - "JsonGroupJoinInfo": { - "fields": { - "groupID": { - "type": "String", - "example": "\"EdSqI90cS0UomDpgUXOlCoObWvQOXlH5G3Z2d3f4ayE=\"" - }, - "title": { - "type": "String", - "example": "\"Parkdale Run Club\"" - }, - "description": { - "type": "String", - "example": "\"A club for running in Parkdale\"" - }, - "memberCount": { - "type": "int", - "example": "3" - }, - "addFromInviteLink": { - "type": "int", - "doc": "The access level required in order to join the group from the invite link, as an AccessControl.AccessRequired enum from the upstream Signal groups.proto file. This is UNSATISFIABLE (4) when the group link is disabled; ADMINISTRATOR (3) when the group link is enabled, but an administrator must approve new members; and ANY (1) when the group link is enabled and no approval is required. See theGroupAccessControl structure and the upstream enum ordinals." - }, - "revision": { - "type": "int", - "doc": "The Group V2 revision. This is incremented by clients whenever they update group information, and it is often used by clients to determine if the local group state is out-of-date with the server's revision.", - "example": "5" - }, - "pendingAdminApproval": { - "type": "boolean", - "doc": "Whether the account is waiting for admin approval in order to be added to the group." - } - } - }, - "InvalidInviteURIError": { - "fields": { - "message": { - "type": "String" - } - }, - "error": true - }, - "GroupNotActiveError": { - "fields": { - "message": { - "type": "String" - } - }, - "error": true - }, - "RemoveLinkedDeviceRequest": { - "fields": { - "account": { - "type": "String", - "doc": "The account to interact with", - "example": "\"+12024561414\"", - "required": true - }, - "deviceId": { - "type": "long", - "doc": "the ID of the device to unlink", - "example": "3", - "required": true - } - }, - "doc": "Remove a linked device from the Signal account. Only allowed when the local device id is 1" - }, - "UpdateGroupRequest": { - "fields": { - "account": { - "type": "String", - "doc": "The identifier of the account to interact with", - "example": "\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"", - "required": true - }, - "groupID": { - "type": "String", - "doc": "the ID of the group to update", - "example": "\"EdSqI90cS0UomDpgUXOlCoObWvQOXlH5G3Z2d3f4ayE=\"", - "required": true - }, - "title": { - "type": "String", - "example": "\"Parkdale Run Club\"" - }, - "description": { - "type": "String", - "doc": "A new group description. Set to empty string to remove an existing description.", - "example": "\"A club for running in Parkdale\"" - }, - "avatar": { - "type": "String", - "example": "\"/tmp/image.jpg\"" - }, - "updateTimer": { - "type": "int", - "doc": "update the group timer." - }, - "addMembers": { - "list": true, - "type": "JsonAddress", - "version": "v1" - }, - "removeMembers": { - "list": true, - "type": "JsonAddress", - "version": "v1" - }, - "updateRole": { - "type": "GroupMember", - "version": "v1" - }, - "updateAccessControl": { - "type": "GroupAccessControl", - "version": "v1", - "doc": "note that only one of the access controls may be updated per request" - }, - "resetLink": { - "type": "boolean", - "doc": "regenerate the group link password, invalidating the old one" - }, - "announcements": { - "type": "String", - "doc": "ENABLED to only allow admins to post messages, DISABLED to allow anyone to post" - } - }, - "doc": "modify a group. Note that only one modification action may be performed at once" - }, - "GroupInfo": { - "fields": { - "v1": { - "type": "JsonGroupInfo", - "version": "v1" - }, - "v2": { - "type": "JsonGroupV2Info", - "version": "v1" - } - }, - "doc": "A generic type that is used when the group version is not known" - }, - "SetProfile": { - "fields": { - "account": { - "type": "String", - "doc": "The phone number of the account to use", - "example": "\"+12024561414\"", - "required": true - }, - "name": { - "type": "String", - "doc": "Change the profile name", - "example": "\"signald user\"" - }, - "avatarFile": { - "type": "String", - "doc": "Path to new profile avatar file. If unset or null, unset the profile avatar", - "example": "\"/tmp/image.jpg\"" - }, - "about": { - "type": "String", - "doc": "Change the 'about' profile field" - }, - "emoji": { - "type": "String", - "doc": "Change the profile emoji" - }, - "mobilecoin_address": { - "type": "String", - "doc": "Change the profile payment address. Payment address must be a *base64-encoded* MobileCoin address. Note that this is not the traditional MobileCoin address encoding, which is custom. Clients are responsible for converting between MobileCoin's custom base58 on the user-facing side and base64 encoding on the signald side." - }, - "visible_badge_ids": { - "list": true, - "type": "String", - "doc": "configure visible badge IDs" - } - } - }, - "InvalidBase64Error": { - "fields": { - "message": { - "type": "String" - } - }, - "error": true - }, - "ResolveAddressRequest": { - "fields": { - "account": { - "type": "String", - "doc": "The signal account to use", - "example": "\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"", - "required": true - }, - "partial": { - "type": "JsonAddress", - "version": "v1", - "doc": "The partial address, missing fields", - "required": true - } - }, - "doc": "Resolve a partial JsonAddress with only a number or UUID to one with both. Anywhere that signald accepts a JsonAddress will except a partial, this is a convenience function for client authors, mostly because signald doesn't resolve all the partials it returns." - }, - "JsonAddress": { - "fields": { - "number": { - "type": "String", - "doc": "An e164 phone number, starting with +. Currently the only available user-facing Signal identifier.", - "example": "\"+13215551234\"" - }, - "uuid": { - "type": "UUID", - "doc": "A UUID, the unique identifier for a particular Signal account." - }, - "relay": { - "type": "String" - } - } - }, - "MarkReadRequest": { - "fields": { - "account": { - "type": "String", - "doc": "The account to interact with", - "example": "\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"", - "required": true - }, - "to": { - "type": "JsonAddress", - "version": "v1", - "doc": "The address that sent the message being marked as read", - "required": true - }, - "timestamps": { - "list": true, - "type": "Long", - "doc": "List of messages to mark as read", - "example": "1615576442475", - "required": true - }, - "when": { - "type": "Long" - } - } - }, - "GetProfileRequest": { - "fields": { - "account": { - "type": "String", - "doc": "the signald account to use", - "example": "\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"", - "required": true - }, - "async": { - "type": "boolean", - "doc": "if true, return results from local store immediately, refreshing from server in the background if needed. if false (default), block until profile can be retrieved from server" - }, - "address": { - "type": "JsonAddress", - "version": "v1", - "doc": "the address to look up", - "required": true - } - }, - "doc": "Get all information available about a user" - }, - "Profile": { - "fields": { - "name": { - "type": "String", - "doc": "The user's name from local contact names if available, or if not in contact list their Signal profile name" - }, - "avatar": { - "type": "String", - "doc": "path to avatar on local disk" - }, - "address": { - "type": "JsonAddress", - "version": "v1" - }, - "capabilities": { - "type": "Capabilities", - "version": "v1" - }, - "color": { - "type": "String", - "doc": "color of the chat with this user" - }, - "about": { - "type": "String" - }, - "emoji": { - "type": "String" - }, - "profile_name": { - "type": "String", - "doc": "The user's Signal profile name" - }, - "inbox_position": { - "type": "Integer" - }, - "expiration_time": { - "type": "int" - }, - "mobilecoin_address": { - "type": "String", - "doc": "*base64-encoded* mobilecoin address. Note that this is not the traditional MobileCoin address encoding. Clients are responsible for converting between MobileCoin's custom base58 on the user-facing side and base64 encoding on the signald side. If unset, null or an empty string, will empty the profile payment address" - }, - "visible_badge_ids": { - "list": true, - "type": "String", - "doc": "currently unclear how these work, as they are not available in the production Signal apps" - } - }, - "doc": "Information about a Signal user" - }, - "ProfileUnavailableError": { - "fields": { - "message": { - "type": "String" - } - }, - "error": true - }, - "ListGroupsRequest": { - "fields": { - "account": { - "type": "String", - "example": "\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"", - "required": true - } - } - }, - "GroupList": { - "fields": { - "groups": { - "list": true, - "type": "JsonGroupV2Info", - "version": "v1" - }, - "legacyGroups": { - "list": true, - "type": "JsonGroupInfo", - "version": "v1" - } - } - }, - "ListContactsRequest": { - "fields": { - "account": { - "type": "String", - "example": "\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"", - "required": true - }, - "async": { - "type": "boolean", - "doc": "return results from local store immediately, refreshing from server afterward if needed. If false (default), block until all pending profiles have been retrieved." - } - } - }, - "ProfileList": { - "fields": { - "profiles": { - "list": true, - "type": "Profile", - "version": "v1" - } - } - }, - "CreateGroupRequest": { - "fields": { - "account": { - "type": "String", - "doc": "The account to interact with", - "example": "\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"", - "required": true - }, - "title": { - "type": "String", - "example": "\"Parkdale Run Club\"", - "required": true - }, - "avatar": { - "type": "String", - "example": "\"/tmp/image.jpg\"" - }, - "members": { - "list": true, - "type": "JsonAddress", - "version": "v1", - "required": true - }, - "timer": { - "type": "int", - "doc": "the message expiration timer" - }, - "member_role": { - "type": "String", - "doc": "The role of all members other than the group creator. Options are ADMINISTRATOR or DEFAULT (case insensitive)", - "example": "\"ADMINISTRATOR\"" - } - } - }, - "NoKnownUUIDError": { - "fields": { - "message": { - "type": "String" - } - }, - "error": true - }, - "LeaveGroupRequest": { - "fields": { - "account": { - "type": "String", - "doc": "The account to use", - "example": "\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"", - "required": true - }, - "groupID": { - "type": "String", - "doc": "The group to leave", - "example": "\"EdSqI90cS0UomDpgUXOlCoObWvQOXlH5G3Z2d3f4ayE=\"", - "required": true - } - } - }, - "GenerateLinkingURIRequest": { - "fields": { - "server": { - "type": "String", - "doc": "The identifier of the server to use. Leave blank for default (usually Signal production servers but configurable at build time)" - } - }, - "doc": "Generate a linking URI. Typically this is QR encoded and scanned by the primary device. Submit the returned session_id with a finish_link request." - }, - "LinkingURI": { - "fields": { - "uri": { - "type": "String" - }, - "session_id": { - "type": "String" - } - } - }, - "FinishLinkRequest": { - "fields": { - "overwrite": { - "type": "boolean", - "doc": "overwrite existing account data if the phone number conflicts. false by default" - }, - "device_name": { - "type": "String" - }, - "session_id": { - "type": "String" - } - }, - "doc": "After a linking URI has been requested, finish_link must be called with the session_id provided with the URI. it will return information about the new account once the linking process is completed by the other device and the new account is setup. Note that the account setup process can sometimes take some time, if rapid userfeedback is required after scanning, use wait_for_scan first, then finish setup with finish_link." - }, - "Account": { - "fields": { - "address": { - "type": "JsonAddress", - "version": "v1", - "doc": "The address of this account" - }, - "pending": { - "type": "Boolean", - "doc": "indicates the account has not completed registration" - }, - "pni": { - "type": "String" - }, - "device_id": { - "type": "int", - "doc": "The Signal device ID. Official Signal mobile clients (iPhone and Android) have device ID = 1, while linked devices such as Signal Desktop or Signal iPad have higher device IDs." - }, - "account_id": { - "type": "String", - "doc": "The primary identifier on the account, included with all requests to signald for this account. Previously called 'username'" - } - }, - "doc": "A local account in signald" - }, - "NoSuchSessionError": { - "fields": { - "message": { - "type": "String" - } - }, - "error": true - }, - "UserAlreadyExistsError": { - "fields": { - "uuid": { - "type": "UUID" - }, - "message": { - "type": "String" - } - }, - "error": true - }, - "ScanTimeoutError": { - "fields": { - "message": { - "type": "String" - } - }, - "error": true - }, - "AddLinkedDeviceRequest": { - "fields": { - "account": { - "type": "String", - "doc": "The account to interact with", - "example": "\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"", - "required": true - }, - "uri": { - "type": "String", - "doc": "the sgnl://linkdevice uri provided (typically in qr code form) by the new device", - "example": "\"sgnl://linkdevice?uuid=jAaZ5lxLfh7zVw5WELd6-Q&pub_key=BfFbjSwmAgpVJBXUdfmSgf61eX3a%2Bq9AoxAVpl1HUap9\"", - "required": true - } - }, - "doc": "Link a new device to a local Signal account" - }, - "RegisterRequest": { - "fields": { - "account": { - "type": "String", - "doc": "the e164 phone number to register with", - "example": "\"+12024561414\"", - "required": true - }, - "voice": { - "type": "boolean", - "doc": "set to true to request a voice call instead of an SMS for verification" - }, - "captcha": { - "type": "String", - "doc": "See https://signald.org/articles/captcha/" - }, - "server": { - "type": "String", - "doc": "The identifier of the server to use. Leave blank for default (usually Signal production servers but configurable at build time)" - } - }, - "doc": "begin the account registration process by requesting a phone number verification code. when the code is received, submit it with a verify request" - }, - "CaptchaRequiredError": { - "fields": { - "more": { - "type": "String" - }, - "message": { - "type": "String" - } - }, - "error": true - }, - "VerifyRequest": { - "fields": { - "account": { - "type": "String", - "doc": "the e164 phone number being verified", - "example": "\"+12024561414\"", - "required": true - }, - "code": { - "type": "String", - "doc": "the verification code, dash (-) optional", - "example": "\"555555\"", - "required": true - } - }, - "doc": "verify an account's phone number with a code after registering, completing the account creation process" - }, - "AccountHasNoKeysError": { - "fields": { - "message": { - "type": "String" - } - }, - "error": true - }, - "AccountAlreadyVerifiedError": { - "fields": { - "message": { - "type": "String" - } - }, - "error": true - }, - "AccountLockedError": { - "fields": { - "more": { - "type": "String" - }, - "message": { - "type": "String" - } - }, - "error": true - }, - "GetIdentitiesRequest": { - "fields": { - "account": { - "type": "String", - "doc": "The account to interact with", - "example": "\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"", - "required": true - }, - "address": { - "type": "JsonAddress", - "version": "v1", - "doc": "address to get keys for", - "required": true - } - }, - "doc": "Get information about a known keys for a particular address" - }, - "IdentityKeyList": { - "fields": { - "address": { - "type": "JsonAddress", - "version": "v1" - }, - "identities": { - "list": true, - "type": "IdentityKey", - "version": "v1" - } - }, - "doc": "a list of identity keys associated with a particular address" - }, - "TrustRequest": { - "fields": { - "account": { - "type": "String", - "doc": "The account to interact with", - "example": "\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"", - "required": true - }, - "address": { - "type": "JsonAddress", - "version": "v1", - "doc": "The user to query identity keys for", - "required": true - }, - "safety_number": { - "type": "String", - "doc": "required if qr_code_data is absent", - "example": "\"373453558586758076680580548714989751943247272727416091564451\"" - }, - "qr_code_data": { - "type": "String", - "doc": "base64-encoded QR code data. required if safety_number is absent" - }, - "trust_level": { - "type": "String", - "doc": "One of TRUSTED_UNVERIFIED, TRUSTED_VERIFIED or UNTRUSTED. Default is TRUSTED_VERIFIED", - "example": "\"TRUSTED_VERIFIED\"" - } - }, - "doc": "Trust another user's safety number using either the QR code data or the safety number text" - }, - "FingerprintVersionMismatchError": { - "fields": { - "message": { - "type": "String" - } - }, - "error": true - }, - "UnknownIdentityKeyError": { - "fields": { - "message": { - "type": "String" - } - }, - "error": true - }, - "InvalidFingerprintError": { - "fields": { - "message": { - "type": "String" - } - }, - "error": true - }, - "DeleteAccountRequest": { - "fields": { - "account": { - "type": "String", - "doc": "The account to delete", - "example": "\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"", - "required": true - }, - "server": { - "type": "boolean", - "doc": "delete account information from the server as well (default false)" - } - }, - "doc": "delete all account data signald has on disk, and optionally delete the account from the server as well. Note that this is not \"unlink\" and will delete the entire account, even from a linked device." - }, - "TypingRequest": { - "fields": { - "account": { - "type": "String", - "doc": "The account to use", - "example": "\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"", - "required": true - }, - "address": { - "type": "JsonAddress", - "version": "v1" - }, - "group": { - "type": "String", - "example": "\"EdSqI90cS0UomDpgUXOlCoObWvQOXlH5G3Z2d3f4ayE=\"" - }, - "typing": { - "type": "boolean", - "example": "true", - "required": true - }, - "when": { - "type": "long" - } - }, - "doc": "send a typing started or stopped message" - }, - "InvalidGroupError": { - "fields": { - "message": { - "type": "String" - } - }, - "error": true - }, - "ResetSessionRequest": { - "fields": { - "account": { - "type": "String", - "doc": "The account to use", - "example": "\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"", - "required": true - }, - "address": { - "type": "JsonAddress", - "version": "v1", - "doc": "the user to reset session with", - "required": true - }, - "timestamp": { - "type": "Long" - } - }, - "doc": "reset a session with a particular user" - }, - "RequestSyncRequest": { - "fields": { - "groups": { - "type": "boolean", - "doc": "request group sync (default true)" - }, - "configuration": { - "type": "boolean", - "doc": "request configuration sync (default true)" - }, - "contacts": { - "type": "boolean", - "doc": "request contact sync (default true)" - }, - "blocked": { - "type": "boolean", - "doc": "request block list sync (default true)" - }, - "keys": { - "type": "boolean", - "doc": "request storage service keys" - }, - "account": { - "type": "String", - "doc": "The account to use", - "example": "\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"", - "required": true - } - }, - "doc": "Request other devices on the account send us their group list, syncable config and contact list." - }, - "ListAccountsRequest": { - "fields": {}, - "doc": "return all local accounts" - }, - "AccountList": { - "fields": { - "accounts": { - "list": true, - "type": "Account", - "version": "v1" - } - } - }, - "GroupLinkInfoRequest": { - "fields": { - "account": { - "type": "String", - "doc": "The account to use", - "example": "\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"", - "required": true - }, - "uri": { - "type": "String", - "doc": "the signald.group link", - "example": "\"https://signal.group/#CjQKINH_GZhXhfifTcnBkaKTNRxW-hHKnGSq-cJNyPVqHRp8EhDUB7zjKNEl0NaULhsqJCX3\"", - "required": true - } - }, - "doc": "Get information about a group from a signal.group link" - }, - "GroupLinkNotActiveError": { - "fields": { - "message": { - "type": "String" - } - }, - "error": true - }, - "UpdateContactRequest": { - "fields": { - "account": { - "type": "String", - "example": "\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"", - "required": true - }, - "address": { - "type": "JsonAddress", - "version": "v1", - "required": true - }, - "name": { - "type": "String" - }, - "color": { - "type": "String" - }, - "inbox_position": { - "type": "Integer" - } - }, - "doc": "update information about a local contact" - }, - "SetExpirationRequest": { - "fields": { - "account": { - "type": "String", - "doc": "The account to use", - "example": "\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"", - "required": true - }, - "address": { - "type": "JsonAddress", - "version": "v1" - }, - "group": { - "type": "String", - "example": "\"EdSqI90cS0UomDpgUXOlCoObWvQOXlH5G3Z2d3f4ayE=\"" - }, - "expiration": { - "type": "int", - "example": "604800", - "required": true - } - }, - "doc": "Set the message expiration timer for a thread. Expiration must be specified in seconds, set to 0 to disable timer" - }, - "SetDeviceNameRequest": { - "fields": { - "account": { - "type": "String", - "doc": "The account to set the device name of", - "example": "\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"", - "required": true - }, - "device_name": { - "type": "String", - "doc": "The device name" - } - }, - "doc": "set this device's name. This will show up on the mobile device on the same account under settings -> linked devices" - }, - "GetAllIdentities": { - "fields": { - "account": { - "type": "String", - "doc": "The account to interact with", - "example": "\"+12024561414\"", - "required": true - } - }, - "doc": "get all known identity keys" - }, - "AllIdentityKeyList": { - "fields": { - "identity_keys": { - "list": true, - "type": "IdentityKeyList", - "version": "v1" - } - } - }, - "SubscribeRequest": { - "fields": { - "account": { - "type": "String", - "doc": "The account to subscribe to incoming message for", - "example": "\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"", - "required": true - } - }, - "doc": "receive incoming messages. After making a subscribe request, incoming messages will be sent to the client encoded as ClientMessageWrapper. Send an unsubscribe request or disconnect from the socket to stop receiving messages." - }, - "UnsubscribeRequest": { - "fields": { - "account": { - "type": "String", - "doc": "The account to unsubscribe from", - "example": "\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"", - "required": true - } - }, - "doc": "See subscribe for more info" - }, - "RemoteDeleteRequest": { - "fields": { - "account": { - "type": "String", - "doc": "the account to use", - "example": "\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"", - "required": true - }, - "address": { - "type": "JsonAddress", - "version": "v1", - "doc": "the address to send the delete message to. should match address the message to be deleted was sent to. required if group is not set." - }, - "group": { - "type": "String", - "doc": "the group to send the delete message to. should match group the message to be deleted was sent to. required if address is not set.", - "example": "\"EdSqI90cS0UomDpgUXOlCoObWvQOXlH5G3Z2d3f4ayE=\"" - }, - "timestamp": { - "type": "long", - "required": true - }, - "members": { - "list": true, - "type": "JsonAddress", - "version": "v1", - "doc": "Optionally set to a sub-set of group members. Ignored if group isn't specified" - } - }, - "doc": "delete a message previously sent" - }, - "AddServerRequest": { - "fields": { - "server": { - "type": "Server", - "version": "v1", - "required": true - } - }, - "doc": "add a new server to connect to. Returns the new server's UUID." - }, - "GetServersRequest": { - "fields": {} - }, - "ServerList": { - "fields": { - "servers": { - "list": true, - "type": "Server", - "version": "v1" - } - } - }, - "RemoveServerRequest": { - "fields": { - "uuid": { - "type": "String" - } - } - }, - "SendPaymentRequest": { - "fields": { - "account": { - "type": "String", - "doc": "the account to use", - "example": "\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"", - "required": true - }, - "address": { - "type": "JsonAddress", - "version": "v1", - "doc": "the address to send the payment message to", - "required": true - }, - "payment": { - "type": "Payment", - "version": "v1", - "required": true - }, - "when": { - "type": "Long" - } - }, - "doc": "send a mobilecoin payment" - }, - "RemoteConfigRequest": { - "fields": { - "account": { - "type": "String", - "doc": "The account to use to retrieve the remote config", - "example": "\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"", - "required": true - } - }, - "doc": "Retrieves the remote config (feature flags) from the server." - }, - "RemoteConfigList": { - "fields": { - "config": { - "list": true, - "type": "RemoteConfig", - "version": "v1" - } - } - }, - "RefuseMembershipRequest": { - "fields": { - "account": { - "type": "String", - "doc": "The account to interact with", - "example": "\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"", - "required": true - }, - "members": { - "list": true, - "type": "JsonAddress", - "version": "v1", - "doc": "list of requesting members to refuse", - "required": true - }, - "group_id": { - "type": "String", - "example": "\"EdSqI90cS0UomDpgUXOlCoObWvQOXlH5G3Z2d3f4ayE=\"", - "required": true - }, - "also_ban": { - "type": "boolean" - } - }, - "doc": "deny a request to join a group" - }, - "SubmitChallengeRequest": { - "fields": { - "account": { - "type": "String", - "example": "\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"", - "required": true - }, - "challenge": { - "type": "String", - "required": true - }, - "captcha_token": { - "type": "String" - } - } - }, - "IsIdentifierRegisteredRequest": { - "fields": { - "account": { - "type": "String", - "doc": "The account to use to use", - "example": "\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"", - "required": true - }, - "identifier": { - "type": "String", - "doc": "The UUID of an identifier to check if it is registered on Signal. This UUID is either a Phone Number Identity (PNI) or an Account Identity (ACI).", - "example": "\"aeed01f0-a234-478e-8cf7-261c283151e7\"", - "required": true - } - }, - "doc": "Determine whether an account identifier is registered on the Signal service." - }, - "BooleanMessage": { - "fields": { - "value": { - "type": "boolean" - } - }, - "doc": "A message containing a single boolean, usually as a response" - }, - "WaitForScanRequest": { - "fields": { - "session_id": { - "type": "String" - } - }, - "doc": "An optional part of the linking process. Intended to be called after displaying the QR code, will return quickly after the user scans the QR code. finish_link must be called after wait_for_scan returns a non-error" - }, - "GetGroupRevisionPagesRequest": { - "fields": { - "account": { - "type": "String", - "doc": "The account to interact with", - "example": "\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"", - "required": true - }, - "group_id": { - "type": "String", - "example": "\"EdSqI90cS0UomDpgUXOlCoObWvQOXlH5G3Z2d3f4ayE=\"", - "required": true - }, - "from_revision": { - "type": "int", - "doc": "The revision to start the pages from. Note that if this is lower than the revision you joined the group, an AuthorizationFailedError is returned.", - "required": true - }, - "include_first_revision": { - "type": "boolean", - "doc": "Whether to include the first state in the returned pages (default false)" - } - }, - "doc": "Query the server for group revision history. The history contains information about the changes between each revision and the user that made the change." - }, - "GroupHistoryPage": { - "fields": { - "results": { - "list": true, - "type": "GroupHistoryEntry", - "version": "v1" - }, - "paging_data": { - "type": "PagingData", - "version": "v1" - } - }, - "doc": "The result of fetching a group's history along with paging data." - }, - "SendSyncMessageRequest": { - "fields": { - "account": { - "type": "String", - "example": "\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"", - "required": true - }, - "view_once_open_message": { - "type": "JsonViewOnceOpenMessage", - "version": "v1", - "doc": "This can be set to indicate to other devices about having viewed a view-once message." - }, - "message_request_response": { - "type": "JsonMessageRequestResponseMessage", - "version": "v1", - "doc": "This can be set to indicate to other devices about a response to an incoming message request from an unknown user or group. Warning: Using the BLOCK and BLOCK_AND_DELETE options relies on other devices to do the blocking, and it does not make you leave the group!" - } - }, - "doc": "Sends a sync message to the account's devices" - }, - "JsonSendMessageResult": { - "fields": { - "address": { - "type": "JsonAddress", - "version": "v1" - }, - "success": { - "type": "SendSuccess", - "version": "v1" - }, - "networkFailure": { - "type": "boolean", - "example": "false" - }, - "unregisteredFailure": { - "type": "boolean", - "example": "false" - }, - "identityFailure": { - "type": "String" - }, - "proof_required_failure": { - "type": "ProofRequiredError", - "version": "v1" - } - } - }, - "BanUserRequest": { - "fields": { - "account": { - "type": "String", - "doc": "The account to interact with", - "example": "\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"", - "required": true - }, - "group_id": { - "type": "String", - "example": "\"EdSqI90cS0UomDpgUXOlCoObWvQOXlH5G3Z2d3f4ayE=\"", - "required": true - }, - "users": { - "list": true, - "type": "JsonAddress", - "version": "v1", - "doc": "List of users to ban", - "required": true - } - }, - "doc": "Bans users from a group. This works even if the users aren't in the group. If they are currently in the group, they will also be removed." - }, - "UnbanUserRequest": { - "fields": { - "account": { - "type": "String", - "doc": "The account to interact with", - "example": "\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"", - "required": true - }, - "group_id": { - "type": "String", - "example": "\"EdSqI90cS0UomDpgUXOlCoObWvQOXlH5G3Z2d3f4ayE=\"", - "required": true - }, - "users": { - "list": true, - "type": "JsonAddress", - "version": "v1", - "doc": "List of users to unban", - "required": true - } - }, - "doc": "Unbans users from a group." - }, - "IdentityKey": { - "fields": { - "added": { - "type": "long", - "doc": "the first time this identity key was seen" - }, - "safety_number": { - "type": "String", - "example": "\"373453558586758076680580548714989751943247272727416091564451\"" - }, - "qr_code_data": { - "type": "String", - "doc": "base64-encoded QR code data" - }, - "trust_level": { - "type": "String", - "doc": "One of TRUSTED_UNVERIFIED, TRUSTED_VERIFIED or UNTRUSTED" - } - } - }, - "JsonDataMessage": { - "fields": { - "timestamp": { - "type": "long", - "doc": "the timestamp that the message was sent at, according to the sender's device. This is used to uniquely identify this message for things like reactions and quotes.", - "example": "1615576442475" - }, - "attachments": { - "list": true, - "type": "JsonAttachment", - "version": "v1", - "doc": "files attached to the incoming message" - }, - "body": { - "type": "String", - "doc": "the text body of the incoming message.", - "example": "\"hello\"" - }, - "group": { - "type": "JsonGroupInfo", - "version": "v1", - "doc": "if the incoming message was sent to a v1 group, information about that group will be here" - }, - "groupV2": { - "type": "JsonGroupV2Info", - "version": "v1", - "doc": "if the incoming message was sent to a v2 group, basic identifying information about that group will be here. If group information changes, JsonGroupV2Info.revision is incremented. If the group revision is higher than previously seen, a client can retrieve the group information by calling get_group." - }, - "endSession": { - "type": "boolean" - }, - "expiresInSeconds": { - "type": "int", - "doc": "the expiry timer on the incoming message. Clients should delete records of the message within this number of seconds" - }, - "profileKeyUpdate": { - "type": "boolean" - }, - "quote": { - "type": "JsonQuote", - "version": "v1", - "doc": "if the incoming message is a quote or reply to another message, this will contain information about that message" - }, - "contacts": { - "list": true, - "type": "SharedContact", - "version": "v1", - "doc": "if the incoming message has a shared contact, the contact's information will be here" - }, - "previews": { - "list": true, - "type": "JsonPreview", - "version": "v1", - "doc": "if the incoming message has a link preview, information about that preview will be here" - }, - "sticker": { - "type": "JsonSticker", - "version": "v0", - "doc": "if the incoming message is a sticker, information about the sicker will be here" - }, - "viewOnce": { - "type": "boolean", - "doc": "indicates the message is a view once message. View once messages typically include no body and a single image attachment. Official Signal clients will prevent the user from saving the image, and once the user has viewed the image once they will destroy the image." - }, - "reaction": { - "type": "JsonReaction", - "version": "v1", - "doc": "if the message adds or removes a reaction to another message, this will indicate what change is being made" - }, - "remoteDelete": { - "type": "RemoteDelete", - "version": "v1", - "doc": "if the inbound message is deleting a previously sent message, indicates which message should be deleted" - }, - "mentions": { - "list": true, - "type": "JsonMention", - "version": "v1", - "doc": "list of mentions in the message" - }, - "payment": { - "type": "Payment", - "version": "v1", - "doc": "details about the MobileCoin payment attached to the message, if present" - }, - "is_expiration_update": { - "type": "boolean", - "doc": "whether or not this message changes the expiresInSeconds value for the whole chat. Some messages (remote deletes, reactions, etc) will have expiresInSeconds=0 even though the chat has disappearing messages enabled." - }, - "group_call_update": { - "type": "String", - "doc": "the eraId string from a group call message update" - }, - "story_context": { - "type": "StoryContext", - "version": "v1" - } - } - }, - "JsonSyncMessage": { - "fields": { - "sent": { - "type": "JsonSentTranscriptMessage", - "version": "v1" - }, - "contacts": { - "type": "JsonAttachment", - "version": "v1" - }, - "contactsComplete": { - "type": "boolean" - }, - "groups": { - "type": "JsonAttachment", - "version": "v1" - }, - "blockedList": { - "type": "JsonBlockedListMessage", - "version": "v1" - }, - "request": { - "type": "String" - }, - "readMessages": { - "list": true, - "type": "JsonReadMessage", - "version": "v1" - }, - "viewOnceOpen": { - "type": "JsonViewOnceOpenMessage", - "version": "v1" - }, - "verified": { - "type": "JsonVerifiedMessage", - "version": "v1" - }, - "configuration": { - "type": "ConfigurationMessage", - "version": "v0" - }, - "stickerPackOperations": { - "list": true, - "type": "JsonStickerPackOperationMessage", - "version": "v0" - }, - "fetchType": { - "type": "String" - }, - "messageRequestResponse": { - "type": "JsonMessageRequestResponseMessage", - "version": "v1" - } - } - }, - "CallMessage": { - "fields": { - "offer_message": { - "type": "OfferMessage", - "version": "v1" - }, - "answer_message": { - "type": "AnswerMessage", - "version": "v1" - }, - "busy_message": { - "type": "BusyMessage", - "version": "v1" - }, - "hangup_message": { - "type": "HangupMessage", - "version": "v1" - }, - "ice_update_message": { - "list": true, - "type": "IceUpdateMessage", - "version": "v1" - }, - "destination_device_id": { - "type": "Integer" - }, - "multi_ring": { - "type": "boolean" - } - } - }, - "ReceiptMessage": { - "fields": { - "type": { - "type": "String", - "doc": "options: UNKNOWN, DELIVERY, READ, VIEWED" - }, - "timestamps": { - "list": true, - "type": "Long" - }, - "when": { - "type": "long" - } - } - }, - "TypingMessage": { - "fields": { - "action": { - "type": "String" - }, - "timestamp": { - "type": "long" - }, - "group_id": { - "type": "String" - } - } - }, - "StoryMessage": { - "fields": { - "group": { - "type": "JsonGroupV2Info", - "version": "v1" - }, - "file": { - "type": "JsonAttachment", - "version": "v1" - }, - "text": { - "type": "TextAttachment", - "version": "v1" - }, - "allow_replies": { - "type": "Boolean" - } - } - }, - "JsonAttachment": { - "fields": { - "contentType": { - "type": "String" - }, - "id": { - "type": "String" - }, - "size": { - "type": "int" - }, - "storedFilename": { - "type": "String", - "doc": "when receiving, the path that file has been downloaded to" - }, - "filename": { - "type": "String", - "doc": "when sending, the path to the local file to upload" - }, - "customFilename": { - "type": "String", - "doc": "the original name of the file" - }, - "caption": { - "type": "String" - }, - "width": { - "type": "int" - }, - "height": { - "type": "int" - }, - "voiceNote": { - "type": "boolean" - }, - "key": { - "type": "String" - }, - "digest": { - "type": "String" - }, - "blurhash": { - "type": "String" - } - }, - "doc": "represents a file attached to a message. When sending, only `filename` is required." - }, - "JsonQuote": { - "fields": { - "id": { - "type": "long", - "doc": "the client timestamp of the message being quoted", - "example": "1615576442475" - }, - "author": { - "type": "JsonAddress", - "version": "v1", - "doc": "the author of the message being quoted" - }, - "text": { - "type": "String", - "doc": "the body of the message being quoted", - "example": "\"hey  what's up?\"" - }, - "attachments": { - "list": true, - "type": "JsonQuotedAttachment", - "version": "v0", - "doc": "list of files attached to the quoted message" - }, - "mentions": { - "list": true, - "type": "JsonMention", - "version": "v1", - "doc": "list of mentions in the quoted message" - } - }, - "doc": "A quote is a reply to a previous message. ID is the sent time of the message being replied to" - }, - "JsonMention": { - "fields": { - "uuid": { - "type": "String", - "doc": "The UUID of the account being mentioned", - "example": "\"aeed01f0-a234-478e-8cf7-261c283151e7\"" - }, - "start": { - "type": "int", - "doc": "The number of characters in that the mention starts at. Note that due to a quirk of how signald encodes JSON, if this value is 0 (for example if the first character in the message is the mention) the field won't show up.", - "example": "4" - }, - "length": { - "type": "int", - "doc": "The length of the mention represented in the message. Seems to always be 1 but included here in case that changes.", - "example": "1" - } - } - }, - "JsonPreview": { - "fields": { - "url": { - "type": "String" - }, - "title": { - "type": "String" - }, - "description": { - "type": "String" - }, - "date": { - "type": "long" - }, - "attachment": { - "type": "JsonAttachment", - "version": "v1", - "doc": "an optional image file attached to the preview" - } - }, - "doc": "metadata about one of the links in a message" - }, - "JsonReaction": { - "fields": { - "emoji": { - "type": "String", - "doc": "the emoji to react with", - "example": "\"👍\"" - }, - "remove": { - "type": "boolean", - "doc": "set to true to remove the reaction. requires emoji be set to previously reacted emoji" - }, - "targetAuthor": { - "type": "JsonAddress", - "version": "v1", - "doc": "the author of the message being reacted to" - }, - "targetSentTimestamp": { - "type": "long", - "doc": "the client timestamp of the message being reacted to", - "example": "1615576442475" - } - } - }, - "GroupAccessControl": { - "fields": { - "link": { - "type": "String", - "doc": "UNSATISFIABLE when the group link is disabled, ADMINISTRATOR when the group link is enabled but an administrator must approve new members, ANY when the group link is enabled and no approval is required", - "example": "\"ANY\"" - }, - "attributes": { - "type": "String", - "doc": "who can edit group info" - }, - "members": { - "type": "String", - "doc": "who can add members" - } - }, - "doc": "group access control settings. Options for each controlled action are: UNKNOWN, ANY, MEMBER, ADMINISTRATOR, UNSATISFIABLE and UNRECOGNIZED" - }, - "GroupMember": { - "fields": { - "uuid": { - "type": "String", - "example": "\"aeed01f0-a234-478e-8cf7-261c283151e7\"" - }, - "role": { - "type": "String", - "doc": "possible values are: UNKNOWN, DEFAULT, ADMINISTRATOR and UNRECOGNIZED", - "example": "\"DEFAULT\"" - }, - "joined_revision": { - "type": "int" - } - } - }, - "BannedGroupMember": { - "fields": { - "uuid": { - "type": "String", - "example": "\"aeed01f0-a234-478e-8cf7-261c283151e7\"" - }, - "timestamp": { - "type": "long", - "doc": "Timestamp as milliseconds since Unix epoch of when the user was banned. This field is set by the server." - } - } - }, - "GroupChange": { - "fields": { - "editor": { - "type": "JsonAddress", - "version": "v1", - "doc": "The user that made the change." - }, - "revision": { - "type": "Integer", - "doc": "The group revision that this change brings the group to." - }, - "new_members": { - "list": true, - "type": "GroupMember", - "version": "v1", - "doc": "Represents users have been added to the group. This can be from group members adding users, or a users joining via a group link that required no approval." - }, - "delete_members": { - "list": true, - "type": "JsonAddress", - "version": "v1", - "doc": "Represents users that have been removed from the group. This can be from admins removing users, or users choosing to leave the group" - }, - "modify_member_roles": { - "list": true, - "type": "GroupMember", - "version": "v1", - "doc": "Represents users with their new, modified role." - }, - "modified_profile_keys": { - "list": true, - "type": "GroupMember", - "version": "v1", - "doc": "Represents users that have rotated their profile key. Note that signald currently does not expose profile keys to clients. The joined revision property will always be 0 in this list." - }, - "new_pending_members": { - "list": true, - "type": "GroupPendingMember", - "version": "v1", - "doc": "Represents a user that has been invited to the group by another user." - }, - "delete_pending_members": { - "list": true, - "type": "JsonAddress", - "version": "v1" - }, - "promote_pending_members": { - "list": true, - "type": "GroupMember", - "version": "v1" - }, - "new_banned_members": { - "list": true, - "type": "BannedGroupMember", - "version": "v1" - }, - "new_unbanned_members": { - "list": true, - "type": "BannedGroupMember", - "version": "v1" - }, - "new_title": { - "type": "String" - }, - "new_avatar": { - "type": "Boolean", - "doc": "Whether this group change changed the avatar." - }, - "new_timer": { - "type": "Integer", - "doc": "New disappearing messages timer value." - }, - "new_access_control": { - "type": "GroupAccessControl", - "version": "v1", - "doc": "If not null, then this group change modified one of the access controls. Some of the properties in here will be null." - }, - "new_requesting_members": { - "list": true, - "type": "GroupRequestingMember", - "version": "v1", - "doc": "Represents users that have requested to join the group via the group link. Note that members requesting to join might not necessarily have the list of users in the group, so they won't be able to send a peer-to-peer group update message to inform users of their request to join. Other users in the group may inform us that the revision has increased, but the members requesting access will have to be obtained from the server instead (which signald will handle). For now, a get_group request has to be made to get the users that have requested to join the group." - }, - "delete_requesting_members": { - "list": true, - "type": "JsonAddress", - "version": "v1" - }, - "promote_requesting_members": { - "list": true, - "type": "GroupMember", - "version": "v1" - }, - "new_invite_link_password": { - "type": "Boolean", - "doc": "Whether this group change involved resetting the group invite link." - }, - "new_description": { - "type": "String" - }, - "new_is_announcement_group": { - "type": "String", - "doc": "Whether this change affected the announcement group setting. Possible values are UNKNOWN, ENABLED or DISABLED" - } - }, - "doc": "Represents a group change made by a user. This can also represent request link invites. Only the fields relevant to the group change performed will be set. Note that in signald, group changes are currently only received from incoming messages from a message subscription." - }, - "DeviceInfo": { - "fields": { - "id": { - "type": "long" - }, - "name": { - "type": "String" - }, - "created": { - "type": "long" - }, - "lastSeen": { - "type": "long" - } - } - }, - "JsonGroupInfo": { - "fields": { - "groupId": { - "type": "String" - }, - "members": { - "list": true, - "type": "JsonAddress", - "version": "v1" - }, - "name": { - "type": "String" - }, - "type": { - "type": "String" - }, - "avatarId": { - "type": "long" - } - }, - "doc": "information about a legacy group" - }, - "Capabilities": { - "fields": { - "gv2": { - "type": "boolean", - "doc": "this capability is deprecated and will always be true" - }, - "storage": { - "type": "boolean" - }, - "stories": { - "type": "boolean" - }, - "gv1-migration": { - "type": "boolean" - }, - "sender_key": { - "type": "boolean" - }, - "announcement_group": { - "type": "boolean" - }, - "change_number": { - "type": "boolean" - } - } - }, - "Server": { - "fields": { - "uuid": { - "type": "UUID", - "doc": "A unique identifier for the server, referenced when adding accounts. Must be a valid UUID. Will be generated if not specified when creating." - }, - "proxy": { - "type": "String" - }, - "ca": { - "type": "String", - "doc": "base64 encoded trust store, password must be 'whisper'" - }, - "service_url": { - "type": "String" - }, - "cdn_urls": { - "list": true, - "type": "ServerCDN", - "version": "v1" - }, - "contact_discovery_url": { - "type": "String" - }, - "key_backup_url": { - "type": "String" - }, - "storage_url": { - "type": "String" - }, - "zk_param": { - "type": "String", - "doc": "base64 encoded ZKGROUP_SERVER_PUBLIC_PARAMS value" - }, - "unidentified_sender_root": { - "type": "String", - "doc": "base64 encoded" - }, - "key_backup_service_name": { - "type": "String" - }, - "key_backup_service_id": { - "type": "String", - "doc": "base64 encoded" - }, - "key_backup_mrenclave": { - "type": "String" - }, - "cds_mrenclave": { - "type": "String" - }, - "ias_ca": { - "type": "String", - "doc": "base64 encoded trust store, password must be 'whisper'" - } - }, - "doc": "a Signal server" - }, - "Payment": { - "fields": { - "receipt": { - "type": "String", - "doc": "base64 encoded payment receipt data. This is a protobuf value which can be decoded as the Receipt object described in https://github.com/mobilecoinfoundation/mobilecoin/blob/master/api/proto/external.proto" - }, - "note": { - "type": "String", - "doc": "note attached to the payment" - } - }, - "doc": "details about a MobileCoin payment" - }, - "RemoteConfig": { - "fields": { - "name": { - "type": "String", - "doc": "The name of this remote config entry. These names may be prefixed with the platform type (\"android.\", \"ios.\", \"desktop.\", etc.) Typically, clients only handle the relevant configs for its platform, hardcoding the names it cares about handling and ignoring the rest.", - "example": "desktop.mediaQuality.levels" - }, - "value": { - "type": "String", - "doc": "The value for this remote config entry. Even though this is a string, it could be a boolean as a string, an integer/long value, a comma-delimited list, etc. Clients usually consume this by hardcoding the feature flagsit should track in the app and assuming that the server will send the type that the client expects. If an unexpected type occurs, it falls back to a default value.", - "example": "1:2,61:2,81:2,82:2,65:2,31:2,47:2,41:2,32:2,385:2,971:2,974:2,49:2,33:2,*:1" - } - }, - "doc": "A remote config (feature flag) entry." - }, - "GroupHistoryEntry": { - "fields": { - "group": { - "type": "JsonGroupV2Info", - "version": "v1" - }, - "change": { - "type": "GroupChange", - "version": "v1" - } - } - }, - "PagingData": { - "fields": { - "has_more_pages": { - "type": "boolean" - }, - "next_page_revision": { - "type": "int" - } - } - }, - "JsonViewOnceOpenMessage": { - "fields": { - "sender": { - "type": "JsonAddress", - "version": "v1" - }, - "timestamp": { - "type": "long", - "example": "1615576442475" - } - } - }, - "JsonMessageRequestResponseMessage": { - "fields": { - "person": { - "type": "JsonAddress", - "version": "v1" - }, - "groupId": { - "type": "String" - }, - "type": { - "type": "String", - "doc": "One of UNKNOWN, ACCEPT, DELETE, BLOCK, BLOCK_AND_DELETE, UNBLOCK_AND_ACCEPT" - } - }, - "doc": "Responses to message requests from unknown users or groups" - }, - "SendSuccess": { - "fields": { - "unidentified": { - "type": "boolean" - }, - "needsSync": { - "type": "boolean" - }, - "duration": { - "type": "long" - }, - "devices": { - "list": true, - "type": "Integer" - } - } - }, - "ProofRequiredError": { - "fields": { - "token": { - "type": "String" - }, - "options": { - "list": true, - "type": "String", - "doc": "possible list values are RECAPTCHA and PUSH_CHALLENGE" - }, - "message": { - "type": "String" - }, - "retry_after": { - "type": "long", - "doc": "value in seconds" - } - }, - "error": true - }, - "SharedContact": { - "fields": { - "name": { - "type": "SharedContactName", - "version": "v1", - "doc": "the name of the shared contact" - }, - "email": { - "list": true, - "type": "SharedContactEmail", - "version": "v1", - "doc": "the email addresses of the shared contact" - }, - "phone": { - "list": true, - "type": "SharedContactPhone", - "version": "v1", - "doc": "the phone numbers of the shared contact" - }, - "address": { - "list": true, - "type": "SharedContactAddress", - "version": "v1", - "doc": "the physical addresses of the shared contact" - }, - "avatar": { - "type": "SharedContactAvatar", - "version": "v1", - "doc": "the profile picture/avatar of the shared contact" - }, - "organization": { - "type": "String", - "doc": "the organization (e.g. workplace) of the shared contact" - } - } - }, - "RemoteDelete": { - "fields": { - "target_sent_timestamp": { - "type": "long" - } - } - }, - "StoryContext": { - "fields": { - "author": { - "type": "String" - }, - "sent_timestamp": { - "type": "long" - } - } - }, - "JsonSentTranscriptMessage": { - "fields": { - "destination": { - "type": "JsonAddress", - "version": "v1" - }, - "timestamp": { - "type": "long", - "example": "1615576442475" - }, - "expirationStartTimestamp": { - "type": "long" - }, - "message": { - "type": "JsonDataMessage", - "version": "v1" - }, - "unidentifiedStatus": { - "type": "Map" - }, - "isRecipientUpdate": { - "type": "boolean" - } - } - }, - "JsonBlockedListMessage": { - "fields": { - "addresses": { - "list": true, - "type": "JsonAddress", - "version": "v1" - }, - "groupIds": { - "list": true, - "type": "String" - } - } - }, - "JsonReadMessage": { - "fields": { - "sender": { - "type": "JsonAddress", - "version": "v1" - }, - "timestamp": { - "type": "long", - "example": "1615576442475" - } - } - }, - "JsonVerifiedMessage": { - "fields": { - "destination": { - "type": "JsonAddress", - "version": "v1" - }, - "identityKey": { - "type": "String" - }, - "verified": { - "type": "String" - }, - "timestamp": { - "type": "long" - } - } - }, - "OfferMessage": { - "fields": { - "id": { - "type": "long" - }, - "sdp": { - "type": "String" - }, - "type": { - "type": "String" - }, - "opaque": { - "type": "String" - } - } - }, - "AnswerMessage": { - "fields": { - "id": { - "type": "long" - }, - "sdp": { - "type": "String" - }, - "opaque": { - "type": "String" - } - } - }, - "BusyMessage": { - "fields": { - "id": { - "type": "long" - } - } - }, - "HangupMessage": { - "fields": { - "id": { - "type": "long" - }, - "type": { - "type": "String" - }, - "legacy": { - "type": "boolean" - }, - "device_id": { - "type": "int" - } - } - }, - "IceUpdateMessage": { - "fields": { - "id": { - "type": "long" - }, - "opaque": { - "type": "String" - }, - "sdp": { - "type": "String" - } - } - }, - "TextAttachment": { - "fields": { - "text": { - "type": "String" - }, - "style": { - "type": "String" - }, - "preview": { - "type": "JsonPreview", - "version": "v1" - }, - "text_foreground_color": { - "type": "String" - }, - "text_background_color": { - "type": "String" - }, - "background_gradient": { - "type": "Gradient", - "version": "v1" - }, - "background_color": { - "type": "String" - } - } - }, - "GroupPendingMember": { - "fields": { - "uuid": { - "type": "String", - "example": "\"aeed01f0-a234-478e-8cf7-261c283151e7\"" - }, - "role": { - "type": "String", - "doc": "possible values are: UNKNOWN, DEFAULT, ADMINISTRATOR and UNRECOGNIZED", - "example": "\"DEFAULT\"" - }, - "timestamp": { - "type": "long" - }, - "added_by_uuid": { - "type": "String", - "example": "\"aeed01f0-a234-478e-8cf7-261c283151e7\"" - } - } - }, - "GroupRequestingMember": { - "fields": { - "uuid": { - "type": "String", - "example": "\"aeed01f0-a234-478e-8cf7-261c283151e7\"" - }, - "timestamp": { - "type": "long" - } - } - }, - "ServerCDN": { - "fields": { - "number": { - "type": "int" - }, - "url": { - "type": "String" - } - } - }, - "SharedContactName": { - "fields": { - "display": { - "type": "String", - "doc": "the full name that should be displayed" - }, - "given": { - "type": "String", - "doc": "given name" - }, - "middle": { - "type": "String", - "doc": "middle name" - }, - "family": { - "type": "String", - "doc": "family name (surname)" - }, - "prefix": { - "type": "String" - }, - "suffix": { - "type": "String" - } - } - }, - "SharedContactEmail": { - "fields": { - "type": { - "type": "String", - "doc": "the type of email (options: HOME, WORK, MOBILE, CUSTOM)" - }, - "value": { - "type": "String", - "doc": "the email address" - }, - "label": { - "type": "String", - "doc": "the type label when type is CUSTOM" - } - } - }, - "SharedContactPhone": { - "fields": { - "type": { - "type": "String", - "doc": "the type of phone (options: HOME, WORK, MOBILE, CUSTOM)" - }, - "value": { - "type": "String", - "doc": "the phone number" - }, - "label": { - "type": "String", - "doc": "the type label when type is CUSTOM" - } - } - }, - "SharedContactAddress": { - "fields": { - "type": { - "type": "String", - "doc": "the type of address (options: HOME, WORK, CUSTOM)" - }, - "label": { - "type": "String" - }, - "street": { - "type": "String" - }, - "pobox": { - "type": "String" - }, - "neighborhood": { - "type": "String" - }, - "city": { - "type": "String" - }, - "region": { - "type": "String" - }, - "postcode": { - "type": "String" - }, - "country": { - "type": "String" - } - } - }, - "SharedContactAvatar": { - "fields": { - "attachment": { - "type": "JsonAttachment", - "version": "v1" - }, - "is_profile": { - "type": "boolean" - } - } - }, - "Gradient": { - "fields": { - "start_color": { - "type": "String" - }, - "end_color": { - "type": "String" - } - } - } - } - }, - "actions": { - "v1": { - "send": { - "request": "SendRequest", - "response": "SendResponse", - "errors": [ - { - "name": "NoSuchAccountError" - }, - { - "name": "ServerNotFoundError" - }, - { - "name": "InvalidProxyError" - }, - { - "name": "NoSendPermissionError" - }, - { - "name": "InvalidAttachmentError" - }, - { - "name": "InternalError" - }, - { - "name": "InvalidRequestError" - }, - { - "name": "UnknownGroupError" - }, - { - "name": "RateLimitError" - }, - { - "name": "InvalidRecipientError" - }, - { - "name": "AttachmentTooLargeError" - }, - { - "name": "AuthorizationFailedError" - }, - { - "name": "SQLError" - } - ] - }, - "react": { - "request": "ReactRequest", - "response": "SendResponse", - "doc": "react to a previous message", - "errors": [ - { - "name": "NoSuchAccountError" - }, - { - "name": "ServerNotFoundError" - }, - { - "name": "InvalidProxyError" - }, - { - "name": "NoSendPermissionError" - }, - { - "name": "InternalError" - }, - { - "name": "InvalidRecipientError" - }, - { - "name": "UnknownGroupError" - }, - { - "name": "InvalidRequestError" - }, - { - "name": "RateLimitError" - }, - { - "name": "UnregisteredUserError" - }, - { - "name": "AuthorizationFailedError" - }, - { - "name": "SQLError" - } - ] - }, - "version": { - "request": "VersionRequest", - "response": "JsonVersionMessage" - }, - "accept_invitation": { - "request": "AcceptInvitationRequest", - "response": "JsonGroupV2Info", - "doc": "Accept a v2 group invitation. Note that you must have a profile name set to join groups.", - "errors": [ - { - "name": "NoSuchAccountError" - }, - { - "name": "OwnProfileKeyDoesNotExistError" - }, - { - "name": "ServerNotFoundError" - }, - { - "name": "InvalidProxyError" - }, - { - "name": "UnknownGroupError" - }, - { - "name": "InternalError" - }, - { - "name": "InvalidRequestError" - }, - { - "name": "AuthorizationFailedError", - "doc": "Can be caused if signald is setup as a linked device that has been removed by the primary device. If trying to update a group, this can also be caused if group permissions don't allow the update (e.g. current role insufficient or not a member)." - }, - { - "name": "SQLError" - }, - { - "name": "GroupPatchNotAcceptedError", - "doc": "Caused when server rejects the group update." - } - ] - }, - "approve_membership": { - "request": "ApproveMembershipRequest", - "response": "JsonGroupV2Info", - "doc": "approve a request to join a group", - "errors": [ - { - "name": "NoSuchAccountError" - }, - { - "name": "ServerNotFoundError" - }, - { - "name": "InvalidProxyError" - }, - { - "name": "UnknownGroupError" - }, - { - "name": "InternalError" - }, - { - "name": "GroupVerificationError" - }, - { - "name": "InvalidRequestError" - }, - { - "name": "AuthorizationFailedError", - "doc": "Can be caused if signald is setup as a linked device that has been removed by the primary device. If trying to update a group, this can also be caused if group permissions don't allow the update (e.g. current role insufficient or not a member)." - }, - { - "name": "SQLError" - }, - { - "name": "GroupPatchNotAcceptedError", - "doc": "Caused when server rejects the group update." - } - ] - }, - "get_group": { - "request": "GetGroupRequest", - "response": "JsonGroupV2Info", - "doc": "Query the server for the latest state of a known group. If the account is not a member of the group, an UnknownGroupError is returned.", - "errors": [ - { - "name": "NoSuchAccountError" - }, - { - "name": "UnknownGroupError" - }, - { - "name": "ServerNotFoundError" - }, - { - "name": "InvalidProxyError" - }, - { - "name": "InternalError" - }, - { - "name": "GroupVerificationError" - }, - { - "name": "InvalidGroupStateError" - }, - { - "name": "InvalidRequestError" - }, - { - "name": "AuthorizationFailedError" - }, - { - "name": "SQLError" - } - ] - }, - "get_linked_devices": { - "request": "GetLinkedDevicesRequest", - "response": "LinkedDevices", - "doc": "list all linked devices on a Signal account", - "errors": [ - { - "name": "InternalError" - }, - { - "name": "InvalidProxyError" - }, - { - "name": "ServerNotFoundError" - }, - { - "name": "NoSuchAccountError" - }, - { - "name": "InvalidRequestError" - }, - { - "name": "AuthorizationFailedError" - }, - { - "name": "SQLError" - } - ] - }, - "join_group": { - "request": "JoinGroupRequest", - "response": "JsonGroupJoinInfo", - "doc": "Join a group using the a signal.group URL. Note that you must have a profile name set to join groups.", - "errors": [ - { - "name": "InvalidRequestError" - }, - { - "name": "InvalidInviteURIError" - }, - { - "name": "InternalError" - }, - { - "name": "InvalidProxyError" - }, - { - "name": "ServerNotFoundError" - }, - { - "name": "NoSuchAccountError" - }, - { - "name": "OwnProfileKeyDoesNotExistError" - }, - { - "name": "GroupVerificationError" - }, - { - "name": "GroupNotActiveError" - }, - { - "name": "UnknownGroupError" - }, - { - "name": "InvalidGroupStateError" - }, - { - "name": "AuthorizationFailedError" - }, - { - "name": "SQLError" - } - ] - }, - "remove_linked_device": { - "request": "RemoveLinkedDeviceRequest", - "doc": "Remove a linked device from the Signal account. Only allowed when the local device id is 1", - "errors": [ - { - "name": "InternalError" - }, - { - "name": "InvalidProxyError" - }, - { - "name": "ServerNotFoundError" - }, - { - "name": "NoSuchAccountError" - }, - { - "name": "InvalidRequestError" - }, - { - "name": "AuthorizationFailedError" - }, - { - "name": "SQLError" - } - ] - }, - "update_group": { - "request": "UpdateGroupRequest", - "response": "GroupInfo", - "doc": "modify a group. Note that only one modification action may be performed at once", - "errors": [ - { - "name": "InternalError" - }, - { - "name": "InvalidProxyError" - }, - { - "name": "ServerNotFoundError" - }, - { - "name": "NoSuchAccountError" - }, - { - "name": "UnknownGroupError" - }, - { - "name": "GroupVerificationError" - }, - { - "name": "InvalidRequestError" - }, - { - "name": "AuthorizationFailedError", - "doc": "Can be caused if signald is setup as a linked device that has been removed by the primary device. If trying to update a group, this can also be caused if group permissions don't allow the update (e.g. current role insufficient or not a member)." - }, - { - "name": "UnregisteredUserError" - }, - { - "name": "SQLError" - }, - { - "name": "GroupPatchNotAcceptedError", - "doc": "Caused when server rejects the group update, e.g. trying to add a user that's already in the group" - } - ] - }, - "set_profile": { - "request": "SetProfile", - "errors": [ - { - "name": "InternalError" - }, - { - "name": "InvalidProxyError" - }, - { - "name": "ServerNotFoundError" - }, - { - "name": "NoSuchAccountError" - }, - { - "name": "InvalidBase64Error" - }, - { - "name": "InvalidRequestError" - }, - { - "name": "AuthorizationFailedError" - }, - { - "name": "SQLError" - } - ] - }, - "resolve_address": { - "request": "ResolveAddressRequest", - "response": "JsonAddress", - "doc": "Resolve a partial JsonAddress with only a number or UUID to one with both. Anywhere that signald accepts a JsonAddress will except a partial, this is a convenience function for client authors, mostly because signald doesn't resolve all the partials it returns.", - "errors": [ - { - "name": "InternalError" - }, - { - "name": "NoSuchAccountError" - }, - { - "name": "UnregisteredUserError" - }, - { - "name": "AuthorizationFailedError" - }, - { - "name": "SQLError" - } - ] - }, - "mark_read": { - "request": "MarkReadRequest", - "errors": [ - { - "name": "NoSuchAccountError" - }, - { - "name": "ServerNotFoundError" - }, - { - "name": "InvalidProxyError" - }, - { - "name": "InternalError" - }, - { - "name": "UntrustedIdentityError" - }, - { - "name": "UnregisteredUserError" - }, - { - "name": "AuthorizationFailedError" - }, - { - "name": "SQLError" - } - ] - }, - "get_profile": { - "request": "GetProfileRequest", - "response": "Profile", - "doc": "Get all information available about a user", - "errors": [ - { - "name": "InternalError" - }, - { - "name": "InvalidProxyError" - }, - { - "name": "ServerNotFoundError" - }, - { - "name": "NoSuchAccountError" - }, - { - "name": "ProfileUnavailableError" - }, - { - "name": "UnregisteredUserError" - }, - { - "name": "AuthorizationFailedError" - }, - { - "name": "SQLError" - } - ] - }, - "list_groups": { - "request": "ListGroupsRequest", - "response": "GroupList", - "errors": [ - { - "name": "InternalError" - }, - { - "name": "InvalidProxyError" - }, - { - "name": "ServerNotFoundError" - }, - { - "name": "NoSuchAccountError" - }, - { - "name": "InvalidRequestError" - }, - { - "name": "AuthorizationFailedError" - }, - { - "name": "SQLError" - } - ] - }, - "list_contacts": { - "request": "ListContactsRequest", - "response": "ProfileList", - "errors": [ - { - "name": "InternalError" - }, - { - "name": "InvalidProxyError" - }, - { - "name": "ServerNotFoundError" - }, - { - "name": "NoSuchAccountError" - }, - { - "name": "AuthorizationFailedError" - }, - { - "name": "SQLError" - } - ] - }, - "create_group": { - "request": "CreateGroupRequest", - "response": "JsonGroupV2Info", - "errors": [ - { - "name": "InternalError" - }, - { - "name": "InvalidProxyError" - }, - { - "name": "ServerNotFoundError" - }, - { - "name": "NoSuchAccountError" - }, - { - "name": "OwnProfileKeyDoesNotExistError" - }, - { - "name": "NoKnownUUIDError" - }, - { - "name": "InvalidRequestError" - }, - { - "name": "GroupVerificationError" - }, - { - "name": "InvalidGroupStateError" - }, - { - "name": "UnknownGroupError" - }, - { - "name": "UnregisteredUserError" - }, - { - "name": "AuthorizationFailedError" - }, - { - "name": "SQLError" - } - ] - }, - "leave_group": { - "request": "LeaveGroupRequest", - "response": "GroupInfo", - "errors": [ - { - "name": "NoSuchAccountError" - }, - { - "name": "ServerNotFoundError" - }, - { - "name": "InvalidProxyError" - }, - { - "name": "InternalError" - }, - { - "name": "UnknownGroupError" - }, - { - "name": "GroupVerificationError" - }, - { - "name": "InvalidRequestError" - }, - { - "name": "AuthorizationFailedError" - }, - { - "name": "SQLError" - } - ] - }, - "generate_linking_uri": { - "request": "GenerateLinkingURIRequest", - "response": "LinkingURI", - "doc": "Generate a linking URI. Typically this is QR encoded and scanned by the primary device. Submit the returned session_id with a finish_link request.", - "errors": [ - { - "name": "ServerNotFoundError" - }, - { - "name": "InvalidProxyError" - } - ] - }, - "finish_link": { - "request": "FinishLinkRequest", - "response": "Account", - "doc": "After a linking URI has been requested, finish_link must be called with the session_id provided with the URI. it will return information about the new account once the linking process is completed by the other device and the new account is setup. Note that the account setup process can sometimes take some time, if rapid userfeedback is required after scanning, use wait_for_scan first, then finish setup with finish_link.", - "errors": [ - { - "name": "NoSuchSessionError" - }, - { - "name": "ServerNotFoundError" - }, - { - "name": "InvalidProxyError" - }, - { - "name": "InternalError" - }, - { - "name": "NoSuchAccountError" - }, - { - "name": "UserAlreadyExistsError" - }, - { - "name": "ScanTimeoutError" - } - ] - }, - "add_device": { - "request": "AddLinkedDeviceRequest", - "doc": "Link a new device to a local Signal account", - "errors": [ - { - "name": "NoSuchAccountError" - }, - { - "name": "ServerNotFoundError" - }, - { - "name": "InvalidProxyError" - }, - { - "name": "InvalidRequestError", - "doc": "caused by syntax errors with the provided linking URI" - }, - { - "name": "InternalError" - }, - { - "name": "AuthorizationFailedError" - }, - { - "name": "SQLError" - } - ] - }, - "register": { - "request": "RegisterRequest", - "response": "Account", - "doc": "begin the account registration process by requesting a phone number verification code. when the code is received, submit it with a verify request", - "errors": [ - { - "name": "CaptchaRequiredError" - }, - { - "name": "ServerNotFoundError" - }, - { - "name": "InvalidProxyError" - } - ] - }, - "verify": { - "request": "VerifyRequest", - "response": "Account", - "doc": "verify an account's phone number with a code after registering, completing the account creation process", - "errors": [ - { - "name": "InternalError" - }, - { - "name": "InvalidProxyError" - }, - { - "name": "ServerNotFoundError" - }, - { - "name": "AccountHasNoKeysError" - }, - { - "name": "AccountAlreadyVerifiedError" - }, - { - "name": "AccountLockedError" - }, - { - "name": "NoSuchAccountError" - } - ] - }, - "get_identities": { - "request": "GetIdentitiesRequest", - "response": "IdentityKeyList", - "doc": "Get information about a known keys for a particular address", - "errors": [ - { - "name": "InternalError" - }, - { - "name": "InvalidProxyError" - }, - { - "name": "ServerNotFoundError" - }, - { - "name": "NoSuchAccountError" - }, - { - "name": "UnregisteredUserError" - }, - { - "name": "AuthorizationFailedError" - }, - { - "name": "SQLError" - } - ] - }, - "trust": { - "request": "TrustRequest", - "doc": "Trust another user's safety number using either the QR code data or the safety number text", - "errors": [ - { - "name": "InvalidRequestError" - }, - { - "name": "InternalError" - }, - { - "name": "InvalidProxyError" - }, - { - "name": "ServerNotFoundError" - }, - { - "name": "NoSuchAccountError" - }, - { - "name": "FingerprintVersionMismatchError" - }, - { - "name": "InvalidBase64Error" - }, - { - "name": "UnknownIdentityKeyError" - }, - { - "name": "InvalidFingerprintError" - }, - { - "name": "UnregisteredUserError" - }, - { - "name": "AuthorizationFailedError" - }, - { - "name": "SQLError" - } - ] - }, - "delete_account": { - "request": "DeleteAccountRequest", - "doc": "delete all account data signald has on disk, and optionally delete the account from the server as well. Note that this is not \"unlink\" and will delete the entire account, even from a linked device.", - "errors": [ - { - "name": "InternalError" - }, - { - "name": "InvalidProxyError" - }, - { - "name": "ServerNotFoundError" - }, - { - "name": "NoSuchAccountError" - }, - { - "name": "AuthorizationFailedError" - }, - { - "name": "SQLError" - } - ] - }, - "typing": { - "request": "TypingRequest", - "doc": "send a typing started or stopped message", - "errors": [ - { - "name": "InternalError" - }, - { - "name": "InvalidProxyError" - }, - { - "name": "ServerNotFoundError" - }, - { - "name": "NoSuchAccountError" - }, - { - "name": "InvalidRecipientError" - }, - { - "name": "InvalidGroupError" - }, - { - "name": "UntrustedIdentityError" - }, - { - "name": "UnknownGroupError" - }, - { - "name": "InvalidRequestError" - }, - { - "name": "UnregisteredUserError" - }, - { - "name": "AuthorizationFailedError" - }, - { - "name": "SQLError" - } - ] - }, - "reset_session": { - "request": "ResetSessionRequest", - "response": "SendResponse", - "doc": "reset a session with a particular user", - "errors": [ - { - "name": "InternalError" - }, - { - "name": "ServerNotFoundError" - }, - { - "name": "InvalidProxyError" - }, - { - "name": "NoSuchAccountError" - }, - { - "name": "InvalidRequestError" - }, - { - "name": "NoSendPermissionError" - }, - { - "name": "UnknownGroupError" - }, - { - "name": "RateLimitError" - }, - { - "name": "InvalidRecipientError" - }, - { - "name": "UnregisteredUserError" - }, - { - "name": "AuthorizationFailedError" - }, - { - "name": "SQLError" - } - ] - }, - "request_sync": { - "request": "RequestSyncRequest", - "doc": "Request other devices on the account send us their group list, syncable config and contact list.", - "errors": [ - { - "name": "InternalError" - }, - { - "name": "InvalidProxyError" - }, - { - "name": "ServerNotFoundError" - }, - { - "name": "NoSuchAccountError" - }, - { - "name": "UntrustedIdentityError" - }, - { - "name": "InvalidRequestError" - }, - { - "name": "AuthorizationFailedError" - }, - { - "name": "SQLError" - } - ] - }, - "list_accounts": { - "request": "ListAccountsRequest", - "response": "AccountList", - "doc": "return all local accounts", - "errors": [ - { - "name": "NoSuchAccountError" - }, - { - "name": "InternalError" - } - ] - }, - "group_link_info": { - "request": "GroupLinkInfoRequest", - "response": "JsonGroupJoinInfo", - "doc": "Get information about a group from a signal.group link", - "errors": [ - { - "name": "GroupLinkNotActiveError" - }, - { - "name": "InternalError" - }, - { - "name": "InvalidProxyError" - }, - { - "name": "ServerNotFoundError" - }, - { - "name": "NoSuchAccountError" - }, - { - "name": "InvalidRequestError" - }, - { - "name": "GroupVerificationError" - }, - { - "name": "SQLError" - } - ] - }, - "update_contact": { - "request": "UpdateContactRequest", - "response": "Profile", - "doc": "update information about a local contact", - "errors": [ - { - "name": "NoSuchAccountError" - }, - { - "name": "ServerNotFoundError" - }, - { - "name": "InvalidProxyError" - }, - { - "name": "InternalError" - }, - { - "name": "AuthorizationFailedError" - }, - { - "name": "SQLError" - } - ] - }, - "set_expiration": { - "request": "SetExpirationRequest", - "response": "SendResponse", - "doc": "Set the message expiration timer for a thread. Expiration must be specified in seconds, set to 0 to disable timer", - "errors": [ - { - "name": "InternalError" - }, - { - "name": "InvalidProxyError" - }, - { - "name": "ServerNotFoundError" - }, - { - "name": "NoSuchAccountError" - }, - { - "name": "UnknownGroupError" - }, - { - "name": "GroupVerificationError" - }, - { - "name": "InvalidRequestError" - }, - { - "name": "AuthorizationFailedError", - "doc": "Can be caused if signald is setup as a linked device that has been removed by the primary device. If trying to update a group, this can also be caused if group permissions don't allow the update (e.g. current role insufficient or not a member)." - }, - { - "name": "UnregisteredUserError" - }, - { - "name": "SQLError" - }, - { - "name": "GroupPatchNotAcceptedError", - "doc": "If updating a group, caused when server rejects the group update." - } - ] - }, - "set_device_name": { - "request": "SetDeviceNameRequest", - "doc": "set this device's name. This will show up on the mobile device on the same account under settings -> linked devices", - "errors": [ - { - "name": "InternalError" - }, - { - "name": "InvalidProxyError" - }, - { - "name": "ServerNotFoundError" - }, - { - "name": "NoSuchAccountError" - }, - { - "name": "AuthorizationFailedError" - }, - { - "name": "SQLError" - } - ] - }, - "get_all_identities": { - "request": "GetAllIdentities", - "response": "AllIdentityKeyList", - "doc": "get all known identity keys", - "errors": [ - { - "name": "InvalidProxyError" - }, - { - "name": "NoSuchAccountError" - }, - { - "name": "ServerNotFoundError" - }, - { - "name": "InternalError" - }, - { - "name": "AuthorizationFailedError" - }, - { - "name": "SQLError" - } - ] - }, - "subscribe": { - "request": "SubscribeRequest", - "doc": "receive incoming messages. After making a subscribe request, incoming messages will be sent to the client encoded as ClientMessageWrapper. Send an unsubscribe request or disconnect from the socket to stop receiving messages.", - "errors": [ - { - "name": "NoSuchAccountError" - }, - { - "name": "ServerNotFoundError" - }, - { - "name": "InvalidProxyError" - }, - { - "name": "InternalError" - }, - { - "name": "AuthorizationFailedError" - }, - { - "name": "SQLError" - } - ] - }, - "unsubscribe": { - "request": "UnsubscribeRequest", - "doc": "See subscribe for more info", - "errors": [ - { - "name": "NoSuchAccountError" - }, - { - "name": "InternalError" - }, - { - "name": "SQLError" - } - ] - }, - "remote_delete": { - "request": "RemoteDeleteRequest", - "response": "SendResponse", - "doc": "delete a message previously sent", - "errors": [ - { - "name": "InternalError" - }, - { - "name": "InvalidProxyError" - }, - { - "name": "ServerNotFoundError" - }, - { - "name": "NoSuchAccountError" - }, - { - "name": "InvalidRecipientError" - }, - { - "name": "NoSendPermissionError" - }, - { - "name": "UnknownGroupError" - }, - { - "name": "InvalidRequestError" - }, - { - "name": "RateLimitError" - }, - { - "name": "UnregisteredUserError" - }, - { - "name": "AuthorizationFailedError" - }, - { - "name": "SQLError" - } - ] - }, - "add_server": { - "request": "AddServerRequest", - "response": "String", - "doc": "add a new server to connect to. Returns the new server's UUID.", - "errors": [ - { - "name": "InvalidProxyError" - }, - { - "name": "InternalError" - } - ] - }, - "get_servers": { - "request": "GetServersRequest", - "response": "ServerList", - "errors": [ - { - "name": "InternalError" - } - ] - }, - "delete_server": { - "request": "RemoveServerRequest", - "errors": [ - { - "name": "InternalError" - } - ] - }, - "send_payment": { - "request": "SendPaymentRequest", - "response": "SendResponse", - "doc": "send a mobilecoin payment", - "errors": [ - { - "name": "InternalError" - }, - { - "name": "InvalidProxyError" - }, - { - "name": "ServerNotFoundError" - }, - { - "name": "NoSuchAccountError" - }, - { - "name": "InvalidBase64Error" - }, - { - "name": "InvalidRecipientError" - }, - { - "name": "UnknownGroupError" - }, - { - "name": "NoSendPermissionError" - }, - { - "name": "InvalidRequestError" - }, - { - "name": "RateLimitError" - }, - { - "name": "UnregisteredUserError" - }, - { - "name": "AuthorizationFailedError" - }, - { - "name": "SQLError" - } - ] - }, - "get_remote_config": { - "request": "RemoteConfigRequest", - "response": "RemoteConfigList", - "doc": "Retrieves the remote config (feature flags) from the server.", - "errors": [ - { - "name": "InternalError" - }, - { - "name": "InvalidProxyError" - }, - { - "name": "ServerNotFoundError" - }, - { - "name": "NoSuchAccountError" - }, - { - "name": "SQLError" - } - ] - }, - "refuse_membership": { - "request": "RefuseMembershipRequest", - "response": "JsonGroupV2Info", - "doc": "deny a request to join a group", - "errors": [ - { - "name": "NoSuchAccountError" - }, - { - "name": "ServerNotFoundError" - }, - { - "name": "InvalidProxyError" - }, - { - "name": "UnknownGroupError" - }, - { - "name": "GroupVerificationError" - }, - { - "name": "InternalError" - }, - { - "name": "InvalidRequestError" - }, - { - "name": "AuthorizationFailedError", - "doc": "Can be caused if signald is setup as a linked device that has been removed by the primary device. If trying to update a group, this can also be caused if group permissions don't allow the update (e.g. current role insufficient or not a member)." - }, - { - "name": "UnregisteredUserError" - }, - { - "name": "SQLError" - }, - { - "name": "GroupPatchNotAcceptedError", - "doc": "Caused when server rejects the group update." - } - ] - }, - "submit_challenge": { - "request": "SubmitChallengeRequest", - "errors": [ - { - "name": "NoSuchAccountError" - }, - { - "name": "InvalidRequestError" - }, - { - "name": "ServerNotFoundError" - }, - { - "name": "InvalidProxyError" - }, - { - "name": "InternalError" - }, - { - "name": "SQLError" - } - ] - }, - "is_identifier_registered": { - "request": "IsIdentifierRegisteredRequest", - "response": "BooleanMessage", - "doc": "Determine whether an account identifier is registered on the Signal service.", - "errors": [ - { - "name": "InternalError" - }, - { - "name": "InvalidProxyError" - }, - { - "name": "ServerNotFoundError" - }, - { - "name": "NoSuchAccountError" - }, - { - "name": "SQLError" - } - ] - }, - "wait_for_scan": { - "request": "WaitForScanRequest", - "doc": "An optional part of the linking process. Intended to be called after displaying the QR code, will return quickly after the user scans the QR code. finish_link must be called after wait_for_scan returns a non-error", - "errors": [ - { - "name": "NoSuchSessionError" - }, - { - "name": "ScanTimeoutError" - }, - { - "name": "InternalError" - } - ] - }, - "get_group_revision_pages": { - "request": "GetGroupRevisionPagesRequest", - "response": "GroupHistoryPage", - "doc": "Query the server for group revision history. The history contains information about the changes between each revision and the user that made the change.", - "errors": [ - { - "name": "NoSuchAccountError" - }, - { - "name": "UnknownGroupError" - }, - { - "name": "ServerNotFoundError" - }, - { - "name": "InvalidProxyError" - }, - { - "name": "InternalError" - }, - { - "name": "GroupVerificationError" - }, - { - "name": "InvalidGroupStateError" - }, - { - "name": "InvalidRequestError" - }, - { - "name": "AuthorizationFailedError", - "doc": "caused when not a member of the group, when requesting logs from a revision lower than your joinedAtVersion, etc." - }, - { - "name": "RateLimitError" - }, - { - "name": "SQLError" - } - ] - }, - "send_sync_message": { - "request": "SendSyncMessageRequest", - "response": "JsonSendMessageResult", - "doc": "Sends a sync message to the account's devices", - "errors": [ - { - "name": "InvalidRequestError" - }, - { - "name": "RateLimitError" - }, - { - "name": "InternalError" - }, - { - "name": "UnregisteredUserError" - }, - { - "name": "NoSuchAccountError" - }, - { - "name": "ServerNotFoundError" - }, - { - "name": "InvalidProxyError" - }, - { - "name": "AuthorizationFailedError" - }, - { - "name": "SQLError" - } - ] - }, - "ban_user": { - "request": "BanUserRequest", - "response": "JsonGroupV2Info", - "doc": "Bans users from a group. This works even if the users aren't in the group. If they are currently in the group, they will also be removed.", - "errors": [ - { - "name": "NoSuchAccountError" - }, - { - "name": "ServerNotFoundError" - }, - { - "name": "InvalidProxyError" - }, - { - "name": "UnknownGroupError" - }, - { - "name": "GroupVerificationError" - }, - { - "name": "InternalError" - }, - { - "name": "InvalidRequestError" - }, - { - "name": "AuthorizationFailedError", - "doc": "Can be caused if signald is setup as a linked device that has been removed by the primary device. If trying to update a group, this can also be caused if group permissions don't allow the update (e.g. current role insufficient or not a member)." - }, - { - "name": "SQLError" - }, - { - "name": "GroupPatchNotAcceptedError", - "doc": "Caused when server rejects the group update." - } - ] - }, - "unban_user": { - "request": "UnbanUserRequest", - "response": "JsonGroupV2Info", - "doc": "Unbans users from a group.", - "errors": [ - { - "name": "NoSuchAccountError" - }, - { - "name": "ServerNotFoundError" - }, - { - "name": "InvalidProxyError" - }, - { - "name": "UnknownGroupError" - }, - { - "name": "GroupVerificationError" - }, - { - "name": "InternalError" - }, - { - "name": "InvalidRequestError" - }, - { - "name": "AuthorizationFailedError", - "doc": "Can be caused if signald is setup as a linked device that has been removed by the primary device. If trying to update a group, this can also be caused if group permissions don't allow the update (e.g. current role insufficient or not a member)." - }, - { - "name": "SQLError" - }, - { - "name": "GroupPatchNotAcceptedError", - "doc": "Caused when server rejects the group update." - } - ] - } - } - } -} +{"doc_version":"v1","version":{"name":"signald","version":"0.20.0-9-d745ad70","branch":"call-signaling","commit":"d745ad70473054386b8046c7bfd52a6809d2a74d"},"info":"This document describes objects that may be used when communicating with signald.","types":{"v0":{"JsonAccountList":{"fields":{"accounts":{"list":true,"type":"JsonAccount","version":"v0"}},"deprecated":true,"removal_date":1641027661},"JsonMessageEnvelope":{"fields":{"username":{"type":"String","example":"\"+12024561414\""},"uuid":{"type":"String","example":"\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\""},"source":{"type":"JsonAddress","version":"v0"},"sourceDevice":{"type":"int"},"type":{"type":"String"},"relay":{"type":"String","doc":"this field is no longer available and will never be populated"},"timestamp":{"type":"long","example":"1615576442475"},"timestampISO":{"type":"String"},"serverTimestamp":{"type":"long"},"serverDeliveredTimestamp":{"type":"long","example":"161557644247580"},"hasLegacyMessage":{"type":"boolean"},"hasContent":{"type":"boolean"},"isUnidentifiedSender":{"type":"boolean"},"dataMessage":{"type":"JsonDataMessage","version":"v0"},"syncMessage":{"type":"JsonSyncMessage","version":"v0"},"callMessage":{"type":"JsonCallMessage","version":"v0"},"receipt":{"type":"JsonReceiptMessage","version":"v0"},"typing":{"type":"JsonTypingMessage","version":"v0"}},"deprecated":true,"removal_date":1641027661},"JsonAccount":{"fields":{"deviceId":{"type":"int"},"username":{"type":"String"},"filename":{"type":"String"},"uuid":{"type":"String"},"registered":{"type":"boolean"},"has_keys":{"type":"boolean"},"subscribed":{"type":"boolean"}},"deprecated":true,"removal_date":1641027661},"JsonAddress":{"fields":{"number":{"type":"String"},"uuid":{"type":"UUID"},"relay":{"type":"String"}},"deprecated":true,"removal_date":1641027661},"JsonDataMessage":{"fields":{"timestamp":{"type":"long","doc":"the timestamp that the message was sent at, according to the sender's device. This is used to uniquely identify this message for things like reactions and quotes.","example":"1615576442475"},"attachments":{"list":true,"type":"JsonAttachment","version":"v0","doc":"files attached to the incoming message"},"body":{"type":"String","doc":"the text body of the incoming message.","example":"\"hello\""},"group":{"type":"JsonGroupInfo","version":"v0","doc":"if the incoming message was sent to a v1 group, information about that group will be here"},"groupV2":{"type":"JsonGroupV2Info","version":"v0","doc":"is the incoming message was sent to a v2 group, basic identifying information about that group will be here. For full information, use list_groups"},"endSession":{"type":"boolean"},"expiresInSeconds":{"type":"int","doc":"the expiry timer on the incoming message. Clients should delete records of the message within this number of seconds"},"profileKeyUpdate":{"type":"boolean"},"quote":{"type":"JsonQuote","version":"v0","doc":"if the incoming message is a quote or reply to another message, this will contain information about that message"},"contacts":{"list":true,"type":"SharedContact","version":"v0","doc":"if the incoming message has a shared contact, the contact's information will be here"},"previews":{"list":true,"type":"JsonPreview","version":"v0","doc":"if the incoming message has a link preview, information about that preview will be here"},"sticker":{"type":"JsonSticker","version":"v0","doc":"if the incoming message is a sticker, information about the sicker will be here"},"viewOnce":{"type":"boolean","doc":"indicates the message is a view once message. View once messages typically include no body and a single image attachment. Official Signal clients will prevent the user from saving the image, and once the user has viewed the image once they will destroy the image."},"reaction":{"type":"JsonReaction","version":"v0","doc":"if the message adds or removes a reaction to another message, this will indicate what change is being made"},"remoteDelete":{"type":"RemoteDelete","version":"v0","doc":"if the inbound message is deleting a previously sent message, indicates which message should be deleted"},"mentions":{"list":true,"type":"JsonMention","version":"v0","doc":"list of mentions in the message"}},"deprecated":true,"removal_date":1641027661},"JsonSyncMessage":{"fields":{"sent":{"type":"JsonSentTranscriptMessage","version":"v0"},"contacts":{"type":"JsonAttachment","version":"v0"},"contactsComplete":{"type":"boolean"},"groups":{"type":"JsonAttachment","version":"v0"},"blockedList":{"type":"JsonBlockedListMessage","version":"v0"},"request":{"type":"String"},"readMessages":{"list":true,"type":"JsonReadMessage","version":"v0"},"viewOnceOpen":{"type":"JsonViewOnceOpenMessage","version":"v0"},"verified":{"type":"JsonVerifiedMessage","version":"v0"},"configuration":{"type":"ConfigurationMessage","version":"v0"},"stickerPackOperations":{"list":true,"type":"JsonStickerPackOperationMessage","version":"v0"},"fetchType":{"type":"String"},"messageRequestResponse":{"type":"JsonMessageRequestResponseMessage","version":"v0"}},"deprecated":true,"removal_date":1641027661},"JsonCallMessage":{"fields":{"offerMessage":{"type":"OfferMessage","version":"v0"},"answerMessage":{"type":"AnswerMessage","version":"v0"},"busyMessage":{"type":"BusyMessage","version":"v0"},"hangupMessage":{"type":"HangupMessage","version":"v0"},"iceUpdateMessages":{"list":true,"type":"IceUpdateMessage","version":"v0"},"destinationDeviceId":{"type":"int"},"isMultiRing":{"type":"boolean"}},"deprecated":true,"removal_date":1641027661},"JsonReceiptMessage":{"fields":{"type":{"type":"String"},"timestamps":{"list":true,"type":"Long"},"when":{"type":"long"}},"deprecated":true,"removal_date":1641027661},"JsonTypingMessage":{"fields":{"action":{"type":"String"},"timestamp":{"type":"long"},"groupId":{"type":"String"}},"deprecated":true,"removal_date":1641027661},"JsonAttachment":{"fields":{"contentType":{"type":"String"},"id":{"type":"String"},"size":{"type":"int"},"storedFilename":{"type":"String"},"filename":{"type":"String"},"customFilename":{"type":"String"},"caption":{"type":"String"},"width":{"type":"int"},"height":{"type":"int"},"voiceNote":{"type":"boolean"},"key":{"type":"String"},"digest":{"type":"String"},"blurhash":{"type":"String"}},"deprecated":true,"removal_date":1641027661},"JsonGroupInfo":{"fields":{"groupId":{"type":"String"},"members":{"list":true,"type":"JsonAddress","version":"v0"},"name":{"type":"String"},"type":{"type":"String"},"avatarId":{"type":"long"}},"deprecated":true,"removal_date":1641027661},"JsonGroupV2Info":{"fields":{"id":{"type":"String","example":"\"EdSqI90cS0UomDpgUXOlCoObWvQOXlH5G3Z2d3f4ayE=\""},"revision":{"type":"int","example":"5"},"title":{"type":"String","example":"\"Parkdale Run Club\""},"description":{"type":"String"},"avatar":{"type":"String","doc":"path to the group's avatar on local disk, if available","example":"\"/var/lib/signald/avatars/group-EdSqI90cS0UomDpgUXOlCoObWvQOXlH5G3Z2d3f4ayE=\""},"timer":{"type":"int","example":"604800"},"members":{"list":true,"type":"JsonAddress","version":"v0"},"pendingMembers":{"list":true,"type":"JsonAddress","version":"v0"},"requestingMembers":{"list":true,"type":"JsonAddress","version":"v0"},"inviteLink":{"type":"String","doc":"the signal.group link, if applicable"},"accessControl":{"type":"GroupAccessControl","version":"v0","doc":"current access control settings for this group"},"memberDetail":{"list":true,"type":"GroupMember","version":"v0","doc":"detailed member list"},"pendingMemberDetail":{"list":true,"type":"GroupMember","version":"v0","doc":"detailed pending member list"}},"deprecated":true,"removal_date":1641027661},"JsonQuote":{"fields":{"id":{"type":"long","doc":"the client timestamp of the message being quoted","example":"1615576442475"},"author":{"type":"JsonAddress","version":"v0","doc":"the author of the message being quoted"},"text":{"type":"String","doc":"the body of the message being quoted","example":"\"hey ? what's up?\""},"attachments":{"list":true,"type":"JsonQuotedAttachment","version":"v0","doc":"list of files attached to the quoted message"},"mentions":{"list":true,"type":"JsonMention","version":"v0","doc":"list of mentions in the quoted message"}},"doc":"A quote is a reply to a previous message. ID is the sent time of the message being replied to","deprecated":true,"removal_date":1641027661},"SharedContact":{"fields":{"name":{"type":"Name","version":"v0"},"avatar":{"type":"Optional","version":"v0"},"phone":{"type":"Optional","version":"v0"},"email":{"type":"Optional","version":"v0"},"address":{"type":"Optional","version":"v0"},"organization":{"type":"Optional","version":"v0"}}},"JsonPreview":{"fields":{"url":{"type":"String"},"title":{"type":"String"},"attachment":{"type":"JsonAttachment","version":"v0"}},"deprecated":true,"removal_date":1641027661},"JsonSticker":{"fields":{"packID":{"type":"String"},"packKey":{"type":"String"},"stickerID":{"type":"int"},"attachment":{"type":"JsonAttachment","version":"v0"},"image":{"type":"String"}},"deprecated":true,"removal_date":1641027661},"JsonReaction":{"fields":{"emoji":{"type":"String","doc":"the emoji to react with","example":"\"?\""},"remove":{"type":"boolean","doc":"set to true to remove the reaction. requires emoji be set to previously reacted emoji"},"targetAuthor":{"type":"JsonAddress","version":"v0","doc":"the author of the message being reacted to"},"targetSentTimestamp":{"type":"long","doc":"the client timestamp of the message being reacted to","example":"1615576442475"}},"deprecated":true,"removal_date":1641027661},"RemoteDelete":{"fields":{"targetSentTimestamp":{"type":"long"}}},"JsonMention":{"fields":{"uuid":{"type":"String","doc":"The UUID of the account being mentioned","example":"\"aeed01f0-a234-478e-8cf7-261c283151e7\""},"start":{"type":"int","doc":"The number of characters in that the mention starts at. Note that due to a quirk of how signald encodes JSON, if this value is 0 (for example if the first character in the message is the mention) the field won't show up.","example":"4"},"length":{"type":"int","doc":"The length of the mention represented in the message. Seems to always be 1 but included here in case that changes.","example":"1"}},"deprecated":true,"removal_date":1641027661},"JsonSentTranscriptMessage":{"fields":{"destination":{"type":"JsonAddress","version":"v0"},"timestamp":{"type":"long","example":"1615576442475"},"expirationStartTimestamp":{"type":"long"},"message":{"type":"JsonDataMessage","version":"v0"},"unidentifiedStatus":{"type":"Map"},"isRecipientUpdate":{"type":"boolean"}},"deprecated":true,"removal_date":1641027661},"JsonBlockedListMessage":{"fields":{"addresses":{"list":true,"type":"JsonAddress","version":"v0"},"groupIds":{"list":true,"type":"String"}},"deprecated":true,"removal_date":1641027661},"JsonReadMessage":{"fields":{"sender":{"type":"JsonAddress","version":"v0"},"timestamp":{"type":"long","example":"1615576442475"}},"deprecated":true,"removal_date":1641027661},"JsonViewOnceOpenMessage":{"fields":{"sender":{"type":"JsonAddress","version":"v0"},"timestamp":{"type":"long","example":"1615576442475"}},"deprecated":true,"removal_date":1641027661},"JsonVerifiedMessage":{"fields":{"destination":{"type":"JsonAddress","version":"v0"},"identityKey":{"type":"String"},"verified":{"type":"String"},"timestamp":{"type":"long"}},"deprecated":true,"removal_date":1641027661},"ConfigurationMessage":{"fields":{"readReceipts":{"type":"Optional","version":"v0"},"unidentifiedDeliveryIndicators":{"type":"Optional","version":"v0"},"typingIndicators":{"type":"Optional","version":"v0"},"linkPreviews":{"type":"Optional","version":"v0"}}},"JsonStickerPackOperationMessage":{"fields":{"packID":{"type":"String"},"packKey":{"type":"String"},"type":{"type":"String"}},"deprecated":true,"removal_date":1641027661},"JsonMessageRequestResponseMessage":{"fields":{"person":{"type":"JsonAddress","version":"v0"},"groupId":{"type":"String"},"type":{"type":"String"}},"deprecated":true,"removal_date":1641027661},"OfferMessage":{"fields":{"id":{"type":"long"},"sdp":{"type":"String"},"type":{"type":"Type","version":"v0"},"opaque":{"type":"String"}}},"AnswerMessage":{"fields":{"id":{"type":"long"},"sdp":{"type":"String"},"opaque":{"type":"String"}}},"BusyMessage":{"fields":{"id":{"type":"long"}}},"HangupMessage":{"fields":{"id":{"type":"long"},"type":{"type":"Type","version":"v0"},"deviceId":{"type":"int"},"legacy":{"type":"boolean"}}},"IceUpdateMessage":{"fields":{"id":{"type":"long"},"opaque":{"type":"String"},"sdp":{"type":"String"}}},"JsonQuotedAttachment":{"fields":{"contentType":{"type":"String"},"fileName":{"type":"String"},"thumbnail":{"type":"JsonAttachment","version":"v0"}},"deprecated":true,"removal_date":1641027661},"GroupAccessControl":{"fields":{"link":{"type":"String","doc":"UNSATISFIABLE when the group link is disabled, ADMINISTRATOR when the group link is enabled but an administrator must approve new members, ANY when the group link is enabled and no approval is required","example":"\"ANY\""},"attributes":{"type":"String","doc":"who can edit group info"},"members":{"type":"String","doc":"who can add members"}},"doc":"group access control settings. Options for each controlled action are: UNKNOWN, ANY, MEMBER, ADMINISTRATOR, UNSATISFIABLE and UNRECOGNIZED","deprecated":true,"removal_date":1641027661},"GroupMember":{"fields":{"uuid":{"type":"String","example":"\"aeed01f0-a234-478e-8cf7-261c283151e7\""},"role":{"type":"String","doc":"possible values are: UNKNOWN, DEFAULT, ADMINISTRATOR and UNRECOGNIZED","example":"\"DEFAULT\""},"joined_revision":{"type":"int"}},"deprecated":true,"removal_date":1641027661},"Name":{"fields":{"display":{"type":"Optional","version":"v0"},"given":{"type":"Optional","version":"v0"},"family":{"type":"Optional","version":"v0"},"prefix":{"type":"Optional","version":"v0"},"suffix":{"type":"Optional","version":"v0"},"middle":{"type":"Optional","version":"v0"}}},"Optional":{"fields":{"empty":{"type":"boolean"},"present":{"type":"boolean"}}},"Type":{"fields":{}}},"v1":{"ClientMessageWrapper":{"fields":{"type":{"type":"String","doc":"the type of object to expect in the `data` field"},"version":{"type":"String","doc":"the version of the object in the `data` field"},"data":{"type":"Object","doc":"the incoming object. The structure will vary from message to message, see `type` and `version` fields"},"error":{"type":"Boolean","doc":"true if the incoming message represents an error"},"account":{"type":"String","doc":"the account this message is from"}},"doc":"Wraps all incoming messages sent to the client after a v1 subscribe request is issued"},"UntrustedIdentityError":{"fields":{"identifier":{"type":"String"},"message":{"type":"String"},"identity_key":{"type":"IdentityKey","version":"v1"}},"error":true},"ProtocolNoSessionError":{"fields":{"sender":{"type":"String"},"timestamp":{"type":"long"},"message":{"type":"String"},"sender_device":{"type":"int"},"content_hint":{"type":"int"},"group_id":{"type":"String"}},"error":true},"DuplicateMessageError":{"fields":{"timestamp":{"type":"long"},"message":{"type":"String"}},"error":true},"ProtocolInvalidMessageError":{"fields":{"sender":{"type":"String"},"timestamp":{"type":"long"},"message":{"type":"String"},"sender_device":{"type":"int"},"content_hint":{"type":"int"},"group_id":{"type":"String"}},"error":true},"ProtocolInvalidKeyIdError":{"fields":{"sender":{"type":"String"},"timestamp":{"type":"long"},"message":{"type":"String"},"sender_device":{"type":"int"},"content_hint":{"type":"int"},"group_id":{"type":"String"}},"error":true},"IncomingMessage":{"fields":{"account":{"type":"String","example":"\"+12024561414\""},"source":{"type":"JsonAddress","version":"v1"},"type":{"type":"String"},"timestamp":{"type":"long","example":"1615576442475"},"source_device":{"type":"int"},"server_receiver_timestamp":{"type":"long","example":"1615576442475"},"server_deliver_timestamp":{"type":"long","example":"1615576442475"},"has_legacy_message":{"type":"boolean"},"has_content":{"type":"boolean"},"unidentified_sender":{"type":"boolean"},"data_message":{"type":"JsonDataMessage","version":"v1"},"sync_message":{"type":"JsonSyncMessage","version":"v1"},"call_message":{"type":"CallMessage","version":"v1"},"receipt_message":{"type":"ReceiptMessage","version":"v1"},"typing_message":{"type":"TypingMessage","version":"v1"},"story_message":{"type":"StoryMessage","version":"v1"},"server_guid":{"type":"String"}}},"ListenerState":{"fields":{"connected":{"type":"boolean"}},"doc":"prior attempt to indicate signald connectivity state. WebSocketConnectionState messages will be delivered at the same time as well as in other parts of the websocket lifecycle."},"WebSocketConnectionState":{"fields":{"state":{"type":"String","doc":"One of: DISCONNECTED, CONNECTING, CONNECTED, RECONNECTING, DISCONNECTING, AUTHENTICATION_FAILED, FAILED"},"socket":{"type":"String","doc":"One of: UNIDENTIFIED, IDENTIFIED"}},"doc":"indicates when the websocket connection state to the signal server has changed"},"StorageChange":{"fields":{"version":{"type":"long","doc":"Seems to behave like the group version numbers and increments every time the state changes"}},"doc":"Broadcast to subscribed clients when there is a state change from the storage service"},"SendRequest":{"fields":{"username":{"type":"String","example":"\"+12024561414\""},"account":{"type":"String","example":"\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\""},"recipientAddress":{"type":"JsonAddress","version":"v1"},"recipientGroupId":{"type":"String","example":"\"EdSqI90cS0UomDpgUXOlCoObWvQOXlH5G3Z2d3f4ayE=\""},"messageBody":{"type":"String","example":"\"hello\""},"attachments":{"list":true,"type":"JsonAttachment","version":"v1"},"quote":{"type":"JsonQuote","version":"v1"},"timestamp":{"type":"Long"},"mentions":{"list":true,"type":"JsonMention","version":"v1"},"previews":{"list":true,"type":"JsonPreview","version":"v1"},"members":{"list":true,"type":"JsonAddress","version":"v1","doc":"Optionally set to a sub-set of group members. Ignored if recipientGroupId isn't specified"}}},"SendResponse":{"fields":{"results":{"list":true,"type":"JsonSendMessageResult","version":"v1"},"timestamp":{"type":"long","example":"1615576442475"}}},"NoSuchAccountError":{"fields":{"account":{"type":"String"},"message":{"type":"String"}},"error":true},"ServerNotFoundError":{"fields":{"uuid":{"type":"String"},"message":{"type":"String"}},"error":true},"InvalidProxyError":{"fields":{"message":{"type":"String"}},"error":true},"NoSendPermissionError":{"fields":{"message":{"type":"String"}},"error":true},"InvalidAttachmentError":{"fields":{"filename":{"type":"String"},"message":{"type":"String"}},"error":true},"InternalError":{"fields":{"exceptions":{"list":true,"type":"String"},"message":{"type":"String"}},"doc":"an internal error in signald has occurred. typically these are things that \"should never happen\" such as issues saving to the local disk, but it is also the default error type and may catch some things that should have their own error type. If you find tht your code is depending on the exception list for any particular behavior, please file an issue so we can pull those errors out to a separate error type: https://gitlab.com/signald/signald/-/issues/new","error":true},"InvalidRequestError":{"fields":{"message":{"type":"String"}},"error":true},"UnknownGroupError":{"fields":{"message":{"type":"String"}},"error":true},"RateLimitError":{"fields":{"message":{"type":"String"}},"error":true},"InvalidRecipientError":{"fields":{"message":{"type":"String"}},"error":true},"AttachmentTooLargeError":{"fields":{"filename":{"type":"String"},"message":{"type":"String"}},"error":true},"AuthorizationFailedError":{"fields":{"message":{"type":"String"}},"doc":"Indicates the server rejected our credentials or a failed group update. Typically means the linked device was removed by the primary device, or that the account was re-registered. For group updates, this can indicate that we lack permissions.","error":true},"SQLError":{"fields":{"message":{"type":"String"}},"error":true},"ReactRequest":{"fields":{"username":{"type":"String","example":"\"+12024561414\"","required":true},"recipientAddress":{"type":"JsonAddress","version":"v1"},"recipientGroupId":{"type":"String","example":"\"EdSqI90cS0UomDpgUXOlCoObWvQOXlH5G3Z2d3f4ayE=\""},"reaction":{"type":"JsonReaction","version":"v1","required":true},"timestamp":{"type":"long"},"members":{"list":true,"type":"JsonAddress","version":"v1","doc":"Optionally set to a sub-set of group members. Ignored if recipientGroupId isn't specified"}},"doc":"react to a previous message"},"UnregisteredUserError":{"fields":{"message":{"type":"String"},"e164_number":{"type":"String"}},"error":true},"VersionRequest":{"fields":{}},"JsonVersionMessage":{"fields":{"name":{"type":"String","example":"\"signald\""},"version":{"type":"String","example":"\"0.20.0-9-d745ad70\""},"branch":{"type":"String","example":"\"call-signaling\""},"commit":{"type":"String","example":"\"d745ad70473054386b8046c7bfd52a6809d2a74d\""}}},"AcceptInvitationRequest":{"fields":{"account":{"type":"String","doc":"The account to interact with","example":"\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"","required":true},"groupID":{"type":"String","example":"\"EdSqI90cS0UomDpgUXOlCoObWvQOXlH5G3Z2d3f4ayE=\"","required":true}},"doc":"Accept a v2 group invitation. Note that you must have a profile name set to join groups."},"JsonGroupV2Info":{"fields":{"id":{"type":"String","example":"\"EdSqI90cS0UomDpgUXOlCoObWvQOXlH5G3Z2d3f4ayE=\""},"revision":{"type":"int","example":"5"},"title":{"type":"String","example":"\"Parkdale Run Club\""},"description":{"type":"String"},"avatar":{"type":"String","doc":"path to the group's avatar on local disk, if available","example":"\"/var/lib/signald/avatars/group-EdSqI90cS0UomDpgUXOlCoObWvQOXlH5G3Z2d3f4ayE=\""},"timer":{"type":"int","example":"604800"},"members":{"list":true,"type":"JsonAddress","version":"v1"},"pendingMembers":{"list":true,"type":"JsonAddress","version":"v1"},"requestingMembers":{"list":true,"type":"JsonAddress","version":"v1"},"inviteLink":{"type":"String","doc":"the signal.group link, if applicable"},"accessControl":{"type":"GroupAccessControl","version":"v1","doc":"current access control settings for this group"},"memberDetail":{"list":true,"type":"GroupMember","version":"v1","doc":"detailed member list"},"pendingMemberDetail":{"list":true,"type":"GroupMember","version":"v1","doc":"detailed pending member list"},"announcements":{"type":"String","doc":"indicates if the group is an announcements group. Only admins are allowed to send messages to announcements groups. Options are UNKNOWN, ENABLED or DISABLED"},"removed":{"type":"boolean","doc":"will be set to true for incoming messages to indicate the user has been removed from the group"},"banned_members":{"list":true,"type":"BannedGroupMember","version":"v1"},"group_change":{"type":"GroupChange","version":"v1","doc":"Represents a peer-to-peer group change done by a user. Will not be set if the group change signature fails verification. This is usually only set inside of incoming messages."}},"doc":"Information about a Signal group"},"OwnProfileKeyDoesNotExistError":{"fields":{"message":{"type":"String"}},"error":true},"GroupPatchNotAcceptedError":{"fields":{"message":{"type":"String"}},"doc":"Indicates the server rejected our group update. This can be due to errors such as trying to add a user that's already in the group.","error":true},"ApproveMembershipRequest":{"fields":{"account":{"type":"String","doc":"The account to interact with","example":"\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"","required":true},"groupID":{"type":"String","example":"\"EdSqI90cS0UomDpgUXOlCoObWvQOXlH5G3Z2d3f4ayE=\"","required":true},"members":{"list":true,"type":"JsonAddress","version":"v1","doc":"list of requesting members to approve","required":true}},"doc":"approve a request to join a group"},"GroupVerificationError":{"fields":{"message":{"type":"String"}},"error":true},"GetGroupRequest":{"fields":{"account":{"type":"String","doc":"The account to interact with","example":"\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"","required":true},"groupID":{"type":"String","example":"\"EdSqI90cS0UomDpgUXOlCoObWvQOXlH5G3Z2d3f4ayE=\"","required":true},"revision":{"type":"int","doc":"the latest known revision, default value (-1) forces fetch from server"}},"doc":"Query the server for the latest state of a known group. If the account is not a member of the group, an UnknownGroupError is returned."},"InvalidGroupStateError":{"fields":{"message":{"type":"String"}},"error":true},"GetLinkedDevicesRequest":{"fields":{"account":{"type":"String","doc":"The account to interact with","example":"\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"","required":true}},"doc":"list all linked devices on a Signal account"},"LinkedDevices":{"fields":{"devices":{"list":true,"type":"DeviceInfo","version":"v1"}}},"JoinGroupRequest":{"fields":{"account":{"type":"String","doc":"The account to interact with","example":"\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"","required":true},"uri":{"type":"String","doc":"The signal.group URL","example":"\"https://signal.group/#CjQKINH_GZhXhfifTcnBkaKTNRxW-hHKnGSq-cJNyPVqHRp8EhDUB7zjKNEl0NaULhsqJCX3\"","required":true}},"doc":"Join a group using the a signal.group URL. Note that you must have a profile name set to join groups."},"JsonGroupJoinInfo":{"fields":{"groupID":{"type":"String","example":"\"EdSqI90cS0UomDpgUXOlCoObWvQOXlH5G3Z2d3f4ayE=\""},"title":{"type":"String","example":"\"Parkdale Run Club\""},"description":{"type":"String","example":"\"A club for running in Parkdale\""},"memberCount":{"type":"int","example":"3"},"addFromInviteLink":{"type":"int","doc":"The access level required in order to join the group from the invite link, as an AccessControl.AccessRequired enum from the upstream Signal groups.proto file. This is UNSATISFIABLE (4) when the group link is disabled; ADMINISTRATOR (3) when the group link is enabled, but an administrator must approve new members; and ANY (1) when the group link is enabled and no approval is required. See theGroupAccessControl structure and the upstream enum ordinals."},"revision":{"type":"int","doc":"The Group V2 revision. This is incremented by clients whenever they update group information, and it is often used by clients to determine if the local group state is out-of-date with the server's revision.","example":"5"},"pendingAdminApproval":{"type":"boolean","doc":"Whether the account is waiting for admin approval in order to be added to the group."}}},"InvalidInviteURIError":{"fields":{"message":{"type":"String"}},"error":true},"GroupNotActiveError":{"fields":{"message":{"type":"String"}},"error":true},"RemoveLinkedDeviceRequest":{"fields":{"account":{"type":"String","doc":"The account to interact with","example":"\"+12024561414\"","required":true},"deviceId":{"type":"long","doc":"the ID of the device to unlink","example":"3","required":true}},"doc":"Remove a linked device from the Signal account. Only allowed when the local device id is 1"},"UpdateGroupRequest":{"fields":{"account":{"type":"String","doc":"The identifier of the account to interact with","example":"\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"","required":true},"groupID":{"type":"String","doc":"the ID of the group to update","example":"\"EdSqI90cS0UomDpgUXOlCoObWvQOXlH5G3Z2d3f4ayE=\"","required":true},"title":{"type":"String","example":"\"Parkdale Run Club\""},"description":{"type":"String","doc":"A new group description. Set to empty string to remove an existing description.","example":"\"A club for running in Parkdale\""},"avatar":{"type":"String","example":"\"/tmp/image.jpg\""},"updateTimer":{"type":"int","doc":"update the group timer."},"addMembers":{"list":true,"type":"JsonAddress","version":"v1"},"removeMembers":{"list":true,"type":"JsonAddress","version":"v1"},"updateRole":{"type":"GroupMember","version":"v1"},"updateAccessControl":{"type":"GroupAccessControl","version":"v1","doc":"note that only one of the access controls may be updated per request"},"resetLink":{"type":"boolean","doc":"regenerate the group link password, invalidating the old one"},"announcements":{"type":"String","doc":"ENABLED to only allow admins to post messages, DISABLED to allow anyone to post"}},"doc":"modify a group. Note that only one modification action may be performed at once"},"GroupInfo":{"fields":{"v1":{"type":"JsonGroupInfo","version":"v1"},"v2":{"type":"JsonGroupV2Info","version":"v1"}},"doc":"A generic type that is used when the group version is not known"},"UnsupportedGroupError":{"fields":{"message":{"type":"String"}},"doc":"returned in response to use v1 groups, which are no longer supported","error":true},"SetProfile":{"fields":{"account":{"type":"String","doc":"The phone number of the account to use","example":"\"+12024561414\"","required":true},"name":{"type":"String","doc":"Change the profile name","example":"\"signald user\""},"avatarFile":{"type":"String","doc":"Path to new profile avatar file. If unset or null, unset the profile avatar","example":"\"/tmp/image.jpg\""},"about":{"type":"String","doc":"Change the 'about' profile field"},"emoji":{"type":"String","doc":"Change the profile emoji"},"mobilecoin_address":{"type":"String","doc":"Change the profile payment address. Payment address must be a *base64-encoded* MobileCoin address. Note that this is not the traditional MobileCoin address encoding, which is custom. Clients are responsible for converting between MobileCoin's custom base58 on the user-facing side and base64 encoding on the signald side."},"visible_badge_ids":{"list":true,"type":"String","doc":"configure visible badge IDs"}}},"InvalidBase64Error":{"fields":{"message":{"type":"String"}},"error":true},"ResolveAddressRequest":{"fields":{"account":{"type":"String","doc":"The signal account to use","example":"\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"","required":true},"partial":{"type":"JsonAddress","version":"v1","doc":"The partial address, missing fields","required":true}},"doc":"Resolve a partial JsonAddress with only a number or UUID to one with both. Anywhere that signald accepts a JsonAddress will except a partial, this is a convenience function for client authors, mostly because signald doesn't resolve all the partials it returns."},"JsonAddress":{"fields":{"number":{"type":"String","doc":"An e164 phone number, starting with +. Currently the only available user-facing Signal identifier.","example":"\"+13215551234\""},"uuid":{"type":"UUID","doc":"A UUID, the unique identifier for a particular Signal account."},"relay":{"type":"String"}}},"MarkReadRequest":{"fields":{"account":{"type":"String","doc":"The account to interact with","example":"\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"","required":true},"to":{"type":"JsonAddress","version":"v1","doc":"The address that sent the message being marked as read","required":true},"timestamps":{"list":true,"type":"Long","doc":"List of messages to mark as read","example":"1615576442475","required":true},"when":{"type":"Long"}}},"ProofRequiredError":{"fields":{"token":{"type":"String"},"options":{"list":true,"type":"String","doc":"possible list values are RECAPTCHA and PUSH_CHALLENGE"},"message":{"type":"String"},"retry_after":{"type":"long","doc":"value in seconds"}},"error":true},"GetProfileRequest":{"fields":{"account":{"type":"String","doc":"the signald account to use","example":"\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"","required":true},"async":{"type":"boolean","doc":"if true, return results from local store immediately, refreshing from server in the background if needed. if false (default), block until profile can be retrieved from server"},"address":{"type":"JsonAddress","version":"v1","doc":"the address to look up","required":true}},"doc":"Get all information available about a user"},"Profile":{"fields":{"name":{"type":"String","doc":"The user's name from local contact names if available, or if not in contact list their Signal profile name"},"avatar":{"type":"String","doc":"path to avatar on local disk"},"address":{"type":"JsonAddress","version":"v1"},"capabilities":{"type":"Capabilities","version":"v1"},"color":{"type":"String","doc":"color of the chat with this user"},"about":{"type":"String"},"emoji":{"type":"String"},"contact_name":{"type":"String","doc":"The user's name from local contact names"},"profile_name":{"type":"String","doc":"The user's Signal profile name"},"inbox_position":{"type":"Integer"},"expiration_time":{"type":"int"},"mobilecoin_address":{"type":"String","doc":"*base64-encoded* mobilecoin address. Note that this is not the traditional MobileCoin address encoding. Clients are responsible for converting between MobileCoin's custom base58 on the user-facing side and base64 encoding on the signald side. If unset, null or an empty string, will empty the profile payment address"},"visible_badge_ids":{"list":true,"type":"String","doc":"currently unclear how these work, as they are not available in the production Signal apps"}},"doc":"Information about a Signal user"},"ProfileUnavailableError":{"fields":{"message":{"type":"String"}},"error":true},"ListGroupsRequest":{"fields":{"account":{"type":"String","example":"\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"","required":true}}},"GroupList":{"fields":{"groups":{"list":true,"type":"JsonGroupV2Info","version":"v1"},"legacyGroups":{"list":true,"type":"JsonGroupInfo","version":"v1","doc":"list of legacy (v1) groups, no longer supported (will always be empty)"}}},"ListContactsRequest":{"fields":{"account":{"type":"String","example":"\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"","required":true},"async":{"type":"boolean","doc":"return results from local store immediately, refreshing from server afterward if needed. If false (default), block until all pending profiles have been retrieved."}}},"ProfileList":{"fields":{"profiles":{"list":true,"type":"Profile","version":"v1"}}},"CreateGroupRequest":{"fields":{"account":{"type":"String","doc":"The account to interact with","example":"\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"","required":true},"title":{"type":"String","example":"\"Parkdale Run Club\"","required":true},"avatar":{"type":"String","example":"\"/tmp/image.jpg\""},"members":{"list":true,"type":"JsonAddress","version":"v1","required":true},"timer":{"type":"int","doc":"the message expiration timer"},"member_role":{"type":"String","doc":"The role of all members other than the group creator. Options are ADMINISTRATOR or DEFAULT (case insensitive)","example":"\"ADMINISTRATOR\""}}},"NoKnownUUIDError":{"fields":{"message":{"type":"String"}},"error":true},"LeaveGroupRequest":{"fields":{"account":{"type":"String","doc":"The account to use","example":"\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"","required":true},"groupID":{"type":"String","doc":"The group to leave","example":"\"EdSqI90cS0UomDpgUXOlCoObWvQOXlH5G3Z2d3f4ayE=\"","required":true}}},"GenerateLinkingURIRequest":{"fields":{"server":{"type":"String","doc":"The identifier of the server to use. Leave blank for default (usually Signal production servers but configurable at build time)"}},"doc":"Generate a linking URI. Typically this is QR encoded and scanned by the primary device. Submit the returned session_id with a finish_link request."},"LinkingURI":{"fields":{"uri":{"type":"String"},"session_id":{"type":"String"}}},"FinishLinkRequest":{"fields":{"overwrite":{"type":"boolean","doc":"overwrite existing account data if the phone number conflicts. false by default"},"device_name":{"type":"String"},"session_id":{"type":"String"}},"doc":"After a linking URI has been requested, finish_link must be called with the session_id provided with the URI. it will return information about the new account once the linking process is completed by the other device and the new account is setup. Note that the account setup process can sometimes take some time, if rapid userfeedback is required after scanning, use wait_for_scan first, then finish setup with finish_link."},"Account":{"fields":{"address":{"type":"JsonAddress","version":"v1","doc":"The address of this account"},"pending":{"type":"Boolean","doc":"indicates the account has not completed registration"},"pni":{"type":"String"},"device_id":{"type":"int","doc":"The Signal device ID. Official Signal mobile clients (iPhone and Android) have device ID = 1, while linked devices such as Signal Desktop or Signal iPad have higher device IDs."},"account_id":{"type":"String","doc":"The primary identifier on the account, included with all requests to signald for this account. Previously called 'username'"}},"doc":"A local account in signald"},"NoSuchSessionError":{"fields":{"message":{"type":"String"}},"error":true},"UserAlreadyExistsError":{"fields":{"uuid":{"type":"UUID"},"message":{"type":"String"}},"error":true},"ScanTimeoutError":{"fields":{"message":{"type":"String"}},"error":true},"AddLinkedDeviceRequest":{"fields":{"account":{"type":"String","doc":"The account to interact with","example":"\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"","required":true},"uri":{"type":"String","doc":"the sgnl://linkdevice uri provided (typically in qr code form) by the new device","example":"\"sgnl://linkdevice?uuid=jAaZ5lxLfh7zVw5WELd6-Q&pub_key=BfFbjSwmAgpVJBXUdfmSgf61eX3a%2Bq9AoxAVpl1HUap9\"","required":true}},"doc":"Link a new device to a local Signal account"},"RegisterRequest":{"fields":{"account":{"type":"String","doc":"the e164 phone number to register with","example":"\"+12024561414\"","required":true},"voice":{"type":"boolean","doc":"set to true to request a voice call instead of an SMS for verification"},"captcha":{"type":"String","doc":"See https://signald.org/articles/captcha/"},"server":{"type":"String","doc":"The identifier of the server to use. Leave blank for default (usually Signal production servers but configurable at build time)"}},"doc":"begin the account registration process by requesting a phone number verification code. when the code is received, submit it with a verify request"},"CaptchaRequiredError":{"fields":{"more":{"type":"String"},"message":{"type":"String"}},"error":true},"VerifyRequest":{"fields":{"account":{"type":"String","doc":"the e164 phone number being verified","example":"\"+12024561414\"","required":true},"code":{"type":"String","doc":"the verification code, dash (-) optional","example":"\"555555\"","required":true}},"doc":"verify an account's phone number with a code after registering, completing the account creation process"},"AccountHasNoKeysError":{"fields":{"message":{"type":"String"}},"error":true},"AccountAlreadyVerifiedError":{"fields":{"message":{"type":"String"}},"error":true},"AccountLockedError":{"fields":{"more":{"type":"String"},"message":{"type":"String"}},"error":true},"GetIdentitiesRequest":{"fields":{"account":{"type":"String","doc":"The account to interact with","example":"\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"","required":true},"address":{"type":"JsonAddress","version":"v1","doc":"address to get keys for","required":true}},"doc":"Get information about a known keys for a particular address"},"IdentityKeyList":{"fields":{"address":{"type":"JsonAddress","version":"v1"},"identities":{"list":true,"type":"IdentityKey","version":"v1"}},"doc":"a list of identity keys associated with a particular address"},"TrustRequest":{"fields":{"account":{"type":"String","doc":"The account to interact with","example":"\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"","required":true},"address":{"type":"JsonAddress","version":"v1","doc":"The user to query identity keys for","required":true},"safety_number":{"type":"String","doc":"required if qr_code_data is absent","example":"\"373453558586758076680580548714989751943247272727416091564451\""},"qr_code_data":{"type":"String","doc":"base64-encoded QR code data. required if safety_number is absent"},"trust_level":{"type":"String","doc":"One of TRUSTED_UNVERIFIED, TRUSTED_VERIFIED or UNTRUSTED. Default is TRUSTED_VERIFIED","example":"\"TRUSTED_VERIFIED\""}},"doc":"Trust another user's safety number using either the QR code data or the safety number text"},"FingerprintVersionMismatchError":{"fields":{"message":{"type":"String"}},"error":true},"UnknownIdentityKeyError":{"fields":{"message":{"type":"String"}},"error":true},"InvalidFingerprintError":{"fields":{"message":{"type":"String"}},"error":true},"DeleteAccountRequest":{"fields":{"account":{"type":"String","doc":"The account to delete","example":"\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"","required":true},"server":{"type":"boolean","doc":"delete account information from the server as well (default false)"}},"doc":"delete all account data signald has on disk, and optionally delete the account from the server as well. Note that this is not \"unlink\" and will delete the entire account, even from a linked device."},"TypingRequest":{"fields":{"account":{"type":"String","doc":"The account to use","example":"\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"","required":true},"address":{"type":"JsonAddress","version":"v1"},"group":{"type":"String","example":"\"EdSqI90cS0UomDpgUXOlCoObWvQOXlH5G3Z2d3f4ayE=\""},"typing":{"type":"boolean","example":"true","required":true},"when":{"type":"long"}},"doc":"send a typing started or stopped message"},"InvalidGroupError":{"fields":{"message":{"type":"String"}},"error":true},"ResetSessionRequest":{"fields":{"account":{"type":"String","doc":"The account to use","example":"\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"","required":true},"address":{"type":"JsonAddress","version":"v1","doc":"the user to reset session with","required":true},"timestamp":{"type":"Long"}},"doc":"reset a session with a particular user"},"RequestSyncRequest":{"fields":{"groups":{"type":"boolean","doc":"request group sync (default true)"},"configuration":{"type":"boolean","doc":"request configuration sync (default true)"},"contacts":{"type":"boolean","doc":"request contact sync (default true)"},"blocked":{"type":"boolean","doc":"request block list sync (default true)"},"keys":{"type":"boolean","doc":"request storage service keys"},"account":{"type":"String","doc":"The account to use","example":"\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"","required":true}},"doc":"Request other devices on the account send us their group list, syncable config and contact list."},"ListAccountsRequest":{"fields":{},"doc":"return all local accounts"},"AccountList":{"fields":{"accounts":{"list":true,"type":"Account","version":"v1"}}},"GroupLinkInfoRequest":{"fields":{"account":{"type":"String","doc":"The account to use","example":"\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"","required":true},"uri":{"type":"String","doc":"the signald.group link","example":"\"https://signal.group/#CjQKINH_GZhXhfifTcnBkaKTNRxW-hHKnGSq-cJNyPVqHRp8EhDUB7zjKNEl0NaULhsqJCX3\"","required":true}},"doc":"Get information about a group from a signal.group link"},"GroupLinkNotActiveError":{"fields":{"message":{"type":"String"}},"error":true},"UpdateContactRequest":{"fields":{"account":{"type":"String","example":"\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"","required":true},"address":{"type":"JsonAddress","version":"v1","required":true},"name":{"type":"String"},"color":{"type":"String"},"inbox_position":{"type":"Integer"}},"doc":"update information about a local contact"},"SetExpirationRequest":{"fields":{"account":{"type":"String","doc":"The account to use","example":"\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"","required":true},"address":{"type":"JsonAddress","version":"v1"},"group":{"type":"String","example":"\"EdSqI90cS0UomDpgUXOlCoObWvQOXlH5G3Z2d3f4ayE=\""},"expiration":{"type":"int","example":"604800","required":true}},"doc":"Set the message expiration timer for a thread. Expiration must be specified in seconds, set to 0 to disable timer"},"SetDeviceNameRequest":{"fields":{"account":{"type":"String","doc":"The account to set the device name of","example":"\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"","required":true},"device_name":{"type":"String","doc":"The device name"}},"doc":"set this device's name. This will show up on the mobile device on the same account under settings -> linked devices"},"GetAllIdentities":{"fields":{"account":{"type":"String","doc":"The account to interact with","example":"\"+12024561414\"","required":true}},"doc":"get all known identity keys"},"AllIdentityKeyList":{"fields":{"identity_keys":{"list":true,"type":"IdentityKeyList","version":"v1"}}},"SubscribeRequest":{"fields":{"account":{"type":"String","doc":"The account to subscribe to incoming message for","example":"\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"","required":true}},"doc":"receive incoming messages. After making a subscribe request, incoming messages will be sent to the client encoded as ClientMessageWrapper. Send an unsubscribe request or disconnect from the socket to stop receiving messages."},"UnsubscribeRequest":{"fields":{"account":{"type":"String","doc":"The account to unsubscribe from","example":"\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"","required":true}},"doc":"See subscribe for more info"},"RemoteDeleteRequest":{"fields":{"account":{"type":"String","doc":"the account to use","example":"\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"","required":true},"address":{"type":"JsonAddress","version":"v1","doc":"the address to send the delete message to. should match address the message to be deleted was sent to. required if group is not set."},"group":{"type":"String","doc":"the group to send the delete message to. should match group the message to be deleted was sent to. required if address is not set.","example":"\"EdSqI90cS0UomDpgUXOlCoObWvQOXlH5G3Z2d3f4ayE=\""},"timestamp":{"type":"long","required":true},"members":{"list":true,"type":"JsonAddress","version":"v1","doc":"Optionally set to a sub-set of group members. Ignored if group isn't specified"}},"doc":"delete a message previously sent"},"AddServerRequest":{"fields":{"server":{"type":"Server","version":"v1","required":true}},"doc":"add a new server to connect to. Returns the new server's UUID."},"GetServersRequest":{"fields":{}},"ServerList":{"fields":{"servers":{"list":true,"type":"Server","version":"v1"}}},"RemoveServerRequest":{"fields":{"uuid":{"type":"String"}}},"SendPaymentRequest":{"fields":{"account":{"type":"String","doc":"the account to use","example":"\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"","required":true},"address":{"type":"JsonAddress","version":"v1","doc":"the address to send the payment message to","required":true},"payment":{"type":"Payment","version":"v1","required":true},"when":{"type":"Long"}},"doc":"send a mobilecoin payment"},"RemoteConfigRequest":{"fields":{"account":{"type":"String","doc":"The account to use to retrieve the remote config","example":"\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"","required":true}},"doc":"Retrieves the remote config (feature flags) from the server."},"RemoteConfigList":{"fields":{"config":{"list":true,"type":"RemoteConfig","version":"v1"}}},"RefuseMembershipRequest":{"fields":{"account":{"type":"String","doc":"The account to interact with","example":"\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"","required":true},"members":{"list":true,"type":"JsonAddress","version":"v1","doc":"list of requesting members to refuse","required":true},"group_id":{"type":"String","example":"\"EdSqI90cS0UomDpgUXOlCoObWvQOXlH5G3Z2d3f4ayE=\"","required":true},"also_ban":{"type":"boolean"}},"doc":"deny a request to join a group"},"SubmitChallengeRequest":{"fields":{"account":{"type":"String","example":"\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"","required":true},"challenge":{"type":"String","required":true},"captcha_token":{"type":"String"}}},"IsIdentifierRegisteredRequest":{"fields":{"account":{"type":"String","doc":"The account to use to use","example":"\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"","required":true},"identifier":{"type":"String","doc":"The UUID of an identifier to check if it is registered on Signal. This UUID is either a Phone Number Identity (PNI) or an Account Identity (ACI).","example":"\"aeed01f0-a234-478e-8cf7-261c283151e7\"","required":true}},"doc":"Determine whether an account identifier is registered on the Signal service."},"BooleanMessage":{"fields":{"value":{"type":"boolean"}},"doc":"A message containing a single boolean, usually as a response"},"WaitForScanRequest":{"fields":{"session_id":{"type":"String"}},"doc":"An optional part of the linking process. Intended to be called after displaying the QR code, will return quickly after the user scans the QR code. finish_link must be called after wait_for_scan returns a non-error"},"GetGroupRevisionPagesRequest":{"fields":{"account":{"type":"String","doc":"The account to interact with","example":"\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"","required":true},"group_id":{"type":"String","example":"\"EdSqI90cS0UomDpgUXOlCoObWvQOXlH5G3Z2d3f4ayE=\"","required":true},"from_revision":{"type":"int","doc":"The revision to start the pages from. Note that if this is lower than the revision you joined the group, an AuthorizationFailedError is returned.","required":true},"include_first_revision":{"type":"boolean","doc":"Whether to include the first state in the returned pages (default false)"}},"doc":"Query the server for group revision history. The history contains information about the changes between each revision and the user that made the change."},"GroupHistoryPage":{"fields":{"results":{"list":true,"type":"GroupHistoryEntry","version":"v1"},"paging_data":{"type":"PagingData","version":"v1"}},"doc":"The result of fetching a group's history along with paging data."},"SendSyncMessageRequest":{"fields":{"account":{"type":"String","example":"\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"","required":true},"view_once_open_message":{"type":"JsonViewOnceOpenMessage","version":"v1","doc":"This can be set to indicate to other devices about having viewed a view-once message."},"message_request_response":{"type":"JsonMessageRequestResponseMessage","version":"v1","doc":"This can be set to indicate to other devices about a response to an incoming message request from an unknown user or group. Warning: Using the BLOCK and BLOCK_AND_DELETE options relies on other devices to do the blocking, and it does not make you leave the group!"}},"doc":"Sends a sync message to the account's devices"},"JsonSendMessageResult":{"fields":{"address":{"type":"JsonAddress","version":"v1"},"success":{"type":"SendSuccess","version":"v1"},"networkFailure":{"type":"boolean","example":"false"},"unregisteredFailure":{"type":"boolean","example":"false"},"identityFailure":{"type":"String"},"proof_required_failure":{"type":"ProofRequiredError","version":"v1"}}},"BanUserRequest":{"fields":{"account":{"type":"String","doc":"The account to interact with","example":"\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"","required":true},"group_id":{"type":"String","example":"\"EdSqI90cS0UomDpgUXOlCoObWvQOXlH5G3Z2d3f4ayE=\"","required":true},"users":{"list":true,"type":"JsonAddress","version":"v1","doc":"List of users to ban","required":true}},"doc":"Bans users from a group. This works even if the users aren't in the group. If they are currently in the group, they will also be removed."},"UnbanUserRequest":{"fields":{"account":{"type":"String","doc":"The account to interact with","example":"\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"","required":true},"group_id":{"type":"String","example":"\"EdSqI90cS0UomDpgUXOlCoObWvQOXlH5G3Z2d3f4ayE=\"","required":true},"users":{"list":true,"type":"JsonAddress","version":"v1","doc":"List of users to unban","required":true}},"doc":"Unbans users from a group."},"AnswerCallRequest":{"fields":{"account":{"type":"String","doc":"the local account to use","example":"\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"","required":true},"recipient":{"type":"JsonAddress","version":"v1","doc":"the address of the caller","required":true},"sdp":{"type":"String"},"multiring":{"type":"boolean"},"call_id":{"type":"long","doc":"the id of the call","required":true},"destination_device_id":{"type":"Integer"}}},"SendIceUpdatesRequest":{"fields":{"account":{"type":"String","doc":"the local account to use","example":"\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"","required":true},"recipient":{"type":"JsonAddress","version":"v1","doc":"the address of the caller","required":true},"updates":{"list":true,"type":"IceUpdateMessage","version":"v1","required":true},"multiring":{"type":"boolean"},"destination_device_id":{"type":"Integer"}}},"SendCallOfferRequest":{"fields":{"account":{"type":"String","doc":"the local account to use","example":"\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"","required":true},"recipient":{"type":"JsonAddress","version":"v1","doc":"the address of the caller","required":true},"sdp":{"type":"String"},"multring":{"type":"boolean"},"call_id":{"type":"long","doc":"the id of the call","required":true},"call_type":{"type":"String","doc":"must be one of 'audio_call' or 'video_call'","required":true},"destination_device_id":{"type":"Integer"}}},"HangupCallRequest":{"fields":{"account":{"type":"String","doc":"the local account to use","example":"\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"","required":true},"recipient":{"type":"JsonAddress","version":"v1","doc":"the address of the caller","required":true},"type":{"type":"String","doc":"hangup type, options are: normal, accepted, declined, busy, need_permission"},"multiring":{"type":"boolean"},"call_id":{"type":"long","doc":"the id of the call","required":true},"device_id":{"type":"Integer"},"destination_device_id":{"type":"Integer"}}},"IdentityKey":{"fields":{"added":{"type":"long","doc":"the first time this identity key was seen"},"safety_number":{"type":"String","example":"\"373453558586758076680580548714989751943247272727416091564451\""},"qr_code_data":{"type":"String","doc":"base64-encoded QR code data"},"trust_level":{"type":"String","doc":"One of TRUSTED_UNVERIFIED, TRUSTED_VERIFIED or UNTRUSTED"}}},"JsonDataMessage":{"fields":{"timestamp":{"type":"long","doc":"the timestamp that the message was sent at, according to the sender's device. This is used to uniquely identify this message for things like reactions and quotes.","example":"1615576442475"},"attachments":{"list":true,"type":"JsonAttachment","version":"v1","doc":"files attached to the incoming message"},"body":{"type":"String","doc":"the text body of the incoming message.","example":"\"hello\""},"group":{"type":"JsonGroupInfo","version":"v1","doc":"if the incoming message was sent to a v1 group, information about that group will be here"},"groupV2":{"type":"JsonGroupV2Info","version":"v1","doc":"if the incoming message was sent to a v2 group, basic identifying information about that group will be here. If group information changes, JsonGroupV2Info.revision is incremented. If the group revision is higher than previously seen, a client can retrieve the group information by calling get_group."},"endSession":{"type":"boolean"},"expiresInSeconds":{"type":"int","doc":"the expiry timer on the incoming message. Clients should delete records of the message within this number of seconds"},"profileKeyUpdate":{"type":"boolean"},"quote":{"type":"JsonQuote","version":"v1","doc":"if the incoming message is a quote or reply to another message, this will contain information about that message"},"contacts":{"list":true,"type":"SharedContact","version":"v1","doc":"if the incoming message has a shared contact, the contact's information will be here"},"previews":{"list":true,"type":"JsonPreview","version":"v1","doc":"if the incoming message has a link preview, information about that preview will be here"},"sticker":{"type":"JsonSticker","version":"v0","doc":"if the incoming message is a sticker, information about the sicker will be here"},"viewOnce":{"type":"boolean","doc":"indicates the message is a view once message. View once messages typically include no body and a single image attachment. Official Signal clients will prevent the user from saving the image, and once the user has viewed the image once they will destroy the image."},"reaction":{"type":"JsonReaction","version":"v1","doc":"if the message adds or removes a reaction to another message, this will indicate what change is being made"},"remoteDelete":{"type":"RemoteDelete","version":"v1","doc":"if the inbound message is deleting a previously sent message, indicates which message should be deleted"},"mentions":{"list":true,"type":"JsonMention","version":"v1","doc":"list of mentions in the message"},"payment":{"type":"Payment","version":"v1","doc":"details about the MobileCoin payment attached to the message, if present"},"is_expiration_update":{"type":"boolean","doc":"whether or not this message changes the expiresInSeconds value for the whole chat. Some messages (remote deletes, reactions, etc) will have expiresInSeconds=0 even though the chat has disappearing messages enabled."},"group_call_update":{"type":"String","doc":"the eraId string from a group call message update"},"story_context":{"type":"StoryContext","version":"v1"}}},"JsonSyncMessage":{"fields":{"sent":{"type":"JsonSentTranscriptMessage","version":"v1"},"contacts":{"type":"JsonAttachment","version":"v1"},"contactsComplete":{"type":"boolean"},"groups":{"type":"JsonAttachment","version":"v1"},"blockedList":{"type":"JsonBlockedListMessage","version":"v1"},"request":{"type":"String"},"readMessages":{"list":true,"type":"JsonReadMessage","version":"v1"},"viewOnceOpen":{"type":"JsonViewOnceOpenMessage","version":"v1"},"verified":{"type":"JsonVerifiedMessage","version":"v1"},"configuration":{"type":"ConfigurationMessage","version":"v0"},"stickerPackOperations":{"list":true,"type":"JsonStickerPackOperationMessage","version":"v0"},"fetchType":{"type":"String"},"messageRequestResponse":{"type":"JsonMessageRequestResponseMessage","version":"v1"}}},"CallMessage":{"fields":{"offer_message":{"type":"OfferMessage","version":"v1"},"answer_message":{"type":"AnswerMessage","version":"v1"},"busy_message":{"type":"BusyMessage","version":"v1"},"hangup_message":{"type":"HangupMessage","version":"v1"},"ice_update_message":{"list":true,"type":"IceUpdateMessage","version":"v1"},"destination_device_id":{"type":"Integer"},"multi_ring":{"type":"boolean"}}},"ReceiptMessage":{"fields":{"type":{"type":"String","doc":"options: UNKNOWN, DELIVERY, READ, VIEWED"},"timestamps":{"list":true,"type":"Long"},"when":{"type":"long"}}},"TypingMessage":{"fields":{"action":{"type":"String"},"timestamp":{"type":"long"},"group_id":{"type":"String"}}},"StoryMessage":{"fields":{"group":{"type":"JsonGroupV2Info","version":"v1"},"file":{"type":"JsonAttachment","version":"v1"},"text":{"type":"TextAttachment","version":"v1"},"allow_replies":{"type":"Boolean"}}},"JsonAttachment":{"fields":{"contentType":{"type":"String"},"id":{"type":"String"},"size":{"type":"int"},"storedFilename":{"type":"String","doc":"when receiving, the path that file has been downloaded to"},"filename":{"type":"String","doc":"when sending, the path to the local file to upload"},"customFilename":{"type":"String","doc":"the original name of the file"},"caption":{"type":"String"},"width":{"type":"int"},"height":{"type":"int"},"voiceNote":{"type":"boolean"},"key":{"type":"String"},"digest":{"type":"String"},"blurhash":{"type":"String"}},"doc":"represents a file attached to a message. When sending, only `filename` is required."},"JsonQuote":{"fields":{"id":{"type":"long","doc":"the client timestamp of the message being quoted","example":"1615576442475"},"author":{"type":"JsonAddress","version":"v1","doc":"the author of the message being quoted"},"text":{"type":"String","doc":"the body of the message being quoted","example":"\"hey ? what's up?\""},"attachments":{"list":true,"type":"JsonQuotedAttachment","version":"v0","doc":"list of files attached to the quoted message"},"mentions":{"list":true,"type":"JsonMention","version":"v1","doc":"list of mentions in the quoted message"}},"doc":"A quote is a reply to a previous message. ID is the sent time of the message being replied to"},"JsonMention":{"fields":{"uuid":{"type":"String","doc":"The UUID of the account being mentioned","example":"\"aeed01f0-a234-478e-8cf7-261c283151e7\""},"start":{"type":"int","doc":"The number of characters in that the mention starts at. Note that due to a quirk of how signald encodes JSON, if this value is 0 (for example if the first character in the message is the mention) the field won't show up.","example":"4"},"length":{"type":"int","doc":"The length of the mention represented in the message. Seems to always be 1 but included here in case that changes.","example":"1"}}},"JsonPreview":{"fields":{"url":{"type":"String"},"title":{"type":"String"},"description":{"type":"String"},"date":{"type":"long"},"attachment":{"type":"JsonAttachment","version":"v1","doc":"an optional image file attached to the preview"}},"doc":"metadata about one of the links in a message"},"JsonReaction":{"fields":{"emoji":{"type":"String","doc":"the emoji to react with","example":"\"?\""},"remove":{"type":"boolean","doc":"set to true to remove the reaction. requires emoji be set to previously reacted emoji"},"targetAuthor":{"type":"JsonAddress","version":"v1","doc":"the author of the message being reacted to"},"targetSentTimestamp":{"type":"long","doc":"the client timestamp of the message being reacted to","example":"1615576442475"}}},"GroupAccessControl":{"fields":{"link":{"type":"String","doc":"UNSATISFIABLE when the group link is disabled, ADMINISTRATOR when the group link is enabled but an administrator must approve new members, ANY when the group link is enabled and no approval is required","example":"\"ANY\""},"attributes":{"type":"String","doc":"who can edit group info"},"members":{"type":"String","doc":"who can add members"}},"doc":"group access control settings. Options for each controlled action are: UNKNOWN, ANY, MEMBER, ADMINISTRATOR, UNSATISFIABLE and UNRECOGNIZED"},"GroupMember":{"fields":{"uuid":{"type":"String","example":"\"aeed01f0-a234-478e-8cf7-261c283151e7\""},"role":{"type":"String","doc":"possible values are: UNKNOWN, DEFAULT, ADMINISTRATOR and UNRECOGNIZED","example":"\"DEFAULT\""},"joined_revision":{"type":"int"}}},"BannedGroupMember":{"fields":{"uuid":{"type":"String","example":"\"aeed01f0-a234-478e-8cf7-261c283151e7\""},"timestamp":{"type":"long","doc":"Timestamp as milliseconds since Unix epoch of when the user was banned. This field is set by the server."}}},"GroupChange":{"fields":{"editor":{"type":"JsonAddress","version":"v1","doc":"The user that made the change."},"revision":{"type":"Integer","doc":"The group revision that this change brings the group to."},"new_members":{"list":true,"type":"GroupMember","version":"v1","doc":"Represents users have been added to the group. This can be from group members adding users, or a users joining via a group link that required no approval."},"delete_members":{"list":true,"type":"JsonAddress","version":"v1","doc":"Represents users that have been removed from the group. This can be from admins removing users, or users choosing to leave the group"},"modify_member_roles":{"list":true,"type":"GroupMember","version":"v1","doc":"Represents users with their new, modified role."},"modified_profile_keys":{"list":true,"type":"GroupMember","version":"v1","doc":"Represents users that have rotated their profile key. Note that signald currently does not expose profile keys to clients. The joined revision property will always be 0 in this list."},"new_pending_members":{"list":true,"type":"GroupPendingMember","version":"v1","doc":"Represents a user that has been invited to the group by another user."},"delete_pending_members":{"list":true,"type":"JsonAddress","version":"v1"},"promote_pending_members":{"list":true,"type":"GroupMember","version":"v1"},"new_banned_members":{"list":true,"type":"BannedGroupMember","version":"v1"},"new_unbanned_members":{"list":true,"type":"BannedGroupMember","version":"v1"},"new_title":{"type":"String"},"new_avatar":{"type":"Boolean","doc":"Whether this group change changed the avatar."},"new_timer":{"type":"Integer","doc":"New disappearing messages timer value."},"new_access_control":{"type":"GroupAccessControl","version":"v1","doc":"If not null, then this group change modified one of the access controls. Some of the properties in here will be null."},"new_requesting_members":{"list":true,"type":"GroupRequestingMember","version":"v1","doc":"Represents users that have requested to join the group via the group link. Note that members requesting to join might not necessarily have the list of users in the group, so they won't be able to send a peer-to-peer group update message to inform users of their request to join. Other users in the group may inform us that the revision has increased, but the members requesting access will have to be obtained from the server instead (which signald will handle). For now, a get_group request has to be made to get the users that have requested to join the group."},"delete_requesting_members":{"list":true,"type":"JsonAddress","version":"v1"},"promote_requesting_members":{"list":true,"type":"GroupMember","version":"v1"},"new_invite_link_password":{"type":"Boolean","doc":"Whether this group change involved resetting the group invite link."},"new_description":{"type":"String"},"new_is_announcement_group":{"type":"String","doc":"Whether this change affected the announcement group setting. Possible values are UNKNOWN, ENABLED or DISABLED"}},"doc":"Represents a group change made by a user. This can also represent request link invites. Only the fields relevant to the group change performed will be set. Note that in signald, group changes are currently only received from incoming messages from a message subscription."},"DeviceInfo":{"fields":{"id":{"type":"long"},"name":{"type":"String"},"created":{"type":"long"},"lastSeen":{"type":"long"}}},"JsonGroupInfo":{"fields":{"groupId":{"type":"String"},"members":{"list":true,"type":"JsonAddress","version":"v1"},"name":{"type":"String"},"type":{"type":"String"},"avatarId":{"type":"long"}},"doc":"information about a legacy group"},"Capabilities":{"fields":{"gv2":{"type":"boolean","doc":"this capability is deprecated and will always be true"},"storage":{"type":"boolean"},"stories":{"type":"boolean"},"gv1-migration":{"type":"boolean"},"sender_key":{"type":"boolean"},"announcement_group":{"type":"boolean"},"change_number":{"type":"boolean"}}},"Server":{"fields":{"uuid":{"type":"UUID","doc":"A unique identifier for the server, referenced when adding accounts. Must be a valid UUID. Will be generated if not specified when creating."},"proxy":{"type":"String"},"ca":{"type":"String","doc":"base64 encoded trust store, password must be 'whisper'"},"service_url":{"type":"String"},"cdn_urls":{"list":true,"type":"ServerCDN","version":"v1"},"contact_discovery_url":{"type":"String"},"key_backup_url":{"type":"String"},"storage_url":{"type":"String"},"zk_param":{"type":"String","doc":"base64 encoded ZKGROUP_SERVER_PUBLIC_PARAMS value"},"unidentified_sender_root":{"type":"String","doc":"base64 encoded"},"key_backup_service_name":{"type":"String"},"key_backup_service_id":{"type":"String","doc":"base64 encoded"},"key_backup_mrenclave":{"type":"String"},"cds_mrenclave":{"type":"String"},"ias_ca":{"type":"String","doc":"base64 encoded trust store, password must be 'whisper'"}},"doc":"a Signal server"},"Payment":{"fields":{"receipt":{"type":"String","doc":"base64 encoded payment receipt data. This is a protobuf value which can be decoded as the Receipt object described in https://github.com/mobilecoinfoundation/mobilecoin/blob/master/api/proto/external.proto"},"note":{"type":"String","doc":"note attached to the payment"}},"doc":"details about a MobileCoin payment"},"RemoteConfig":{"fields":{"name":{"type":"String","doc":"The name of this remote config entry. These names may be prefixed with the platform type (\"android.\", \"ios.\", \"desktop.\", etc.) Typically, clients only handle the relevant configs for its platform, hardcoding the names it cares about handling and ignoring the rest.","example":"desktop.mediaQuality.levels"},"value":{"type":"String","doc":"The value for this remote config entry. Even though this is a string, it could be a boolean as a string, an integer/long value, a comma-delimited list, etc. Clients usually consume this by hardcoding the feature flagsit should track in the app and assuming that the server will send the type that the client expects. If an unexpected type occurs, it falls back to a default value.","example":"1:2,61:2,81:2,82:2,65:2,31:2,47:2,41:2,32:2,385:2,971:2,974:2,49:2,33:2,*:1"}},"doc":"A remote config (feature flag) entry."},"GroupHistoryEntry":{"fields":{"group":{"type":"JsonGroupV2Info","version":"v1"},"change":{"type":"GroupChange","version":"v1"}}},"PagingData":{"fields":{"has_more_pages":{"type":"boolean"},"next_page_revision":{"type":"int"}}},"JsonViewOnceOpenMessage":{"fields":{"sender":{"type":"JsonAddress","version":"v1"},"timestamp":{"type":"long","example":"1615576442475"}}},"JsonMessageRequestResponseMessage":{"fields":{"person":{"type":"JsonAddress","version":"v1"},"groupId":{"type":"String"},"type":{"type":"String","doc":"One of UNKNOWN, ACCEPT, DELETE, BLOCK, BLOCK_AND_DELETE, UNBLOCK_AND_ACCEPT"}},"doc":"Responses to message requests from unknown users or groups"},"SendSuccess":{"fields":{"unidentified":{"type":"boolean"},"needsSync":{"type":"boolean"},"duration":{"type":"long"},"devices":{"list":true,"type":"Integer"}}},"IceUpdateMessage":{"fields":{"id":{"type":"long"},"opaque":{"type":"String","doc":"the base64 encoded protobuf value."},"sdp":{"type":"String"},"mid":{"type":"String"},"line":{"type":"int"}}},"SharedContact":{"fields":{"name":{"type":"SharedContactName","version":"v1","doc":"the name of the shared contact"},"email":{"list":true,"type":"SharedContactEmail","version":"v1","doc":"the email addresses of the shared contact"},"phone":{"list":true,"type":"SharedContactPhone","version":"v1","doc":"the phone numbers of the shared contact"},"address":{"list":true,"type":"SharedContactAddress","version":"v1","doc":"the physical addresses of the shared contact"},"avatar":{"type":"SharedContactAvatar","version":"v1","doc":"the profile picture/avatar of the shared contact"},"organization":{"type":"String","doc":"the organization (e.g. workplace) of the shared contact"}}},"RemoteDelete":{"fields":{"target_sent_timestamp":{"type":"long"}}},"StoryContext":{"fields":{"author":{"type":"String"},"sent_timestamp":{"type":"long"}}},"JsonSentTranscriptMessage":{"fields":{"destination":{"type":"JsonAddress","version":"v1"},"timestamp":{"type":"long","example":"1615576442475"},"expirationStartTimestamp":{"type":"long"},"message":{"type":"JsonDataMessage","version":"v1"},"story":{"type":"StoryMessage","version":"v1"},"unidentifiedStatus":{"type":"Map"},"isRecipientUpdate":{"type":"boolean"}}},"JsonBlockedListMessage":{"fields":{"addresses":{"list":true,"type":"JsonAddress","version":"v1"},"groupIds":{"list":true,"type":"String"}}},"JsonReadMessage":{"fields":{"sender":{"type":"JsonAddress","version":"v1"},"timestamp":{"type":"long","example":"1615576442475"}}},"JsonVerifiedMessage":{"fields":{"destination":{"type":"JsonAddress","version":"v1"},"identityKey":{"type":"String"},"verified":{"type":"String"},"timestamp":{"type":"long"}}},"OfferMessage":{"fields":{"id":{"type":"long"},"sdp":{"type":"String"},"type":{"type":"String"},"opaque":{"type":"String"}}},"AnswerMessage":{"fields":{"id":{"type":"long"},"sdp":{"type":"String"},"opaque":{"type":"String"}}},"BusyMessage":{"fields":{"id":{"type":"long"}}},"HangupMessage":{"fields":{"id":{"type":"long"},"type":{"type":"String"},"legacy":{"type":"boolean"},"device_id":{"type":"int"}}},"TextAttachment":{"fields":{"text":{"type":"String"},"style":{"type":"String"},"preview":{"type":"JsonPreview","version":"v1"},"text_foreground_color":{"type":"String"},"text_background_color":{"type":"String"},"background_gradient":{"type":"Gradient","version":"v1"},"background_color":{"type":"String"}}},"GroupPendingMember":{"fields":{"uuid":{"type":"String","example":"\"aeed01f0-a234-478e-8cf7-261c283151e7\""},"role":{"type":"String","doc":"possible values are: UNKNOWN, DEFAULT, ADMINISTRATOR and UNRECOGNIZED","example":"\"DEFAULT\""},"timestamp":{"type":"long"},"added_by_uuid":{"type":"String","example":"\"aeed01f0-a234-478e-8cf7-261c283151e7\""}}},"GroupRequestingMember":{"fields":{"uuid":{"type":"String","example":"\"aeed01f0-a234-478e-8cf7-261c283151e7\""},"timestamp":{"type":"long"}}},"ServerCDN":{"fields":{"number":{"type":"int"},"url":{"type":"String"}}},"SharedContactName":{"fields":{"display":{"type":"String","doc":"the full name that should be displayed"},"given":{"type":"String","doc":"given name"},"middle":{"type":"String","doc":"middle name"},"family":{"type":"String","doc":"family name (surname)"},"prefix":{"type":"String"},"suffix":{"type":"String"}}},"SharedContactEmail":{"fields":{"type":{"type":"String","doc":"the type of email (options: HOME, WORK, MOBILE, CUSTOM)"},"value":{"type":"String","doc":"the email address"},"label":{"type":"String","doc":"the type label when type is CUSTOM"}}},"SharedContactPhone":{"fields":{"type":{"type":"String","doc":"the type of phone (options: HOME, WORK, MOBILE, CUSTOM)"},"value":{"type":"String","doc":"the phone number"},"label":{"type":"String","doc":"the type label when type is CUSTOM"}}},"SharedContactAddress":{"fields":{"type":{"type":"String","doc":"the type of address (options: HOME, WORK, CUSTOM)"},"label":{"type":"String"},"street":{"type":"String"},"pobox":{"type":"String"},"neighborhood":{"type":"String"},"city":{"type":"String"},"region":{"type":"String"},"postcode":{"type":"String"},"country":{"type":"String"}}},"SharedContactAvatar":{"fields":{"attachment":{"type":"JsonAttachment","version":"v1"},"is_profile":{"type":"boolean"}}},"Gradient":{"fields":{"start_color":{"type":"String"},"end_color":{"type":"String"}}}}},"actions":{"v1":{"send":{"request":"SendRequest","response":"SendResponse","errors":[{"name":"NoSuchAccountError"},{"name":"ServerNotFoundError"},{"name":"InvalidProxyError"},{"name":"NoSendPermissionError"},{"name":"InvalidAttachmentError"},{"name":"InternalError"},{"name":"InvalidRequestError"},{"name":"UnknownGroupError"},{"name":"RateLimitError"},{"name":"InvalidRecipientError"},{"name":"AttachmentTooLargeError"},{"name":"AuthorizationFailedError"},{"name":"SQLError"}]},"react":{"request":"ReactRequest","response":"SendResponse","doc":"react to a previous message","errors":[{"name":"NoSuchAccountError"},{"name":"ServerNotFoundError"},{"name":"InvalidProxyError"},{"name":"InternalError"},{"name":"InvalidRecipientError"},{"name":"UnknownGroupError"},{"name":"InvalidRequestError"},{"name":"RateLimitError"},{"name":"UnregisteredUserError"},{"name":"AuthorizationFailedError"},{"name":"SQLError"}]},"version":{"request":"VersionRequest","response":"JsonVersionMessage"},"accept_invitation":{"request":"AcceptInvitationRequest","response":"JsonGroupV2Info","doc":"Accept a v2 group invitation. Note that you must have a profile name set to join groups.","errors":[{"name":"NoSuchAccountError"},{"name":"OwnProfileKeyDoesNotExistError"},{"name":"ServerNotFoundError"},{"name":"InvalidProxyError"},{"name":"UnknownGroupError"},{"name":"InternalError"},{"name":"InvalidRequestError"},{"name":"AuthorizationFailedError","doc":"Can be caused if signald is setup as a linked device that has been removed by the primary device. If trying to update a group, this can also be caused if group permissions don't allow the update (e.g. current role insufficient or not a member)."},{"name":"SQLError"},{"name":"GroupPatchNotAcceptedError","doc":"Caused when server rejects the group update."}]},"approve_membership":{"request":"ApproveMembershipRequest","response":"JsonGroupV2Info","doc":"approve a request to join a group","errors":[{"name":"NoSuchAccountError"},{"name":"ServerNotFoundError"},{"name":"InvalidProxyError"},{"name":"UnknownGroupError"},{"name":"InternalError"},{"name":"GroupVerificationError"},{"name":"InvalidRequestError"},{"name":"AuthorizationFailedError","doc":"Can be caused if signald is setup as a linked device that has been removed by the primary device. If trying to update a group, this can also be caused if group permissions don't allow the update (e.g. current role insufficient or not a member)."},{"name":"SQLError"},{"name":"GroupPatchNotAcceptedError","doc":"Caused when server rejects the group update."}]},"get_group":{"request":"GetGroupRequest","response":"JsonGroupV2Info","doc":"Query the server for the latest state of a known group. If the account is not a member of the group, an UnknownGroupError is returned.","errors":[{"name":"NoSuchAccountError"},{"name":"UnknownGroupError"},{"name":"ServerNotFoundError"},{"name":"InvalidProxyError"},{"name":"InternalError"},{"name":"GroupVerificationError"},{"name":"InvalidGroupStateError"},{"name":"InvalidRequestError"},{"name":"AuthorizationFailedError"},{"name":"SQLError"}]},"get_linked_devices":{"request":"GetLinkedDevicesRequest","response":"LinkedDevices","doc":"list all linked devices on a Signal account","errors":[{"name":"InternalError"},{"name":"InvalidProxyError"},{"name":"ServerNotFoundError"},{"name":"NoSuchAccountError"},{"name":"InvalidRequestError"},{"name":"AuthorizationFailedError"},{"name":"SQLError"}]},"join_group":{"request":"JoinGroupRequest","response":"JsonGroupJoinInfo","doc":"Join a group using the a signal.group URL. Note that you must have a profile name set to join groups.","errors":[{"name":"InvalidRequestError"},{"name":"InvalidInviteURIError"},{"name":"InternalError"},{"name":"InvalidProxyError"},{"name":"ServerNotFoundError"},{"name":"NoSuchAccountError"},{"name":"OwnProfileKeyDoesNotExistError"},{"name":"GroupVerificationError"},{"name":"GroupNotActiveError"},{"name":"UnknownGroupError"},{"name":"InvalidGroupStateError"},{"name":"AuthorizationFailedError"},{"name":"SQLError"}]},"remove_linked_device":{"request":"RemoveLinkedDeviceRequest","doc":"Remove a linked device from the Signal account. Only allowed when the local device id is 1","errors":[{"name":"InternalError"},{"name":"InvalidProxyError"},{"name":"ServerNotFoundError"},{"name":"NoSuchAccountError"},{"name":"InvalidRequestError"},{"name":"AuthorizationFailedError"},{"name":"SQLError"}]},"update_group":{"request":"UpdateGroupRequest","response":"GroupInfo","doc":"modify a group. Note that only one modification action may be performed at once","errors":[{"name":"InternalError"},{"name":"InvalidProxyError"},{"name":"ServerNotFoundError"},{"name":"NoSuchAccountError"},{"name":"UnknownGroupError"},{"name":"GroupVerificationError"},{"name":"InvalidRequestError"},{"name":"AuthorizationFailedError","doc":"Can be caused if signald is setup as a linked device that has been removed by the primary device. If trying to update a group, this can also be caused if group permissions don't allow the update (e.g. current role insufficient or not a member)."},{"name":"UnregisteredUserError"},{"name":"SQLError"},{"name":"GroupPatchNotAcceptedError","doc":"Caused when server rejects the group update, e.g. trying to add a user that's already in the group"},{"name":"UnsupportedGroupError"}]},"set_profile":{"request":"SetProfile","errors":[{"name":"InternalError"},{"name":"InvalidProxyError"},{"name":"ServerNotFoundError"},{"name":"NoSuchAccountError"},{"name":"InvalidBase64Error"},{"name":"InvalidRequestError"},{"name":"AuthorizationFailedError"},{"name":"SQLError"}]},"resolve_address":{"request":"ResolveAddressRequest","response":"JsonAddress","doc":"Resolve a partial JsonAddress with only a number or UUID to one with both. Anywhere that signald accepts a JsonAddress will except a partial, this is a convenience function for client authors, mostly because signald doesn't resolve all the partials it returns.","errors":[{"name":"InternalError"},{"name":"NoSuchAccountError"},{"name":"UnregisteredUserError"},{"name":"AuthorizationFailedError"},{"name":"SQLError"}]},"mark_read":{"request":"MarkReadRequest","errors":[{"name":"NoSuchAccountError"},{"name":"ServerNotFoundError"},{"name":"InvalidProxyError"},{"name":"InternalError"},{"name":"UntrustedIdentityError"},{"name":"UnregisteredUserError"},{"name":"AuthorizationFailedError"},{"name":"SQLError"},{"name":"InvalidRequestError"},{"name":"ProofRequiredError"}]},"get_profile":{"request":"GetProfileRequest","response":"Profile","doc":"Get all information available about a user","errors":[{"name":"InternalError"},{"name":"InvalidProxyError"},{"name":"ServerNotFoundError"},{"name":"NoSuchAccountError"},{"name":"ProfileUnavailableError"},{"name":"UnregisteredUserError"},{"name":"AuthorizationFailedError"},{"name":"SQLError"},{"name":"InvalidRequestError"}]},"list_groups":{"request":"ListGroupsRequest","response":"GroupList","errors":[{"name":"InternalError"},{"name":"InvalidProxyError"},{"name":"ServerNotFoundError"},{"name":"NoSuchAccountError"},{"name":"InvalidRequestError"},{"name":"AuthorizationFailedError"},{"name":"SQLError"}]},"list_contacts":{"request":"ListContactsRequest","response":"ProfileList","errors":[{"name":"InternalError"},{"name":"InvalidProxyError"},{"name":"ServerNotFoundError"},{"name":"NoSuchAccountError"},{"name":"AuthorizationFailedError"},{"name":"SQLError"},{"name":"InvalidRequestError"}]},"create_group":{"request":"CreateGroupRequest","response":"JsonGroupV2Info","errors":[{"name":"InternalError"},{"name":"InvalidProxyError"},{"name":"ServerNotFoundError"},{"name":"NoSuchAccountError"},{"name":"OwnProfileKeyDoesNotExistError"},{"name":"NoKnownUUIDError"},{"name":"InvalidRequestError"},{"name":"GroupVerificationError"},{"name":"InvalidGroupStateError"},{"name":"UnknownGroupError"},{"name":"UnregisteredUserError"},{"name":"AuthorizationFailedError"},{"name":"SQLError"}]},"leave_group":{"request":"LeaveGroupRequest","response":"GroupInfo","errors":[{"name":"NoSuchAccountError"},{"name":"ServerNotFoundError"},{"name":"InvalidProxyError"},{"name":"InternalError"},{"name":"UnknownGroupError"},{"name":"GroupVerificationError"},{"name":"InvalidRequestError"},{"name":"AuthorizationFailedError"},{"name":"SQLError"}]},"generate_linking_uri":{"request":"GenerateLinkingURIRequest","response":"LinkingURI","doc":"Generate a linking URI. Typically this is QR encoded and scanned by the primary device. Submit the returned session_id with a finish_link request.","errors":[{"name":"ServerNotFoundError"},{"name":"InvalidProxyError"}]},"finish_link":{"request":"FinishLinkRequest","response":"Account","doc":"After a linking URI has been requested, finish_link must be called with the session_id provided with the URI. it will return information about the new account once the linking process is completed by the other device and the new account is setup. Note that the account setup process can sometimes take some time, if rapid userfeedback is required after scanning, use wait_for_scan first, then finish setup with finish_link.","errors":[{"name":"NoSuchSessionError"},{"name":"ServerNotFoundError"},{"name":"InvalidProxyError"},{"name":"InternalError"},{"name":"NoSuchAccountError"},{"name":"UserAlreadyExistsError"},{"name":"ScanTimeoutError"}]},"add_device":{"request":"AddLinkedDeviceRequest","doc":"Link a new device to a local Signal account","errors":[{"name":"NoSuchAccountError"},{"name":"ServerNotFoundError"},{"name":"InvalidProxyError"},{"name":"InvalidRequestError","doc":"caused by syntax errors with the provided linking URI"},{"name":"InternalError"},{"name":"AuthorizationFailedError"},{"name":"SQLError"}]},"register":{"request":"RegisterRequest","response":"Account","doc":"begin the account registration process by requesting a phone number verification code. when the code is received, submit it with a verify request","errors":[{"name":"CaptchaRequiredError"},{"name":"ServerNotFoundError"},{"name":"InvalidProxyError"}]},"verify":{"request":"VerifyRequest","response":"Account","doc":"verify an account's phone number with a code after registering, completing the account creation process","errors":[{"name":"InternalError"},{"name":"InvalidProxyError"},{"name":"ServerNotFoundError"},{"name":"AccountHasNoKeysError"},{"name":"AccountAlreadyVerifiedError"},{"name":"AccountLockedError"},{"name":"NoSuchAccountError"}]},"get_identities":{"request":"GetIdentitiesRequest","response":"IdentityKeyList","doc":"Get information about a known keys for a particular address","errors":[{"name":"InternalError"},{"name":"InvalidProxyError"},{"name":"ServerNotFoundError"},{"name":"NoSuchAccountError"},{"name":"UnregisteredUserError"},{"name":"AuthorizationFailedError"},{"name":"SQLError"}]},"trust":{"request":"TrustRequest","doc":"Trust another user's safety number using either the QR code data or the safety number text","errors":[{"name":"InvalidRequestError"},{"name":"InternalError"},{"name":"InvalidProxyError"},{"name":"ServerNotFoundError"},{"name":"NoSuchAccountError"},{"name":"FingerprintVersionMismatchError"},{"name":"InvalidBase64Error"},{"name":"UnknownIdentityKeyError"},{"name":"InvalidFingerprintError"},{"name":"UnregisteredUserError"},{"name":"AuthorizationFailedError"},{"name":"SQLError"}]},"delete_account":{"request":"DeleteAccountRequest","doc":"delete all account data signald has on disk, and optionally delete the account from the server as well. Note that this is not \"unlink\" and will delete the entire account, even from a linked device.","errors":[{"name":"InternalError"},{"name":"InvalidProxyError"},{"name":"ServerNotFoundError"},{"name":"NoSuchAccountError"},{"name":"SQLError"}]},"typing":{"request":"TypingRequest","doc":"send a typing started or stopped message","errors":[{"name":"InternalError"},{"name":"InvalidProxyError"},{"name":"ServerNotFoundError"},{"name":"NoSuchAccountError"},{"name":"InvalidRecipientError"},{"name":"InvalidGroupError"},{"name":"UntrustedIdentityError"},{"name":"UnknownGroupError"},{"name":"InvalidRequestError"},{"name":"UnregisteredUserError"},{"name":"AuthorizationFailedError"},{"name":"SQLError"}]},"reset_session":{"request":"ResetSessionRequest","response":"SendResponse","doc":"reset a session with a particular user","errors":[{"name":"InternalError"},{"name":"ServerNotFoundError"},{"name":"InvalidProxyError"},{"name":"NoSuchAccountError"},{"name":"InvalidRequestError"},{"name":"UnknownGroupError"},{"name":"RateLimitError"},{"name":"InvalidRecipientError"},{"name":"UnregisteredUserError"},{"name":"AuthorizationFailedError"},{"name":"SQLError"}]},"request_sync":{"request":"RequestSyncRequest","doc":"Request other devices on the account send us their group list, syncable config and contact list.","errors":[{"name":"InternalError"},{"name":"InvalidProxyError"},{"name":"ServerNotFoundError"},{"name":"NoSuchAccountError"},{"name":"UntrustedIdentityError"},{"name":"InvalidRequestError"},{"name":"AuthorizationFailedError"},{"name":"SQLError"}]},"list_accounts":{"request":"ListAccountsRequest","response":"AccountList","doc":"return all local accounts","errors":[{"name":"NoSuchAccountError"},{"name":"InternalError"}]},"group_link_info":{"request":"GroupLinkInfoRequest","response":"JsonGroupJoinInfo","doc":"Get information about a group from a signal.group link","errors":[{"name":"GroupLinkNotActiveError"},{"name":"InternalError"},{"name":"InvalidProxyError"},{"name":"ServerNotFoundError"},{"name":"NoSuchAccountError"},{"name":"InvalidRequestError"},{"name":"GroupVerificationError"},{"name":"SQLError"}]},"update_contact":{"request":"UpdateContactRequest","response":"Profile","doc":"update information about a local contact","errors":[{"name":"NoSuchAccountError"},{"name":"ServerNotFoundError"},{"name":"InvalidProxyError"},{"name":"InternalError"},{"name":"AuthorizationFailedError"},{"name":"SQLError"}]},"set_expiration":{"request":"SetExpirationRequest","response":"SendResponse","doc":"Set the message expiration timer for a thread. Expiration must be specified in seconds, set to 0 to disable timer","errors":[{"name":"InternalError"},{"name":"InvalidProxyError"},{"name":"ServerNotFoundError"},{"name":"NoSuchAccountError"},{"name":"UnknownGroupError"},{"name":"GroupVerificationError"},{"name":"InvalidRequestError"},{"name":"AuthorizationFailedError","doc":"Can be caused if signald is setup as a linked device that has been removed by the primary device. If trying to update a group, this can also be caused if group permissions don't allow the update (e.g. current role insufficient or not a member)."},{"name":"UnregisteredUserError"},{"name":"SQLError"},{"name":"GroupPatchNotAcceptedError","doc":"If updating a group, caused when server rejects the group update."},{"name":"UnsupportedGroupError"}]},"set_device_name":{"request":"SetDeviceNameRequest","doc":"set this device's name. This will show up on the mobile device on the same account under settings -> linked devices","errors":[{"name":"InternalError"},{"name":"InvalidProxyError"},{"name":"ServerNotFoundError"},{"name":"NoSuchAccountError"},{"name":"AuthorizationFailedError"},{"name":"SQLError"},{"name":"InvalidRequestError"}]},"get_all_identities":{"request":"GetAllIdentities","response":"AllIdentityKeyList","doc":"get all known identity keys","errors":[{"name":"InvalidProxyError"},{"name":"NoSuchAccountError"},{"name":"ServerNotFoundError"},{"name":"InternalError"},{"name":"AuthorizationFailedError"},{"name":"SQLError"}]},"subscribe":{"request":"SubscribeRequest","doc":"receive incoming messages. After making a subscribe request, incoming messages will be sent to the client encoded as ClientMessageWrapper. Send an unsubscribe request or disconnect from the socket to stop receiving messages.","errors":[{"name":"NoSuchAccountError"},{"name":"ServerNotFoundError"},{"name":"InvalidProxyError"},{"name":"InternalError"},{"name":"AuthorizationFailedError"},{"name":"SQLError"}]},"unsubscribe":{"request":"UnsubscribeRequest","doc":"See subscribe for more info","errors":[{"name":"NoSuchAccountError"},{"name":"InternalError"},{"name":"SQLError"}]},"remote_delete":{"request":"RemoteDeleteRequest","response":"SendResponse","doc":"delete a message previously sent","errors":[{"name":"InternalError"},{"name":"InvalidProxyError"},{"name":"ServerNotFoundError"},{"name":"NoSuchAccountError"},{"name":"InvalidRecipientError"},{"name":"UnknownGroupError"},{"name":"InvalidRequestError"},{"name":"RateLimitError"},{"name":"UnregisteredUserError"},{"name":"AuthorizationFailedError"},{"name":"SQLError"}]},"add_server":{"request":"AddServerRequest","response":"String","doc":"add a new server to connect to. Returns the new server's UUID.","errors":[{"name":"InvalidProxyError"},{"name":"InternalError"}]},"get_servers":{"request":"GetServersRequest","response":"ServerList","errors":[{"name":"InternalError"}]},"delete_server":{"request":"RemoveServerRequest","errors":[{"name":"InternalError"}]},"send_payment":{"request":"SendPaymentRequest","response":"SendResponse","doc":"send a mobilecoin payment","errors":[{"name":"InternalError"},{"name":"InvalidProxyError"},{"name":"ServerNotFoundError"},{"name":"NoSuchAccountError"},{"name":"InvalidBase64Error"},{"name":"InvalidRecipientError"},{"name":"UnknownGroupError"},{"name":"InvalidRequestError"},{"name":"RateLimitError"},{"name":"UnregisteredUserError"},{"name":"AuthorizationFailedError"},{"name":"SQLError"}]},"get_remote_config":{"request":"RemoteConfigRequest","response":"RemoteConfigList","doc":"Retrieves the remote config (feature flags) from the server.","errors":[{"name":"InternalError"},{"name":"InvalidProxyError"},{"name":"ServerNotFoundError"},{"name":"NoSuchAccountError"},{"name":"SQLError"}]},"refuse_membership":{"request":"RefuseMembershipRequest","response":"JsonGroupV2Info","doc":"deny a request to join a group","errors":[{"name":"NoSuchAccountError"},{"name":"ServerNotFoundError"},{"name":"InvalidProxyError"},{"name":"UnknownGroupError"},{"name":"GroupVerificationError"},{"name":"InternalError"},{"name":"InvalidRequestError"},{"name":"AuthorizationFailedError","doc":"Can be caused if signald is setup as a linked device that has been removed by the primary device. If trying to update a group, this can also be caused if group permissions don't allow the update (e.g. current role insufficient or not a member)."},{"name":"UnregisteredUserError"},{"name":"SQLError"},{"name":"GroupPatchNotAcceptedError","doc":"Caused when server rejects the group update."}]},"submit_challenge":{"request":"SubmitChallengeRequest","errors":[{"name":"NoSuchAccountError"},{"name":"InvalidRequestError"},{"name":"ServerNotFoundError"},{"name":"InvalidProxyError"},{"name":"InternalError"},{"name":"SQLError"}]},"is_identifier_registered":{"request":"IsIdentifierRegisteredRequest","response":"BooleanMessage","doc":"Determine whether an account identifier is registered on the Signal service.","errors":[{"name":"InternalError"},{"name":"InvalidProxyError"},{"name":"ServerNotFoundError"},{"name":"NoSuchAccountError"},{"name":"SQLError"}]},"wait_for_scan":{"request":"WaitForScanRequest","doc":"An optional part of the linking process. Intended to be called after displaying the QR code, will return quickly after the user scans the QR code. finish_link must be called after wait_for_scan returns a non-error","errors":[{"name":"NoSuchSessionError"},{"name":"ScanTimeoutError"},{"name":"InternalError"}]},"get_group_revision_pages":{"request":"GetGroupRevisionPagesRequest","response":"GroupHistoryPage","doc":"Query the server for group revision history. The history contains information about the changes between each revision and the user that made the change.","errors":[{"name":"NoSuchAccountError"},{"name":"UnknownGroupError"},{"name":"ServerNotFoundError"},{"name":"InvalidProxyError"},{"name":"InternalError"},{"name":"GroupVerificationError"},{"name":"InvalidGroupStateError"},{"name":"InvalidRequestError"},{"name":"AuthorizationFailedError","doc":"caused when not a member of the group, when requesting logs from a revision lower than your joinedAtVersion, etc."},{"name":"RateLimitError"},{"name":"SQLError"}]},"send_sync_message":{"request":"SendSyncMessageRequest","response":"JsonSendMessageResult","doc":"Sends a sync message to the account's devices","errors":[{"name":"InvalidRequestError"},{"name":"RateLimitError"},{"name":"InternalError"},{"name":"UnregisteredUserError"},{"name":"NoSuchAccountError"},{"name":"ServerNotFoundError"},{"name":"InvalidProxyError"},{"name":"AuthorizationFailedError"},{"name":"SQLError"}]},"ban_user":{"request":"BanUserRequest","response":"JsonGroupV2Info","doc":"Bans users from a group. This works even if the users aren't in the group. If they are currently in the group, they will also be removed.","errors":[{"name":"NoSuchAccountError"},{"name":"ServerNotFoundError"},{"name":"InvalidProxyError"},{"name":"UnknownGroupError"},{"name":"GroupVerificationError"},{"name":"InternalError"},{"name":"InvalidRequestError"},{"name":"AuthorizationFailedError","doc":"Can be caused if signald is setup as a linked device that has been removed by the primary device. If trying to update a group, this can also be caused if group permissions don't allow the update (e.g. current role insufficient or not a member)."},{"name":"SQLError"},{"name":"GroupPatchNotAcceptedError","doc":"Caused when server rejects the group update."}]},"unban_user":{"request":"UnbanUserRequest","response":"JsonGroupV2Info","doc":"Unbans users from a group.","errors":[{"name":"NoSuchAccountError"},{"name":"ServerNotFoundError"},{"name":"InvalidProxyError"},{"name":"UnknownGroupError"},{"name":"GroupVerificationError"},{"name":"InternalError"},{"name":"InvalidRequestError"},{"name":"AuthorizationFailedError","doc":"Can be caused if signald is setup as a linked device that has been removed by the primary device. If trying to update a group, this can also be caused if group permissions don't allow the update (e.g. current role insufficient or not a member)."},{"name":"SQLError"},{"name":"GroupPatchNotAcceptedError","doc":"Caused when server rejects the group update."}]},"answer_call":{"request":"AnswerCallRequest","errors":[{"name":"NoSuchAccountError"},{"name":"SQLError"},{"name":"InternalError"},{"name":"ServerNotFoundError"},{"name":"InvalidProxyError"},{"name":"UnregisteredUserError"},{"name":"AuthorizationFailedError"},{"name":"UntrustedIdentityError"}]},"send_ice_updates":{"request":"SendIceUpdatesRequest","errors":[{"name":"NoSuchAccountError"},{"name":"SQLError"},{"name":"InternalError"},{"name":"UnregisteredUserError"},{"name":"AuthorizationFailedError"},{"name":"ServerNotFoundError"},{"name":"InvalidProxyError"},{"name":"UntrustedIdentityError"}]},"send_call_offer":{"request":"SendCallOfferRequest","errors":[{"name":"NoSuchAccountError"},{"name":"SQLError"},{"name":"InternalError"},{"name":"ServerNotFoundError"},{"name":"InvalidProxyError"},{"name":"UnregisteredUserError"},{"name":"AuthorizationFailedError"},{"name":"UntrustedIdentityError"},{"name":"InvalidRequestError"}]},"hangup_call":{"request":"HangupCallRequest","errors":[{"name":"NoSuchAccountError"},{"name":"SQLError"},{"name":"InternalError"},{"name":"UnregisteredUserError"},{"name":"AuthorizationFailedError"},{"name":"ServerNotFoundError"},{"name":"InvalidProxyError"},{"name":"UntrustedIdentityError"},{"name":"InvalidRequestError"}]}}}} diff --git a/signald/client-protocol/v1/errors.go b/signald/client-protocol/v1/errors.go index c7a4841..0ddb670 100644 --- a/signald/client-protocol/v1/errors.go +++ b/signald/client-protocol/v1/errors.go @@ -284,6 +284,13 @@ func mkerr(response client_protocol.BasicResponse) error { return err } return result + case "UnsupportedGroupError": + result := UnsupportedGroupError{} + err := json.Unmarshal(response.Error, &result) + if err != nil { + return err + } + return result case "UntrustedIdentityError": result := UntrustedIdentityError{} err := json.Unmarshal(response.Error, &result) @@ -645,6 +652,15 @@ func (e UnregisteredUserError) Error() string { return e.Message } +// UnsupportedGroupError: returned in response to use v1 groups, which are no longer supported +type UnsupportedGroupError struct { + Message string `json:"message,omitempty" yaml:"message,omitempty"` +} + +func (e UnsupportedGroupError) Error() string { + return e.Message +} + type UntrustedIdentityError struct { Identifier string `json:"identifier,omitempty" yaml:"identifier,omitempty"` IdentityKey **IdentityKey `json:"identity_key,omitempty" yaml:"identity_key,omitempty"` diff --git a/signald/client-protocol/v1/requests.go b/signald/client-protocol/v1/requests.go index ac5d93b..7144391 100644 --- a/signald/client-protocol/v1/requests.go +++ b/signald/client-protocol/v1/requests.go @@ -98,6 +98,30 @@ func (r *AddServerRequest) Submit(conn *signald.Signald) (response string, err e } +func (r *AnswerCallRequest) Submit(conn *signald.Signald) (err error) { + r.Version = "v1" + r.Type = "answer_call" + if r.ID == "" { + r.ID = signald.GenerateID() + } + responseChannel := conn.GetResponseListener(r.ID) + defer conn.CloseResponseListener(r.ID) + err = conn.RawRequest(r) + if err != nil { + log.Println("signald-go: error submitting request to signald") + return + } + + rawResponse := <-responseChannel + if rawResponse.Error != nil { + err = mkerr(rawResponse) + return + } + + return err + +} + // Submit: approve a request to join a group func (r *ApproveMembershipRequest) Submit(conn *signald.Signald) (response JsonGroupV2Info, err error) { r.Version = "v1" @@ -593,6 +617,30 @@ func (r *GroupLinkInfoRequest) Submit(conn *signald.Signald) (response JsonGroup } +func (r *HangupCallRequest) Submit(conn *signald.Signald) (err error) { + r.Version = "v1" + r.Type = "hangup_call" + if r.ID == "" { + r.ID = signald.GenerateID() + } + responseChannel := conn.GetResponseListener(r.ID) + defer conn.CloseResponseListener(r.ID) + err = conn.RawRequest(r) + if err != nil { + log.Println("signald-go: error submitting request to signald") + return + } + + rawResponse := <-responseChannel + if rawResponse.Error != nil { + err = mkerr(rawResponse) + return + } + + return err + +} + // Submit: Determine whether an account identifier is registered on the Signal service. func (r *IsIdentifierRegisteredRequest) Submit(conn *signald.Signald) (response BooleanMessage, err error) { r.Version = "v1" @@ -1079,6 +1127,54 @@ func (r *SendRequest) Submit(conn *signald.Signald) (response SendResponse, err } +func (r *SendCallOfferRequest) Submit(conn *signald.Signald) (err error) { + r.Version = "v1" + r.Type = "send_call_offer" + if r.ID == "" { + r.ID = signald.GenerateID() + } + responseChannel := conn.GetResponseListener(r.ID) + defer conn.CloseResponseListener(r.ID) + err = conn.RawRequest(r) + if err != nil { + log.Println("signald-go: error submitting request to signald") + return + } + + rawResponse := <-responseChannel + if rawResponse.Error != nil { + err = mkerr(rawResponse) + return + } + + return err + +} + +func (r *SendIceUpdatesRequest) Submit(conn *signald.Signald) (err error) { + r.Version = "v1" + r.Type = "send_ice_updates" + if r.ID == "" { + r.ID = signald.GenerateID() + } + responseChannel := conn.GetResponseListener(r.ID) + defer conn.CloseResponseListener(r.ID) + err = conn.RawRequest(r) + if err != nil { + log.Println("signald-go: error submitting request to signald") + return + } + + rawResponse := <-responseChannel + if rawResponse.Error != nil { + err = mkerr(rawResponse) + return + } + + return err + +} + // Submit: send a mobilecoin payment func (r *SendPaymentRequest) Submit(conn *signald.Signald) (response SendResponse, err error) { r.Version = "v1" diff --git a/signald/client-protocol/v1/structs.go b/signald/client-protocol/v1/structs.go index cf4845f..375e08c 100644 --- a/signald/client-protocol/v1/structs.go +++ b/signald/client-protocol/v1/structs.go @@ -49,6 +49,16 @@ type AllIdentityKeyList struct { IdentityKeys []*IdentityKeyList `json:"identity_keys,omitempty" yaml:"identity_keys,omitempty"` } +type AnswerCallRequest struct { + Request + Account string `json:"account,omitempty" yaml:"account,omitempty"` // the local account to use + CallId int64 `json:"call_id,omitempty" yaml:"call_id,omitempty"` // the id of the call + DestinationDeviceId int32 `json:"destination_device_id,omitempty" yaml:"destination_device_id,omitempty"` + Multiring bool `json:"multiring,omitempty" yaml:"multiring,omitempty"` + Recipient *JsonAddress `json:"recipient,omitempty" yaml:"recipient,omitempty"` // the address of the caller + Sdp string `json:"sdp,omitempty" yaml:"sdp,omitempty"` +} + type AnswerMessage struct { ID int64 `json:"id,omitempty" yaml:"id,omitempty"` Opaque string `json:"opaque,omitempty" yaml:"opaque,omitempty"` @@ -263,7 +273,7 @@ type GroupLinkInfoRequest struct { type GroupList struct { Groups []*JsonGroupV2Info `json:"groups,omitempty" yaml:"groups,omitempty"` - LegacyGroups []*JsonGroupInfo `json:"legacyGroups,omitempty" yaml:"legacyGroups,omitempty"` + LegacyGroups []*JsonGroupInfo `json:"legacyGroups,omitempty" yaml:"legacyGroups,omitempty"` // list of legacy (v1) groups, no longer supported (will always be empty) } type GroupMember struct { @@ -284,6 +294,17 @@ type GroupRequestingMember struct { UUID string `json:"uuid,omitempty" yaml:"uuid,omitempty"` } +type HangupCallRequest struct { + Request + Account string `json:"account,omitempty" yaml:"account,omitempty"` // the local account to use + CallId int64 `json:"call_id,omitempty" yaml:"call_id,omitempty"` // the id of the call + DestinationDeviceId int32 `json:"destination_device_id,omitempty" yaml:"destination_device_id,omitempty"` + DeviceId int32 `json:"device_id,omitempty" yaml:"device_id,omitempty"` + Multiring bool `json:"multiring,omitempty" yaml:"multiring,omitempty"` + Recipient *JsonAddress `json:"recipient,omitempty" yaml:"recipient,omitempty"` // the address of the caller + Type string `json:"type,omitempty" yaml:"type,omitempty"` // hangup type, options are: normal, accepted, declined, busy, need_permission +} + type HangupMessage struct { DeviceId int32 `json:"device_id,omitempty" yaml:"device_id,omitempty"` ID int64 `json:"id,omitempty" yaml:"id,omitempty"` @@ -293,7 +314,9 @@ type HangupMessage struct { type IceUpdateMessage struct { ID int64 `json:"id,omitempty" yaml:"id,omitempty"` - Opaque string `json:"opaque,omitempty" yaml:"opaque,omitempty"` + Line int32 `json:"line,omitempty" yaml:"line,omitempty"` + Mid string `json:"mid,omitempty" yaml:"mid,omitempty"` + Opaque string `json:"opaque,omitempty" yaml:"opaque,omitempty"` // the base64 encoded protobuf value. Sdp string `json:"sdp,omitempty" yaml:"sdp,omitempty"` } @@ -492,6 +515,7 @@ type JsonSentTranscriptMessage struct { ExpirationStartTimestamp int64 `json:"expirationStartTimestamp,omitempty" yaml:"expirationStartTimestamp,omitempty"` IsRecipientUpdate bool `json:"isRecipientUpdate,omitempty" yaml:"isRecipientUpdate,omitempty"` Message *JsonDataMessage `json:"message,omitempty" yaml:"message,omitempty"` + Story *StoryMessage `json:"story,omitempty" yaml:"story,omitempty"` Timestamp int64 `json:"timestamp,omitempty" yaml:"timestamp,omitempty"` UnidentifiedStatus map[string]string `json:"unidentifiedStatus,omitempty" yaml:"unidentifiedStatus,omitempty"` } @@ -599,7 +623,8 @@ type Profile struct { Address *JsonAddress `json:"address,omitempty" yaml:"address,omitempty"` Avatar string `json:"avatar,omitempty" yaml:"avatar,omitempty"` // path to avatar on local disk Capabilities *Capabilities `json:"capabilities,omitempty" yaml:"capabilities,omitempty"` - Color string `json:"color,omitempty" yaml:"color,omitempty"` // color of the chat with this user + Color string `json:"color,omitempty" yaml:"color,omitempty"` // color of the chat with this user + ContactName string `json:"contact_name,omitempty" yaml:"contact_name,omitempty"` // The user's name from local contact names Emoji string `json:"emoji,omitempty" yaml:"emoji,omitempty"` ExpirationTime int32 `json:"expiration_time,omitempty" yaml:"expiration_time,omitempty"` InboxPosition int32 `json:"inbox_position,omitempty" yaml:"inbox_position,omitempty"` @@ -716,6 +741,26 @@ type ResolveAddressRequest struct { Partial *JsonAddress `json:"partial,omitempty" yaml:"partial,omitempty"` // The partial address, missing fields } +type SendCallOfferRequest struct { + Request + Account string `json:"account,omitempty" yaml:"account,omitempty"` // the local account to use + CallId int64 `json:"call_id,omitempty" yaml:"call_id,omitempty"` // the id of the call + CallType string `json:"call_type,omitempty" yaml:"call_type,omitempty"` // must be one of 'audio_call' or 'video_call' + DestinationDeviceId int32 `json:"destination_device_id,omitempty" yaml:"destination_device_id,omitempty"` + Multring bool `json:"multring,omitempty" yaml:"multring,omitempty"` + Recipient *JsonAddress `json:"recipient,omitempty" yaml:"recipient,omitempty"` // the address of the caller + Sdp string `json:"sdp,omitempty" yaml:"sdp,omitempty"` +} + +type SendIceUpdatesRequest struct { + Request + Account string `json:"account,omitempty" yaml:"account,omitempty"` // the local account to use + DestinationDeviceId int32 `json:"destination_device_id,omitempty" yaml:"destination_device_id,omitempty"` + Multiring bool `json:"multiring,omitempty" yaml:"multiring,omitempty"` + Recipient *JsonAddress `json:"recipient,omitempty" yaml:"recipient,omitempty"` // the address of the caller + Updates []*IceUpdateMessage `json:"updates,omitempty" yaml:"updates,omitempty"` +} + // SendPaymentRequest: send a mobilecoin payment type SendPaymentRequest struct { Request