---
title: "Update a work schedule"
method: PATCH
path: "/companies/{company}/work-schedules/{schedule}"
tags: ["Work Schedules"]
---

# Update a work schedule

`PATCH /companies/{company}/work-schedules/{schedule}`

## Request

- Base URL: `https://api.factuarea.com/v1`
- URL: `https://api.factuarea.com/v1/companies/{company}/work-schedules/{schedule}`
- Auth: one of:
  - HTTP bearer
  - API key in header `X-API-Key`

Partially update a work schedule; an omitted field keeps its value.
- A sent `week_pattern` replaces the whole pattern and `weekly_hours` is recomputed.
- An invalid value returns 422 and changes nothing. Returns the updated schedule.

## Path parameters

- `company` string, uuid, required
- `schedule` string, uuid, required

## Headers

- `Idempotency-Key` string
- `Factuarea-Version` string, date

## Request body

- UpdateWeeklyScheduleRequest
  - `name` string: Weekly schedule name. Optional: when omitted it keeps its current value.
  - `mode` 'validated' | 'real_clocking': Schedule mode: `validated` (assumed fulfilled) or `real_clocking` (computed from real clock entries). Optional: when omitted it keeps its current value.
  - `week_pattern` object[]: Full weekly pattern: list of days with their time ranges. Optional: when omitted the current pattern is kept; when sent it replaces the whole pattern.
    - `day` integer, required: Day of the week in ISO 8601 format (1 Monday .. 7 Sunday).
    - `ranges` object[], required: Time ranges for the day (empty = rest day).
      - `start` string, required: Range start time (HH:MM, 00:00-23:59).
      - `end` string, required: Range end time (HH:MM; 24:00 is allowed as end of workday).
      - `flexible` boolean
      - `required_minutes` integer, nullable

## Response `200`

- object
  - `data` WeeklySchedule, required: A fixed weekly work schedule for the Control Horario (time tracking) module. Defines, per weekday, the expected time ranges (from which the expected hours and the planned start time are derived). Its `mode` decides how balances are computed downstream: `validated` (the period is assumed fulfilled unless an exception) or `real_clocking` (only real clock-ins count).
    - `id` string, uuid, required: Opaque identifier of the work schedule, a UUID v7 (e.g. `01931b3e-7c4a-7f2e-9a8b-3c5d6e7f8a9b`).
    - `object` 'work_schedule', required: Always `work_schedule`.
    - `name` string, required: Human-readable name of the schedule (e.g. `Jornada partida`).
    - `mode` 'validated' | 'real_clocking', required: How the schedule computes balances: `validated` (period assumed fulfilled unless an exception) or `real_clocking` (only real clock-ins count).
    - `week_pattern` object[], required: Weekly pattern: one entry per configured weekday with its ordered, non-overlapping time ranges. A weekday absent from the list (or with an empty `ranges`) is a rest day.
      - `day` integer, required: ISO 8601 weekday (1 = Monday … 7 = Sunday).
      - `ranges` object[], required: Ordered, non-overlapping time ranges worked that day (empty = rest day).
        - `start` string, required: Range start time (HH:MM, 24h).
        - `end` string, required: Range end time (HH:MM, 24h).
    - `weekly_hours` number, float, required: Total weekly hours derived from the sum of all time ranges in the pattern.
    - `status` 'active' | 'archived', required: Lifecycle status: `active` (assignable) or `archived` (retired from use).
    - `created_at` string, date-time, nullable, required: Creation timestamp (ISO 8601).
    - `updated_at` string, date-time, nullable, required: Last-update timestamp (ISO 8601).

## Other responses

- `400`: `parameter_unknown` with `subcode` `retired_active_profile_header`: the retired `X-Active-Profile` header was sent; the company goes in the path. `parameter_invalid_format` on `Factuarea-Version`: the header is not a `YYYY-MM-DD` date. `unsupported_api_version`: the `Factuarea-Version` date is not a supported version.
- `401`: Missing or invalid API key.
- `403`: The request is authenticated but not allowed: the API key lacks the required scope (`insufficient_scope`), the plan does not include the public API or this feature (`addon_not_active`, `feature_not_available_in_plan`), or the module is not available with a test key (`module_not_available_in_sandbox`).
- `404`: The requested resource does not exist or belongs to another company.
- `422`: Validation failed. The `error.param` field identifies which input is invalid.
- `429`: Rate limit exceeded. Retry after the duration in `Retry-After`.
- `500`: Unexpected server error.

---

[API](https://skmtc.dev/factuarea/apis/factuarea-public-api.md) · [All operations](https://skmtc.dev/factuarea/apis/factuarea-public-api/llms.txt) · [OpenAPI document](https://skmtc.dev/factuarea/apis/factuarea-public-api/revisions/718e77934422?raw)
