diff --git a/src/app.module.ts b/src/app.module.ts
index 3dda3d684407ec0e5e6c34fe780296e3547db427..9af4b689a1bb2bcf76a18cbf19058e815ebd6c58 100644
--- a/src/app.module.ts
+++ b/src/app.module.ts
@@ -29,6 +29,7 @@ import { BimbinganModule } from "./bimbingan/bimbingan.module";
 import { Konfigurasi } from "./entities/konfigurasi.entity";
 import { KonfigurasiModule } from "./konfigurasi/konfigurasi.module";
 import { DosenBimbinganModule } from "./dosen-bimbingan/dosen-bimbingan.module";
+import { ApprovalModule } from "./approval/approval.module";
 
 @Module({
   imports: [
@@ -71,6 +72,7 @@ import { DosenBimbinganModule } from "./dosen-bimbingan/dosen-bimbingan.module";
     BimbinganModule,
     KonfigurasiModule,
     DosenBimbinganModule,
+    ApprovalModule,
   ],
   controllers: [AppController],
   providers: [AppService],
diff --git a/src/approval/approval.controller.ts b/src/approval/approval.controller.ts
new file mode 100644
index 0000000000000000000000000000000000000000..6aa201fe7f7469bee763b9eef19236dd9bdcb2d4
--- /dev/null
+++ b/src/approval/approval.controller.ts
@@ -0,0 +1,31 @@
+import { Controller, Patch, Param, UseGuards } from "@nestjs/common";
+import { ApprovalService } from "./approval.service";
+import { RegStatus } from "src/entities/pendaftaranTesis.entity";
+import { CustomAuthGuard } from "src/middlewares/custom-auth.guard";
+import { RolesGuard } from "src/middlewares/roles.guard";
+import { RoleEnum } from "src/entities/pengguna.entity";
+import { Roles } from "src/middlewares/roles.decorator";
+
+@Controller("approval")
+@UseGuards(CustomAuthGuard, RolesGuard)
+export class ApprovalController {
+  constructor(private readonly approvalService: ApprovalService) {}
+
+  @Roles(RoleEnum.S2_PEMBIMBING)
+  @Patch(":id/approve")
+  async approvePendaftaran(@Param("id") id: string) {
+    return this.approvalService.approvePendaftaran(id, RegStatus.APPROVED);
+  }
+
+  @Roles(RoleEnum.S2_PEMBIMBING)
+  @Patch(":id/reject")
+  async declinePendaftaran(@Param("id") id: string) {
+    return this.approvalService.approvePendaftaran(id, RegStatus.REJECTED);
+  }
+
+  @Roles(RoleEnum.S2_PEMBIMBING)
+  @Patch(":id/interview")
+  async interviewPendaftaran(@Param("id") id: string) {
+    return this.approvalService.approvePendaftaran(id, RegStatus.INTERVIEW);
+  }
+}
diff --git a/src/approval/approval.module.ts b/src/approval/approval.module.ts
new file mode 100644
index 0000000000000000000000000000000000000000..c28790252c59277b51e473a33ab7d8b38ae32065
--- /dev/null
+++ b/src/approval/approval.module.ts
@@ -0,0 +1,12 @@
+import { Module } from "@nestjs/common";
+import { TypeOrmModule } from "@nestjs/typeorm";
+import { PendaftaranTesis } from "src/entities/pendaftaranTesis.entity";
+import { ApprovalController } from "./approval.controller";
+import { ApprovalService } from "./approval.service";
+
+@Module({
+  imports: [TypeOrmModule.forFeature([PendaftaranTesis])],
+  controllers: [ApprovalController],
+  providers: [ApprovalService],
+})
+export class ApprovalModule {}
diff --git a/src/approval/approval.service.ts b/src/approval/approval.service.ts
new file mode 100644
index 0000000000000000000000000000000000000000..8163efeda7b43052e82b6a5441b5590f384f1b6a
--- /dev/null
+++ b/src/approval/approval.service.ts
@@ -0,0 +1,33 @@
+import { Injectable } from "@nestjs/common";
+import { InjectRepository } from "@nestjs/typeorm";
+import { FindOneOptions, Repository } from "typeorm";
+import {
+  PendaftaranTesis,
+  RegStatus,
+} from "src/entities/pendaftaranTesis.entity";
+
+@Injectable()
+export class ApprovalService {
+  constructor(
+    @InjectRepository(PendaftaranTesis)
+    private readonly pendaftaranRepository: Repository<PendaftaranTesis>,
+  ) {}
+
+  async approvePendaftaran(
+    id: string,
+    status: RegStatus,
+  ): Promise<PendaftaranTesis> {
+    try {
+      const findOneOptions: FindOneOptions<PendaftaranTesis> = {
+        where: { id },
+      };
+      const pendaftaran =
+        await this.pendaftaranRepository.findOneOrFail(findOneOptions);
+      pendaftaran.status = status;
+
+      return await this.pendaftaranRepository.save(pendaftaran);
+    } catch (error) {
+      throw new Error("Pendaftaran not found");
+    }
+  }
+}