diff --git a/gso/products/product_blocks/iptrunk.py b/gso/products/product_blocks/iptrunk.py
index bebe9c636546ad8803cad356be179d07aec3af95..b0fc2d28eb67bbcd3475238af0be0bf07fb319ef 100644
--- a/gso/products/product_blocks/iptrunk.py
+++ b/gso/products/product_blocks/iptrunk.py
@@ -1,3 +1,5 @@
+"""IP trunk product block that has all parameters of a subscription throughout its lifecycle."""
+
 import ipaddress
 from typing import Optional
 
@@ -9,13 +11,15 @@ from gso.products.product_blocks.device import DeviceBlock, DeviceBlockInactive,
 
 
 class IptrunkType(strEnum):
-    Dark_fiber = "Dark_fiber"
-    Leased = "Leased"
+    DARK_FIBER = "Dark_fiber"
+    LEASED = "Leased"
 
 
 class IptrunkBlockInactive(
     ProductBlockModel, lifecycle=[SubscriptionLifecycle.INITIAL], product_block_name="IptrunkBlock"
 ):
+    """A trunk that's currently inactive, see {class}`IptrunkBlock`."""
+
     geant_s_sid: Optional[str] = None
     iptrunk_description: Optional[str] = None
     iptrunk_type: Optional[IptrunkType] = None
@@ -39,6 +43,8 @@ class IptrunkBlockInactive(
 
 
 class IptrunkBlockProvisioning(IptrunkBlockInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING]):
+    """A trunk that's currently being provisioned, see {class}`IptrunkBlock`."""
+
     geant_s_sid: Optional[str] = None
     iptrunk_description: Optional[str] = None
     iptrunk_type: Optional[IptrunkType] = None
@@ -62,22 +68,39 @@ class IptrunkBlockProvisioning(IptrunkBlockInactive, lifecycle=[SubscriptionLife
 
 
 class IptrunkBlock(IptrunkBlockProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]):
+    """A trunk that's currently deployed in the network."""
+
     geant_s_sid: str
+    """GÉANT service ID associated with this trunk. """
     iptrunk_description: str
+    """A human-readable description of this trunk."""
     iptrunk_type: IptrunkType
-    iptrunk_speed: str
+    """The type of trunk, can be either dark fibre or leased capacity."""
+    iptrunk_speed: str  # FIXME: should be of PhyPortCapacity type
+    """The speed of the trunk, measured per interface associated with it."""
     iptrunk_minimum_links: int
+    """The minimum amount of links the trunk should consist of."""
     iptrunk_isis_metric: int
+    """The {term}`IS-IS` metric of this link"""
     iptrunk_ipv4_network: ipaddress.IPv4Network
+    """The IPv4 network used for this trunk."""
     iptrunk_ipv6_network: ipaddress.IPv6Network
+    """The IPv6 network used for this trunk."""
     #
     iptrunk_sideA_node: DeviceBlock
+    """The router that hosts the A side of the trunk."""
     iptrunk_sideA_ae_iface: str
+    """The name of the interface on which the trunk connects."""
     iptrunk_sideA_ae_geant_a_sid: str
+    """The service ID of the interface."""
     iptrunk_sideA_ae_members: list[str] = Field(default_factory=list)
+    """A list of interface members that make up the aggregated Ethernet interface."""
     iptrunk_sideA_ae_members_description: list[str] = Field(default_factory=list)
+    """The list of descriptions that describe the list of interface members."""
     #
     iptrunk_sideB_node: DeviceBlock
+    """The router that hosts the B side of the trunk. It possesses the same attributes as the A-side, including the
+    interfaces and its descriptions."""
     iptrunk_sideB_ae_iface: str
     iptrunk_sideB_ae_geant_a_sid: str
     iptrunk_sideB_ae_members: list[str] = Field(default_factory=list)