{
  "doc_version": "v1",
  "version": {
    "name": "signald",
    "version": "0.12.0+git2021-01-30rce7ef396.5",
    "branch": "main",
    "commit": "ce7ef39669fc7482b2efe6555bc2962cca8e1ca6"
  },
  "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": "1612005072095"
          },
          "timestampISO": {
            "type": "String"
          },
          "serverTimestamp": {
            "type": "long"
          },
          "serverDeliveredTimestamp": {
            "type": "long",
            "example": "161200507209580"
          },
          "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\"",
            "required": true
          },
          "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": "1612005072095"
          }
        }
      },
      "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"
          }
        },
        "doc": "react to a previous message"
      },
      "VersionRequest": {
        "fields": {}
      },
      "JsonVersionMessage": {
        "fields": {
          "name": {
            "type": "String",
            "example": "\"signald\""
          },
          "version": {
            "type": "String",
            "example": "\"0.12.0+git2021-01-30rce7ef396.5\""
          },
          "branch": {
            "type": "String",
            "example": "\"main\""
          },
          "commit": {
            "type": "String",
            "example": "\"ce7ef39669fc7482b2efe6555bc2962cca8e1ca6\""
          }
        }
      },
      "AcceptInvitationRequest": {
        "fields": {
          "account": {
            "type": "String",
            "doc": "The account to interact with",
            "example": "\"+12024561414\"",
            "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\""
          },
          "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\"",
            "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"
      },
      "GetGroupRequest": {
        "fields": {
          "account": {
            "type": "String",
            "doc": "The account to interact with",
            "example": "\"+12024561414\"",
            "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"
      },
      "GetLinkedDevicesRequest": {
        "fields": {
          "account": {
            "type": "String",
            "doc": "The account to interact with",
            "example": "\"+12024561414\"",
            "required": true
          }
        },
        "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\"",
            "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\""
          },
          "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\"",
            "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": "\"+12024561414\"",
            "required": true
          },
          "groupID": {
            "type": "String",
            "example": "\"EdSqI90cS0UomDpgUXOlCoObWvQOXlH5G3Z2d3f4ayE=\"",
            "required": true
          },
          "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\"",
            "required": true
          },
          "name": {
            "type": "String",
            "doc": "New profile name. Set to empty string for no profile name",
            "example": "\"signald user\"",
            "required": true
          },
          "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\"",
            "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": "\"+12024561414\"",
            "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": "1612005072095",
            "required": true
          }
        }
      },
      "GetProfileRequest": {
        "fields": {
          "account": {
            "type": "String",
            "doc": "the signald account to use",
            "required": true
          },
          "async": {
            "type": "boolean",
            "doc": "return results from local store immediately, refreshing from server if needed. If false (default), block until all pending profiles have been retrieved."
          },
          "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"
          },
          "address": {
            "type": "JsonAddress",
            "version": "v1"
          },
          "capabilities": {
            "type": "Capabilities",
            "version": "v1"
          },
          "color": {
            "type": "String"
          },
          "profile_name": {
            "type": "String",
            "doc": "The user's Signal profile name"
          },
          "inbox_position": {
            "type": "Integer"
          },
          "expiration_time": {
            "type": "int"
          }
        },
        "doc": "Information about a Signal user"
      },
      "ListGroupsRequest": {
        "fields": {
          "account": {
            "type": "String",
            "required": true
          }
        }
      },
      "GroupList": {
        "fields": {
          "groups": {
            "list": true,
            "type": "JsonGroupV2Info",
            "version": "v1"
          },
          "legacyGroups": {
            "list": true,
            "type": "JsonGroupInfo",
            "version": "v1"
          }
        }
      },
      "ListContactsRequest": {
        "fields": {
          "account": {
            "type": "String",
            "required": true
          },
          "async": {
            "type": "boolean",
            "doc": "return results from local store immediately, refreshing from server if needed. If false (default), block until all pending profiles have been retrieved."
          }
        }
      },
      "ProfileList": {
        "fields": {
          "profiles": {
            "list": true,
            "type": "Profile",
            "version": "v1"
          }
        }
      },
      "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": "1612005072095"
          },
          "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": "1612005072095"
          },
          "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": "1612005072095"
          }
        }
      },
      "JsonGroupInfo": {
        "fields": {
          "groupId": {
            "type": "String"
          },
          "members": {
            "list": true,
            "type": "JsonAddress",
            "version": "v1"
          },
          "name": {
            "type": "String"
          },
          "type": {
            "type": "String"
          },
          "avatarId": {
            "type": "long"
          }
        }
      },
      "Capabilities": {
        "fields": {
          "gv2": {
            "type": "boolean"
          },
          "storage": {
            "type": "boolean"
          },
          "gv1-migration": {
            "type": "boolean"
          }
        }
      },
      "JsonSentTranscriptMessage": {
        "fields": {
          "destination": {
            "type": "JsonAddress",
            "version": "v1"
          },
          "timestamp": {
            "type": "long",
            "example": "1612005072095"
          },
          "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": "1612005072095"
          }
        }
      },
      "JsonViewOnceOpenMessage": {
        "fields": {
          "sender": {
            "type": "JsonAddress",
            "version": "v1"
          },
          "timestamp": {
            "type": "long",
            "example": "1612005072095"
          }
        }
      },
      "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\"",
            "required": true
          }
        },
        "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\"",
            "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",
        "deprecated": true
      },
      "JoinGroupRequest": {
        "fields": {
          "account": {
            "type": "String",
            "doc": "The account to interact with",
            "example": "\"+12024561414\"",
            "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.",
        "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\"",
            "required": true
          },
          "groupID": {
            "type": "String",
            "example": "\"EdSqI90cS0UomDpgUXOlCoObWvQOXlH5G3Z2d3f4ayE=\"",
            "required": true
          },
          "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\"",
            "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.",
        "deprecated": true
      },
      "ApproveMembershipRequest": {
        "fields": {
          "account": {
            "type": "String",
            "doc": "The account to interact with",
            "example": "\"+12024561414\"",
            "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",
        "deprecated": true
      },
      "GetGroupRequest": {
        "fields": {
          "account": {
            "type": "String",
            "doc": "The account to interact with",
            "example": "\"+12024561414\"",
            "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",
        "deprecated": true
      }
    },
    "v1alpha2": {
      "UpdateGroupRequest": {
        "fields": {
          "account": {
            "type": "String",
            "doc": "The identifier of the account to interact with",
            "example": "\"+12024561414\"",
            "required": true
          },
          "groupID": {
            "type": "String",
            "example": "\"EdSqI90cS0UomDpgUXOlCoObWvQOXlH5G3Z2d3f4ayE=\"",
            "required": true
          },
          "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"
      },
      "get_profile": {
        "request": "GetProfileRequest",
        "response": "Profile",
        "doc": "Get all information available about a user"
      },
      "list_groups": {
        "request": "ListGroupsRequest",
        "response": "GroupList"
      },
      "list_contacts": {
        "request": "ListContactsRequest",
        "response": "ProfileList"
      }
    },
    "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",
        "deprecated": true
      },
      "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
      }
    }
  }
}