Integre a API de produção para envio de escalas com uma chave API associada à sua subscrição paga. As predefinições do inquilino guardam-se com PATCH /v1/schedule-defaults; os desejos semanais por colaborador leem-se ou substituem-se com GET/PUT /v1/staff/{staffId}/weekly-shift-wish. A faturação segue o seu plano e contrato (não há cobrança por chamada API medida). Esta página documenta direitos, regras de validação e códigos de erro — use a barra lateral para saltar para cada campo.
Esta pagina documenta a API REST de produto para integracoes externas (API Gateway {stage}/v1/*, autenticacao com x-api-key).
Os webhooks de conclusao de resultados sao notificacoes HTTPS de saida configuradas na gestao de API (nao CRUD REST). Ver Completion webhooks nesta pagina.
Rotas internas do browser (p. ex. callbacks de pagamento ou analytics) nao substituem esta API de produto. Para sistemas externos, use /v1/* e os webhooks de conclusao.
Esta API HTTP faz parte do produto pago: o acesso requer um acordo comercial ativo e as chaves são emitidas à sua organização após o onboarding.
A faturação baseia-se na subscrição e no contrato. Em planos pagos, os custos seguem normalmente a página de preços (p. ex. por colaborador registado e mês).
Os limites do playground ou do nível gratuito não se aplicam às chaves API pagas. Os limites efetivos (duração, número de colaboradores, granularidade de 15 minutos) dependem dos seus direitos pagos. Consulte Limites e predefinições nesta página.
Os pedidos devem incluir uma chave API válida emitida na sua subscrição paga. Crie, rode e revogue chaves na área da conta após iniciar sessão.
Envie a chave no cabeçalho x-api-key. As chaves estão ligadas à sua organização para identificação do inquilino e limites de acesso do plano.
Gerir chaves: Gestão de API
Envie uma condição de escala em JSON. É a superfície de integração paga; o URL base exato é fornecido por ambiente após o acesso à API ser provisionado.
Use o URL base fornecido quando o acesso à API foi provisionado ou pelo seu contacto de operações.
Substitua **BASE_URL** pelo URL base da API (prefixo do caminho) fornecido quando o seu acesso foi provisionado.
Envie a sua chave API no cabeçalho **x-api-key**. A sua organização (inquilino) é identificada pela chave — não precisa de passar um ID de inquilino separado na query string.
Funções pagas (turno de emergência, detalhes laborais, alguns valores predefinidos) exigem uma subscrição paga ativa. Pode receber **503** (p. ex. código **STRIPE_NOT_CONFIGURED**) quando a faturação não estiver configurada. O perfil da empresa, registos de auditoria e gestão de utilizadores (contas) são feitos na aplicação web e não fazem parte da API pública.
Windows PowerShell: uma barra invertida final `\` **não** continua a linha. Use uma só linha, ou termine cada linha com crase (`) para continuar.
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/staff"
Mesmo URL de base e mesma chave API que POST /v1/schedule. Consulta opcional: limit (1–100, predefinição 50), cursor (token opaco: reenvie o campo nextCursor da resposta anterior).
Lista linhas pai SCHEDULE_RESULT: conditionId, status, candidateCount, createdAt/updatedAt, etc. Paginação DynamoDB.
Pesquisa de histórico de resultados (como no navegador). from / to (ISO 8601, padrão início do serviço até agora), keyword, eventName (INSERT,MODIFY,REMOVE separados por vírgula), limit, cursor. Funde recente e arquivo automaticamente; só items / nextCursor.
Obtém uma linha pai SCHEDULE_RESULT por conditionId (atributos JSON; sem PK/SK).
Saída de otimização resolvida: status, candidates, confirmedAssignments quando presentes. Se status for completed e ainda não confirmado, rank-1 pode ser auto-confirmado neste GET (efeito colateral). Use POST …/confirm-assignments para confirmação manual.
Payload de revisão para confirmação manual (candidatos, requiredByCellKey, allowedCellKeys do pessoal, etc.).
Contexto de turno de emergência (datas, pessoal, slots). Subscrição paga necessária; null se a condição não existir.
Lista linhas pai SCHEDULE_CONDITION (conditionId, datas, publicApiCancelledAt opcional).
Linha pai da condição mais reqDays e staffSnapshots (sem PK/SK).
Linha de predefinições do inquilino (SCHEDULE_DEFAULTS) ou null se ainda não guardada.
Linha SCHEDULE_ACTUAL de turnos reais, ou null se inexistente.
Linha de desejos semanais do colaborador, ou null se inexistente.
Lista pessoal ativo do inquilino (ordenado por nome apresentado).
Obtém uma pessoa por staffId com detalhes laborais (laborLawCompliance, laborFlsaExempt, tetos pessoais, laborConstraintMask). Eliminação lógica → 404.
| Método | Caminho | Descrição |
|---|---|---|
| GET | {baseUrl}/v1/schedule-results | Lista linhas pai SCHEDULE_RESULT: conditionId, status, candidateCount, createdAt/updatedAt, etc. Paginação DynamoDB. |
| GET | {baseUrl}/v1/schedule-results/history | Pesquisa de histórico de resultados (como no navegador). from / to (ISO 8601, padrão início do serviço até agora), keyword, eventName (INSERT,MODIFY,REMOVE separados por vírgula), limit, cursor. Funde recente e arquivo automaticamente; só items / nextCursor. |
| GET | {baseUrl}/v1/schedule-results/{conditionId} | Obtém uma linha pai SCHEDULE_RESULT por conditionId (atributos JSON; sem PK/SK). |
| GET | {baseUrl}/v1/schedule-results/{conditionId}/resolution | Saída de otimização resolvida: status, candidates, confirmedAssignments quando presentes. Se status for completed e ainda não confirmado, rank-1 pode ser auto-confirmado neste GET (efeito colateral). Use POST …/confirm-assignments para confirmação manual. |
| GET | {baseUrl}/v1/schedule-results/{conditionId}/review | Payload de revisão para confirmação manual (candidatos, requiredByCellKey, allowedCellKeys do pessoal, etc.). |
| GET | {baseUrl}/v1/schedule-results/{conditionId}/emergency-shift-context | Contexto de turno de emergência (datas, pessoal, slots). Subscrição paga necessária; null se a condição não existir. |
| GET | {baseUrl}/v1/schedule-conditions | Lista linhas pai SCHEDULE_CONDITION (conditionId, datas, publicApiCancelledAt opcional). |
| GET | {baseUrl}/v1/schedule-conditions/{conditionId} | Linha pai da condição mais reqDays e staffSnapshots (sem PK/SK). |
| GET | {baseUrl}/v1/schedule-defaults | Linha de predefinições do inquilino (SCHEDULE_DEFAULTS) ou null se ainda não guardada. |
| GET | {baseUrl}/v1/schedule-actual/{conditionId} | Linha SCHEDULE_ACTUAL de turnos reais, ou null se inexistente. |
| GET | {baseUrl}/v1/staff/{staffId}/weekly-shift-wish | Linha de desejos semanais do colaborador, ou null se inexistente. |
| GET | {baseUrl}/v1/staff | Lista pessoal ativo do inquilino (ordenado por nome apresentado). |
| GET | {baseUrl}/v1/staff/{staffId} | Obtém uma pessoa por staffId com detalhes laborais (laborLawCompliance, laborFlsaExempt, tetos pessoais, laborConstraintMask). Eliminação lógica → 404. |
Use a mesma chave API com corpos JSON. PATCH /v1/schedule-defaults guarda predefinições do inquilino (requirementsByCellKey, horizonte de planeamento, etc.); os campos pagos seguem a sua subscrição. PUT /v1/staff/{staffId}/weekly-shift-wish substitui por completo a grelha semanal de desejos desse colaborador (veja a nota de validação). POST /v1/staff devolve 409 STAFF_LIMIT se a lista excedesse o limite contratual. A gestão de utilizadores (contas), o perfil da empresa e os registos de auditoria são feitos na aplicação web e não fazem parte da API pública.
POST /v1/staff: só JSON { "displayName": "..." }. PATCH /v1/staff/{staffId}: displayName, laborLawCompliance, laborFlsaExempt, personalMaxWeeklyMinutes / personalMaxMonthlyMinutes / personalMaxThreeMonthMinutes (inteiro ou null), laborConstraintMask (objeto ou null se laborLawCompliance true) — campos laborais pagos. POST /v1/schedule-results/{conditionId}/emergency-shift: absentStaffIds, absentDatesYmd e/ou absentSlots (pago, plano fonte concluído). POST …/confirm-assignments: array assignments e relaxAvailability opcional. PATCH /v1/schedule-defaults: PUBLIC_API_SCHEDULE_REQUEST_BODY.md §12. PUT /v1/staff/{staffId}/weekly-shift-wish: scheduleStartDate, scheduleEndDate, timeRangeStart, timeRangeEnd, wishByCellKey.
Guarda predefinições de horários do inquilino (corpo alinhado com saveSchema em schedule-defaults-actions). Os campos pagos seguem a sua subscrição.
Cria uma pessoa (displayName). Devolve 201 com JSON staff.
Clona plano fonte concluído com ausências aplicadas; devolve 201 com conditionId. Subscrição paga necessária.
Valida e grava atribuições editadas manualmente (200 com { ok: true }).
Atualiza displayName e detalhes laborais (laborLawCompliance, laborFlsaExempt, tetos pessoais, laborConstraintMask).
Eliminação lógica de uma pessoa (define deletedAt).
Marca a condição como cancelada (publicApiCancelledAt); não elimina linhas filhas.
Guarda atribuições reais JSON { "assignments": [ ... ] } (validadas contra a grelha da condição).
Substitui desejos semanais: grelha completa (1–7 dias), wishByCellKey por célula (NONE|LOW|HIGH); granularidade dos padrões do inquilino.
| Método | Caminho | Descrição |
|---|---|---|
| PATCH | {baseUrl}/v1/schedule-defaults | Guarda predefinições de horários do inquilino (corpo alinhado com saveSchema em schedule-defaults-actions). Os campos pagos seguem a sua subscrição. |
| POST | {baseUrl}/v1/staff | Cria uma pessoa (displayName). Devolve 201 com JSON staff. |
| POST | {baseUrl}/v1/schedule-results/{conditionId}/emergency-shift | Clona plano fonte concluído com ausências aplicadas; devolve 201 com conditionId. Subscrição paga necessária. |
| POST | {baseUrl}/v1/schedule-results/{conditionId}/confirm-assignments | Valida e grava atribuições editadas manualmente (200 com { ok: true }). |
| PATCH | {baseUrl}/v1/staff/{staffId} | Atualiza displayName e detalhes laborais (laborLawCompliance, laborFlsaExempt, tetos pessoais, laborConstraintMask). |
| DELETE | {baseUrl}/v1/staff/{staffId} | Eliminação lógica de uma pessoa (define deletedAt). |
| DELETE | {baseUrl}/v1/schedule-conditions/{conditionId} | Marca a condição como cancelada (publicApiCancelledAt); não elimina linhas filhas. |
| PUT | {baseUrl}/v1/schedule-actual/{conditionId} | Guarda atribuições reais JSON { "assignments": [ ... ] } (validadas contra a grelha da condição). |
| PUT | {baseUrl}/v1/staff/{staffId}/weekly-shift-wish | Substitui desejos semanais: grelha completa (1–7 dias), wishByCellKey por célula (NONE|LOW|HIGH); granularidade dos padrões do inquilino. |
When a schedule result reaches a terminal status, we POST a signed JSON notification to your HTTPS URL. The body does not include the full result; fetch details with GET /v1/schedule-results/{conditionId}.
Playground results are not delivered. If the webhook is disabled or no URL is saved, nothing is sent.
Event type and when it is sent.
schedule.result.terminal
Schedule result status becomes completed, no_solution, failed, error, or canceled
| type | When |
|---|---|
| schedule.result.terminal | Schedule result status becomes completed, no_solution, failed, error, or canceled |
status is terminal only. customerId is omitted from the body.
{
"type": "schedule.result.terminal",
"conditionId": "019ee481-e855-7000-abd8-977cbfd64ffc",
"status": "completed",
"occurredAt": "2026-07-16T13:00:54.694Z",
"links": {
"result": "{baseUrl}/v1/schedule-results/019ee481-e855-7000-abd8-977cbfd64ffc"
}
}Content-Type
application/json
User-Agent
AutoScheduler-Webhook/1.0
X-AutoScheduler-Timestamp
Unix seconds as a string
X-AutoScheduler-Signature
v1=<hex> (see verification below)
| Header | Description |
|---|---|
| Content-Type | application/json |
| User-Agent | AutoScheduler-Webhook/1.0 |
| X-AutoScheduler-Timestamp | Unix seconds as a string |
| X-AutoScheduler-Signature | v1=<hex> (see verification below) |
Compute a digest from the raw body (before JSON parse) and the Timestamp, then compare to Signature. Reject requests when |now − timestamp| exceeds 300 seconds (5 minutes) unless you intentionally allow wider clock skew.
HMAC-SHA256(signingSecret, `${timestamp}.${rawBody}`) → hex; header value is v1=<hex>On 5xx or timeout we retry automatically. Persistent failures go to a dead-letter queue. Browser push notifications use a separate path.
Register & enable: API management
x-api-key
Chave API ligada à sua subscrição paga (identifica o inquilino e os limites do plano).
Content-Type
application/json
| Cabeçalho | Descrição |
|---|---|
| x-api-key | Chave API ligada à sua subscrição paga (identifica o inquilino e os limites do plano). |
| Content-Type | application/json |
Alguns cabeçalhos de resposta (como IDs de pedido) são metadados de rastreio, não a sua chave API. Trate os **corpos** JSON como confidenciais quando incluírem dados da empresa ou do utilizador.
Limites de validação típicos do seu contrato (granularidade de 15 minutos, horizonte de escala, número de colaboradores registados e tetos relacionados).
Modelo de faturação
Subscrição Stripe; as taxas do produto escalam normalmente com os lugares de pessoal registados conforme a página de preços (sem cobrança por chamada API).
maxScheduleDays
Até 14 dias civis por envio no planeamento detalhado padrão de duas semanas (intervalos maiores só se o contrato permitir).
maxStaffPerSchedule
Até 500 linhas staff por POST /v1/schedule (PUBLIC_SCHEDULE_MAX_STAFF; staffId inline no corpo).
maxRosterStaff
Até 30 colaboradores ativos via POST /v1/staff (STAFF_ROSTER_MAX_PAID); 409 STAFF_LIMIT se excedido.
allowedGranularities
[60, 15] — slots de 15 minutos são uma capacidade paga; 60 minutos também é suportado.
maxPayloadBytes
524288 (512 KiB) UTF-8 salvo um teto superior concedido.
strictUnknownRootKeys
true — chaves desconhecidas no nível superior ou em staff são rejeitadas
| Definição | API paga (típico) |
|---|---|
| Modelo de faturação | Subscrição Stripe; as taxas do produto escalam normalmente com os lugares de pessoal registados conforme a página de preços (sem cobrança por chamada API). |
| maxScheduleDays | Até 14 dias civis por envio no planeamento detalhado padrão de duas semanas (intervalos maiores só se o contrato permitir). |
| maxStaffPerSchedule | Até 500 linhas staff por POST /v1/schedule (PUBLIC_SCHEDULE_MAX_STAFF; staffId inline no corpo). |
| maxRosterStaff | Até 30 colaboradores ativos via POST /v1/staff (STAFF_ROSTER_MAX_PAID); 409 STAFF_LIMIT se excedido. |
| allowedGranularities | [60, 15] — slots de 15 minutos são uma capacidade paga; 60 minutos também é suportado. |
| maxPayloadBytes | 524288 (512 KiB) UTF-8 salvo um teto superior concedido. |
| strictUnknownRootKeys | true — chaves desconhecidas no nível superior ou em staff são rejeitadas |
A necessidade de pessoal por célula continua a ser um inteiro de 0 a 15. Exceder os limites de frequência de pedidos pode devolver uma resposta de erro.
Com o modo estrito ativo, só são aceites as seguintes chaves de nível superior. Qualquer outra devolve UNKNOWN_FIELD.
O payload segue o modelo público pago: datas de calendário, fuso horário, grelha de slots (60 ou 15 minutos na API paga), necessidades por célula e disponibilidade do pessoal. A jurisdição laboral, os indicadores de otimização paga e os campos laborais ao nível do colaborador não fazem parte do JSON — o servidor escreve predefinições na linha ascendente SCHEDULE_CONDITION ao persistir (veja «Legislação laboral e opções pagas»). Não inclua chaves DynamoDB nem tipos de entidade internos no corpo.
timeZone
Fuso horário IANA para interpretar datas e slots.
scheduleStartDate / scheduleEndDate
Intervalo de calendário inclusivo; início ≤ fim.
timeRangeStart / timeRangeEnd
Intervalo horário de relógio que define a coluna de slots; deve gerar pelo menos um slot.
slotGranularityMinutes
API paga: 60 (hora) ou 15 (quartos hora). Deve constar em allowedGranularities.
requirementsByCell
Chaves = cellKey na grelha calculada; valores = inteiro 0–15.
staff
Não vazio; tamanho máx. segundo limites; cada item: staffId, displayName, availableCells opcional.
| Campo | Tipo | Obrigatório | Notas |
|---|---|---|---|
| timeZone | string | Sim | Fuso horário IANA para interpretar datas e slots. |
| scheduleStartDate / scheduleEndDate | string (YYYY-MM-DD) | Sim | Intervalo de calendário inclusivo; início ≤ fim. |
| timeRangeStart / timeRangeEnd | string (HH:mm) | Sim | Intervalo horário de relógio que define a coluna de slots; deve gerar pelo menos um slot. |
| slotGranularityMinutes | 60 | 15 | Sim | API paga: 60 (hora) ou 15 (quartos hora). Deve constar em allowedGranularities. |
| requirementsByCell | object | Sim | Chaves = cellKey na grelha calculada; valores = inteiro 0–15. |
| staff | array | Sim | Não vazio; tamanho máx. segundo limites; cada item: staffId, displayName, availableCells opcional. |
As secções seguintes espelham o validador em `app/lib/public-schedule-api/validate.ts` e os sanitizadores em `sanitize.ts`, com os predefinidos pagos de `PUBLIC_SCHEDULE_SUBMIT_DEFAULTS` salvo opções explícitas. Envie números JSON como números reais (não como strings). Após a validação, `build-schedule-transact-items.ts` adiciona campos da linha ascendente (cópia de otimização paga, jurisdição laboral, versão do modelo) que não são chaves de pedido — veja «Legislação laboral e opções pagas».
string | omitido · Obrigatório: Não — opcional
Valores permitidos
Comportamento
Erros típicos
TYPE_ERRORValor apiVersion não suportado.string · Obrigatório: Sim
Valores permitidos
Comportamento
Erros típicos
INVALID_TIME_ZONEEm falta, vazio ou zona IANA inválida.string, string · Obrigatório: Sim — ambos
Valores permitidos
Comportamento
Erros típicos
INVALID_DATE_RANGEFormato incorreto, datas inválidas ou intervalo vazio.SCHEDULE_SPAN_TOO_LONGMais de maxScheduleDays dias.string, string · Obrigatório: Sim — ambos
Valores permitidos
Comportamento
Erros típicos
INVALID_TIME_RANGEValores em falta ou zero slots para o intervalo.number (número JSON) · Obrigatório: Sim
Valores permitidos
Comportamento
Erros típicos
INVALID_GRANULARITYNão é 60/15 ou não permitido no plano.Record<string, number> · Obrigatório: Sim
Valores permitidos
Comportamento
Erros típicos
INVALID_REQUIREMENTSNão é um objeto ou valor numérico inválido para uma chave.UNKNOWN_CELL_KEYChave fora da grelha data × slot calculada.array · Obrigatório: Sim — array não vazio
Valores permitidos
Comportamento
Erros típicos
INVALID_STAFFArray vazio, demasiadas linhas, objeto inválido ou sanitização falhada.UNKNOWN_FIELDChave extra num objeto staff em modo estrito.DUPLICATE_STAFF_IDO mesmo staffId duas vezes.string[] | omitido · Obrigatório: Não — opcional
Valores permitidos
Verificação SHORTFALL
Erros típicos
INVALID_AVAILABLE_CELLChave de célula desconhecida ou entrada vazia.SHORTFALL_CELLSPessoal insuficiente face à necessidade numa célula.n/d — persistido no servidor · No pedido: Não — nunca envie estas chaves
O que a API guarda na linha ascendente
Documentação
Se enviar chaves não permitidas
UNKNOWN_FIELDO modo estrito rejeita propriedades desconhecidas na raiz ou em staff.Aplicadas antes ou durante a validação como em `sanitize.ts`. Explicam rejeições como INVALID_STAFF.
staffId
displayName
Chaves de célula (requirements / availableCells)
202 Accepted
O corpo passou na validação e a condição foi escrita; a otimização pode continuar de forma assíncrona. O manipulador pode devolver JSON com conditionId e campos relacionados.
Os erros de validação devolvem informação estruturada com um `code` estável. A análise ocorre antes da validação (INVALID_JSON, PAYLOAD_TOO_LARGE). Falhas de persistência podem aparecer como DYNAMODB_ERROR. PATCH /v1/schedule-defaults pode devolver SCHEDULE_DEFAULTS_SAVE_FAILED (HTTP 400) com detalhes.
INVALID_JSON
O corpo não é JSON válido.
PAYLOAD_TOO_LARGE
O comprimento em bytes UTF-8 excede maxPayloadBytes (predefinição 512 KiB).
TYPE_ERROR
Tipo JSON incorreto ou cadeia apiVersion não suportada.
UNKNOWN_FIELD
Modo estrito: propriedade não permitida na raiz ou no objeto staff.
INVALID_TIME_ZONE
timeZone em falta ou não é um nome IANA válido.
INVALID_DATE_RANGE
Datas não YYYY-MM-DD, intervalo inválido ou enumeração vazia.
SCHEDULE_SPAN_TOO_LONG
Demasiados dias entre início e fim (veja maxScheduleDays).
INVALID_TIME_RANGE
Intervalo horário em falta ou gera zero slots.
INVALID_GRANULARITY
slotGranularityMinutes não é 60/15 ou não permitido no plano.
INVALID_REQUIREMENTS
requirementsByCell não é objeto ou a contagem não é inteiro 0–15.
UNKNOWN_CELL_KEY
Chave não está na grelha de planeamento calculada.
INVALID_STAFF
staff vazio, demasiado grande, linha inválida ou sanitização falhada.
DUPLICATE_STAFF_ID
Valores staffId duplicados.
INVALID_AVAILABLE_CELL
Entrada vazia ou desconhecida em availableCells.
SHORTFALL_CELLS
Disponibilidade insuficiente face às necessidades.
DYNAMODB_ERROR
Erro transitório ou de persistência após validação (depende do manipulador).
SCHEDULE_DEFAULTS_SAVE_FAILED
PATCH /v1/schedule-defaults: validação ou regras de negócio falharam (ver error.details).
LABOR_COMPLIANCE_REQUIRED
PATCH /v1/staff/{staffId}: laborConstraintMask enviado com laborLawCompliance false.
| Código | Significado |
|---|---|
| INVALID_JSON | O corpo não é JSON válido. |
| PAYLOAD_TOO_LARGE | O comprimento em bytes UTF-8 excede maxPayloadBytes (predefinição 512 KiB). |
| TYPE_ERROR | Tipo JSON incorreto ou cadeia apiVersion não suportada. |
| UNKNOWN_FIELD | Modo estrito: propriedade não permitida na raiz ou no objeto staff. |
| INVALID_TIME_ZONE | timeZone em falta ou não é um nome IANA válido. |
| INVALID_DATE_RANGE | Datas não YYYY-MM-DD, intervalo inválido ou enumeração vazia. |
| SCHEDULE_SPAN_TOO_LONG | Demasiados dias entre início e fim (veja maxScheduleDays). |
| INVALID_TIME_RANGE | Intervalo horário em falta ou gera zero slots. |
| INVALID_GRANULARITY | slotGranularityMinutes não é 60/15 ou não permitido no plano. |
| INVALID_REQUIREMENTS | requirementsByCell não é objeto ou a contagem não é inteiro 0–15. |
| UNKNOWN_CELL_KEY | Chave não está na grelha de planeamento calculada. |
| INVALID_STAFF | staff vazio, demasiado grande, linha inválida ou sanitização falhada. |
| DUPLICATE_STAFF_ID | Valores staffId duplicados. |
| INVALID_AVAILABLE_CELL | Entrada vazia ou desconhecida em availableCells. |
| SHORTFALL_CELLS | Disponibilidade insuficiente face às necessidades. |
| DYNAMODB_ERROR | Erro transitório ou de persistência após validação (depende do manipulador). |
| SCHEDULE_DEFAULTS_SAVE_FAILED | PATCH /v1/schedule-defaults: validação ou regras de negócio falharam (ver error.details). |
| LABOR_COMPLIANCE_REQUIRED | PATCH /v1/staff/{staffId}: laborConstraintMask enviado com laborLawCompliance false. |
{
"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"]
}
]
}Leitura adicional. Planos e funcionalidades pagas: docs/architecture/NURSE_SCHEDULING_SERVICE_SPECIFICATION.md. Corpo POST /v1/schedule: docs/data-and-api/PUBLIC_API_SCHEDULE_REQUEST_BODY.md §1–§11. Corpo PATCH das predefinições do inquilino: mesmo ficheiro §12. Código: app/lib/public-schedule-api/, app/features/schedule-settings/schedule-defaults-actions.ts, app/lib/public-api-write/weekly-shift-wish-tenant.ts. Implantação: docs/aws/CDK_DEPLOY.md.