diff --git a/include/olm/outbound_group_session.h b/include/olm/outbound_group_session.h
index 27991acb844fd6edb5c2a9df7c71833cd096f112..90859e9ef7889da9a45d861e0d1c1f3066068668 100644
--- a/include/olm/outbound_group_session.h
+++ b/include/olm/outbound_group_session.h
@@ -90,7 +90,7 @@ size_t olm_init_outbound_group_session_random_length(
 );
 
 /**
- * Start a new outbound group session. Returns std::size_t(-1) on failure. On
+ * Start a new outbound group session. Returns olm_error() on failure. On
  * failure last_error will be set with an error code. The last_error will be
  * NOT_ENOUGH_RANDOM if the number of random bytes was too small.
  */
@@ -109,7 +109,7 @@ size_t olm_group_encrypt_message_length(
 
 /**
  * Encrypt some plain-text. Returns the length of the encrypted message or
- * std::size_t(-1) on failure. On failure last_error will be set with an
+ * olm_error() on failure. On failure last_error will be set with an
  * error code. The last_error will be OUTPUT_BUFFER_TOO_SMALL if the output
  * buffer is too small.
  */
@@ -119,6 +119,61 @@ size_t olm_group_encrypt(
     uint8_t * message, size_t message_length
 );
 
+
+/**
+ * Get the number of bytes returned by olm_outbound_group_session_id()
+ */
+size_t olm_outbound_group_session_id_length(
+    const OlmOutboundGroupSession *session
+);
+
+/**
+ * Get a base64-encoded identifier for this session.
+ *
+ * Returns the length of the session id on success or olm_error() on
+ * failure. On failure last_error will be set with an error code. The
+ * last_error will be OUTPUT_BUFFER_TOO_SMALL if the id buffer was too
+ * small.
+ */
+size_t olm_outbound_group_session_id(
+    OlmOutboundGroupSession *session,
+    uint8_t * id, size_t id_length
+);
+
+/**
+ * Get the current message index for this session.
+ *
+ * Each message is sent with an increasing index; this returns the index for
+ * the next message.
+ */
+uint32_t olm_outbound_group_session_message_index(
+    OlmOutboundGroupSession *session
+);
+
+/**
+ * Get the number of bytes returned by olm_outbound_group_session_key()
+ */
+size_t olm_outbound_group_session_key_length(
+    const OlmOutboundGroupSession *session
+);
+
+/**
+ * Get the base64-encoded current ratchet key for this session.
+ *
+ * Each message is sent with a diffent ratchet key. This function returns the
+ * ratchet key that will be used for the next message.
+ *
+ * Returns the length of the ratchet key on success or olm_error() on
+ * failure. On failure last_error will be set with an error code. The
+ * last_error will be OUTPUT_BUFFER_TOO_SMALL if the buffer was too small.
+ */
+size_t olm_outbound_group_session_key(
+    OlmOutboundGroupSession *session,
+    uint8_t * key, size_t key_length
+);
+
+
+
 #ifdef __cplusplus
 } // extern "C"
 #endif
diff --git a/python/olm/outbound_group_session.py b/python/olm/outbound_group_session.py
index 61826476a1715ef213f18a7dff9b9b13623502ab..56f0962b8fb2c871a86ed54cda07dc4f94d89239 100644
--- a/python/olm/outbound_group_session.py
+++ b/python/olm/outbound_group_session.py
@@ -34,12 +34,21 @@ outbound_group_session_function(
 
 outbound_group_session_function(lib.olm_init_outbound_group_session_random_length)
 outbound_group_session_function(lib.olm_init_outbound_group_session, c_void_p, c_size_t)
+
+lib.olm_outbound_group_session_message_index.argtypes = [c_void_p]
+lib.olm_outbound_group_session_message_index.restype = c_uint32
+
 outbound_group_session_function(lib.olm_group_encrypt_message_length, c_size_t)
 outbound_group_session_function(lib.olm_group_encrypt,
     c_void_p, c_size_t,  # Plaintext
     c_void_p, c_size_t,  # Message
 )
 
+outbound_group_session_function(lib.olm_outbound_group_session_id_length)
+outbound_group_session_function(lib.olm_outbound_group_session_id, c_void_p, c_size_t)
+outbound_group_session_function(lib.olm_outbound_group_session_key_length)
+outbound_group_session_function(lib.olm_outbound_group_session_key, c_void_p, c_size_t)
+
 
 class OutboundGroupSession(object):
     def __init__(self):
@@ -81,3 +90,18 @@ class OutboundGroupSession(object):
             message_buffer, message_length,
         )
         return message_buffer.raw
+
+    def session_id(self):
+        id_length = lib.olm_outbound_group_session_id_length(self.ptr)
+        id_buffer = create_string_buffer(id_length)
+        lib.olm_outbound_group_session_id(self.ptr, id_buffer, id_length);
+        return id_buffer.raw
+
+    def message_index(self):
+        return lib.olm_outbound_group_session_message_index(self.ptr)
+
+    def session_key(self):
+        key_length = lib.olm_outbound_group_session_key_length(self.ptr)
+        key_buffer = create_string_buffer(key_length)
+        lib.olm_outbound_group_session_key(self.ptr, key_buffer, key_length);
+        return key_buffer.raw
diff --git a/src/outbound_group_session.c b/src/outbound_group_session.c
index 8dc1cd1a400d69f5bc7fa8aba33340578aa12d06..fadf949831c7d044a5ee77485014684c58663812 100644
--- a/src/outbound_group_session.c
+++ b/src/outbound_group_session.c
@@ -254,7 +254,52 @@ size_t olm_group_encrypt(
     megolm_advance(&(session->ratchet));
 
     return _olm_encode_base64(
-        message_pos, rawmsglen,
-        message
+        message_pos, rawmsglen, message
+    );
+}
+
+
+size_t olm_outbound_group_session_id_length(
+    const OlmOutboundGroupSession *session
+) {
+    return _olm_encode_base64_length(GROUP_SESSION_ID_LENGTH);
+}
+
+size_t olm_outbound_group_session_id(
+    OlmOutboundGroupSession *session,
+    uint8_t * id, size_t id_length
+) {
+    if (id_length < olm_outbound_group_session_id_length(session)) {
+        session->last_error = OLM_OUTPUT_BUFFER_TOO_SMALL;
+        return (size_t)-1;
+    }
+
+    return _olm_encode_base64(session->session_id, GROUP_SESSION_ID_LENGTH, id);
+}
+
+uint32_t olm_outbound_group_session_message_index(
+    OlmOutboundGroupSession *session
+) {
+    return session->ratchet.counter;
+}
+
+size_t olm_outbound_group_session_key_length(
+    const OlmOutboundGroupSession *session
+) {
+    return _olm_encode_base64_length(MEGOLM_RATCHET_LENGTH);
+}
+
+size_t olm_outbound_group_session_key(
+    OlmOutboundGroupSession *session,
+    uint8_t * key, size_t key_length
+) {
+    if (key_length < olm_outbound_group_session_key_length(session)) {
+        session->last_error = OLM_OUTPUT_BUFFER_TOO_SMALL;
+        return (size_t)-1;
+    }
+
+    return _olm_encode_base64(
+        megolm_get_data(&session->ratchet),
+        MEGOLM_RATCHET_LENGTH, key
     );
 }