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 mendokumentasikan API REST produk untuk integrasi eksternal.
Webhook penyelesaian hasil jadwal adalah notifikasi HTTPS keluar yang dikonfigurasi di manajemen API (bukan CRUD REST). Lihat Completion webhooks di halaman ini.
Rute browser internal (mis. callback pembayaran atau analitik) bukan pengganti API produk ini. Untuk sistem eksternal, gunakan /v1/* dan webhook penyelesaian.
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. Operasi di luar scopes mengembalikan 403 (API_KEY_SCOPE_DENIED). Kunci lama tanpa atribut scopes tetap mengizinkan semua operasi.
Tempel blok di bawah ke asisten obrolan saat Anda ingin bantuan memanggil API produk ini tanpa mengonfigurasi MCP.
Merangkum base URL, autentikasi, operasi utama, dan peringatan tulis. Tidak pernah menyertakan kunci API nyata.
Untuk panggilan API nyata dari agen, konfigurasikan MCP (agen) daripada hanya mengandalkan teks tempel ini.
Konteks untuk ditempel
Auto Scheduler — Public API context for LLM assistants
Use this when helping a developer call the Auto Scheduler paid product REST API (/v1/*). Prefer configuring Tools MCP when available; this paste is for chat without MCP.
Base URL
- https://api.autoschedulers.com
- Paths are under /v1/*. Do not confuse this with the marketing website origin.
Authentication
- Every request needs header: x-api-key: <API_KEY>
- Never paste a real API key into chat logs or this prompt; ask the user to supply it via environment or a secret store.
- Keys are created in the product under Account → API management.
- JSON writes: Content-Type: application/json
Read endpoints
- GET /v1/schedule-results?limit=10
- GET /v1/schedule-results/{conditionId}
- GET /v1/schedule-conditions
- GET /v1/staff
- GET /v1/staff/{staffId}
- GET /v1/schedule-defaults
- GET /v1/schedule-results/{conditionId}/emergency-shift-context
Write endpoints (confirm with the user before calling)
- POST /v1/schedule — starts a job; may incur charges; max 14 calendar days
- PATCH /v1/schedule-defaults — tenant-wide
- POST /v1/staff
- PATCH /v1/staff/{staffId}
- PUT /v1/staff/{staffId}/weekly-shift-wish — full replace
- POST /v1/schedule-results/{conditionId}/emergency-shift — paid
- POST /v1/schedule-results/{conditionId}/confirm-assignments
- DELETE /v1/schedule-conditions/{conditionId}
- PUT /v1/schedule-actual/{conditionId} — full replace
Minimal curl (read)
curl -sS -H "x-api-key: YOUR_API_KEY" "https://api.autoschedulers.com/v1/staff"
curl -sS -H "x-api-key: YOUR_API_KEY" "https://api.autoschedulers.com/v1/schedule-results?limit=10"
Contract notes
- Schedule submit body needs a supported apiVersion and valid JSON fields — see api-docs Field reference or Docs MCP Resources; do not invent fields.
- planningHorizon on defaults is only week or two_weeks (month_attendance is rejected).
- Outbound completion webhooks are HMAC-signed HTTPS callbacks configured in API management (not REST CRUD).
Safety
- Write endpoints change tenant data. Confirm destructive or irreversible actions with the user before calling them.
- Prefer read/list first when exploring an unfamiliar tenant.
Endpoint
Kirim kondisi jadwal sebagai JSON. Ini adalah permukaan integrasi berbayar; URL dasar pasti diberikan per lingkungan setelah akses API disediakan.
URL dasar
Host API REST publik (/v1/*), bukan URL situs browser. Setel AUTO_SCHEDULER_PUBLIC_API_BASE_URL (MCP) dan BASE_URL (curl) ke nilai ini.
AUTO_SCHEDULER_PUBLIC_API_BASE_URL — URL dasar yang dikonfigurasi untuk lingkungan dokumentasi ini. Gunakan nilai yang sama di MCP dan curl.
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.
Fitur berbayar (detail ketenagakerjaan, beberapa default jadwal) memerlukan langganan berbayar yang aktif. Anda dapat menerima **503** (mis. kode **STRIPE_NOT_CONFIGURED**) bila penagihan belum dikonfigurasi. Profil perusahaan, log audit, dan pengelolaan pengguna (akun) dilakukan di aplikasi web dan bukan bagian dari API publik.
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.
Anda dapat memanggil API REST produk yang sama dari agen seperti Cursor, Claude, Gemini, dan GPT melalui MCP. Operasinya cocok dengan permukaan /v1 di halaman ini.
Server MCP bawaan memakai stdio lokal. Tambahkan command / args / env ke setiap file konfigurasi klien. Buat kunci di Manajemen API (jangan commit atau tempel ke chat publik).
Hanya untuk dokumentasi, MCP Resources tidak perlu login atau kunci API (mcp/api-docs). Halaman ini (/{locale}/api-docs) juga dapat dilihat tanpa masuk; membuat kunci tetap memerlukan Akun → Manajemen API.
Jalur tercepat (disarankan)
Create an API key in Account → API management (never paste the real key into chat).
In the repo: cd mcp/public-api && npm install && npm run build (also mcp/api-docs if you want documentation Resources).
Copy the env snippet below and the Cursor mcp.json under Client-specific setup; replace paths and YOUR_* placeholders.
Restart the client and confirm Tools (list_staff, …) appear. Prefer read tools before any write.
Opsi mana yang dipakai
Tools MCP (public-api)
Live /v1 calls with your API key. Use this when the agent should actually list staff, submit schedules, etc.
Docs MCP (api-docs Resources)
Contract markdown only—no API key. Use when the agent needs field rules or request-body shape.
Copy for LLM (this page)
Orientation text for chat assistants without MCP. Not enough alone for correct request bodies—pair with MCP or the sections below.
Variabel lingkungan wajib (Tools MCP)
AUTO_SCHEDULER_PUBLIC_API_BASE_URL
URL dasar API REST publik (/v1/*)—bukan domain situs. Gunakan host API yang diberikan (slash akhir opsional)
AUTO_SCHEDULER_API_KEY
Kunci dari Manajemen API (jangan commit atau posting publik)
Variabel
Deskripsi
AUTO_SCHEDULER_PUBLIC_API_BASE_URL
URL dasar API REST publik (/v1/*)—bukan domain situs. Gunakan host API yang diberikan (slash akhir opsional)
AUTO_SCHEDULER_API_KEY
Kunci dari Manajemen API (jangan commit atau posting publik)
Konektor konsol cloud Gemini menargetkan MCP jarak jauh. Gunakan Gemini CLI untuk stdio lokal.
GPT (ChatGPT / OpenAI)
Pengaturan konektor ChatGPT (hanya MCP jarak jauh). Tidak ada mcp.json lokal untuk ChatGPT.
ChatGPT (konektor web / desktop) tidak dapat menjalankan proses MCP stdio lokal
Produk ini hanya menyertakan MCP stdio lokal, jadi ChatGPT tidak dapat terhubung langsung
Untuk agen kelas GPT: (1) jalankan MCP yang sama di Cursor / Claude / Gemini CLI, atau (2) panggil REST API halaman ini dengan x-api-key dari Custom Actions / klien API Anda
Anda hanya dapat mendaftarkan konektor ChatGPT jika Anda sendiri meng-host MCP HTTPS jarak jauh (bukan penawaran standar produk).
OpenAI Agents / Responses API juga mengharapkan MCP jarak jauh (HTTP). Server bawaan untuk klien stdio.
Ikhtisar tools (public-api)
Tersedia tools baca dan tulis. Penulisan dapat memulai job berbayar atau mengubah pengaturan organisasi—konfirmasi sebelum memanggil.
If status is completed and not yet confirmed, rank-1 may be auto-confirmed on this GET (side effect). Prefer POST …/confirm-assignments for explicit confirmation.
Kunci API dan badan JSON yang sama dengan rute /v1 lain. Setiap kartu menampilkan contoh badan permintaan minimal yang dapat disalin. Pengguna akun, profil perusahaan, dan log audit tetap di aplikasi web — bukan bagian API ini. POST /v1/staff mengembalikan 409 STAFF_LIMIT jika daftar staf melebihi batas penyewa.
Bidang ketenagakerjaan dan Soft prefer/avoid memerlukan langganan berbayar. Ganti UUID, tanggal, dan kunci sel contoh dengan data penyewa Anda.
PATCH{baseUrl}/v1/schedule-defaults
Saves tenant-wide schedule defaults. Paid-tier fields follow your subscription.
requirementsByCellKey must include every cell in period × slots (missing/extra keys → 400). Cell key = YYYY-MM-DD__HH:mm. planningHorizon: week | two_weeks (month_attendance rejected). Optional: requiredRolesByCellKey, laborLawJurisdiction, usLaborStateCode, linkedMonthPlanStartDate / linkedMonthPlanEndDate, laborModelVersion.
Clones a completed source schedule with absences applied. Returns 201 with new conditionId. Paid subscription required.
Prefer absentDayPairs. Legacy: absentStaffIds + absentDatesYmd (Cartesian). You may also send absentSlots. Optional substituteDayPairs / substituteSlots open coverage (source must be completed).
Updates one staff member. Send any subset of the fields in the example.
Personal max minutes: integer or null to clear. laborConstraintMask only when laborLawCompliance is true. schedulingRoleIds / Soft prefer-avoid: UUID arrays; unknown catalog IDs filtered; prefer and avoid must be disjoint. Labor and Soft require paid.
Replaces the weekly wish grid for one staff member (full replace).
Dates/time range must match the tenant weekly-wish navigation window from schedule defaults. wishByCellKey must cover every cell in that window. Values: NONE | LOW | HIGH.
Saat hasil jadwal mencapai status terminal, kami POST notifikasi JSON bertanda tangan ke URL HTTPS Anda. Body tidak menyertakan hasil penuh; ambil detail dengan GET /v1/schedule-results/{conditionId}.
Hasil playground tidak dikirim. Jika webhook dinonaktifkan atau tidak ada URL tersimpan, tidak ada yang dikirim.
Pengaturan
Setelah masuk, buka Manajemen API dan simpan URL notifikasi HTTPS.
Aktifkan «Aktifkan notifikasi».
Salin rahasia tanda tangan yang ditampilkan sekali (tidak dapat ditampilkan lagi; regenerasikan jika hilang).
Verifikasi tanda tangan di penerima, lalu GET links.result dengan kunci API bila perlu.
Peristiwa
Jenis peristiwa dan kapan dikirim.
schedule.result.terminal
Status hasil jadwal menjadi completed, no_solution, failed, error, atau canceled
type
Kapan
schedule.result.terminal
Status hasil jadwal menjadi completed, no_solution, failed, error, atau canceled
Body permintaan
status hanya terminal. customerId dihilangkan dari body.
Hitung digest dari body mentah (sebelum parse JSON) dan Timestamp, lalu bandingkan dengan Signature. Tolak permintaan saat |now − timestamp| melebihi 300 detik (5 menit) kecuali Anda sengaja mengizinkan simpangan jam yang lebih lebar.
HMAC-SHA256(signingSecret, `${timestamp}.${rawBody}`) → hex; nilai header adalah v1=<hex>
Percobaan ulang
Pada 5xx atau timeout kami mencoba ulang otomatis. Kegagalan terus-menerus masuk antrean dead-letter. Notifikasi push browser memakai jalur terpisah.
Kunci API terikat ke langganan berbayar Anda (mengidentifikasi penyewa dan batas paket).
Content-Type
application/json
Header
Deskripsi
x-api-key
Kunci API terikat ke langganan berbayar Anda (mengidentifikasi penyewa dan batas paket).
Content-Type
application/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).
Model penagihan
Langganan Stripe; biaya produk biasanya mengikuti jumlah kursi staf terdaftar sesuai halaman harga (bukan tagihan per panggilan API).
maxScheduleDays
Hingga 14 hari kalender per pengiriman untuk perencanaan detail dua minggu (batas tetap; kontrak tidak memperpanjang).
maxStaffPerSchedule
Hingga 500 baris staff per POST /v1/schedule (PUBLIC_SCHEDULE_MAX_STAFF; staffId inline di body).
maxRosterStaff
Hingga 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.
maxPayloadBytes
524288 (512 KiB) UTF-8 kecuali batas lebih tinggi diberikan.
strictUnknownRootKeys
true — kunci tingkat atas atau di staff yang tidak dikenal ditolak
Pengaturan
API berbayar (tipikal)
Model penagihan
Langganan Stripe; biaya produk biasanya mengikuti jumlah kursi staf terdaftar sesuai halaman harga (bukan tagihan per panggilan API).
maxScheduleDays
Hingga 14 hari kalender per pengiriman untuk perencanaan detail dua minggu (batas tetap; kontrak tidak memperpanjang).
maxStaffPerSchedule
Hingga 500 baris staff per POST /v1/schedule (PUBLIC_SCHEDULE_MAX_STAFF; staffId inline di body).
maxRosterStaff
Hingga 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.
maxPayloadBytes
524288 (512 KiB) UTF-8 kecuali batas lebih tinggi diberikan.
strictUnknownRootKeys
true — 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.
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 tidak ada di JSON. paidOptimization opsional untuk apiVersion 2026-09-13+ (jika tidak, default tenant). Field Soft prefer/avoid staf memerlukan 2026-09-14. Lihat «Hukum kerja & flag berbayar». Jangan sertakan kunci DynamoDB atau tipe entitas internal di body.
apiVersion — Opsional. Abaikan atau "2026-04-01" = legacy. "2026-09-09" = peran; "2026-09-13" = peran + paidOptimization; "2026-09-14" = Soft prefer/avoid. Versi terbaru: 2026-09-14.
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
timeZone
Tipe
string
Wajib
Ya
Zona waktu IANA untuk menafsirkan tanggal dan slot.
scheduleStartDate / scheduleEndDate
Tipe
string (YYYY-MM-DD)
Wajib
Ya
Rentang kalender inklusif; mulai ≤ akhir.
timeRangeStart / timeRangeEnd
Tipe
string (HH:mm)
Wajib
Ya
Rentang jam dinding yang mendefinisikan kolom slot; harus menghasilkan setidaknya satu slot.
slotGranularityMinutes
Tipe
60 | 15
Wajib
Ya
API berbayar: 60 (per jam) atau 15 (15 menit). Harus ada di allowedGranularities.
requirementsByCell
Tipe
object
Wajib
Ya
Kunci = cellKey di grid yang dihitung; nilai = bilangan bulat 0–15.
requiredRolesByCell
Tipe
object
Wajib
Tidak — hanya 2026-09-09
cellKey → roleId→need. Jumlah need per sel ≤ requirementsByCell. Versi lama → UNKNOWN_FIELD.
staff
Tipe
array
Wajib
Ya
Tidak kosong; ukuran maks. sesuai batas; setiap item: staffId, displayName, availableCells / laborConstraintMask / schedulingRoleIds (2026-09-09+) / Soft prefer-avoid (2026-09-14) opsional.
Bidang
Tipe
Wajib
Catatan
timeZone
string
Ya
Zona waktu IANA untuk menafsirkan tanggal dan slot.
scheduleStartDate / scheduleEndDate
string (YYYY-MM-DD)
Ya
Rentang kalender inklusif; mulai ≤ akhir.
timeRangeStart / timeRangeEnd
string (HH:mm)
Ya
Rentang jam dinding yang mendefinisikan kolom slot; harus menghasilkan setidaknya satu slot.
slotGranularityMinutes
60 | 15
Ya
API berbayar: 60 (per jam) atau 15 (15 menit). Harus ada di allowedGranularities.
requirementsByCell
object
Ya
Kunci = cellKey di grid yang dihitung; nilai = bilangan bulat 0–15.
requiredRolesByCell
object
Tidak — hanya 2026-09-09
cellKey → roleId→need. Jumlah need per sel ≤ requirementsByCell. Versi lama → UNKNOWN_FIELD.
staff
array
Ya
Tidak kosong; ukuran maks. sesuai batas; setiap item: staffId, displayName, availableCells / laborConstraintMask / schedulingRoleIds (2026-09-09+) / Soft prefer-avoid (2026-09-14) opsional.
Referensi field (nilai yang diizinkan)
Aturan field berikut cocok dengan validator API publik. Kirim angka JSON sebagai angka sebenarnya (bukan string). Setelah validasi, server dapat menyimpan default baris induk (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 "2026-04-01", "2026-09-09", "2026-09-13", atau "2026-09-14". Versi terbaru yang dipublikasikan: 2026-09-14.
String lain ditolak (TYPE_ERROR).
Perilaku
Dibandingkan setelah penanganan setara trim di sanitizeApiVersion.
Versi memilih kumpulan kunci tingkat atas dan objek staff yang diizinkan (peran pada 2026-09-09+; paidOptimization pada 2026-09-13+; Soft prefer/avoid pada 2026-09-14).
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.
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: batas tetap 14 hari untuk perencanaan dua minggu).
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.
requiredRolesByCell
object | omitted · Wajib: Tidak — opsional; hanya apiVersion 2026-09-09
Nilai yang diizinkan
Hanya diterima saat apiVersion adalah "2026-09-09". Diabaikan / 2026-04-01 → UNKNOWN_FIELD.
Harus objek JSON biasa. Setiap kunci adalah cellKey di grid requirements.
Setiap nilai adalah objek yang memetakan roleId (UUID) → need bilangan bulat ≥ 1.
Untuk setiap sel, sum(need) harus ≤ requirementsByCell[cell] (atau 0 jika diabaikan).
Jalur submit hanya memvalidasi bentuk UUID dan jumlah (tanpa lookup katalog).
Perilaku
Nilai dinormalisasi dan divalidasi (ID peran UUID; jumlah need ≤ headcount).
Disimpan sebagai requiredRolesBySlot pada baris kebutuhan harian.
Kesalahan umum
UNKNOWN_FIELDDikirim pada apiVersion lama.
INVALID_REQUIREMENTSBentuk salah, roleId bukan UUID, atau jumlah melebihi headcount.
UNKNOWN_CELL_KEYcellKey tidak ada di grid 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 untuk apiVersion: staffId, displayName, availableCells, laborConstraintMask; plus schedulingRoleIds pada 2026-09-09+; plus preferredSchedulingRoleIds / avoidedSchedulingRoleIds pada 2026-09-14 (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.
staff[].schedulingRoleIds / Soft prefer-avoid
string[] | omitted · Wajib: Tidak — opsional; peran pada 2026-09-09+; Soft pada 2026-09-14
Nilai yang diizinkan
schedulingRoleIds: diterima pada apiVersion 2026-09-09+. Soft preferredSchedulingRoleIds / avoidedSchedulingRoleIds: hanya 2026-09-14. Versi lebih lama → UNKNOWN_FIELD.
Disalin ke baris snapshot kondisi staf saat tidak kosong.
Kesalahan umum
UNKNOWN_FIELDDikirim pada apiVersion yang tidak mengizinkan kunci.
INVALID_STAFFBukan array, elemen bukan UUID, atau tumpang tindih Soft prefer/avoid.
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 kunci tingkat atas dan objek staf yang diizinkan untuk apiVersion Anda. Jangan kirim laborLawJurisdiction, usLaborStateCode, atau laborModelVersion. paidOptimization opsional untuk apiVersion 2026-09-13+. Field Soft prefer/avoid staf memerlukan 2026-09-14.
Saat mengirim, server mengatur SCHEDULE_CONDITION induk dari default bersama: paidOptimization dari body (apiVersion 2026-09-13+) atau SCHEDULE_DEFAULTS tenant jika diabaikan; jika tidak, DEFAULT_PAID_OPTIMIZATION (laborLawCompliance induk dipaksa true). laborLawJurisdiction / usLaborStateCode / laborModelVersion diwarisi dari SCHEDULE_DEFAULTS tenant (cadangan JP / GENERIC / model sesuai yurisdiksi).
Kendala hukum kerja bergaya undang-undang di optimizer memerlukan flag kepatuhan induk dan per staf aktif. Flag per staf tidak ada di JSON: server mewarisi dari daftar staf tenant (staffId yang tidak terdaftar default aktif). POST /v1/staff juga default aktif; matikan per orang dengan PATCH berbayar /v1/staff/{staffId}.
Model hukum kerja adalah perkiraan untuk penjadwalan, bukan nasihat hukum. Katalog: .
Dokumentasi
Detail lengkap: this page 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. Aturan ini menjelaskan mengapa nilai dapat ditolak sebagai 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.
INVALID_JSON
Body bukan JSON yang valid.
PAYLOAD_TOO_LARGE
Panjang byte UTF-8 melebihi maxPayloadBytes (default 512 KiB).
TYPE_ERROR
Tipe JSON salah atau string apiVersion tidak didukung.
UNKNOWN_FIELD
Mode ketat: properti tidak diizinkan pada root atau objek staff.
INVALID_TIME_ZONE
timeZone hilang atau bukan nama IANA yang valid.
INVALID_DATE_RANGE
Tanggal bukan YYYY-MM-DD, rentang tidak valid, atau enumerasi kosong.
SCHEDULE_SPAN_TOO_LONG
Terlalu banyak hari antara mulai dan akhir (lihat maxScheduleDays).
INVALID_TIME_RANGE
Rentang waktu hilang atau menghasilkan nol slot.
INVALID_GRANULARITY
slotGranularityMinutes bukan 60/15 atau tidak diizinkan paket.
INVALID_REQUIREMENTS
requirementsByCell bukan objek atau hitungan bukan bilangan bulat 0–15.
UNKNOWN_CELL_KEY
Kunci tidak dalam grid jadwal yang dihitung.
INVALID_STAFF
staff kosong, terlalu besar, baris buruk, atau sanitasi gagal.
DUPLICATE_STAFF_ID
Nilai staffId duplikat.
INVALID_AVAILABLE_CELL
Entri kosong atau tidak dikenal di availableCells.
SHORTFALL_CELLS
Ketersediaan staf tidak cukup vs kebutuhan.
DYNAMODB_ERROR
Error sementara atau persistensi setelah validasi (tergantung handler).
SCHEDULE_DEFAULTS_SAVE_FAILED
PATCH /v1/schedule-defaults: validasi atau aturan bisnis gagal (lihat error.details).
LABOR_COMPLIANCE_REQUIRED
PATCH /v1/staff/{staffId}: laborConstraintMask dikirim saat laborLawCompliance false.
Kode
Arti
INVALID_JSON
Body bukan JSON yang valid.
PAYLOAD_TOO_LARGE
Panjang byte UTF-8 melebihi maxPayloadBytes (default 512 KiB).
TYPE_ERROR
Tipe JSON salah atau string apiVersion tidak didukung.
UNKNOWN_FIELD
Mode ketat: properti tidak diizinkan pada root atau objek staff.
INVALID_TIME_ZONE
timeZone hilang atau bukan nama IANA yang valid.
INVALID_DATE_RANGE
Tanggal bukan YYYY-MM-DD, rentang tidak valid, atau enumerasi kosong.
SCHEDULE_SPAN_TOO_LONG
Terlalu banyak hari antara mulai dan akhir (lihat maxScheduleDays).
INVALID_TIME_RANGE
Rentang waktu hilang atau menghasilkan nol slot.
INVALID_GRANULARITY
slotGranularityMinutes bukan 60/15 atau tidak diizinkan paket.
INVALID_REQUIREMENTS
requirementsByCell bukan objek atau hitungan bukan bilangan bulat 0–15.
UNKNOWN_CELL_KEY
Kunci tidak dalam grid jadwal yang dihitung.
INVALID_STAFF
staff kosong, terlalu besar, baris buruk, atau sanitasi gagal.
DUPLICATE_STAFF_ID
Nilai staffId duplikat.
INVALID_AVAILABLE_CELL
Entri kosong atau tidak dikenal di availableCells.
SHORTFALL_CELLS
Ketersediaan staf tidak cukup vs kebutuhan.
DYNAMODB_ERROR
Error sementara atau persistensi setelah validasi (tergantung handler).
SCHEDULE_DEFAULTS_SAVE_FAILED
PATCH /v1/schedule-defaults: validasi atau aturan bisnis gagal (lihat error.details).
LABOR_COMPLIANCE_REQUIRED
PATCH /v1/staff/{staffId}: laborConstraintMask dikirim saat laborLawCompliance false.
Di halaman ini. POST /v1/schedule: referensi field dan tabel singkat. Default penyewa: endpoint tulis → PATCH /v1/schedule-defaults. Labor / Soft: PATCH /v1/staff/{staffId}. Paket: halaman harga.