Auto Scheduler
HargaPlaygroundAlurBlogPertanyaan yang Sering DiajukanDokumentasi API
Masuk

Di halaman ini

RingkasanCakupanLangganan & penagihanAutentikasiEndpointCara memanggil (mulai cepat)API baca (GET)API tulis (PATCH / POST / PUT / DELETE)HeaderBatas & defaultKunci root yang diizinkanRingkasan body permintaanTabel referensi cepatReferensi field (nilai yang diizinkan)apiVersiontimeZonescheduleStartDate / scheduleEndDatetimeRangeStart / timeRangeEndslotGranularityMinutesrequirementsByCellstaffavailableCellsHukum kerja & flag berbayar (default server)SanitasiRespons suksesDaftar kode errorContoh JSONBacaan lanjutan
API berbayar · Langganan

Referensi API pengembang (berbayar)

Integrasikan API produksi untuk pengiriman jadwal dengan kunci API yang terikat ke langganan berbayar Anda. Default penyewa dapat disimpan dengan PATCH /v1/schedule-defaults; harian mingguan per staf dibaca atau diganti penuh dengan GET/PUT /v1/staff/{staffId}/weekly-shift-wish. Penagihan mengikuti paket dan kontrak Anda (bukan bayar per panggilan API). Halaman ini mendokumentasikan hak, aturan validasi, dan kode error — gunakan bilah sisi untuk melompat ke setiap field.

Cakupan dokumentasi ini

Halaman ini hanya mencakup API REST produk di API Gateway ({stage}/v1/*, autentikasi x-api-key).

Rute Next.js /api/* (webhook Stripe, gambar OG, Web Vitals, dll.) bersifat internal untuk aplikasi web dan bukan bagian dari API pengembang ini. Jangan gunakan untuk integrasi eksternal.

GET /v1/processing-history tidak disediakan (dihapus bersama UI lama) dan tidak tercantum dalam daftar endpoint di halaman ini.

Langganan & akses

API HTTP ini merupakan bagian produk berbayar: akses memerlukan perjanjian komersial aktif dan kunci diterbitkan ke organisasi Anda setelah onboarding.

Penagihan berdasarkan langganan dan kontrak. Untuk paket berbayar, biaya biasanya mengikuti halaman harga (mis. per staf terdaftar per bulan).

Batas playground / tingkat gratis tidak berlaku untuk kunci API berbayar. Batas efektif seperti rentang jadwal, jumlah staf, dan granularitas 15 menit ditentukan oleh hak berbayar Anda. Lihat Batas & default di halaman ini.

Autentikasi

Permintaan harus menyertakan kunci API yang valid yang diterbitkan untuk langganan berbayar Anda. Buat, putar, dan cabut kunci dari area akun setelah masuk.

Kirim kunci di header x-api-key. Kunci terikat ke organisasi Anda untuk identifikasi penyewa dan batas akses berdasarkan paket.

Kelola kunci: Manajemen API

Endpoint

Kirim kondisi jadwal sebagai JSON. Ini adalah permukaan integrasi berbayar; URL dasar pasti diberikan per lingkungan setelah akses API disediakan.

POST {baseUrl}/v1/schedule

Gunakan URL dasar yang diberikan saat akses API disediakan atau oleh kontak operasi Anda.

Cara memanggil (mulai cepat)

Ganti **BASE_URL** dengan URL dasar API (awalan jalur) yang diberikan saat akses Anda disediakan.

Kirim kunci API di header **x-api-key**. Organisasi (penyewa) Anda diidentifikasi dari kunci — Anda tidak perlu mengirim ID penyewa terpisah di query string.

Pembacaan dan pembaruan perusahaan (GET/PATCH /v1/company) memerlukan langganan berbayar yang aktif. Anda dapat menerima **503** (mis. kode **STRIPE_NOT_CONFIGURED**) bila penagihan belum dikonfigurasi untuk penyewa Anda.

Contoh curl (bash / macOS / Linux / WSL)

Windows PowerShell: `\` di akhir baris **bukan** kelanjutan baris. Tulis satu baris, atau akhiri setiap baris dengan backtick (`) untuk melanjutkan.

curl -sS -D - \
  -H "x-api-key: YOUR_API_KEY" \
  "BASE_URL/v1/schedule-results?limit=10"

curl -sS -D - \
  -H "x-api-key: YOUR_API_KEY" \
  "BASE_URL/v1/company"

API baca (GET)

URL dasar dan kunci API yang sama seperti POST /v1/schedule. Query opsional: limit (1–100, bawaan 50), cursor (token buram dari field nextCursor respons sebelumnya).

GET /v1/company dan pembaruan perusahaan memerlukan langganan berbayar yang aktif. Anda dapat menerima **503 / STRIPE_NOT_CONFIGURED** bila penagihan belum dikonfigurasi.

MetodeJalurDeskripsi
GET{baseUrl}/v1/schedule-resultsMendaftar baris induk SCHEDULE_RESULT: conditionId, status, candidateCount, createdAt/updatedAt, dll. Paginasi baris induk DynamoDB.
GET{baseUrl}/v1/schedule-results/historyPencarian riwayat hasil jadwal (sama seperti browser). from / to (ISO 8601, default awal layanan hingga sekarang), keyword, eventName (INSERT,MODIFY,REMOVE dipisah koma), limit, cursor. Menggabungkan data terbaru dan arsip otomatis; hanya items / nextCursor.
GET{baseUrl}/v1/schedule-results/{conditionId}Mengambil satu baris induk SCHEDULE_RESULT menurut conditionId (atribut JSON; PK/SK dihilangkan).
GET{baseUrl}/v1/schedule-results/{conditionId}/resolutionOutput optimasi terselesaikan: status, candidates, confirmedAssignments jika ada. Jika status completed dan belum dikonfirmasi, rank-1 dapat dikonfirmasi otomatis pada GET ini (efek samping). Gunakan POST …/confirm-assignments untuk konfirmasi manual.
GET{baseUrl}/v1/schedule-results/{conditionId}/reviewPayload tinjauan untuk konfirmasi manual (kandidat, requiredByCellKey, allowedCellKeys staf, dll.).
GET{baseUrl}/v1/schedule-results/{conditionId}/emergency-shift-contextKonteks shift darurat (tanggal kalender, staf, slot). Langganan berbayar diperlukan; null jika kondisi tidak ada.
GET{baseUrl}/v1/schedule-conditionsDaftar baris induk SCHEDULE_CONDITION (conditionId, tanggal, publicApiCancelledAt opsional).
GET{baseUrl}/v1/schedule-conditions/{conditionId}Baris induk kondisi plus reqDays dan staffSnapshots (tanpa PK/SK).
GET{baseUrl}/v1/audit-logsDaftar entri audit log (terbaru dulu; paginasi cursor).
GET{baseUrl}/v1/schedule-defaultsBaris default jadwal penyewa (SCHEDULE_DEFAULTS) atau null jika belum disimpan.
GET{baseUrl}/v1/schedule-actual/{conditionId}Baris SCHEDULE_ACTUAL penugasan aktual, atau null jika tidak ada.
GET{baseUrl}/v1/staff/{staffId}/weekly-shift-wishBaris keinginan shift mingguan staf, atau null jika tidak ada.
GET{baseUrl}/v1/companyMengembalikan field Stripe Customer (nama, email, telepon, alamat) untuk customerId pada kunci API Anda.
GET{baseUrl}/v1/usersMendaftar pengguna penyewa (opsional: limit, cursor, userName, permissionProfileId, scope fullAccess|nonFullAccess).
GET{baseUrl}/v1/users/{userId}Mendapatkan satu pengguna berdasarkan userId di path.
GET{baseUrl}/v1/staffMendaftar staf aktif penyewa (diurut menurut nama tampilan).
GET{baseUrl}/v1/staff/{staffId}Mengambil satu anggota staf menurut staffId termasuk detail ketenagakerjaan (laborLawCompliance, laborFlsaExempt, batas pribadi, laborConstraintMask). Soft delete → 404.

API tulis (PATCH / POST / PUT / DELETE)

Gunakan kunci API yang sama dengan body JSON. PATCH /v1/company menolak string kosong untuk field seperti nama perusahaan (selaras dengan aplikasi web). PATCH /v1/schedule-defaults menyimpan default penyewa (requirementsByCellKey, horizon perencanaan, dll.); field berbayar mengikuti langganan Anda. PUT /v1/staff/{staffId}/weekly-shift-wish mengganti seluruh grid keinginan mingguan staf tersebut (lihat catatan validasi). DELETE /v1/users/{userId} mengembalikan 409 jika organisasi tidak akan memiliki pengguna atau aturan admin terakhir berlaku. POST /v1/staff mengembalikan 409 STAFF_LIMIT jika daftar melebihi batas kontrak.

POST /v1/users membutuhkan userName, email, permissionProfileId; opsional: locale, password. PATCH pengguna: hanya field yang berubah. POST /v1/staff: JSON { "displayName": "..." } saja. PATCH /v1/staff/{staffId}: displayName, laborLawCompliance, laborFlsaExempt, personalMaxWeeklyMinutes / personalMaxMonthlyMinutes / personalMaxThreeMonthMinutes (bilangan bulat atau null), laborConstraintMask (objek atau null jika laborLawCompliance true) — field ketenagakerjaan berbayar. POST /v1/schedule-results/{conditionId}/emergency-shift: absentStaffIds, absentDatesYmd dan/atau absentSlots (berbayar, jadwal sumber selesai). POST …/confirm-assignments: array assignments dan relaxAvailability opsional. PATCH /v1/schedule-defaults: PUBLIC_API_SCHEDULE_REQUEST_BODY.md §12. PUT /v1/staff/{staffId}/weekly-shift-wish: scheduleStartDate, scheduleEndDate, timeRangeStart, timeRangeEnd, wishByCellKey.

MetodeJalurDeskripsi
PATCH{baseUrl}/v1/companyMemperbarui field profil perusahaan (pelanggan penagihan).
PATCH{baseUrl}/v1/schedule-defaultsMenyimpan default jadwal penyewa (body selaras saveSchema di schedule-defaults-actions). Field berbayar mengikuti langganan Anda.
POST{baseUrl}/v1/usersMembuat pengguna. Mengembalikan 201 dengan JSON user.
PATCH{baseUrl}/v1/users/{userId}Memperbarui field pengguna (userName, email, permissionProfileId, locale).
DELETE{baseUrl}/v1/users/{userId}Menghapus pengguna. 409 jika tidak ada pengguna tersisa atau aturan admin terakhir.
POST{baseUrl}/v1/staffMembuat anggota staf (displayName). Mengembalikan 201 dengan JSON staff.
POST{baseUrl}/v1/schedule-results/{conditionId}/emergency-shiftMengkloning jadwal sumber yang selesai dengan absensi diterapkan; mengembalikan 201 dengan conditionId. Langganan berbayar diperlukan.
POST{baseUrl}/v1/schedule-results/{conditionId}/confirm-assignmentsMemvalidasi dan menyimpan penugasan yang diedit manual (200 dengan { ok: true }).
PATCH{baseUrl}/v1/staff/{staffId}Memperbarui displayName dan detail ketenagakerjaan (laborLawCompliance, laborFlsaExempt, batas pribadi, laborConstraintMask).
DELETE{baseUrl}/v1/staff/{staffId}Soft delete anggota staf (mengatur deletedAt).
DELETE{baseUrl}/v1/schedule-conditions/{conditionId}Menandai kondisi dibatalkan (publicApiCancelledAt); tidak menghapus baris anak.
PUT{baseUrl}/v1/schedule-actual/{conditionId}Menyimpan penugasan aktual JSON { "assignments": [ ... ] } (divalidasi terhadap grid kondisi).
PUT{baseUrl}/v1/staff/{staffId}/weekly-shift-wishMengganti keinginan mingguan: grid penuh (1–7 hari), wishByCellKey per sel (NONE|LOW|HIGH); granularitas dari default penyewa.
POST{baseUrl}/v1/users/{userId}/restoreMemulihkan pengguna yang dihapus secara logis.

Header

HeaderDeskripsi
x-api-keyKunci API terikat ke langganan berbayar Anda (mengidentifikasi penyewa dan batas paket).
Content-Typeapplication/json

Header respons

Beberapa header respons (seperti ID permintaan) adalah metadata pelacakan, bukan kunci API Anda. Anggap **body** JSON bersifat rahasia bila berisi data perusahaan atau pengguna.

Batas tingkat berbayar (hak)

Batas validasi tipikal untuk kontrak Anda (granularitas 15 menit, rentang jadwal, jumlah staf terdaftar, dan batas terkait).

PengaturanAPI berbayar (tipikal)
Model penagihanLangganan Stripe; biaya produk biasanya mengikuti jumlah kursi staf terdaftar sesuai halaman harga (bukan tagihan per panggilan API).
maxScheduleDaysHingga 14 hari kalender per pengiriman untuk perencanaan detail dua minggu standar (rentang lebih lebar hanya jika kontrak mengizinkan).
maxStaffPerScheduleHingga 500 baris staff per POST /v1/schedule (PUBLIC_SCHEDULE_MAX_STAFF; staffId inline di body).
maxRosterStaffHingga 30 staf aktif via POST /v1/staff (STAFF_ROSTER_MAX_PAID); 409 STAFF_LIMIT jika terlampaui.
allowedGranularities[60, 15] — slot 15 menit adalah fitur berbayar; 60 menit juga didukung.
maxPayloadBytes524288 (512 KiB) UTF-8 kecuali batas lebih tinggi diberikan.
strictUnknownRootKeystrue — kunci tingkat atas atau di staff yang tidak dikenal ditolak

Kebutuhan kepala per sel tetap bilangan bulat 0 hingga 15. Melebihi batas frekuensi permintaan dapat mengembalikan respons error.

Kunci root yang diizinkan (mode ketat)

Saat mode ketat aktif, hanya kunci tingkat atas berikut yang diterima. Kunci lain mengembalikan UNKNOWN_FIELD.

  • apiVersion
  • timeZone
  • scheduleStartDate
  • scheduleEndDate
  • timeRangeStart
  • timeRangeEnd
  • slotGranularityMinutes
  • requirementsByCell
  • staff

Body permintaan (ringkasan)

Payload mengikuti model permintaan jadwal publik berbayar: tanggal kalender, zona waktu, grid slot (60 atau 15 menit di API berbayar), kebutuhan per sel, dan ketersediaan staf. Yurisdiksi hukum kerja, flag optimasi berbayar, dan field hukum kerja tingkat staf bukan bagian JSON — server menulis default pada baris induk SCHEDULE_CONDITION saat menyimpan (lihat «Hukum kerja & flag berbayar»). Jangan sertakan kunci DynamoDB atau tipe entitas internal di body.

  • apiVersion — Opsional. Jika ada, hanya string versi skema yang didukung.
  • Format cellKey — Kunci di requirementsByCell dan availableCells harus cocok dengan `${date}__${slotId}` dengan date YYYY-MM-DD dalam rentang dan slotId dari slot yang dihitung untuk rentang waktu dan granularitas Anda (sama seperti `cellKey` di helper playground).

Tabel referensi cepat

FieldTipeWajibCatatan
timeZonestringYaZona waktu IANA untuk menafsirkan tanggal dan slot.
scheduleStartDate / scheduleEndDatestring (YYYY-MM-DD)YaRentang kalender inklusif; mulai ≤ akhir.
timeRangeStart / timeRangeEndstring (HH:mm)YaRentang jam dinding yang mendefinisikan kolom slot; harus menghasilkan setidaknya satu slot.
slotGranularityMinutes60 | 15YaAPI berbayar: 60 (per jam) atau 15 (15 menit). Harus ada di allowedGranularities.
requirementsByCellobjectYaKunci = cellKey di grid yang dihitung; nilai = bilangan bulat 0–15.
staffarrayYaTidak kosong; ukuran maks. sesuai batas; setiap item: staffId, displayName, availableCells opsional.

Referensi field (nilai yang diizinkan)

Bagian berikut mencerminkan validator di `app/lib/public-schedule-api/validate.ts` dan sanitiser di `sanitize.ts`, dengan default berbayar dari `PUBLIC_SCHEDULE_SUBMIT_DEFAULTS` kecuali opsi diberikan. Kirim angka JSON sebagai angka sebenarnya (bukan string). Setelah validasi, `build-schedule-transact-items.ts` menambahkan field baris induk (salinan optimasi berbayar, yurisdiksi hukum kerja, versi model) yang bukan kunci permintaan — lihat «Hukum kerja & flag berbayar».

apiVersion

string | dihilangkan · Wajib: Tidak — opsional

Nilai yang diizinkan

  • Dihilangkan: diterima (perilaku terbaru).
  • Jika ada, harus tepat "2026-04-01" (PUBLIC_SCHEDULE_API_VERSION).
  • String lain ditolak (TYPE_ERROR).

Perilaku

  • Dibandingkan setelah penanganan setara trim di sanitizeApiVersion.

Error umum

  • TYPE_ERRORNilai apiVersion tidak didukung.

timeZone

string · Wajib: Ya

Nilai yang diizinkan

  • Format satu string. API TIDAK menerbitkan enum tertutup semua zona: server memvalidasi secara dinamis.
  • Validasi cocok dengan `isValidIanaTimeZone`: Luxon `DateTime.now().setZone(zone).isValid` harus true.
  • Gunakan pengidentifikasi IANA kanonik, mis. `Asia/Tokyo`, `America/New_York`, `Europe/Berlin`, `UTC`.
  • Jangan mengandalkan hanya singkatan (`EST`, `JST`, `GMT`) — bukan ID zona IANA yang stabil dan mungkin ditolak.
  • Daftar referensi: distribusi IANA (https://www.iana.org/time-zones) atau API zona waktu platform Anda.

Perilaku

  • Digunakan dengan tanggal dan waktu slot dalam normalisasi hilir.
  • Jika perlu daftar tetap di klien, turunkan dari aturan yang sama (ID IANA), jangan mengharapkan enum server di skema JSON.

Error umum

  • INVALID_TIME_ZONEHilang, kosong, atau zona IANA tidak valid.

scheduleStartDate, scheduleEndDate

string, string · Wajib: Ya — keduanya

Nilai yang diizinkan

  • Harus cocok /^\d{4}-\d{2}-\d{2}$/ (setelah trim).
  • Tanggal kalender nyata; rentang inklusif harus menghasilkan setidaknya satu hari melalui enumerateDates.
  • Jumlah hari dalam rentang tidak boleh melebihi maxScheduleDays (API berbayar biasanya hingga 14 hari; batas pasti = hak penyewa).

Perilaku

  • scheduleStartDate harus pada atau sebelum scheduleEndDate.

Error umum

  • INVALID_DATE_RANGEFormat buruk, tanggal tidak valid, atau rentang kosong.
  • SCHEDULE_SPAN_TOO_LONGLebih dari maxScheduleDays hari.

timeRangeStart, timeRangeEnd

string, string · Wajib: Ya — keduanya

Nilai yang diizinkan

  • String tidak kosong (trim) diinterpretasikan dengan enumerasi slot yang sama seperti UI (`enumerateSlotsByGranularity`).
  • Pasangan harus menghasilkan setidaknya satu slot; jika tidak, validasi gagal.

Perilaku

  • Bersama slotGranularityMinutes, mendefinisikan nilai slotId untuk cellKey.

Error umum

  • INVALID_TIME_RANGENilai hilang atau nol slot untuk rentang.

slotGranularityMinutes

number (angka JSON) · Wajib: Ya

Nilai yang diizinkan

  • Harus tepat 60 atau 15 (bukan string).
  • Juga harus muncul di allowedGranularities. Di API berbayar keduanya biasanya diaktifkan; jika 15 dinonaktifkan untuk penyewa Anda, INVALID_GRANULARITY.

Perilaku

  • Mendefinisikan jumlah slot bersama rentang waktu.

Error umum

  • INVALID_GRANULARITYBukan 60/15, atau tidak diizinkan untuk paket.

requirementsByCell

Record<string, number> · Wajib: Ya

Nilai yang diizinkan

  • Harus objek JSON biasa (bukan array).
  • Setiap kunci harus cellKey di grid yang diharapkan (tanggal × slotIds). Kunci tidak dikenal → UNKNOWN_CELL_KEY.
  • Setiap nilai harus angka JSON, bilangan bulat, antara 0 dan 15 inklusif.
  • Sel yang dihilangkan diperlakukan sebagai kebutuhan 0 (hanya sel dengan kebutuhan ≥ 1 ikut SHORTFALL).

Perilaku

  • Kunci dibandingkan setelah trim melalui sanitizeCellKey.

Error umum

  • INVALID_REQUIREMENTSBukan objek atau nilai numerik tidak valid untuk kunci.
  • UNKNOWN_CELL_KEYKunci tidak dalam grid tanggal × slot yang dihitung.

staff

array · Wajib: Ya — array tidak kosong

Nilai yang diizinkan

  • Panjang antara 1 dan maxStaffPerSchedule (default 500 untuk POST /v1/schedule; terpisah dari batas roster POST /v1/staff).
  • Setiap elemen harus objek biasa dengan kunci yang diizinkan saja: staffId, displayName, availableCells (mode ketat).
  • staffId dan displayName harus lulus sanitasi (lihat bagian Sanitasi).
  • staffId harus unik di array (DUPLICATE_STAFF_ID).

Perilaku

  • Urutan dipertahankan untuk penghitungan ketersediaan.

Error umum

  • INVALID_STAFFArray kosong, terlalu banyak baris, objek buruk, atau sanitasi gagal.
  • UNKNOWN_FIELDKunci ekstra pada objek staff dalam mode ketat.
  • DUPLICATE_STAFF_IDstaffId yang sama dua kali.

staff[].availableCells

string[] | dihilangkan · Wajib: Tidak — opsional

Nilai yang diizinkan

  • Jika dihilangkan: staf dianggap tersedia di semua sel grid (implementasi memakai null «semua sel»).
  • Jika ada: harus array JSON string; setiap string tidak kosong harus cellKey di grid yang diharapkan.
  • String kosong dalam array tidak valid (INVALID_AVAILABLE_CELL).

Pemeriksaan SHORTFALL

  • Untuk setiap sel dengan kebutuhan ≥ 1, jumlah staf yang dihitung tersedia harus ≥ kebutuhan, jika tidak SHORTFALL_CELLS.

Error umum

  • INVALID_AVAILABLE_CELLKunci sel tidak dikenal atau entri kosong.
  • SHORTFALL_CELLSStaf tidak cukup untuk kebutuhan sel.

Hukum kerja & optimasi berbayar (tidak di body JSON)

t/a — disimpan di server · Dalam permintaan: Tidak — jangan kirim kunci ini

Yang disimpan API pada baris induk

  • API publik hanya menerima ROOT_KEYS di tingkat atas dan STAFF_KEYS pada setiap objek staf. Jangan kirim laborLawJurisdiction, usLaborStateCode, laborModelVersion, atau paidOptimization.
  • Saat mengirim, server mengatur SCHEDULE_CONDITION induk dari default bersama: paidOptimization = DEFAULT_PAID_OPTIMIZATION — laborLawCompliance false; balanceStaffLoad, honorShiftWishes, dan preferConsecutiveShifts true (lihat schedule-defaults-shared.ts dan build-schedule-transact-items.ts). laborLawJurisdiction JP, usLaborStateCode GENERIC, laborModelVersion v1.
  • Kendala hukum kerja bergaya undang-undang di optimizer memerlukan flag kepatuhan induk dan per staf aktif; jalur ini mematikannya — jangan harap batas undang-undang hanya dari JSON ini.
  • Model hukum kerja adalah perkiraan untuk penjadwalan, bukan nasihat hukum. Katalog: optimizer/config/labor_models.json.

Dokumentasi

  • Detail lengkap: docs/data-and-api/PUBLIC_API_SCHEDULE_REQUEST_BODY.md §2.1.1 dan §3.1.

Jika mengirim kunci yang dilarang

  • UNKNOWN_FIELDMode ketat menolak properti root atau staff yang tidak dikenal.

Aturan sanitasi

Diterapkan sebelum atau selama validasi seperti di `sanitize.ts`. Menjelaskan penolakan INVALID_STAFF.

staffId

  • Trim; panjang 1–128.
  • Karakter harus cocok /^[a-zA-Z0-9._-]+$/ (tanpa garis miring atau backslash).

displayName

  • Hapus karakter kontrol dan zero-width; rapatkan spasi; trim.
  • Kurung sudut < dan > tidak diizinkan.
  • Maks. 128 karakter setelah sanitasi; tidak boleh kosong.

Kunci sel (requirements / availableCells)

  • Kunci di-trim; harus cocok persis dengan string cellKey di grid yang dihitung.

Respons sukses

202 Accepted

Body lolos validasi dan kondisi ditulis; optimasi dapat berlanjut secara asinkron. Handler dapat mengembalikan JSON dengan conditionId dan field terkait.

Daftar kode error (lengkap)

Error validasi mengembalikan informasi terstruktur dengan `code` yang stabil. Parsing sebelum validasi (INVALID_JSON, PAYLOAD_TOO_LARGE). Kegagalan persistensi dapat muncul sebagai DYNAMODB_ERROR. PATCH /v1/schedule-defaults dapat mengembalikan SCHEDULE_DEFAULTS_SAVE_FAILED (HTTP 400) dengan detail.

KodeArti
INVALID_JSONBody bukan JSON yang valid.
PAYLOAD_TOO_LARGEPanjang byte UTF-8 melebihi maxPayloadBytes (default 512 KiB).
TYPE_ERRORTipe JSON salah atau string apiVersion tidak didukung.
UNKNOWN_FIELDMode ketat: properti tidak diizinkan pada root atau objek staff.
INVALID_TIME_ZONEtimeZone hilang atau bukan nama IANA yang valid.
INVALID_DATE_RANGETanggal bukan YYYY-MM-DD, rentang tidak valid, atau enumerasi kosong.
SCHEDULE_SPAN_TOO_LONGTerlalu banyak hari antara mulai dan akhir (lihat maxScheduleDays).
INVALID_TIME_RANGERentang waktu hilang atau menghasilkan nol slot.
INVALID_GRANULARITYslotGranularityMinutes bukan 60/15 atau tidak diizinkan paket.
INVALID_REQUIREMENTSrequirementsByCell bukan objek atau hitungan bukan bilangan bulat 0–15.
UNKNOWN_CELL_KEYKunci tidak dalam grid jadwal yang dihitung.
INVALID_STAFFstaff kosong, terlalu besar, baris buruk, atau sanitasi gagal.
DUPLICATE_STAFF_IDNilai staffId duplikat.
INVALID_AVAILABLE_CELLEntri kosong atau tidak dikenal di availableCells.
SHORTFALL_CELLSKetersediaan staf tidak cukup vs kebutuhan.
DYNAMODB_ERRORError sementara atau persistensi setelah validasi (tergantung handler).
SCHEDULE_DEFAULTS_SAVE_FAILEDPATCH /v1/schedule-defaults: validasi atau aturan bisnis gagal (lihat error.details).
LABOR_COMPLIANCE_REQUIREDPATCH /v1/staff/{staffId}: laborConstraintMask dikirim saat laborLawCompliance false.

Contoh JSON minimal

{
  "apiVersion": "2026-04-01",
  "timeZone": "Asia/Tokyo",
  "scheduleStartDate": "2026-04-07",
  "scheduleEndDate": "2026-04-13",
  "timeRangeStart": "08:00",
  "timeRangeEnd": "20:00",
  "slotGranularityMinutes": 60,
  "requirementsByCell": {
    "2026-04-07__slot-0": 2
  },
  "staff": [
    {
      "staffId": "550e8400-e29b-41d4-a716-446655440000",
      "displayName": "Example",
      "availableCells": ["2026-04-07__slot-0"]
    }
  ]
}

Bacaan lanjutan. Paket & fitur berbayar: docs/architecture/NURSE_SCHEDULING_SERVICE_SPECIFICATION.md. Isi permintaan POST /v1/schedule: docs/data-and-api/PUBLIC_API_SCHEDULE_REQUEST_BODY.md §1–§11. Isi permintaan PATCH default penyewa: berkas yang sama §12. Kode: app/lib/public-schedule-api/, app/features/schedule-settings/schedule-defaults-actions.ts, app/lib/public-api-write/weekly-shift-wish-tenant.ts. Penerapan: docs/aws/CDK_DEPLOY.md.

Auto Scheduler

Layanan cloud untuk optimasi jadwal shift dan penjadwalan—adil, mematuhi kendala operasional, dan mudah dioperasikan.

Ketentuan Layanan|Kebijakan Privasi|Pengungkapan Hukum

Solver (pengelola)