diff --git a/bindings/python/gpiod/chip.py b/bindings/python/gpiod/chip.py
index 52d0757..da93370 100644
--- a/bindings/python/gpiod/chip.py
+++ b/bindings/python/gpiod/chip.py
@@ -17,6 +17,8 @@ from errno import ENOENT
 from select import select
 from typing import Union, Optional
 
+__all__ = "Chip"
+
 
 class Chip:
     """
diff --git a/bindings/python/gpiod/chip_info.py b/bindings/python/gpiod/chip_info.py
index a506b55..92b5e6f 100644
--- a/bindings/python/gpiod/chip_info.py
+++ b/bindings/python/gpiod/chip_info.py
@@ -4,6 +4,8 @@
 
 from dataclasses import dataclass
 
+__all__ = "ChipInfo"
+
 
 @dataclass(frozen=True, repr=False)
 class ChipInfo:
diff --git a/bindings/python/gpiod/edge_event.py b/bindings/python/gpiod/edge_event.py
index 88f8e9b..bf258c1 100644
--- a/bindings/python/gpiod/edge_event.py
+++ b/bindings/python/gpiod/edge_event.py
@@ -5,6 +5,8 @@ from . import _ext
 from dataclasses import dataclass
 from enum import Enum
 
+__all__ = "EdgeEvent"
+
 
 @dataclass(frozen=True, init=False, repr=False)
 class EdgeEvent:
diff --git a/bindings/python/gpiod/exception.py b/bindings/python/gpiod/exception.py
index 07ffaa6..f9a83c2 100644
--- a/bindings/python/gpiod/exception.py
+++ b/bindings/python/gpiod/exception.py
@@ -1,6 +1,8 @@
 # SPDX-License-Identifier: LGPL-2.1-or-later
 # SPDX-FileCopyrightText: 2022 Bartosz Golaszewski <brgl@bgdev.pl>
 
+__all__ = ["ChipClosedError", "RequestReleasedError"]
+
 
 class ChipClosedError(Exception):
     """
diff --git a/bindings/python/gpiod/ext/module.c b/bindings/python/gpiod/ext/module.c
index 101d756..25c252a 100644
--- a/bindings/python/gpiod/ext/module.c
+++ b/bindings/python/gpiod/ext/module.c
@@ -157,8 +157,8 @@ static PyTypeObject *types[] = {
 PyMODINIT_FUNC PyInit__ext(void)
 {
 	const struct module_const *modconst;
+	PyObject *module, *all;
 	PyTypeObject **type;
-	PyObject *module;
 	int ret;
 
 	module = PyModule_Create(&module_def);
@@ -172,6 +172,19 @@ PyMODINIT_FUNC PyInit__ext(void)
 		return NULL;
 	}
 
+	all = PyList_New(0);
+	if (!all) {
+		Py_DECREF(module);
+		return NULL;
+	}
+
+	ret = PyModule_AddObjectRef(module, "__all__", all);
+	Py_DECREF(all);
+	if (ret) {
+		Py_DECREF(module);
+		return NULL;
+	}
+
 	for (type = types; *type; type++) {
 		ret = PyModule_AddType(module, *type);
 		if (ret) {
diff --git a/bindings/python/gpiod/info_event.py b/bindings/python/gpiod/info_event.py
index 78b1459..481eae6 100644
--- a/bindings/python/gpiod/info_event.py
+++ b/bindings/python/gpiod/info_event.py
@@ -6,6 +6,8 @@ from .line_info import LineInfo
 from dataclasses import dataclass
 from enum import Enum
 
+__all__ = "InfoEvent"
+
 
 @dataclass(frozen=True, init=False, repr=False)
 class InfoEvent:
diff --git a/bindings/python/gpiod/internal.py b/bindings/python/gpiod/internal.py
index 7b4598c..2dddb65 100644
--- a/bindings/python/gpiod/internal.py
+++ b/bindings/python/gpiod/internal.py
@@ -5,6 +5,8 @@ from datetime import timedelta
 from select import select
 from typing import Optional, Union
 
+__all__ = []
+
 
 def poll_fd(fd: int, timeout: Optional[Union[timedelta, float]] = None) -> bool:
     if isinstance(timeout, timedelta):
diff --git a/bindings/python/gpiod/line.py b/bindings/python/gpiod/line.py
index c5d5ddf..1cc512f 100644
--- a/bindings/python/gpiod/line.py
+++ b/bindings/python/gpiod/line.py
@@ -5,6 +5,8 @@
 from . import _ext
 from enum import Enum
 
+__all__ = ["Value", "Direction", "Bias", "Drive", "Edge", "Clock"]
+
 
 class Value(Enum):
     """Logical line states."""
diff --git a/bindings/python/gpiod/line_info.py b/bindings/python/gpiod/line_info.py
index 9a6c9bf..c196a6a 100644
--- a/bindings/python/gpiod/line_info.py
+++ b/bindings/python/gpiod/line_info.py
@@ -6,6 +6,8 @@ from dataclasses import dataclass
 from datetime import timedelta
 from gpiod.line import Direction, Bias, Drive, Edge, Clock
 
+__all__ = "LineInfo"
+
 
 @dataclass(frozen=True, init=False, repr=False)
 class LineInfo:
diff --git a/bindings/python/gpiod/line_request.py b/bindings/python/gpiod/line_request.py
index 090467c..096bf18 100644
--- a/bindings/python/gpiod/line_request.py
+++ b/bindings/python/gpiod/line_request.py
@@ -11,6 +11,8 @@ from collections.abc import Iterable
 from datetime import timedelta
 from typing import Optional, Union
 
+__all__ = "LineRequest"
+
 
 class LineRequest:
     """
diff --git a/bindings/python/gpiod/line_settings.py b/bindings/python/gpiod/line_settings.py
index e02e932..458fd81 100644
--- a/bindings/python/gpiod/line_settings.py
+++ b/bindings/python/gpiod/line_settings.py
@@ -6,6 +6,8 @@ from dataclasses import dataclass
 from datetime import timedelta
 from gpiod.line import Direction, Bias, Drive, Edge, Clock, Value
 
+__all__ = "LineSettings"
+
 
 @dataclass(repr=False)
 class LineSettings:
