Index: frontend/src/api/discipline.js
===================================================================
--- frontend/src/api/discipline.js	(revision 4f85b41e4eaa6d668912791fb3cff6efbe7dc1a4)
+++ frontend/src/api/discipline.js	(revision 447c39f7111f1415e8f44660911d00bb61568780)
@@ -36,2 +36,53 @@
 }
 
+export async function getCustomTrackingCategories() {
+  const res = await api.get("/discipline/custom-tracking-categories");
+  return res?.data;
+}
+
+export async function createCustomTrackingCategory(payload) {
+  const res = await api.post("/discipline/custom-tracking-categories", payload);
+  return res?.data;
+}
+
+export async function getCustomCategoryTasks(customTrackingId) {
+  const res = await api.get(
+    `/discipline/custom-tracking-categories/${customTrackingId}/tasks`
+  );
+  return res?.data;
+}
+
+export async function createCustomCategoryTask(customTrackingId, payload) {
+  const res = await api.post(
+    `/discipline/custom-tracking-categories/${customTrackingId}/tasks`,
+    payload
+  );
+  return res?.data;
+}
+
+export async function updateCustomCategoryTask(customTrackingId, taskId, payload) {
+  const res = await api.put(
+    `/discipline/custom-tracking-categories/${customTrackingId}/tasks/${taskId}`,
+    payload
+  );
+  return res?.data;
+}
+
+export async function updateCustomCategoryTaskFinished(
+  customTrackingId,
+  taskId,
+  isFinished
+) {
+  const res = await api.patch(
+    `/discipline/custom-tracking-categories/${customTrackingId}/tasks/${taskId}/finished`,
+    { isFinished }
+  );
+  return res?.data;
+}
+
+export async function deleteCustomCategoryTask(customTrackingId, taskId) {
+  return api.delete(
+    `/discipline/custom-tracking-categories/${customTrackingId}/tasks/${taskId}`
+  );
+}
+
