----------------------------------------- Description of the jsonevtloop and schema ----------------------------------------- Purpose: JSON-based asynchronous API for signal-cli. This mode is not intended to be used directly from the command line, but to provide an easy use API for other scripting languages. signal-cli listens for JSON requests on stdin. Each JSON request must be a single valid JSON object (enclosed in {}), followed by LF. The JSON text itself hence must not contain linefeeds (only escaped as \n and no pretty printing enabled). When incoming messages are received from the signal back-end, they are in turned JSON encoded and sent out on stdout. Any error messages or debug information is sent out on stderr as expected. JSON Schema Version 2 JSON Requests are read from STDIN in "jsonevtloop" mode and the Reponses are sent to STDOUT in "jsonevtloop" mode Generic Request attributes valid for ALL requests { "reqType": "", // MANDATORY: Name of request type "reqID": // Optional: reqID that will be present in the // response message for async callers to use as transaction id // (note: for brevity omitted in the examples below) } Generic Response attributes valid for ALL responses { "respType": "", // Name of response type "apiVer": 2, // API Version 2 "reqID": , // Request Identifier as present in the request object "status": "", // Whether the request was a success of failure "message": "" // In case of status="error", this contains any error message } Send Message Request (direct message to another person) { "reqType": "send_message", "recipientNumber": "", "messageBody": "", "attachments": [ "", ... ] } Message Envelope Received, sent to group chat with some attachements present { "apiVer": 2, "respType": "envelope", "reqID": null, "status": "ok", "envelope": { "source": "+46123456", "sourceDevice": 1, "relay": null, "timestamp": 1581272926239, "isReceipt": false, "dataMessage": { "timestamp": 1581272926239, "message": "😋😋😋", "expiresInSeconds": 0, "attachments": [ { "contentType": "image/jpeg", "filename": "signal-2020-02-09-122846.jpeg", "id": "8983570171695764643", "size": 569218 }, { "contentType": "image/jpeg", "filename": "signal-2020-02-09-122846.jpeg", "id": "4282268489503632431", "size": 629080 }, { "contentType": "image/jpeg", "filename": "signal-2020-02-09-122846.jpeg", "id": "1780607521773749056", "size": 595515 }, { "contentType": "image/jpeg", "filename": "signal-2020-02-09-122846.jpeg", "id": "119656560176959856", "size": 311650 } ], "groupInfo": { "groupId": "FRasdb6mSVwHwetHSX8mkjQ==", "members": null, "name": null, "type": "DELIVER" } }, "syncMessage": null, "callMessage": null, "receiptMessage": null } } Alive Request Test if signal-cli is still responding { "reqType": "alive" } Alive Response { "respType": "alive" } Exit Request Request immediate termination of signal-cli client { "reqType": "exit" } Exit Response to an exit request Indicated the exit was due to an exit request as opposed to an error { "respType": "exit", "status": "ok" } Exit Response due to an unrecoverable error { "respType": "exit", "status": "error", "message": "" } Generic Error Response { "respType": "error", "status": "error", "message": "" }