diff --git a/src/presentation/DigitalData.TaskFlow.API/Contracts/Workflows/CloseWorkflowRequest.cs b/src/presentation/DigitalData.TaskFlow.API/Contracts/Workflows/CloseWorkflowRequest.cs
new file mode 100644
index 0000000..59ea71d
--- /dev/null
+++ b/src/presentation/DigitalData.TaskFlow.API/Contracts/Workflows/CloseWorkflowRequest.cs
@@ -0,0 +1,22 @@
+namespace DigitalData.TaskFlow.API.Contracts.Workflows;
+
+///
+/// Represents the request payload for closing a workflow.
+///
+public sealed class CloseWorkflowRequest
+{
+ ///
+ /// Gets or sets the selected closing method identifier.
+ ///
+ public required int ClosingMethodId { get; init; }
+
+ ///
+ /// Gets or sets an optional user comment.
+ ///
+ public string? Comment { get; init; }
+
+ ///
+ /// Gets or sets an optional rejection reason identifier.
+ ///
+ public int? RejectionReasonId { get; init; }
+}
diff --git a/src/presentation/DigitalData.TaskFlow.API/Controllers/DocumentsController.cs b/src/presentation/DigitalData.TaskFlow.API/Controllers/DocumentsController.cs
new file mode 100644
index 0000000..df545bb
--- /dev/null
+++ b/src/presentation/DigitalData.TaskFlow.API/Controllers/DocumentsController.cs
@@ -0,0 +1,38 @@
+using DigitalData.TaskFlow.Application.Features.Documents.Queries.GetDocument;
+using DigitalData.TaskFlow.Domain.Common;
+using DigitalData.TaskFlow.Domain.Documents;
+using MediatR;
+using Microsoft.AspNetCore.Mvc;
+
+namespace DigitalData.TaskFlow.API.Controllers;
+
+///
+/// Provides document binary download endpoints.
+///
+[ApiController]
+[Route("api/documents")]
+public sealed class DocumentsController(ISender sender) : ControllerBase
+{
+ ///
+ /// Returns binary document content by document identifier.
+ ///
+ /// Document identifier.
+ /// Cancellation token.
+ /// Binary stream when available.
+ [HttpGet("{id}")]
+ [ProducesResponseType(typeof(FileContentResult), StatusCodes.Status200OK)]
+ [ProducesResponseType(typeof(ApiEnvelope