Auto Scheduler
价格试用使用方法博客常见问题API 文档
登录

本页目录

概览范围订阅与计费认证端点调用方式(快速开始)读取 API(GET)写入 API(PATCH / POST / PUT / DELETE)请求头限额与默认值允许的根键请求体概览快速参考表字段参考(允许值)apiVersiontimeZonescheduleStartDate / scheduleEndDatetimeRangeStart / timeRangeEndslotGranularityMinutesrequirementsByCellstaffavailableCells劳动法与付费选项(服务器默认值)清理成功响应错误码(完整列表)JSON 示例延伸阅读
付费 API · 订阅

付费开发者 API 参考

使用与付费订阅绑定的 API 密钥对接生产环境的排班提交 API。租户排班默认值可通过 PATCH /v1/schedule-defaults 保存;员工周次班次愿望可通过 GET/PUT /v1/staff/{staffId}/weekly-shift-wish 读取或整体替换。计费遵循订阅与合同(不按 API 调用从量计费)。本页说明付费权益、校验规则与错误码 — 可用侧栏搜索跳转到各字段。

本文档的范围

本页仅记载 API Gateway 上的产品 REST API({stage}/v1/*,使用 x-api-key 认证)。

Next.js 的 /api/*(Stripe webhook、OG 图片、Web Vitals 等)属于 Web 应用内部路由,不在本开发者 API 范围内,请勿用于外部集成。

随旧 UI 废止,不提供 GET /v1/processing-history(本页端点列表中也不包含)。

订阅计费与访问

本 HTTP API 属于付费产品:需有生效的商业协议,并在入驻后向贵组织发放密钥。

费用按订阅与合同收取;付费产品通常按登记员工人数(席)按月计费(见定价页)。

沙盒/免费档限制不适用于付费 API 密钥。日程跨度、人数、是否启用 15 分钟粒度等由付费权益决定。详见本页的限额与默认值。

认证

请求须包含在付费订阅下签发的有效 API 密钥。登录后在账户区创建、轮换与吊销密钥。

在 x-api-key 头中发送密钥。密钥与贵组织绑定,用于租户识别及基于计划的访问上限。

管理密钥: API 管理

端点

以 JSON 提交排班条件。这是付费集成面;开通 API 访问后,将按环境提供具体基址 URL。

POST {baseUrl}/v1/schedule

请使用 API 访问开通时或运维联系人提供的基址 URL。

调用方式(快速开始)

将 **BASE_URL** 替换为开通访问时提供的 API 基址 URL(路径前缀)。

在 **x-api-key** 请求头中发送 API 密钥。贵组织(租户)通过密钥自动识别——无需在查询字符串中单独传递租户 ID。

公司信息的读取与更新(GET/PATCH /v1/company)需要有效的付费订阅。若租户未完成计费配置,可能收到 **503**(例如代码 **STRIPE_NOT_CONFIGURED**)。

curl 示例(bash / macOS / Linux / WSL)

Windows PowerShell:行尾的 `\` **不是**续行。请写一行,或用行末 **反引号(`)**续行。

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(GET)

与 POST /v1/schedule 使用相同的基础 URL 与 API 密钥。可选查询参数:limit(1〜100,默认 50)、cursor(将上一次响应中的 nextCursor 原样传入的不透明令牌)。

GET /v1/company 及公司信息更新需要有效的付费订阅。计费未配置时可能为 **503 / STRIPE_NOT_CONFIGURED**。

方法路径说明
GET{baseUrl}/v1/schedule-results列出 SCHEDULE_RESULT 父行:conditionId、status、candidateCount、createdAt/updatedAt 等。DynamoDB 父行分页。
GET{baseUrl}/v1/schedule-results/history排班结果历史搜索(与浏览器历史查看相同)。可选 from / to(ISO 8601,默认服务开始至现在)、keyword、eventName(逗号分隔 INSERT,MODIFY,REMOVE)、limit、cursor。自动合并近期与归档,仅返回 items / nextCursor。
GET{baseUrl}/v1/schedule-results/{conditionId}按 conditionId 获取一条 SCHEDULE_RESULT 父行(JSON 属性;省略 PK/SK)。
GET{baseUrl}/v1/schedule-results/{conditionId}/resolution已解析的优化输出:status、candidates、如有则含 confirmedAssignments。若 status 为 completed 且尚未确认,此 GET 可能自动确认 rank-1(副作用)。手动确认请使用 POST …/confirm-assignments。
GET{baseUrl}/v1/schedule-results/{conditionId}/review手动确认用审查载荷(候选项、requiredByCellKey、员工 allowedCellKeys 等)。
GET{baseUrl}/v1/schedule-results/{conditionId}/emergency-shift-context紧急班次上下文(日历日、员工、时段列表)。需付费订阅;条件不存在时为 null。
GET{baseUrl}/v1/schedule-conditions列出 SCHEDULE_CONDITION 父行(conditionId、日期、可选 publicApiCancelledAt)。
GET{baseUrl}/v1/schedule-conditions/{conditionId}条件父行及 reqDays、staffSnapshots(不含 PK/SK)。
GET{baseUrl}/v1/audit-logs审计日志列表(最新优先;cursor 分页)。
GET{baseUrl}/v1/schedule-defaults租户排班默认值行(SCHEDULE_DEFAULTS),未保存则为 null。
GET{baseUrl}/v1/schedule-actual/{conditionId}实绩班次 SCHEDULE_ACTUAL 行,无则为 null。
GET{baseUrl}/v1/staff/{staffId}/weekly-shift-wish员工周次希望行,无则为 null。
GET{baseUrl}/v1/company返回与 API 密钥上 customerId 对应的 Stripe Customer 字段(姓名、邮箱、电话、地址)。
GET{baseUrl}/v1/users列出租户用户(可选:limit、cursor、userName、role)。
GET{baseUrl}/v1/users/{userId}按路径中的 userId 获取一名用户。
GET{baseUrl}/v1/staff列出租户在册人员(按显示名排序)。
GET{baseUrl}/v1/staff/{staffId}按 staffId 获取一名人员,含 laborLawCompliance、laborFlsaExempt、个人上限、laborConstraintMask 等劳务详情(软删除返回 404)。

写入 API(PATCH / POST / PUT / DELETE)

使用同一 API 密钥发送 JSON 请求体。PATCH /v1/company 会拒绝将公司名称等字段更新为空字符串(与 Web 应用一致)。PATCH /v1/schedule-defaults 保存租户级排班默认值(requirementsByCellKey、计划周期等);付费项按订阅权益生效。PUT /v1/staff/{staffId}/weekly-shift-wish 会整体替换该员工的周次愿望网格(见下方验证说明)。DELETE /v1/users/{userId} 在组织将没有剩余用户或违反末位管理员规则时返回 409。POST /v1/staff 在名册超出合同上限时返回 409 STAFF_LIMIT。

POST /v1/users 需要 userName、email、permissionProfileId(租户权限配置 UUID);可选 locale、password。公开 API 跳过验证码邮件。PATCH 用户:仅发送要变更的字段;若键存在则不允许空字符串。POST /v1/staff 仅需 JSON { "displayName": "..." }。PATCH /v1/staff/{staffId} 可发送 displayName、laborLawCompliance、laborFlsaExempt、personalMaxWeeklyMinutes / personalMaxMonthlyMinutes / personalMaxThreeMonthMinutes(整数或 null 清除)、laborConstraintMask(对象或 null,仅 laborLawCompliance 为 true 时)的任意组合(劳务字段需付费订阅)。POST /v1/schedule-results/{conditionId}/emergency-shift:absentStaffIds、absentDatesYmd 和/或 absentSlots(需付费且参照班次已完成)。POST …/confirm-assignments:assignments 数组及可选 relaxAvailability。PATCH /v1/schedule-defaults 见 PUBLIC_API_SCHEDULE_REQUEST_BODY.md §12。PUT /v1/staff/{staffId}/weekly-shift-wish:scheduleStartDate、scheduleEndDate、timeRangeStart、timeRangeEnd、wishByCellKey。

方法路径说明
PATCH{baseUrl}/v1/company更新公司(计费客户)资料字段。
PATCH{baseUrl}/v1/schedule-defaults保存租户排班默认值(请求体与 schedule-defaults-actions 的 saveSchema 一致)。付费项按订阅权益生效。
POST{baseUrl}/v1/users创建用户。返回 201 及 user JSON。
PATCH{baseUrl}/v1/users/{userId}更新用户字段(userName、email、permissionProfileId、locale)。
DELETE{baseUrl}/v1/users/{userId}删除用户。若无活跃用户或违反末位管理员规则则返回 409。
POST{baseUrl}/v1/staff创建人员(displayName)。返回 201 及 staff JSON。
POST{baseUrl}/v1/schedule-results/{conditionId}/emergency-shift复制已完成参照班次并应用缺勤,创建新 condition(201 与 conditionId)。需付费订阅。
POST{baseUrl}/v1/schedule-results/{conditionId}/confirm-assignments校验并保存手动编辑的分配(200 与 { ok: true })。
PATCH{baseUrl}/v1/staff/{staffId}更新显示名及劳务详情(laborLawCompliance、laborFlsaExempt、个人上限、laborConstraintMask)。
DELETE{baseUrl}/v1/staff/{staffId}软删除人员(设置 deletedAt)。
DELETE{baseUrl}/v1/schedule-conditions/{conditionId}将条件标记为已取消(publicApiCancelledAt);不删除子行。
PUT{baseUrl}/v1/schedule-actual/{conditionId}保存实绩分配 JSON { "assignments": [ ... ] }(对照条件网格校验)。
PUT{baseUrl}/v1/staff/{staffId}/weekly-shift-wish全量替换周次希望:完整网格(1–7 日),每格 wishByCellKey(NONE|LOW|HIGH);粒度遵循租户默认值。
POST{baseUrl}/v1/users/{userId}/restore恢复逻辑删除的用户。

请求头

头说明
x-api-key与付费订阅绑定的 API 密钥(识别租户与计划限额)。
Content-Typeapplication/json

响应头说明

部分响应头(如请求 ID)为追踪用元数据,并非您的 API 密钥。含公司或用户数据的 JSON **响应体**请按机密处理。

付费档限额(权益)

贵合同下的典型校验上限(15 分钟粒度、排班跨度、登记员工数及相关上限)。

设置付费 API(典型)
计费模式Stripe 订阅;产品费用通常按登记员工人数(席)与定价页一致(不按 API 调用从量计费)。
maxScheduleDays标准付费两周详细规划下,每次提交最多 14 个自然日(仅合同允许时可更长)。
maxStaffPerSchedulePOST /v1/schedule 的 staff 数组最多 500 行(PUBLIC_SCHEDULE_MAX_STAFF;正文内联 staffId)。
maxRosterStaffPOST /v1/staff 名册登记最多 30 人(STAFF_ROSTER_MAX_PAID);超出返回 409 STAFF_LIMIT。
allowedGranularities[60, 15] — 15 分钟槽为付费能力;也支持 60 分钟。
maxPayloadBytes524288(512 KiB)UTF-8,除非授予更高上限。
strictUnknownRootKeystrue — 拒绝未知的顶层或 staff 内键

每格所需人数仍为 0–15 的整数。超出请求频率上限时可能返回错误响应。

允许的根键(严格模式)

开启严格模式时,仅接受以下顶层键。其他任何键返回 UNKNOWN_FIELD。

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

请求体(概览)

载荷遵循付费公开排班请求模型:日历日期、时区、槽网格(付费 API 上为 60 或 15 分钟)、每格需求与人员可用性。劳动法管辖、付费优化标志与员工级劳动字段不属于 JSON — 持久化时由服务器写入父行 SCHEDULE_CONDITION 的默认值(见「劳动法与付费选项」)。请勿在正文中包含 DynamoDB 键或内部实体类型。

  • apiVersion — 可选。若填写,仅支持的模式版本字符串。
  • cellKey 格式 — requirementsByCell 与 availableCells 的键须与 `${date}__${slotId}` 一致,其中 date 为范围内 YYYY-MM-DD,slotId 来自时间范围与粒度枚举的槽(与 playground 中 `cellKey` 规则相同)。

快速参考表

字段类型必填说明
timeZonestring是用于解释日期与槽的 IANA 时区。
scheduleStartDate / scheduleEndDatestring (YYYY-MM-DD)是含端点的日历范围;开始 ≤ 结束。
timeRangeStart / timeRangeEndstring (HH:mm)是定义槽列的挂钟范围;须至少生成一个槽。
slotGranularityMinutes60 | 15是付费 API:60(按小时)或 15(15 分钟)。须在 allowedGranularities 中。
requirementsByCellobject是键 = 计算网格中的 cellKey;值 = 0–15 的整数。
staffarray是非空;最大规模见限额;每项:staffId、displayName、可选 availableCells。

字段参考(允许值)

以下各节与 `app/lib/public-schedule-api/validate.ts` 的校验及 `sanitize.ts` 的处理一致,除非传入选项,否则使用 `PUBLIC_SCHEDULE_SUBMIT_DEFAULTS` 的付费默认。JSON 数字请用真实数字类型发送(不要用字符串)。校验通过后,`build-schedule-transact-items.ts` 会添加父行字段(付费优化副本、劳动法管辖、模型版本),这些不是请求键 — 见「劳动法与付费选项」。

apiVersion

string | 省略 · 必填: 否 — 可选

允许值

  • 省略:接受(最新行为)。
  • 若填写,须恰好为 "2026-04-01"(PUBLIC_SCHEDULE_API_VERSION)。
  • 其他字符串拒绝(TYPE_ERROR)。

行为

  • 在 sanitizeApiVersion 中等同 trim 的处理后比较。

常见错误

  • TYPE_ERROR不支持的 apiVersion 值。

timeZone

string · 必填: 是

允许值

  • 线上格式为单个字符串。API 不以封闭枚举列出全部时区:由服务器动态校验。
  • 校验与 `isValidIanaTimeZone` 一致:Luxon `DateTime.now().setZone(zone).isValid` 须为 true。
  • 请使用规范 IANA 标识符,例如 `Asia/Tokyo`、`America/New_York`、`Europe/Berlin`、`UTC`。
  • 勿仅依赖缩写(`EST`、`JST`、`GMT`)— 不是稳定的 IANA ID,可能被拒绝。
  • 列表参考:IANA 发布包(https://www.iana.org/time-zones)或您平台的时区 API。

行为

  • 用于下游规范化中的日期与槽时间。
  • 若客户端需要固定列表,请用相同规则(IANA ID)自行推导,勿指望 JSON 模式中的服务端枚举。

常见错误

  • INVALID_TIME_ZONE缺失、空或无效 IANA 时区。

scheduleStartDate, scheduleEndDate

string, string · 必填: 是 — 两者

允许值

  • 须匹配 /^\d{4}-\d{2}-\d{2}$/(trim 后)。
  • 真实日历日期;含端范围须通过 enumerateDates 至少产生一天。
  • 范围内天数不得超过 maxScheduleDays(付费 API 通常两周规划最多 14 天;精确上限 = 租户权益)。

行为

  • scheduleStartDate 须早于或等于 scheduleEndDate。

常见错误

  • INVALID_DATE_RANGE格式错误、无效日期或空范围。
  • SCHEDULE_SPAN_TOO_LONG超过 maxScheduleDays 的天数。

timeRangeStart, timeRangeEnd

string, string · 必填: 是 — 两者

允许值

  • 非空字符串(trim),与 UI 相同的槽枚举(`enumerateSlotsByGranularity`)。
  • 二者须至少生成一个槽,否则校验失败。

行为

  • 与 slotGranularityMinutes 一起决定 cellKey 所用的 slotId。

常见错误

  • INVALID_TIME_RANGE缺失或该范围下槽数为 0。

slotGranularityMinutes

number(JSON 数字) · 必填: 是

允许值

  • 须恰好为 60 或 15(非字符串)。
  • 还须出现在 allowedGranularities 中。付费 API 通常两者均开;若租户关闭 15 则返回 INVALID_GRANULARITY。

行为

  • 与时间范围一起决定槽数量。

常见错误

  • INVALID_GRANULARITY非 60/15 或方案不允许。

requirementsByCell

Record<string, number> · 必填: 是

允许值

  • 须为普通 JSON 对象(非数组)。
  • 每个键须为预期网格(日期×slotId)上的 cellKey。未知键 → UNKNOWN_CELL_KEY。
  • 每个值须为 JSON 整数,0–15(含)。
  • 省略的格视为需求 0(仅需求≥1 的格参与 SHORTFALL)。

行为

  • 键在 sanitizeCellKey trim 后比较。

常见错误

  • INVALID_REQUIREMENTS不是对象或某键数值无效。
  • UNKNOWN_CELL_KEY键不在计算的日期×槽网格内。

staff

array · 必填: 是 — 非空数组

允许值

  • 长度在 1 与 maxStaffPerSchedule 之间(POST /v1/schedule 默认 500;与 POST /v1/staff 名册上限分开)。
  • 每项须为普通对象,且仅含允许键:staffId、displayName、availableCells(严格模式)。
  • staffId 与 displayName 须通过清理(见「清理」一节)。
  • staffId 在数组内须唯一(DUPLICATE_STAFF_ID)。

行为

  • 保留顺序用于可用性计数。

常见错误

  • INVALID_STAFF空数组、过多行、对象无效或清理失败。
  • UNKNOWN_FIELD严格模式下 staff 对象出现额外键。
  • DUPLICATE_STAFF_ID重复的 staffId。

staff[].availableCells

string[] | 省略 · 必填: 否 — 可选

允许值

  • 省略:该员工视为在整个网格上可用(内部 null 表示「全部格」)。
  • 若提供:须为 JSON 字符串数组;每个非空字符串须为预期网格上的 cellKey。
  • 数组中不允许空字符串(INVALID_AVAILABLE_CELL)。

SHORTFALL 检查

  • 对每个需求≥1 的格,计为可用的员工数须≥需求,否则 SHORTFALL_CELLS。

常见错误

  • INVALID_AVAILABLE_CELL未知 cellKey 或空项。
  • SHORTFALL_CELLS相对需求人数不足。

劳动法与付费优化(不在 JSON 正文中)

不适用 — 服务端持久化 · 是否在请求中: 否 — 切勿发送这些键

API 在父行上存储的内容

  • 公开 API 仅在顶层接受 ROOT_KEYS,每行 staff 仅接受 STAFF_KEYS。请勿发送 laborLawJurisdiction、usLaborStateCode、laborModelVersion 或 paidOptimization。
  • 提交时,服务器用共享默认值填充父 SCHEDULE_CONDITION:paidOptimization = DEFAULT_PAID_OPTIMIZATION — laborLawCompliance 为 false;balanceStaffLoad、honorShiftWishes、preferConsecutiveShifts 为 true(见 schedule-defaults-shared.ts 与 build-schedule-transact-items.ts)。laborLawJurisdiction 为 JP,usLaborStateCode 为 GENERIC,laborModelVersion 为 v1。
  • 优化器中成文法风格的劳动约束需父级与每人员工合规标志同时开启;本路径默认关闭,勿仅凭此 JSON 期望法定上限生效。
  • 劳动模型为排班近似,不构成法律意见。目录:optimizer/config/labor_models.json。

文档

  • 完整说明:docs/data-and-api/PUBLIC_API_SCHEDULE_REQUEST_BODY.md §2.1.1 与 §3.1。

若发送不允许的键

  • UNKNOWN_FIELD严格模式拒绝未知的根或 staff 属性。

清理规则

在 `sanitize.ts` 中于校验前后应用。可解释 INVALID_STAFF 等拒绝原因。

staffId

  • trim;长度 1–128。
  • 字符须匹配 /^[a-zA-Z0-9._-]+$/(不允许斜杠或反斜杠)。

displayName

  • 去除控制字符与零宽字符;压缩空白;trim。
  • 不允许尖括号 < 和 >。
  • 清理后最长 128 字符;不得为空。

单元格键(requirements / availableCells)

  • 键会 trim;须与计算网格中的 cellKey 字符串完全一致。

成功响应

202 Accepted

请求体通过校验并已写入条件;优化可能异步继续。处理程序可返回含 conditionId 等的 JSON。

错误码(完整列表)

校验错误返回带稳定 `code` 的结构化信息。解析先于校验(INVALID_JSON、PAYLOAD_TOO_LARGE)。持久化失败可能表现为 DYNAMODB_ERROR。PATCH /v1/schedule-defaults 失败时可能返回 HTTP 400 与 SCHEDULE_DEFAULTS_SAVE_FAILED(详见 details)。

代码含义
INVALID_JSON正文不是有效 JSON。
PAYLOAD_TOO_LARGEUTF-8 字节长度超过 maxPayloadBytes(默认 512 KiB)。
TYPE_ERRORJSON 类型错误或 apiVersion 字符串不支持。
UNKNOWN_FIELD严格模式:根或 staff 对象上不允许的属性。
INVALID_TIME_ZONEtimeZone 缺失或不是有效 IANA 名称。
INVALID_DATE_RANGE日期非 YYYY-MM-DD、范围无效或枚举为空。
SCHEDULE_SPAN_TOO_LONG起止之间天数过多(见 maxScheduleDays)。
INVALID_TIME_RANGE时间范围缺失或槽数为 0。
INVALID_GRANULARITYslotGranularityMinutes 非 60/15 或方案不允许。
INVALID_REQUIREMENTSrequirementsByCell 不是对象或计数非 0–15 整数。
UNKNOWN_CELL_KEY键不在计算的排班网格中。
INVALID_STAFFstaff 为空、过大、行无效或清理失败。
DUPLICATE_STAFF_IDstaffId 重复。
INVALID_AVAILABLE_CELLavailableCells 中有空项或未知项。
SHORTFALL_CELLS可用人数相对需求不足。
DYNAMODB_ERROR校验后的瞬时或持久化错误(取决于处理程序)。
SCHEDULE_DEFAULTS_SAVE_FAILEDPATCH /v1/schedule-defaults:校验或业务规则失败(见 error.details)。
LABOR_COMPLIANCE_REQUIREDPATCH /v1/staff/{staffId}:laborLawCompliance 为 false 时发送了 laborConstraintMask。

最小 JSON 示例

{
  "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"]
    }
  ]
}

延伸阅读. 产品方案与付费功能:docs/architecture/NURSE_SCHEDULING_SERVICE_SPECIFICATION.md。POST /v1/schedule 请求体:docs/data-and-api/PUBLIC_API_SCHEDULE_REQUEST_BODY.md §1–§11。租户默认值 PATCH 请求体:同一文档 §12。代码:app/lib/public-schedule-api/、app/features/schedule-settings/schedule-defaults-actions.ts、app/lib/public-api-write/weekly-shift-wish-tenant.ts。部署:docs/aws/CDK_DEPLOY.md。

Auto Scheduler

面向企业的排班优化与自动调度云服务,结合规则与约束,帮助制定公平可执行的排班方案。

服务条款|隐私政策|法律声明

Solver(运营主体)