diff --git a/changelogs/unreleased/gh-7895-export-session-id-to-c-api.md b/changelogs/unreleased/gh-7895-export-session-id-to-c-api.md
new file mode 100644
index 0000000000000000000000000000000000000000..812bce32ac9c3eaebdafc4b38d1c0a26a4c9a155
--- /dev/null
+++ b/changelogs/unreleased/gh-7895-export-session-id-to-c-api.md
@@ -0,0 +1,3 @@
+## feature/box
+
+* Exported current session's identifier to C API via `box_session_id` (gh-7895).
diff --git a/extra/exports b/extra/exports
index 6aa5b3c87d9e9488ce59f606f0afd7eba1e8a5cc..ad930e0cde77bfd1a62c3b6b7a4924bb4c07a582 100644
--- a/extra/exports
+++ b/extra/exports
@@ -104,6 +104,7 @@ box_sequence_current
 box_sequence_next
 box_sequence_reset
 box_sequence_set
+box_session_id
 box_session_push
 box_space_id_by_name
 box_truncate
diff --git a/src/box/box.cc b/src/box/box.cc
index 59c2c98b872faab83d1f44264810b63486206152..fbeb0f68db2eadbb7d2ae04fe312f48e6231a36b 100644
--- a/src/box/box.cc
+++ b/src/box/box.cc
@@ -3201,6 +3201,12 @@ box_session_push(const char *data, const char *data_end)
 	return rc;
 }
 
+API_EXPORT uint64_t
+box_session_id(void)
+{
+	return current_session()->id;
+}
+
 static inline void
 box_register_replica(uint32_t id, const struct tt_uuid *uuid)
 {
diff --git a/src/box/box.h b/src/box/box.h
index 33851c8a89e3d24ecabcf46a718695bb3d06e33d..637b7adb072e09012740c747994ce041989df623 100644
--- a/src/box/box.h
+++ b/src/box/box.h
@@ -599,6 +599,12 @@ box_sequence_reset(uint32_t seq_id);
 API_EXPORT int
 box_session_push(const char *data, const char *data_end);
 
+/**
+ * \return current session's unique monotonic identifier (\sa box.session.id)
+ */
+API_EXPORT uint64_t
+box_session_id(void);
+
 /** \endcond public */
 
 /**
diff --git a/src/box/lua/session.c b/src/box/lua/session.c
index b6c77205f7f5c46eca35abd529b7e561f5de725b..23581ef3281d8947bb2bd4bd63dd17e19702f5f7 100644
--- a/src/box/lua/session.c
+++ b/src/box/lua/session.c
@@ -73,17 +73,12 @@ lbox_session_create(struct lua_State *L)
 }
 
 /**
- * Return a unique monotonic session
- * identifier. The identifier can be used
- * to check whether or not a session is alive.
- * 0 means there is no session (e.g.
- * a procedure is running in a detached
- * fiber).
+ * Lua wrapper for `box_session_id`.
  */
 static int
 lbox_session_id(struct lua_State *L)
 {
-	lua_pushnumber(L, current_session()->id);
+	luaL_pushuint64(L, box_session_id());
 	return 1;
 }
 
diff --git a/test/app-tap/module_api.c b/test/app-tap/module_api.c
index d6933095ed5cdb9f71b50c439ad9ce918c419e84..1784efed9b4c2af2e6139a429d5c8b392c9f339d 100644
--- a/test/app-tap/module_api.c
+++ b/test/app-tap/module_api.c
@@ -2994,6 +2994,19 @@ test_box_schema_version(struct lua_State *L)
 
 /* }}} Helpers for schema version Lua/C API test cases */
 
+/* {{{ Helpers for current session identifier Lua/C API test cases */
+
+static int
+test_box_session_id(struct lua_State *L)
+{
+	fail_unless(lua_gettop(L) == 1);
+	fail_unless(lua_isnumber(L, 1));
+	lua_pushboolean(L, luaL_touint64(L, 1) == box_session_id());
+	return 1;
+}
+
+/* }}} Helpers for current session identifier Lua/C API test cases */
+
 LUA_API int
 luaopen_module_api(lua_State *L)
 {
@@ -3045,6 +3058,7 @@ luaopen_module_api(lua_State *L)
 		{"isdecimal", test_isdecimal},
 		{"isdecimal_ptr", test_isdecimal_ptr},
 		{"box_schema_version_matches", test_box_schema_version},
+		{"box_session_id_matches", test_box_session_id},
 		{NULL, NULL}
 	};
 	luaL_register(L, "module_api", lib);
diff --git a/test/app-tap/module_api.test.lua b/test/app-tap/module_api.test.lua
index 6277d86b61c5686b8f3737c2d4335ca8979b75b0..2831a8b3d49859906b1ab7da90e07ba6c2837158 100755
--- a/test/app-tap/module_api.test.lua
+++ b/test/app-tap/module_api.test.lua
@@ -488,8 +488,16 @@ local function test_box_schema_version_matches(test, module)
     s:drop()
 end
 
+local function test_box_session_id_matches(test, module)
+    test:plan(1)
+
+    test:ok(module.box_session_id_matches(box.session.id()),
+            'verify that Lua/C current session identifier APIs return the ' ..
+            'same value')
+end
+
 require('tap').test("module_api", function(test)
-    test:plan(44)
+    test:plan(45)
     local status, module = pcall(require, 'module_api')
     test:is(status, true, "module")
     test:ok(status, "module is loaded")
@@ -522,6 +530,7 @@ require('tap').test("module_api", function(test)
     test:test("pushdecimal", test_pushdecimal, module)
     test:test("isdecimal", test_isdecimal, module)
     test:test("box_schema_version_matches", test_box_schema_version_matches, module)
+    test:test("box_session_id_matches", test_box_session_id_matches, module)
 
     space:drop()
 end)