diff --git a/Makefile b/Makefile index badfcd2..b2cb0d1 100644 --- a/Makefile +++ b/Makefile @@ -2,11 +2,11 @@ signaldctl: signald/client-protocol go build -o signaldctl ./cmd/signaldctl protocol.json: - signald --dump-protocol > protocol.json + signald --dump-protocol | jq . > protocol.json signald/client-protocol: protocol.json tools/generator/* go run ./tools/generator < protocol.json clean: rm -rf protocol.json - rm -rf signald/client-protocol/* \ No newline at end of file + rm -rf signald/client-protocol/* diff --git a/protocol.json b/protocol.json index 2ec06d6..e967a99 100644 --- a/protocol.json +++ b/protocol.json @@ -1 +1,1566 @@ -{"doc_version":"v1","version":{"name":"signald","version":"0.11.1+git2021-01-26r209ba8f1.66","branch":"main","commit":"209ba8f1b1f472ca1fb2b0f1790f7cd1fad0658b"},"info":"This document describes objects that may be used when communicating with signald.","types":{"v1":{"JsonMessageEnvelope":{"fields":{"username":{"type":"String","example":"\"+12024561414\""},"uuid":{"type":"String","example":"\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\""},"source":{"type":"JsonAddress","version":"v1"},"sourceDevice":{"type":"int"},"type":{"type":"String"},"relay":{"type":"String"},"timestamp":{"type":"long","example":"1611698481651"},"timestampISO":{"type":"String"},"serverTimestamp":{"type":"long"},"serverDeliveredTimestamp":{"type":"long","example":"161169848165180"},"hasLegacyMessage":{"type":"boolean"},"hasContent":{"type":"boolean"},"isUnidentifiedSender":{"type":"boolean"},"dataMessage":{"type":"JsonDataMessage","version":"v1"},"syncMessage":{"type":"JsonSyncMessage","version":"v1"},"callMessage":{"type":"JsonCallMessage","version":"v0"},"receipt":{"type":"JsonReceiptMessage","version":"v0"},"typing":{"type":"JsonTypingMessage","version":"v0"}}},"SendRequest":{"fields":{"username":{"type":"String","example":"\"+12024561414\""},"recipientAddress":{"type":"JsonAddress","version":"v1"},"recipientGroupId":{"type":"String","example":"\"EdSqI90cS0UomDpgUXOlCoObWvQOXlH5G3Z2d3f4ayE=\""},"messageBody":{"type":"String","example":"\"hello\""},"attachments":{"list":true,"type":"JsonAttachment","version":"v0"},"quote":{"type":"JsonQuote","version":"v1"},"timestamp":{"type":"Long"},"mentions":{"list":true,"type":"JsonMention","version":"v1"}}},"SendResponse":{"fields":{"results":{"list":true,"type":"JsonSendMessageResult","version":"v1"},"timestamp":{"type":"long","example":"1611698481651"}}},"ReactRequest":{"fields":{"username":{"type":"String","example":"\"+12024561414\""},"recipientAddress":{"type":"JsonAddress","version":"v1"},"recipientGroupId":{"type":"String","example":"\"EdSqI90cS0UomDpgUXOlCoObWvQOXlH5G3Z2d3f4ayE=\""},"reaction":{"type":"JsonReaction","version":"v1"},"timestamp":{"type":"long"}},"doc":"react to a previous message"},"VersionRequest":{"fields":{}},"JsonVersionMessage":{"fields":{"name":{"type":"String","example":"\"signald\""},"version":{"type":"String","example":"\"0.11.1+git2021-01-26r209ba8f1.66\""},"branch":{"type":"String","example":"\"main\""},"commit":{"type":"String","example":"\"209ba8f1b1f472ca1fb2b0f1790f7cd1fad0658b\""}}},"AcceptInvitationRequest":{"fields":{"account":{"type":"String","doc":"The account to interact with","example":"\"+12024561414\""},"groupID":{"type":"String","example":"\"EdSqI90cS0UomDpgUXOlCoObWvQOXlH5G3Z2d3f4ayE=\""}},"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\""},"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"}}},"ApproveMembershipRequest":{"fields":{"account":{"type":"String","doc":"The account to interact with","example":"\"+12024561414\""},"groupID":{"type":"String","example":"\"EdSqI90cS0UomDpgUXOlCoObWvQOXlH5G3Z2d3f4ayE=\""},"members":{"list":true,"type":"JsonAddress","version":"v1","doc":"list of requesting members to approve"}},"doc":"approve a request to join a group"},"GetGroupRequest":{"fields":{"account":{"type":"String","doc":"The account to interact with","example":"\"+12024561414\""},"groupID":{"type":"String","example":"\"EdSqI90cS0UomDpgUXOlCoObWvQOXlH5G3Z2d3f4ayE=\""},"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"},"GetLinkedDevicesRequest":{"fields":{"account":{"type":"String","doc":"The account to interact with","example":"\"+12024561414\""}},"doc":"list all linked devices on a Signal account"},"LinkedDevices":{"fields":{"devices":{"list":true,"type":"DeviceInfo","version":"v0"}}},"JoinGroupRequest":{"fields":{"account":{"type":"String","doc":"The account to interact with","example":"\"+12024561414\""},"uri":{"type":"String","doc":"The signal.group URL","example":"\"https://signal.group/#CjQKINH_GZhXhfifTcnBkaKTNRxW-hHKnGSq-cJNyPVqHRp8EhDUB7zjKNEl0NaULhsqJCX3\""}},"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\""},"memberCount":{"type":"int","example":"3"},"addFromInviteLink":{"type":"int"},"revision":{"type":"int","example":"5"},"pendingAdminApproval":{"type":"boolean"}}},"ProtocolRequest":{"fields":{}},"RemoveLinkedDeviceRequest":{"fields":{"account":{"type":"String","doc":"The account to interact with","example":"\"+12024561414\""},"deviceId":{"type":"long","doc":"the ID of the device to unlink","example":"3"}},"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":"\"+12024561414\""},"groupID":{"type":"String","example":"\"EdSqI90cS0UomDpgUXOlCoObWvQOXlH5G3Z2d3f4ayE=\""},"title":{"type":"String","example":"\"Parkdale Run Club\""},"avatar":{"type":"String","example":"\"/tmp/image.jpg\""},"addMembers":{"list":true,"type":"JsonAddress","version":"v1"},"removeMembers":{"list":true,"type":"JsonAddress","version":"v1"}},"doc":"modify a group"},"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\""},"name":{"type":"String","doc":"New profile name. Set to empty string for no profile name","example":"\"signald user\""},"avatarFile":{"type":"String","doc":"Path to new profile avatar file, if the avatar should be updated","example":"\"/tmp/image.jpg\""}}},"ResolveAddressRequest":{"fields":{"account":{"type":"String","doc":"The signal account to use","example":"\"+12024561414\""},"partial":{"type":"JsonAddress","version":"v1","doc":"The partial address, missing fields"}},"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":"\"+12024561414\""},"to":{"type":"JsonAddress","version":"v1","doc":"The address that sent the message being marked as read"},"timestamps":{"list":true,"type":"Long","doc":"List of messages to mark as read","example":"1611698481651"}}},"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":"1611698481651"},"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":"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":"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":"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":"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":"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":"v0","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"}}},"JsonSyncMessage":{"fields":{"sent":{"type":"JsonSentTranscriptMessage","version":"v1"},"contacts":{"type":"JsonAttachment","version":"v0"},"contactsComplete":{"type":"boolean"},"groups":{"type":"JsonAttachment","version":"v0"},"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"}}},"JsonQuote":{"fields":{"id":{"type":"long","doc":"the client timestamp of the message being quoted","example":"1611698481651"},"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"}}},"JsonSendMessageResult":{"fields":{"address":{"type":"JsonAddress","version":"v1"},"success":{"type":"Success","version":"v0"},"networkFailure":{"type":"boolean","example":"false"},"unregisteredFailure":{"type":"boolean","example":"false"},"identityFailure":{"type":"String"}}},"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":"1611698481651"}}},"JsonGroupInfo":{"fields":{"groupId":{"type":"String"},"members":{"list":true,"type":"JsonAddress","version":"v1"},"name":{"type":"String"},"type":{"type":"String"},"avatarId":{"type":"long"}}},"JsonSentTranscriptMessage":{"fields":{"destination":{"type":"JsonAddress","version":"v1"},"timestamp":{"type":"long","example":"1611698481651"},"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":"1611698481651"}}},"JsonViewOnceOpenMessage":{"fields":{"sender":{"type":"JsonAddress","version":"v1"},"timestamp":{"type":"long","example":"1611698481651"}}},"JsonVerifiedMessage":{"fields":{"destination":{"type":"JsonAddress","version":"v1"},"identityKey":{"type":"String"},"verified":{"type":"String"},"timestamp":{"type":"long"}}},"JsonMessageRequestResponseMessage":{"fields":{"person":{"type":"JsonAddress","version":"v1"},"groupId":{"type":"String"},"type":{"type":"String"}}}},"v0":{"JsonAccountList":{"fields":{"accounts":{"list":true,"type":"JsonAccount","version":"v0"}}},"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"}}},"JsonReceiptMessage":{"fields":{"type":{"type":"String"},"timestamps":{"list":true,"type":"Long"},"when":{"type":"long"}}},"JsonTypingMessage":{"fields":{"action":{"type":"String"},"timestamp":{"type":"long"},"groupId":{"type":"String"}}},"JsonAccount":{"fields":{"deviceId":{"type":"int"},"username":{"type":"String"},"filename":{"type":"String"},"uuid":{"type":"String"},"registered":{"type":"boolean"},"has_keys":{"type":"boolean"},"subscribed":{"type":"boolean"}}},"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"}}},"DeviceInfo":{"fields":{"id":{"type":"long"},"name":{"type":"String"},"created":{"type":"long"},"lastSeen":{"type":"long"}}},"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"}}},"JsonSticker":{"fields":{"packID":{"type":"String"},"packKey":{"type":"String"},"stickerID":{"type":"int"},"attachment":{"type":"JsonAttachment","version":"v0"}}},"RemoteDelete":{"fields":{"targetSentTimestamp":{"type":"long"}}},"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"}}},"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"}}},"Success":{"fields":{"unidentified":{"type":"boolean"},"needsSync":{"type":"boolean"},"duration":{"type":"long"}}},"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":{"present":{"type":"boolean"}}},"Type":{"fields":{}}},"v1alpha1":{"ProtocolRequest":{"fields":{},"deprecated":true},"GetLinkedDevicesRequest":{"fields":{"account":{"type":"String","doc":"The account to interact with","example":"\"+12024561414\""}},"doc":"list all linked devices on a Signal account","deprecated":true},"LinkedDevices":{"fields":{"devices":{"list":true,"type":"DeviceInfo","version":"v0"}}},"RemoveLinkedDeviceRequest":{"fields":{"account":{"type":"String","doc":"The account to interact with","example":"\"+12024561414\""},"deviceId":{"type":"long","doc":"the ID of the device to unlink","example":"3"}},"doc":"Remove a linked device from the Signal account. Only allowed when the local device id is 1"},"JoinGroupRequest":{"fields":{"account":{"type":"String","doc":"The account to interact with","example":"\"+12024561414\""},"uri":{"type":"String","doc":"The signal.group URL","example":"\"https://signal.group/#CjQKINH_GZhXhfifTcnBkaKTNRxW-hHKnGSq-cJNyPVqHRp8EhDUB7zjKNEl0NaULhsqJCX3\""}},"doc":"Join a group using the a signal.group URL. Note that you must have a profile name set to join groups.","deprecated":true},"JsonGroupJoinInfo":{"fields":{"groupID":{"type":"String","example":"\"EdSqI90cS0UomDpgUXOlCoObWvQOXlH5G3Z2d3f4ayE=\""},"title":{"type":"String","example":"\"Parkdale Run Club\""},"memberCount":{"type":"int","example":"3"},"addFromInviteLink":{"type":"int"},"revision":{"type":"int","example":"5"},"pendingAdminApproval":{"type":"boolean"}}},"UpdateGroupRequest":{"fields":{"account":{"type":"String","doc":"The account to interact with","example":"\"+12024561414\""},"groupID":{"type":"String","example":"\"EdSqI90cS0UomDpgUXOlCoObWvQOXlH5G3Z2d3f4ayE=\""},"title":{"type":"String","example":"\"Parkdale Run Club\""},"addMembers":{"list":true,"type":"JsonAddress","version":"v1"},"removeMembers":{"list":true,"type":"JsonAddress","version":"v1"}},"doc":"modify a group. only v2 groups for now","deprecated":true},"JsonGroupV2Info":{"fields":{"id":{"type":"String","example":"\"EdSqI90cS0UomDpgUXOlCoObWvQOXlH5G3Z2d3f4ayE=\""},"revision":{"type":"int","example":"5"},"title":{"type":"String","example":"\"Parkdale Run Club\""},"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"}}},"AcceptInvitationRequest":{"fields":{"account":{"type":"String","doc":"The account to interact with","example":"\"+12024561414\""},"groupID":{"type":"String","example":"\"EdSqI90cS0UomDpgUXOlCoObWvQOXlH5G3Z2d3f4ayE=\""}},"doc":"Accept a v2 group invitation. Note that you must have a profile name set to join groups.","deprecated":true},"ApproveMembershipRequest":{"fields":{"account":{"type":"String","doc":"The account to interact with","example":"\"+12024561414\""},"groupID":{"type":"String","example":"\"EdSqI90cS0UomDpgUXOlCoObWvQOXlH5G3Z2d3f4ayE=\""},"members":{"list":true,"type":"JsonAddress","version":"v1","doc":"list of requesting members to approve"}},"doc":"approve a request to join a group","deprecated":true},"GetGroupRequest":{"fields":{"account":{"type":"String","doc":"The account to interact with","example":"\"+12024561414\""},"groupID":{"type":"String","example":"\"EdSqI90cS0UomDpgUXOlCoObWvQOXlH5G3Z2d3f4ayE=\""},"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","deprecated":true}},"v1alpha2":{"UpdateGroupRequest":{"fields":{"account":{"type":"String","doc":"The identifier of the account to interact with","example":"\"+12024561414\""},"groupID":{"type":"String","example":"\"EdSqI90cS0UomDpgUXOlCoObWvQOXlH5G3Z2d3f4ayE=\""},"title":{"type":"String","example":"\"Parkdale Run Club\""},"avatar":{"type":"String","example":"\"/tmp/image.jpg\""},"addMembers":{"list":true,"type":"JsonAddress","version":"v1"},"removeMembers":{"list":true,"type":"JsonAddress","version":"v1"}},"doc":"modify a group","deprecated":true},"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"}}},"actions":{"v1":{"send":{"request":"SendRequest","response":"SendResponse"},"react":{"request":"ReactRequest","response":"SendResponse","doc":"react to a previous message"},"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."},"approve_membership":{"request":"ApproveMembershipRequest","response":"JsonGroupV2Info","doc":"approve a request to join a group"},"get_group":{"request":"GetGroupRequest","response":"JsonGroupV2Info","doc":"Query the server for the latest state of a known group"},"get_linked_devices":{"request":"GetLinkedDevicesRequest","response":"LinkedDevices","doc":"list all linked devices on a Signal account"},"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."},"protocol":{"request":"ProtocolRequest"},"remove_linked_device":{"request":"RemoveLinkedDeviceRequest","doc":"Remove a linked device from the Signal account. Only allowed when the local device id is 1"},"update_group":{"request":"UpdateGroupRequest","response":"GroupInfo","doc":"modify a group"},"set_profile":{"request":"SetProfile"},"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"},"mark_read":{"request":"MarkReadRequest"}},"v1alpha1":{"protocol":{"request":"ProtocolRequest","deprecated":true},"get_linked_devices":{"request":"GetLinkedDevicesRequest","response":"LinkedDevices","doc":"list all linked devices on a Signal account","deprecated":true},"remove_linked_device":{"request":"RemoveLinkedDeviceRequest","doc":"Remove a linked device from the Signal account. Only allowed when the local device id is 1"},"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.","deprecated":true},"update_group":{"request":"UpdateGroupRequest","response":"JsonGroupV2Info","doc":"modify a group. only v2 groups for now","deprecated":true},"accept_invitation":{"request":"AcceptInvitationRequest","response":"JsonGroupV2Info","doc":"Accept a v2 group invitation. Note that you must have a profile name set to join groups.","deprecated":true},"approve_membership":{"request":"ApproveMembershipRequest","response":"JsonGroupV2Info","doc":"approve a request to join a group","deprecated":true},"get_group":{"request":"GetGroupRequest","response":"JsonGroupV2Info","doc":"Query the server for the latest state of a known group","deprecated":true}},"v1alpha2":{"update_group":{"request":"UpdateGroupRequest","response":"GroupInfo","doc":"modify a group","deprecated":true}}}} +{ + "doc_version": "v1", + "version": { + "name": "signald", + "version": "0.11.1+git2021-01-26r209ba8f1.66", + "branch": "main", + "commit": "209ba8f1b1f472ca1fb2b0f1790f7cd1fad0658b" + }, + "info": "This document describes objects that may be used when communicating with signald.", + "types": { + "v1": { + "JsonMessageEnvelope": { + "fields": { + "username": { + "type": "String", + "example": "\"+12024561414\"" + }, + "uuid": { + "type": "String", + "example": "\"0cc10e61-d64c-4dbc-b51c-334f7dd45a4a\"" + }, + "source": { + "type": "JsonAddress", + "version": "v1" + }, + "sourceDevice": { + "type": "int" + }, + "type": { + "type": "String" + }, + "relay": { + "type": "String" + }, + "timestamp": { + "type": "long", + "example": "1611698481651" + }, + "timestampISO": { + "type": "String" + }, + "serverTimestamp": { + "type": "long" + }, + "serverDeliveredTimestamp": { + "type": "long", + "example": "161169848165180" + }, + "hasLegacyMessage": { + "type": "boolean" + }, + "hasContent": { + "type": "boolean" + }, + "isUnidentifiedSender": { + "type": "boolean" + }, + "dataMessage": { + "type": "JsonDataMessage", + "version": "v1" + }, + "syncMessage": { + "type": "JsonSyncMessage", + "version": "v1" + }, + "callMessage": { + "type": "JsonCallMessage", + "version": "v0" + }, + "receipt": { + "type": "JsonReceiptMessage", + "version": "v0" + }, + "typing": { + "type": "JsonTypingMessage", + "version": "v0" + } + } + }, + "SendRequest": { + "fields": { + "username": { + "type": "String", + "example": "\"+12024561414\"" + }, + "recipientAddress": { + "type": "JsonAddress", + "version": "v1" + }, + "recipientGroupId": { + "type": "String", + "example": "\"EdSqI90cS0UomDpgUXOlCoObWvQOXlH5G3Z2d3f4ayE=\"" + }, + "messageBody": { + "type": "String", + "example": "\"hello\"" + }, + "attachments": { + "list": true, + "type": "JsonAttachment", + "version": "v0" + }, + "quote": { + "type": "JsonQuote", + "version": "v1" + }, + "timestamp": { + "type": "Long" + }, + "mentions": { + "list": true, + "type": "JsonMention", + "version": "v1" + } + } + }, + "SendResponse": { + "fields": { + "results": { + "list": true, + "type": "JsonSendMessageResult", + "version": "v1" + }, + "timestamp": { + "type": "long", + "example": "1611698481651" + } + } + }, + "ReactRequest": { + "fields": { + "username": { + "type": "String", + "example": "\"+12024561414\"" + }, + "recipientAddress": { + "type": "JsonAddress", + "version": "v1" + }, + "recipientGroupId": { + "type": "String", + "example": "\"EdSqI90cS0UomDpgUXOlCoObWvQOXlH5G3Z2d3f4ayE=\"" + }, + "reaction": { + "type": "JsonReaction", + "version": "v1" + }, + "timestamp": { + "type": "long" + } + }, + "doc": "react to a previous message" + }, + "VersionRequest": { + "fields": {} + }, + "JsonVersionMessage": { + "fields": { + "name": { + "type": "String", + "example": "\"signald\"" + }, + "version": { + "type": "String", + "example": "\"0.11.1+git2021-01-26r209ba8f1.66\"" + }, + "branch": { + "type": "String", + "example": "\"main\"" + }, + "commit": { + "type": "String", + "example": "\"209ba8f1b1f472ca1fb2b0f1790f7cd1fad0658b\"" + } + } + }, + "AcceptInvitationRequest": { + "fields": { + "account": { + "type": "String", + "doc": "The account to interact with", + "example": "\"+12024561414\"" + }, + "groupID": { + "type": "String", + "example": "\"EdSqI90cS0UomDpgUXOlCoObWvQOXlH5G3Z2d3f4ayE=\"" + } + }, + "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\"" + }, + "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" + } + } + }, + "ApproveMembershipRequest": { + "fields": { + "account": { + "type": "String", + "doc": "The account to interact with", + "example": "\"+12024561414\"" + }, + "groupID": { + "type": "String", + "example": "\"EdSqI90cS0UomDpgUXOlCoObWvQOXlH5G3Z2d3f4ayE=\"" + }, + "members": { + "list": true, + "type": "JsonAddress", + "version": "v1", + "doc": "list of requesting members to approve" + } + }, + "doc": "approve a request to join a group" + }, + "GetGroupRequest": { + "fields": { + "account": { + "type": "String", + "doc": "The account to interact with", + "example": "\"+12024561414\"" + }, + "groupID": { + "type": "String", + "example": "\"EdSqI90cS0UomDpgUXOlCoObWvQOXlH5G3Z2d3f4ayE=\"" + }, + "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" + }, + "GetLinkedDevicesRequest": { + "fields": { + "account": { + "type": "String", + "doc": "The account to interact with", + "example": "\"+12024561414\"" + } + }, + "doc": "list all linked devices on a Signal account" + }, + "LinkedDevices": { + "fields": { + "devices": { + "list": true, + "type": "DeviceInfo", + "version": "v0" + } + } + }, + "JoinGroupRequest": { + "fields": { + "account": { + "type": "String", + "doc": "The account to interact with", + "example": "\"+12024561414\"" + }, + "uri": { + "type": "String", + "doc": "The signal.group URL", + "example": "\"https://signal.group/#CjQKINH_GZhXhfifTcnBkaKTNRxW-hHKnGSq-cJNyPVqHRp8EhDUB7zjKNEl0NaULhsqJCX3\"" + } + }, + "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\"" + }, + "memberCount": { + "type": "int", + "example": "3" + }, + "addFromInviteLink": { + "type": "int" + }, + "revision": { + "type": "int", + "example": "5" + }, + "pendingAdminApproval": { + "type": "boolean" + } + } + }, + "ProtocolRequest": { + "fields": {} + }, + "RemoveLinkedDeviceRequest": { + "fields": { + "account": { + "type": "String", + "doc": "The account to interact with", + "example": "\"+12024561414\"" + }, + "deviceId": { + "type": "long", + "doc": "the ID of the device to unlink", + "example": "3" + } + }, + "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": "\"+12024561414\"" + }, + "groupID": { + "type": "String", + "example": "\"EdSqI90cS0UomDpgUXOlCoObWvQOXlH5G3Z2d3f4ayE=\"" + }, + "title": { + "type": "String", + "example": "\"Parkdale Run Club\"" + }, + "avatar": { + "type": "String", + "example": "\"/tmp/image.jpg\"" + }, + "addMembers": { + "list": true, + "type": "JsonAddress", + "version": "v1" + }, + "removeMembers": { + "list": true, + "type": "JsonAddress", + "version": "v1" + } + }, + "doc": "modify a group" + }, + "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\"" + }, + "name": { + "type": "String", + "doc": "New profile name. Set to empty string for no profile name", + "example": "\"signald user\"" + }, + "avatarFile": { + "type": "String", + "doc": "Path to new profile avatar file, if the avatar should be updated", + "example": "\"/tmp/image.jpg\"" + } + } + }, + "ResolveAddressRequest": { + "fields": { + "account": { + "type": "String", + "doc": "The signal account to use", + "example": "\"+12024561414\"" + }, + "partial": { + "type": "JsonAddress", + "version": "v1", + "doc": "The partial address, missing fields" + } + }, + "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": "\"+12024561414\"" + }, + "to": { + "type": "JsonAddress", + "version": "v1", + "doc": "The address that sent the message being marked as read" + }, + "timestamps": { + "list": true, + "type": "Long", + "doc": "List of messages to mark as read", + "example": "1611698481651" + } + } + }, + "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": "1611698481651" + }, + "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": "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": "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": "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": "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": "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": "v0", + "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" + } + } + }, + "JsonSyncMessage": { + "fields": { + "sent": { + "type": "JsonSentTranscriptMessage", + "version": "v1" + }, + "contacts": { + "type": "JsonAttachment", + "version": "v0" + }, + "contactsComplete": { + "type": "boolean" + }, + "groups": { + "type": "JsonAttachment", + "version": "v0" + }, + "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" + } + } + }, + "JsonQuote": { + "fields": { + "id": { + "type": "long", + "doc": "the client timestamp of the message being quoted", + "example": "1611698481651" + }, + "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" + } + } + }, + "JsonSendMessageResult": { + "fields": { + "address": { + "type": "JsonAddress", + "version": "v1" + }, + "success": { + "type": "Success", + "version": "v0" + }, + "networkFailure": { + "type": "boolean", + "example": "false" + }, + "unregisteredFailure": { + "type": "boolean", + "example": "false" + }, + "identityFailure": { + "type": "String" + } + } + }, + "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": "1611698481651" + } + } + }, + "JsonGroupInfo": { + "fields": { + "groupId": { + "type": "String" + }, + "members": { + "list": true, + "type": "JsonAddress", + "version": "v1" + }, + "name": { + "type": "String" + }, + "type": { + "type": "String" + }, + "avatarId": { + "type": "long" + } + } + }, + "JsonSentTranscriptMessage": { + "fields": { + "destination": { + "type": "JsonAddress", + "version": "v1" + }, + "timestamp": { + "type": "long", + "example": "1611698481651" + }, + "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": "1611698481651" + } + } + }, + "JsonViewOnceOpenMessage": { + "fields": { + "sender": { + "type": "JsonAddress", + "version": "v1" + }, + "timestamp": { + "type": "long", + "example": "1611698481651" + } + } + }, + "JsonVerifiedMessage": { + "fields": { + "destination": { + "type": "JsonAddress", + "version": "v1" + }, + "identityKey": { + "type": "String" + }, + "verified": { + "type": "String" + }, + "timestamp": { + "type": "long" + } + } + }, + "JsonMessageRequestResponseMessage": { + "fields": { + "person": { + "type": "JsonAddress", + "version": "v1" + }, + "groupId": { + "type": "String" + }, + "type": { + "type": "String" + } + } + } + }, + "v0": { + "JsonAccountList": { + "fields": { + "accounts": { + "list": true, + "type": "JsonAccount", + "version": "v0" + } + } + }, + "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" + } + } + }, + "JsonReceiptMessage": { + "fields": { + "type": { + "type": "String" + }, + "timestamps": { + "list": true, + "type": "Long" + }, + "when": { + "type": "long" + } + } + }, + "JsonTypingMessage": { + "fields": { + "action": { + "type": "String" + }, + "timestamp": { + "type": "long" + }, + "groupId": { + "type": "String" + } + } + }, + "JsonAccount": { + "fields": { + "deviceId": { + "type": "int" + }, + "username": { + "type": "String" + }, + "filename": { + "type": "String" + }, + "uuid": { + "type": "String" + }, + "registered": { + "type": "boolean" + }, + "has_keys": { + "type": "boolean" + }, + "subscribed": { + "type": "boolean" + } + } + }, + "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" + } + } + }, + "DeviceInfo": { + "fields": { + "id": { + "type": "long" + }, + "name": { + "type": "String" + }, + "created": { + "type": "long" + }, + "lastSeen": { + "type": "long" + } + } + }, + "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" + } + } + }, + "JsonSticker": { + "fields": { + "packID": { + "type": "String" + }, + "packKey": { + "type": "String" + }, + "stickerID": { + "type": "int" + }, + "attachment": { + "type": "JsonAttachment", + "version": "v0" + } + } + }, + "RemoteDelete": { + "fields": { + "targetSentTimestamp": { + "type": "long" + } + } + }, + "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" + } + } + }, + "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" + } + } + }, + "Success": { + "fields": { + "unidentified": { + "type": "boolean" + }, + "needsSync": { + "type": "boolean" + }, + "duration": { + "type": "long" + } + } + }, + "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": { + "present": { + "type": "boolean" + } + } + }, + "Type": { + "fields": {} + } + }, + "v1alpha1": { + "ProtocolRequest": { + "fields": {}, + "deprecated": true + }, + "GetLinkedDevicesRequest": { + "fields": { + "account": { + "type": "String", + "doc": "The account to interact with", + "example": "\"+12024561414\"" + } + }, + "doc": "list all linked devices on a Signal account", + "deprecated": true + }, + "LinkedDevices": { + "fields": { + "devices": { + "list": true, + "type": "DeviceInfo", + "version": "v0" + } + } + }, + "RemoveLinkedDeviceRequest": { + "fields": { + "account": { + "type": "String", + "doc": "The account to interact with", + "example": "\"+12024561414\"" + }, + "deviceId": { + "type": "long", + "doc": "the ID of the device to unlink", + "example": "3" + } + }, + "doc": "Remove a linked device from the Signal account. Only allowed when the local device id is 1" + }, + "JoinGroupRequest": { + "fields": { + "account": { + "type": "String", + "doc": "The account to interact with", + "example": "\"+12024561414\"" + }, + "uri": { + "type": "String", + "doc": "The signal.group URL", + "example": "\"https://signal.group/#CjQKINH_GZhXhfifTcnBkaKTNRxW-hHKnGSq-cJNyPVqHRp8EhDUB7zjKNEl0NaULhsqJCX3\"" + } + }, + "doc": "Join a group using the a signal.group URL. Note that you must have a profile name set to join groups.", + "deprecated": true + }, + "JsonGroupJoinInfo": { + "fields": { + "groupID": { + "type": "String", + "example": "\"EdSqI90cS0UomDpgUXOlCoObWvQOXlH5G3Z2d3f4ayE=\"" + }, + "title": { + "type": "String", + "example": "\"Parkdale Run Club\"" + }, + "memberCount": { + "type": "int", + "example": "3" + }, + "addFromInviteLink": { + "type": "int" + }, + "revision": { + "type": "int", + "example": "5" + }, + "pendingAdminApproval": { + "type": "boolean" + } + } + }, + "UpdateGroupRequest": { + "fields": { + "account": { + "type": "String", + "doc": "The account to interact with", + "example": "\"+12024561414\"" + }, + "groupID": { + "type": "String", + "example": "\"EdSqI90cS0UomDpgUXOlCoObWvQOXlH5G3Z2d3f4ayE=\"" + }, + "title": { + "type": "String", + "example": "\"Parkdale Run Club\"" + }, + "addMembers": { + "list": true, + "type": "JsonAddress", + "version": "v1" + }, + "removeMembers": { + "list": true, + "type": "JsonAddress", + "version": "v1" + } + }, + "doc": "modify a group. only v2 groups for now", + "deprecated": true + }, + "JsonGroupV2Info": { + "fields": { + "id": { + "type": "String", + "example": "\"EdSqI90cS0UomDpgUXOlCoObWvQOXlH5G3Z2d3f4ayE=\"" + }, + "revision": { + "type": "int", + "example": "5" + }, + "title": { + "type": "String", + "example": "\"Parkdale Run Club\"" + }, + "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" + } + } + }, + "AcceptInvitationRequest": { + "fields": { + "account": { + "type": "String", + "doc": "The account to interact with", + "example": "\"+12024561414\"" + }, + "groupID": { + "type": "String", + "example": "\"EdSqI90cS0UomDpgUXOlCoObWvQOXlH5G3Z2d3f4ayE=\"" + } + }, + "doc": "Accept a v2 group invitation. Note that you must have a profile name set to join groups.", + "deprecated": true + }, + "ApproveMembershipRequest": { + "fields": { + "account": { + "type": "String", + "doc": "The account to interact with", + "example": "\"+12024561414\"" + }, + "groupID": { + "type": "String", + "example": "\"EdSqI90cS0UomDpgUXOlCoObWvQOXlH5G3Z2d3f4ayE=\"" + }, + "members": { + "list": true, + "type": "JsonAddress", + "version": "v1", + "doc": "list of requesting members to approve" + } + }, + "doc": "approve a request to join a group", + "deprecated": true + }, + "GetGroupRequest": { + "fields": { + "account": { + "type": "String", + "doc": "The account to interact with", + "example": "\"+12024561414\"" + }, + "groupID": { + "type": "String", + "example": "\"EdSqI90cS0UomDpgUXOlCoObWvQOXlH5G3Z2d3f4ayE=\"" + }, + "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", + "deprecated": true + } + }, + "v1alpha2": { + "UpdateGroupRequest": { + "fields": { + "account": { + "type": "String", + "doc": "The identifier of the account to interact with", + "example": "\"+12024561414\"" + }, + "groupID": { + "type": "String", + "example": "\"EdSqI90cS0UomDpgUXOlCoObWvQOXlH5G3Z2d3f4ayE=\"" + }, + "title": { + "type": "String", + "example": "\"Parkdale Run Club\"" + }, + "avatar": { + "type": "String", + "example": "\"/tmp/image.jpg\"" + }, + "addMembers": { + "list": true, + "type": "JsonAddress", + "version": "v1" + }, + "removeMembers": { + "list": true, + "type": "JsonAddress", + "version": "v1" + } + }, + "doc": "modify a group", + "deprecated": true + }, + "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" + } + } + }, + "actions": { + "v1": { + "send": { + "request": "SendRequest", + "response": "SendResponse" + }, + "react": { + "request": "ReactRequest", + "response": "SendResponse", + "doc": "react to a previous message" + }, + "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." + }, + "approve_membership": { + "request": "ApproveMembershipRequest", + "response": "JsonGroupV2Info", + "doc": "approve a request to join a group" + }, + "get_group": { + "request": "GetGroupRequest", + "response": "JsonGroupV2Info", + "doc": "Query the server for the latest state of a known group" + }, + "get_linked_devices": { + "request": "GetLinkedDevicesRequest", + "response": "LinkedDevices", + "doc": "list all linked devices on a Signal account" + }, + "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." + }, + "protocol": { + "request": "ProtocolRequest" + }, + "remove_linked_device": { + "request": "RemoveLinkedDeviceRequest", + "doc": "Remove a linked device from the Signal account. Only allowed when the local device id is 1" + }, + "update_group": { + "request": "UpdateGroupRequest", + "response": "GroupInfo", + "doc": "modify a group" + }, + "set_profile": { + "request": "SetProfile" + }, + "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" + }, + "mark_read": { + "request": "MarkReadRequest" + } + }, + "v1alpha1": { + "protocol": { + "request": "ProtocolRequest", + "deprecated": true + }, + "get_linked_devices": { + "request": "GetLinkedDevicesRequest", + "response": "LinkedDevices", + "doc": "list all linked devices on a Signal account", + "deprecated": true + }, + "remove_linked_device": { + "request": "RemoveLinkedDeviceRequest", + "doc": "Remove a linked device from the Signal account. Only allowed when the local device id is 1" + }, + "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.", + "deprecated": true + }, + "update_group": { + "request": "UpdateGroupRequest", + "response": "JsonGroupV2Info", + "doc": "modify a group. only v2 groups for now", + "deprecated": true + }, + "accept_invitation": { + "request": "AcceptInvitationRequest", + "response": "JsonGroupV2Info", + "doc": "Accept a v2 group invitation. Note that you must have a profile name set to join groups.", + "deprecated": true + }, + "approve_membership": { + "request": "ApproveMembershipRequest", + "response": "JsonGroupV2Info", + "doc": "approve a request to join a group", + "deprecated": true + }, + "get_group": { + "request": "GetGroupRequest", + "response": "JsonGroupV2Info", + "doc": "Query the server for the latest state of a known group", + "deprecated": true + } + }, + "v1alpha2": { + "update_group": { + "request": "UpdateGroupRequest", + "response": "GroupInfo", + "doc": "modify a group", + "deprecated": true + } + } + } +}