openapi: 3.0.3 info: title: 'SaleSync API Documentation' description: '' version: 1.0.0 servers: - url: 'https://api.salesync.id' tags: - name: Absensi description: '' - name: 'Auth User' description: '' - name: Basic description: '' - name: Endpoints description: '' - name: Home description: '' - name: Konfigurasi description: '' - name: Outlet description: '' - name: Performance description: '' - name: Pesanan description: '' - name: Plan description: '' - name: Product description: '' - name: Public description: '' - name: Stok description: '' - name: Subscription description: '' - name: Tugas description: '' - name: User description: '' - name: Visit description: '' paths: /api/absensi/create: post: summary: Create operationId: create description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: status: true message: 'Check in berhasil' data: { } properties: status: type: boolean example: true message: type: string example: 'Check in berhasil' data: type: object properties: { } tags: - Absensi requestBody: required: true content: multipart/form-data: schema: type: object properties: latitude: type: string description: Latitude example: architecto longitude: type: string description: Longitude example: architecto note: type: string description: Note example: architecto image_path: type: string format: binary description: 'Bukti foto (max: 2MB, mimes: jpeg,png,jpg)' required: - latitude - longitude - note - image_path security: [] /api/absensi/history: post: summary: 'Riwayat Absensi' operationId: riwayatAbsensi description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: status: true message: 'Data riwayat absensi berhasil didapatkan' data: { } properties: status: type: boolean example: true message: type: string example: 'Data riwayat absensi berhasil didapatkan' data: type: object properties: { } tags: - Absensi security: [] /api/auth/signup: post: summary: Register operationId: register description: '' parameters: [] responses: 200: description: '' content: text/plain: schema: type: string example: "{\n\"status\": true,\n\"message\": \"Register berhasil, silahkan cek email untuk aktivasi akun!\",\n\"data\": {\n\"name\": \"Ferryanto\",\n\"email\": \"ferryanto@salesync.id\",\n\"updated_at\": \"2025-05-13T07:03:27.000000Z\",\n\"created_at\": \"2025-05-13T07:03:27.000000Z\",\n}\n}" tags: - 'Auth User' requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'Name Lengkap pengguna.' example: Ferryanto password: type: string description: 'Password pengguna.' example: '12345678' phone: type: phone description: 'Phone pengguna.' example: '081**********' email: type: string description: 'Email yang digunakan untuk login.' example: sales2@salesync.id required: - name - password - phone - email security: [] /api/auth/login: post: summary: Login operationId: login description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: status: true message: 'Login berhasil' data: access_token: 3|TRPogkc1j9nkIAq84wglKFIzPnfX7zRmQgzCoRjB27862b47 token_type: Bearer user: uuid: b619b640-d77d-46e3-a67a-f6ab06afe4ae name: Ferryanto email: ferryanto@salesync.id phone: null active: true email_verified_at: '2025-05-13T07:03:27.000000Z' bearer_token: null created_at: '2025-05-13T07:03:27.000000Z' updated_at: '2025-05-13T07:03:27.000000Z' deleted_at: null properties: status: type: boolean example: true message: type: string example: 'Login berhasil' data: type: object properties: access_token: type: string example: 3|TRPogkc1j9nkIAq84wglKFIzPnfX7zRmQgzCoRjB27862b47 token_type: type: string example: Bearer user: type: object properties: uuid: type: string example: b619b640-d77d-46e3-a67a-f6ab06afe4ae name: type: string example: Ferryanto email: type: string example: ferryanto@salesync.id phone: type: string example: null nullable: true active: type: boolean example: true email_verified_at: type: string example: '2025-05-13T07:03:27.000000Z' bearer_token: type: string example: null nullable: true created_at: type: string example: '2025-05-13T07:03:27.000000Z' updated_at: type: string example: '2025-05-13T07:03:27.000000Z' deleted_at: type: string example: null nullable: true tags: - 'Auth User' requestBody: required: true content: application/json: schema: type: object properties: email: type: string description: 'Email User.' example: sales2@salesync.id password: type: string description: 'Password User.' example: '12345678' user_type: type: string description: 'optional Tipe user: sales atau customer.' example: sales nullable: true fcm_id: type: string description: 'optional FCM ID untuk user sales.' example: architecto nullable: true required: - email - password security: [] /api/auth/validasiotp: post: summary: 'Validasi OTP Login' operationId: validasiOTPLogin description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: status: true message: 'Terima kasih, validasi berhasil' data: uuid: b619b640-d77d-46e3-a67a-f6ab06afe4ae name: Ferryanto email: ferryanto@salesync.id phone: null active: false email_verified_at: null bearer_token: null created_at: '2025-05-13T07:03:27.000000Z' updated_at: '2025-05-13T07:03:27.000000Z' deleted_at: null properties: status: type: boolean example: true message: type: string example: 'Terima kasih, validasi berhasil' data: type: object properties: uuid: type: string example: b619b640-d77d-46e3-a67a-f6ab06afe4ae name: type: string example: Ferryanto email: type: string example: ferryanto@salesync.id phone: type: string example: null nullable: true active: type: boolean example: false email_verified_at: type: string example: null nullable: true bearer_token: type: string example: null nullable: true created_at: type: string example: '2025-05-13T07:03:27.000000Z' updated_at: type: string example: '2025-05-13T07:03:27.000000Z' deleted_at: type: string example: null nullable: true tags: - 'Auth User' requestBody: required: true content: application/json: schema: type: object properties: otp: type: numeric description: 'Kode Validasi (4 Digit).' example: '1234' required: - otp security: [] /api/auth/resend/otp: post: summary: 'Resent OTP Login' operationId: resentOTPLogin description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: status: true message: 'Terima kasih, kode validasi berhasil terikirim' data: 1234 properties: status: type: boolean example: true message: type: string example: 'Terima kasih, kode validasi berhasil terikirim' data: type: integer example: 1234 tags: - 'Auth User' security: [] /api/auth/forgot: post: summary: 'Request Reset Password OTP' operationId: requestResetPasswordOTP description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: status: true message: 'Terima kasih, kode OTP berhasil dikirim' data: 1234 properties: status: type: boolean example: true message: type: string example: 'Terima kasih, kode OTP berhasil dikirim' data: type: integer example: 1234 tags: - 'Auth User' requestBody: required: true content: application/json: schema: type: object properties: email: type: string description: 'Email yang digunakan untuk login.' example: ferryanto@salesync.id required: - email security: [] /api/auth/validasiforgot: post: summary: 'Validasi Reset Password OTP' operationId: validasiResetPasswordOTP description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: status: true message: 'Kode OTP Valid. Silahkan login dengan password baru anda' data: otp: 1234 created_at: '2025-05-13T12:15:56.000000Z' properties: status: type: boolean example: true message: type: string example: 'Kode OTP Valid. Silahkan login dengan password baru anda' data: type: object properties: otp: type: integer example: 1234 created_at: type: string example: '2025-05-13T12:15:56.000000Z' tags: - 'Auth User' requestBody: required: true content: application/json: schema: type: object properties: otp: type: numeric description: 'Kode Validasi (4 Digit).' example: '1234' email: type: string description: 'Email yang digunakan pengguna.' example: ferryanto@salesync.id required: - otp - email security: [] /api/auth/newpassword: post: summary: 'Update Password' operationId: updatePassword description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: status: true message: 'Terima kasih, password berhasil diganti' data: otp: 1234 created_at: '2025-05-13T12:15:56.000000Z' properties: status: type: boolean example: true message: type: string example: 'Terima kasih, password berhasil diganti' data: type: object properties: otp: type: integer example: 1234 created_at: type: string example: '2025-05-13T12:15:56.000000Z' tags: - 'Auth User' requestBody: required: true content: application/json: schema: type: object properties: password: type: password description: 'Password baru pengguna.' example: '*********' cpassword: type: password description: 'Ulangi Password baru pengguna.' example: '*********' required: - password - cpassword security: [] /api/auth/logout: post: summary: Logout operationId: logout description: '' parameters: [] responses: 200: description: '' content: text/plain: schema: type: string example: "{\n \"id\": 1,\n}" tags: - 'Auth User' security: [] /api/auth/web/signup: post: summary: Register operationId: register description: '' parameters: [] responses: 200: description: '' content: text/plain: schema: type: string example: "{\n\"status\": true,\n\"message\": \"Register berhasil, silahkan cek email untuk aktivasi akun!\",\n\"data\": {\n\"name\": \"Ferryanto\",\n\"email\": \"ferryanto@salesync.id\",\n\"updated_at\": \"2025-05-13T07:03:27.000000Z\",\n\"created_at\": \"2025-05-13T07:03:27.000000Z\",\n}\n}" tags: - 'Auth User' requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'Name Lengkap pengguna.' example: Ferryanto password: type: string description: 'Password pengguna.' example: '12345678' phone: type: phone description: 'Phone pengguna.' example: '081**********' email: type: string description: 'Email yang digunakan untuk login.' example: sales2@salesync.id required: - name - password - phone - email security: [] /api/auth/web/login: post: summary: Login operationId: login description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: status: true message: 'Login berhasil' data: access_token: 3|TRPogkc1j9nkIAq84wglKFIzPnfX7zRmQgzCoRjB27862b47 token_type: Bearer user: uuid: b619b640-d77d-46e3-a67a-f6ab06afe4ae name: Ferryanto email: ferryanto@salesync.id phone: null active: true email_verified_at: '2025-05-13T07:03:27.000000Z' bearer_token: null created_at: '2025-05-13T07:03:27.000000Z' updated_at: '2025-05-13T07:03:27.000000Z' deleted_at: null properties: status: type: boolean example: true message: type: string example: 'Login berhasil' data: type: object properties: access_token: type: string example: 3|TRPogkc1j9nkIAq84wglKFIzPnfX7zRmQgzCoRjB27862b47 token_type: type: string example: Bearer user: type: object properties: uuid: type: string example: b619b640-d77d-46e3-a67a-f6ab06afe4ae name: type: string example: Ferryanto email: type: string example: ferryanto@salesync.id phone: type: string example: null nullable: true active: type: boolean example: true email_verified_at: type: string example: '2025-05-13T07:03:27.000000Z' bearer_token: type: string example: null nullable: true created_at: type: string example: '2025-05-13T07:03:27.000000Z' updated_at: type: string example: '2025-05-13T07:03:27.000000Z' deleted_at: type: string example: null nullable: true tags: - 'Auth User' requestBody: required: true content: application/json: schema: type: object properties: email: type: string description: 'Email User.' example: sales2@salesync.id password: type: string description: 'Password User.' example: '12345678' user_type: type: string description: 'optional Tipe user: sales atau customer.' example: sales nullable: true fcm_id: type: string description: 'optional FCM ID untuk user sales.' example: architecto nullable: true required: - email - password security: [] /api/auth/web/forgot: post: summary: 'Request Reset Password OTP' operationId: requestResetPasswordOTP description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: status: true message: 'Terima kasih, kode OTP berhasil dikirim' data: 1234 properties: status: type: boolean example: true message: type: string example: 'Terima kasih, kode OTP berhasil dikirim' data: type: integer example: 1234 tags: - 'Auth User' requestBody: required: true content: application/json: schema: type: object properties: email: type: string description: 'Email yang digunakan untuk login.' example: ferryanto@salesync.id required: - email security: [] /api/basic/berita: post: summary: Berita operationId: berita description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: status: true message: 'Data berhasil didapatkan' data: { } properties: status: type: boolean example: true message: type: string example: 'Data berhasil didapatkan' data: type: object properties: { } tags: - Basic security: [] /api/basic/kota: post: summary: Kota operationId: kota description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: status: true message: 'Data berhasil didapatkan' data: { } properties: status: type: boolean example: true message: type: string example: 'Data berhasil didapatkan' data: type: object properties: { } tags: - Basic requestBody: required: true content: application/json: schema: type: object properties: provinsi_id: type: string description: '' example: architecto required: - provinsi_id security: [] /api/basic/provinsi: post: summary: Provinsi operationId: provinsi description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: status: true message: 'Data berhasil didapatkan' data: { } properties: status: type: boolean example: true message: type: string example: 'Data berhasil didapatkan' data: type: object properties: { } tags: - Basic security: [] /api/basic/satuan: post: summary: Satuan operationId: satuan description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: status: true message: 'Data berhasil didapatkan' data: { } properties: status: type: boolean example: true message: type: string example: 'Data berhasil didapatkan' data: type: object properties: { } tags: - Basic security: [] /api/basic/fcm/token: post: summary: 'Get Token Fcm' operationId: getTokenFcm description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: status: true message: 'Data berhasil didapatkan' data: { } properties: status: type: boolean example: true message: type: string example: 'Data berhasil didapatkan' data: type: object properties: { } tags: - Basic requestBody: required: true content: application/json: schema: type: object properties: fcm_id: type: string description: 'FCM ID' example: architecto required: - fcm_id security: [] /api/basic/category: post: summary: Category operationId: category description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: status: true message: 'Data berhasil didapatkan' data: { } properties: status: type: boolean example: true message: type: string example: 'Data berhasil didapatkan' data: type: object properties: { } tags: - Basic security: [] /api/welcome: get: summary: '' operationId: getApiWelcome description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Endpoints security: [] /api/home/activity: post: summary: Activity operationId: activity description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: status: true message: 'Data berhasil didapatkan' data: { } properties: status: type: boolean example: true message: type: string example: 'Data berhasil didapatkan' data: type: object properties: { } 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Home security: [] /api/home/visit/today: post: summary: 'Visit Hari Ini' operationId: visitHariIni description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: status: true message: 'Data berhasil didapatkan' data: { } properties: status: type: boolean example: true message: type: string example: 'Data berhasil didapatkan' data: type: object properties: { } 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Home security: [] /api/home/tasks: post: summary: Tugas operationId: tugas description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: status: true message: 'Data berhasil didapatkan' data: { } properties: status: type: boolean example: true message: type: string example: 'Data berhasil didapatkan' data: type: object properties: { } 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Home security: [] /api/account/konfigurasi: post: summary: General operationId: general description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: status: true message: 'Data berhasil didapatkan' data: { } properties: status: type: boolean example: true message: type: string example: 'Data berhasil didapatkan' data: type: object properties: { } tags: - Konfigurasi requestBody: required: true content: multipart/form-data: schema: type: object properties: name: type: string description: '' example: architecto alamat: type: string description: 'alamat anda.' example: 'Jl raya sini aja' logo: type: string format: binary description: 'Logo Anda max 2MB anda (png,jpg,jpeg)' nullable: true qris: type: string format: binary description: 'QRIS Anda max 2MB anda (png,jpg,jpeg)' nullable: true kota: type: string description: 'kota anda.' example: Surabaya phone: type: string description: 'phone anda.' example: '08123456789' email: type: string description: 'email anda.' example: admin@example.com rek_1: type: string description: 'rekening 1 order.' example: '1234567890' rek_2: type: string description: 'rekening 2 order.' example: '1234567890' required: - name - alamat - logo - qris - kota - phone - email security: [] /api/account/konfigurasi/get: post: summary: 'My General' operationId: myGeneral description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: status: true message: 'Data berhasil didapatkan' data: { } properties: status: type: boolean example: true message: type: string example: 'Data berhasil didapatkan' data: type: object properties: { } tags: - Konfigurasi security: [] /api/outlet: post: summary: 'List Outlet' operationId: listOutlet description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: status: true message: 'Data berhasil didapatkan' data: { } properties: status: type: boolean example: true message: type: string example: 'Data berhasil didapatkan' data: type: object properties: { } 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Outlet requestBody: required: false content: application/json: schema: type: object properties: keyword: type: string description: 'Keyword outlet.' example: Toko security: [] /api/outlet/create: post: summary: 'Add Outlet' operationId: addOutlet description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: status: true message: 'Data berhasil ditambahkan' data: { } properties: status: type: boolean example: true message: type: string example: 'Data berhasil ditambahkan' data: type: object properties: { } 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. 403: description: '' content: application/json: schema: type: object example: status: false message: 'Akses ini hanya untuk user sales' data: null properties: status: type: boolean example: false message: type: string example: 'Akses ini hanya untuk user sales' data: type: string example: null nullable: true tags: - Outlet requestBody: required: true content: multipart/form-data: schema: type: object properties: name: type: string description: 'Nama Outlet.' example: 'Toko Zainal' kota: type: string description: 'ID Kota.' example: Surabaya path_image: type: string format: binary description: 'Foto Outlet max 2MB outlet (png,jpg,jpeg)' phone: type: string description: 'No HP outlet.' example: '08123456789' latitude: type: number description: Latitude. example: 6.12093884 longitude: type: number description: Longitude. example: 112.98093884 distributor_id: type: integer description: '' example: 1 tipe: type: string description: 'Tipe Outlet.' example: Toko address: type: string description: 'Alamat outlet.' example: 'Jl. Raya No. 1' note: type: string description: 'Catatan Outlet.' example: 'Toko baru buka jam 10' pic: type: string description: 'Nama PIC.' example: 'Pak Zainal' required: - name - path_image - latitude - longitude - tipe security: [] /api/outlet/edit: post: summary: 'Edit Outlet' operationId: editOutlet description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: status: true message: 'Data berhasil ditambahkan' data: { } properties: status: type: boolean example: true message: type: string example: 'Data berhasil ditambahkan' data: type: object properties: { } 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Outlet requestBody: required: true content: multipart/form-data: schema: type: object properties: name: type: string description: 'Nama Outlet.' example: 'Toko Zainal' uuid: type: string description: 'UUID Outlet.' example: 9023-kwoier-1234-oiqweu path_image: type: string format: binary description: 'Foto Outlet max 2MB outlet (png,jpg,jpeg)' latitude: type: number description: Latitude. example: 6.12093884 longitude: type: number description: Longitude. example: 112.98093884 distributor_id: type: integer description: '' example: 1 kota_id: type: integer description: 'ID Kota.' example: 1 tipe_id: type: integer description: 'Tipe Outlet.' example: 1 address: type: string description: 'Alamat outlet.' example: 'Jl. Raya No. 1' kodepos: type: numeric description: 'Kode POS Outlet.' example: '60123' phone: type: string description: 'No HP outlet.' example: '08123456789' note: type: string description: 'Catatan Outlet.' example: 'Toko baru buka jam 10' pic: type: string description: 'Nama PIC.' example: 'Pak Zainal' required: - name - uuid - latitude - longitude - kota_id - tipe_id security: [] /api/outlet/detail: post: summary: 'Show Outlet' operationId: showOutlet description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: status: true message: 'Data berhasil didapatkan' data: { } properties: status: type: boolean example: true message: type: string example: 'Data berhasil didapatkan' data: type: object properties: { } 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Outlet requestBody: required: false content: application/json: schema: type: object properties: uuid: type: string description: 'uuid outlet.' example: Toko security: [] /api/outlet/delete: post: summary: 'Delete Outlet' operationId: deleteOutlet description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: status: true message: 'Data berhasil ditambahkan' data: { } properties: status: type: boolean example: true message: type: string example: 'Data berhasil ditambahkan' data: type: object properties: { } 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Outlet requestBody: required: true content: application/json: schema: type: object properties: uuid: type: string description: 'UUID Outlet.' example: 9023-kwoier-1234-oiqweu required: - uuid security: [] /api/performa/dashboard: post: summary: 'Dashboard Performance' operationId: dashboardPerformance description: '' parameters: - in: query name: period description: 'Period type.' example: today required: true schema: type: string description: 'Period type.' example: today responses: 200: description: '' content: application/json: schema: type: object example: status: true message: 'Data berhasil didapatkan' data: { } properties: status: type: boolean example: true message: type: string example: 'Data berhasil didapatkan' data: type: object properties: { } 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Performance requestBody: required: true content: application/json: schema: type: object properties: period: type: string description: '' example: month enum: - today - week - month required: - period security: [] /api/pesanan/create: post: summary: Create operationId: create description: '' parameters: [] responses: 200: description: '' content: text/plain: schema: type: string example: "{\n\"status\": true,\n\"message\": \"Pesanan berhasil dibuat!\",\n\"data\": {\n\"uuid\": \"b619b640-d77d-46e3-a67a-f6ab06afe4ae\",\n\"code\": \"SSOR-12345678\",\n\"updated_at\": \"2025-05-13T07:03:27.000000Z\",\n\"created_at\": \"2025-05-13T07:03:27.000000Z\",\n}\n}" tags: - Pesanan requestBody: required: true content: application/json: schema: type: object properties: outlet_id: type: string description: 'ID Outlet.' example: '903988948934' items: type: array description: 'Array of items.' example: 9848948934 items: type: string discount: type: string description: Diskon. example: '12345678' nullable: true subtotal: type: string description: Subtotal. example: '12345678' note: type: string description: 'Catatan pengguna.' example: '12345678' nullable: true required: - outlet_id - items - discount - subtotal - note security: [] /api/pesanan: post: summary: 'List Pesanan' operationId: listPesanan description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: status: true message: 'Data berhasil didapatkan' data: { } properties: status: type: boolean example: true message: type: string example: 'Data berhasil didapatkan' data: type: object properties: { } 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Pesanan security: [] /api/pesanan/detail: post: summary: 'Show Pesanan' operationId: showPesanan description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: status: true message: 'Data berhasil didapatkan' data: { } properties: status: type: boolean example: true message: type: string example: 'Data berhasil didapatkan' data: type: object properties: { } 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Pesanan requestBody: required: true content: application/json: schema: type: object properties: uuid: type: string description: 'UUID Pesanan.' example: '12345678' required: - uuid security: [] /api/pesanan/status: post: summary: "Update Status Pesanan\nStatus hanya bisa maju sesuai alur: pending -> diproses -> dikirim -> selesai,\natau dibatalkan selama order belum dikirim (pending / diproses)." operationId: updateStatusPesananStatusHanyaBisaMajuSesuaiAlurPendingDiprosesDikirimSelesaiAtauDibatalkanSelamaOrderBelumDikirimpendingDiproses description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: status: true message: 'Status pesanan berhasil diperbarui' data: { } properties: status: type: boolean example: true message: type: string example: 'Status pesanan berhasil diperbarui' data: type: object properties: { } tags: - Pesanan requestBody: required: true content: application/json: schema: type: object properties: uuid: type: string description: 'UUID Pesanan.' example: b619b640-d77d-46e3-a67a-f6ab06afe4ae status: type: string description: 'Status baru (diproses, dikirim, selesai, dibatalkan).' example: diproses note: type: string description: 'Catatan update status.' example: 'Pesanan sedang disiapkan gudang' required: - uuid - status - note security: [] /api/plan: post: summary: 'List Plan' operationId: listPlan description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: status: true message: 'Data berhasil didapatkan' data: { } properties: status: type: boolean example: true message: type: string example: 'Data berhasil didapatkan' data: type: object properties: { } tags: - Plan security: [] /api/product: post: summary: 'List Product' operationId: listProduct description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: status: true message: 'Data berhasil didapatkan' data: { } properties: status: type: boolean example: true message: type: string example: 'Data berhasil didapatkan' data: type: object properties: { } 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Product security: [] /api/product/create: post: summary: 'Add Product' operationId: addProduct description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: status: true message: 'Data berhasil ditambahkan' data: { } properties: status: type: boolean example: true message: type: string example: 'Data berhasil ditambahkan' data: type: object properties: { } 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Product requestBody: required: true content: multipart/form-data: schema: type: object properties: name: type: string description: 'Nama Product.' example: 'LED 5 watt' category_id: type: string description: 'ID Category.' example: '1333' sku: type: string description: 'SKU Product.' example: LED-5-watt description: type: string description: 'Deskripsi Product.' example: 'LED 5 watt' path_image: type: string format: binary description: 'Foto Outlet max 2MB outlet (png,jpg,jpeg)' price: type: integer description: 'Harga Product.' example: 10000 required: - name - category_id - sku - description - path_image - price security: [] /api/product/edit: post: summary: 'Edit Product' operationId: editProduct description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: status: true message: 'Data berhasil ditambahkan' data: { } properties: status: type: boolean example: true message: type: string example: 'Data berhasil ditambahkan' data: type: object properties: { } 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Product requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'Nama Product.' example: 'LED 5 watt' sku: type: string description: 'SKU Product.' example: LED-5-watt description: type: string description: 'Deskripsi Product.' example: 'LED 5 watt' path_image: type: string description: validation.max. example: 'n' nullable: true price: type: integer description: 'Harga Product.' example: 10000 uuid: type: string description: 'UUID Product.' example: 9023-kwoier-1234-oiqweu kota_id: type: integer description: 'ID Kota.' example: 1 required: - name - sku - description - price - uuid - kota_id security: [] /api/public/general: get: summary: 'Data umum layout: konfigurasi perusahaan, menu navigasi, artikel terbaru dan info promo' operationId: dataUmumLayoutKonfigurasiPerusahaanMenuNavigasiArtikelTerbaruDanInfoPromo description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Public security: [] /api/public/home: get: summary: 'Data halaman beranda: FAQ, testimoni dan daftar plan' operationId: dataHalamanBerandaFAQTestimoniDanDaftarPlan description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Public security: [] /api/public/plans: get: summary: 'Daftar plan beserta fitur, untuk halaman harga dan bandingkan plan' operationId: daftarPlanBesertaFiturUntukHalamanHargaDanBandingkanPlan description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Public security: [] /api/public/blogs: get: summary: 'Daftar artikel blog, 12 per halaman' operationId: daftarArtikelBlog12PerHalaman description: '' parameters: - in: query name: page description: Halaman. example: 1 required: false schema: type: integer description: Halaman. example: 1 responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Public security: [] '/api/public/pages/{slug}': get: summary: 'Detail artikel atau halaman statis berdasarkan slug (blog/{slug}, page/{slug}, tentang-kami)' operationId: detailArtikelAtauHalamanStatisBerdasarkanSlugblogslugPageslugTentangKami description: '' parameters: [] responses: 503: description: '' content: application/json: schema: type: object example: message: 'Service Unavailable' properties: message: type: string example: 'Service Unavailable' tags: - Public security: [] parameters: - in: path name: slug description: 'The slug of the page.' example: architecto required: true schema: type: string /api/public/contact: post: summary: 'Kirim form hubungi kami ke email support' operationId: kirimFormHubungiKamiKeEmailSupport description: '' parameters: [] responses: { } tags: - Public requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: validation.max. example: b message: type: string description: validation.max. example: 'n' phone: type: number description: '' example: 4326.41688 email: type: string description: 'validation.email validation.max.' example: rempel.chadrick@example.org turnstile_token: type: string description: 'Token Cloudflare Turnstile.' example: architecto required: - name - message - phone - email - turnstile_token security: [] /api/public/trial: post: summary: 'Ajukan trial: simpan pengajuan lalu kirim email berisi tautan pendaftaran' operationId: ajukanTrialSimpanPengajuanLaluKirimEmailBerisiTautanPendaftaran description: '' parameters: [] responses: { } tags: - Public requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: validation.max. example: b email: type: string description: 'validation.email validation.max.' example: zbailey@example.net turnstile_token: type: string description: 'Token Cloudflare Turnstile.' example: architecto required: - name - email - turnstile_token security: [] /api/stok: post: summary: "List Stok (masuk & keluar)\nRingkasan per produk: on_hand (stok fisik), reserved (dipesan order belum dikirim),\navailable (tersedia untuk order baru)." operationId: listStokmasukKeluarRingkasanPerProdukOnHandstokFisikReserveddipesanOrderBelumDikirimAvailabletersediaUntukOrderBaru description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: status: true message: 'Data berhasil didapatkan' data: { } properties: status: type: boolean example: true message: type: string example: 'Data berhasil didapatkan' data: type: object properties: { } tags: - Stok requestBody: required: false content: application/json: schema: type: object properties: search: type: string description: 'Cari SKU, nama produk, No. PO, kode order, atau penerima.' example: LED type: type: string description: 'Filter jenis: masuk / keluar.' example: masuk page: type: integer description: Halaman. example: 1 security: [] /api/stok/import: post: summary: "Import Stok dari file Excel\nFile .xls / .xlsx / .csv dengan kolom: SKU, Qty, Tanggal Input, No. PO, Penerima, Tgl Terima." operationId: importStokDariFileExcelFilexlsxlsxcsvDenganKolomSKUQtyTanggalInputNoPOPenerimaTglTerima description: 'Semua baris divalidasi lebih dulu; bila ada satu baris salah, tidak ada data yang disimpan.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: status: true message: '120 baris stok berhasil diimport' data: imported: 120 import_batch: b619b640-d77d-46e3-a67a-f6ab06afe4ae properties: status: type: boolean example: true message: type: string example: '120 baris stok berhasil diimport' data: type: object properties: imported: type: integer example: 120 import_batch: type: string example: b619b640-d77d-46e3-a67a-f6ab06afe4ae 422: description: '' content: application/json: schema: type: object example: status: false message: 'Import gagal: 2 baris tidak valid' data: errors: - row: 3 sku: LED-5 messages: - 'SKU tidak ditemukan' properties: status: type: boolean example: false message: type: string example: 'Import gagal: 2 baris tidak valid' data: type: object properties: errors: type: array example: - row: 3 sku: LED-5 messages: - 'SKU tidak ditemukan' items: type: object properties: row: type: integer example: 3 sku: type: string example: LED-5 messages: type: array example: - 'SKU tidak ditemukan' items: type: string tags: - Stok requestBody: required: true content: multipart/form-data: schema: type: object properties: file: type: string format: binary description: 'File Excel stok (max 5MB).' required: - file security: [] /api/stok/template: post: summary: "Template Import Stok\nUnduh file .xlsx berisi judul kolom dan satu contoh baris." operationId: templateImportStokUnduhFilexlsxBerisiJudulKolomDanSatuContohBaris description: '' parameters: [] responses: { } tags: - Stok security: [] /api/subscription/billing: post: summary: 'List Billing Customer' operationId: listBillingCustomer description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: status: true message: 'Data billing berhasil didapatkan' data: { } properties: status: type: boolean example: true message: type: string example: 'Data billing berhasil didapatkan' data: type: object properties: { } 403: description: '' content: application/json: schema: type: object example: status: false message: 'Akses ini hanya untuk user customer' data: null properties: status: type: boolean example: false message: type: string example: 'Akses ini hanya untuk user customer' data: type: string example: null nullable: true tags: - Subscription security: [] /api/subscription/payment: post: summary: 'Generate Snap Token' operationId: generateSnapToken description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: status: true message: 'Snap token berhasil dibuat' data: snap_token: token redirect_url: 'https://app.sandbox.midtrans.com/snap/v2/vtweb/token' snap_js_url: 'https://app.sandbox.midtrans.com/snap/snap.js' client_key: SB-Mid-client-xxx properties: status: type: boolean example: true message: type: string example: 'Snap token berhasil dibuat' data: type: object properties: snap_token: type: string example: token redirect_url: type: string example: 'https://app.sandbox.midtrans.com/snap/v2/vtweb/token' snap_js_url: type: string example: 'https://app.sandbox.midtrans.com/snap/snap.js' client_key: type: string example: SB-Mid-client-xxx 403: description: '' content: application/json: schema: type: object example: status: false message: 'Akses ini hanya untuk user customer' data: null properties: status: type: boolean example: false message: type: string example: 'Akses ini hanya untuk user customer' data: type: string example: null nullable: true tags: - Subscription requestBody: required: true content: application/json: schema: type: object properties: billing_uuid: type: string description: 'UUID billing yang akan dibayar.' example: 6ff8f7f6-1eb3-3525-be4a-3932c805afed required: - billing_uuid security: [] /api/subscription/create: post: summary: "Create Subscription\nCheckout seat sales untuk 1 bulan. Bila masih ada periode aktif, checkout ini menjadi perpanjangan\nyang mulai berlaku di akhir periode berjalan." operationId: createSubscriptionCheckoutSeatSalesUntuk1BulanBilaMasihAdaPeriodeAktifCheckoutIniMenjadiPerpanjanganYangMulaiBerlakuDiAkhirPeriodeBerjalan description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: status: true message: 'Subscription berhasil dibuat' data: { } properties: status: type: boolean example: true message: type: string example: 'Subscription berhasil dibuat' data: type: object properties: { } 403: description: '' content: application/json: schema: type: object example: status: false message: 'Akses ini hanya untuk user customer' data: null properties: status: type: boolean example: false message: type: string example: 'Akses ini hanya untuk user customer' data: type: string example: null nullable: true tags: - Subscription requestBody: required: true content: application/json: schema: type: object properties: quantity: type: integer description: 'Jumlah sales (seat) yang dibeli.' example: 5 description: type: string description: 'Catatan billing.' example: 'Eius et animi quos velit et.' nullable: true required: - quantity security: [] /api/subscription/status: post: summary: "Status Langganan\nPeriode berjalan, periode berikutnya yang sudah dibayar, kuota seat, dan billing pending." operationId: statusLanggananPeriodeBerjalanPeriodeBerikutnyaYangSudahDibayarKuotaSeatDanBillingPending description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: status: true message: 'Status langganan berhasil didapatkan' data: { } properties: status: type: boolean example: true message: type: string example: 'Status langganan berhasil didapatkan' data: type: object properties: { } tags: - Subscription security: [] /api/subscription/enterprise: post: summary: "Permintaan Paket Enterprise\nMengirim permintaan penawaran ke tim Salesync untuk perusahaan dengan banyak sales / kebutuhan khusus." operationId: permintaanPaketEnterpriseMengirimPermintaanPenawaranKeTimSalesyncUntukPerusahaanDenganBanyakSalesKebutuhanKhusus description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: status: true message: 'Permintaan berhasil dikirim, tim kami akan segera menghubungi Anda' data: null properties: status: type: boolean example: true message: type: string example: 'Permintaan berhasil dikirim, tim kami akan segera menghubungi Anda' data: type: string example: null nullable: true tags: - Subscription requestBody: required: true content: application/json: schema: type: object properties: estimated_sales: type: integer description: 'Perkiraan jumlah sales.' example: 120 phone: type: string description: 'Nomor yang bisa dihubungi.' example: '081234567890' nullable: true message: type: string description: 'Kebutuhan khusus.' example: architecto nullable: true required: - estimated_sales security: [] /api/tugas: post: summary: 'List Tugas' operationId: listTugas description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: status: true message: 'Data berhasil didapatkan' data: { } properties: status: type: boolean example: true message: type: string example: 'Data berhasil didapatkan' data: type: object properties: { } 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Tugas security: [] /api/tugas/sales: post: summary: 'List Sales Customer' operationId: listSalesCustomer description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: status: true message: 'Data sales berhasil didapatkan' data: { } properties: status: type: boolean example: true message: type: string example: 'Data sales berhasil didapatkan' data: type: object properties: { } 403: description: '' content: application/json: schema: type: object example: status: false message: 'Akses ini hanya untuk user customer' data: null properties: status: type: boolean example: false message: type: string example: 'Akses ini hanya untuk user customer' data: type: string example: null nullable: true tags: - Tugas security: [] /api/tugas/sales/target: post: summary: 'Update Target Sales' operationId: updateTargetSales description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: status: true message: 'Target sales berhasil diperbarui' data: { } properties: status: type: boolean example: true message: type: string example: 'Target sales berhasil diperbarui' data: type: object properties: { } 403: description: '' content: application/json: schema: type: object example: status: false message: 'Akses ini hanya untuk user customer' data: null properties: status: type: boolean example: false message: type: string example: 'Akses ini hanya untuk user customer' data: type: string example: null nullable: true 404: description: '' content: application/json: schema: type: object example: status: false message: 'Sales UUID tidak ditemukan' data: null properties: status: type: boolean example: false message: type: string example: 'Sales UUID tidak ditemukan' data: type: string example: null nullable: true tags: - Tugas requestBody: required: true content: application/json: schema: type: object properties: sales_id: type: string description: 'UUID sales milik customer.' example: ebe160d1-52d2-4366-8b55-9b9465878454 target_sales: type: numeric description: 'Target sales.' example: '10000000' required: - sales_id - target_sales security: [] /api/tugas/sales/performa: post: summary: 'Performa Sales' operationId: performaSales description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: status: true message: 'Data berhasil didapatkan' data: { } properties: status: type: boolean example: true message: type: string example: 'Data berhasil didapatkan' data: type: object properties: { } tags: - Tugas requestBody: required: true content: application/json: schema: type: object properties: uuid: type: string description: 'UUID sales milik customer.' example: ebe160d1-52d2-4366-8b55-9b9465878454 required: - uuid security: [] /api/tugas/create: post: summary: 'Add Tugas' operationId: addTugas description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: status: true message: 'Tugas berhasil ditambahkan' data: { } properties: status: type: boolean example: true message: type: string example: 'Tugas berhasil ditambahkan' data: type: object properties: { } 403: description: '' content: application/json: schema: type: object example: status: false message: 'Akses ini hanya untuk user customer' data: null properties: status: type: boolean example: false message: type: string example: 'Akses ini hanya untuk user customer' data: type: string example: null nullable: true tags: - Tugas requestBody: required: true content: application/json: schema: type: object properties: title: type: string description: 'Judul tugas.' example: 'Follow up outlet' note: type: string description: 'Catatan tugas.' example: 'Kunjungi outlet prioritas' sales_id: type: string description: 'UUID sales milik customer.' example: ebe160d1-52d2-4366-8b55-9b9465878454 priority: type: integer description: 'Priority tugas.' example: 1 nullable: true due_date: type: date description: 'Deadline tugas.' example: '2026-06-04' required: - title - note - sales_id - due_date security: [] /api/tugas/detail: post: summary: 'Detail Tugas' operationId: detailTugas description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: status: true message: 'Data berhasil didapatkan' data: { } properties: status: type: boolean example: true message: type: string example: 'Data berhasil didapatkan' data: type: object properties: { } 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Tugas requestBody: required: false content: application/json: schema: type: object properties: uuid: type: string description: 'uuid tugas.' example: 'uuid tugas' security: [] /api/tugas/update: post: summary: 'Update Tugas' operationId: updateTugas description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: status: true message: 'Data berhasil didapatkan' data: { } properties: status: type: boolean example: true message: type: string example: 'Data berhasil didapatkan' data: type: object properties: { } 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Tugas requestBody: required: true content: multipart/form-data: schema: type: object properties: status: type: string description: 'status tugas.' example: finish path_image: type: string format: binary description: 'Foto Tugas max 2MB (png,jpg,jpeg)' uuid: type: string description: 'uuid tugas.' example: 'uuid tugas' required: - status - path_image security: [] /api/user/create: post: summary: 'Create Sales' operationId: createSales description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: status: true message: 'Data sales berhasil ditambahkan' data: { } properties: status: type: boolean example: true message: type: string example: 'Data sales berhasil ditambahkan' data: type: object properties: { } 403: description: '' content: application/json: schema: type: object example: status: false message: 'Akses ini hanya untuk user customer' data: null properties: status: type: boolean example: false message: type: string example: 'Akses ini hanya untuk user customer' data: type: string example: null nullable: true tags: - User requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'Nama sales.' example: Ferryanto phone: type: numeric description: 'Nomor handphone sales.' example: '081234567890' email: type: string description: 'Email sales.' example: sales@salesync.id password: type: string description: 'Password sales default 12345678.' example: '12345678' nullable: true required: - name - phone - email security: [] /api/visit/create: post: summary: 'Check In Visit' operationId: checkInVisit description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: status: true message: 'Data berhasil ditambahkan' data: { } properties: status: type: boolean example: true message: type: string example: 'Data berhasil ditambahkan' data: type: object properties: { } 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Visit requestBody: required: true content: multipart/form-data: schema: type: object properties: outlet_id: type: string description: 'UUID Outlet.' example: '1234' note: type: string description: 'Note Outlet.' example: LED-5-watt path_image: type: string format: binary description: 'Foto Outlet max 2MB outlet (png,jpg,jpeg)' required: - outlet_id - note - path_image security: [] /api/visit: post: summary: 'List Visit' operationId: listVisit description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: status: true message: 'Data berhasil didapatkan' data: { } properties: status: type: boolean example: true message: type: string example: 'Data berhasil didapatkan' data: type: object properties: { } 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Visit security: [] /api/visit/detail: post: summary: 'Detail Visit' operationId: detailVisit description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: status: true message: 'Data berhasil didapatkan' data: { } properties: status: type: boolean example: true message: type: string example: 'Data berhasil didapatkan' data: type: object properties: { } 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Visit requestBody: required: true content: application/json: schema: type: object properties: outlet_uuid: type: string description: 'UUID Outlet.' example: '1234' required: - outlet_uuid security: [] /api/visit/update: post: summary: 'Checkout Visit' operationId: checkoutVisit description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: status: true message: 'Data berhasil didapatkan' data: { } properties: status: type: boolean example: true message: type: string example: 'Data berhasil didapatkan' data: type: object properties: { } 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Visit requestBody: required: true content: application/json: schema: type: object properties: outlet_uuid: type: string description: 'UUID Outlet.' example: '1234' required: - outlet_uuid security: []