---
title: "Updates a Contract version"
method: PUT
path: "/api/2026-10-01/resources/contracts/contract_versions/{id}"
tags: ["Contracts > ContractVersion"]
---

# Updates a Contract version

`PUT /api/2026-10-01/resources/contracts/contract_versions/{id}`

## Request

- Base URL: `https://api.factorialhr.com`
- URL: `https://api.factorialhr.com/api/2026-10-01/resources/contracts/contract_versions/{id}`
- Auth: one of:
  - OAuth 2
    - Authorization code: `https://id.factorialhr.com/oauth/authorize`
    - Token URL: `https://id.factorialhr.com/api/oauth/token` scopes: `contracts`
  - API key in header `x-api-key`

Updates a Contract version

## Path parameters

- `id` string, required

## Request body

- object
  - `id` string, required: contract version identifier.
  - `employee_id` string: employee identifier, refers to /employees/employees endpoint.
  - `effective_on` string: the day the specific contract starts, in case of hiring the same than starts_on.
  - `starts_on` string: the day the employee is hired.
  - `ends_on` string: the day the employee is terminated.
  - `working_hours_frequency` string: the frequency of the working hours.
  - `working_week_days` string: the days of the week the employee works.
  - `working_hours` integer: the amount of hours the employee works.
  - `salary_frequency` string: the frequency of the salary payment. When adding a salary to a contract that previously had none, both salary_amount and salary_frequency must be provided together.
  - `salary_amount` integer: the amount of money the employee earns. When adding a salary to a contract that previously had none, both salary_amount and salary_frequency must be provided together.
  - `job_title` string: job title of the employee.
  - `job_catalog_tree_node_uuid` string: the uuid node in the job catalog tree. For now it only supports level nodes. From this point in the job catalog tree you can get the full ancestor path to the root node including the role. Refer to job_catalog/tree_nodes endpoint.
  - `es_cotization_group` integer: cotization group identifier.
  - `es_professional_category_id` string: professional category identifier.
  - `es_education_level_id` string: education level identifier.
  - `es_contract_type_id` string: contract type identifier.
  - `es_working_day_type_id` string: working day type identifier.
  - `has_trial_period` boolean: a flag that indicates if the employee has a trial period.
  - `trial_period_ends_on` string: when the trial period ends.
  - `bank_holiday_treatment` 'workable' | 'non_workable': Defines whether a bank holiday should be considered as a workable or non-workable day.
  - `working_time_percentage_in_cents` integer: Working time percentage in cents (e.g., when an employee is working part-time, the percentage of full-time hours they are working).
  - `annual_working_time_distribution` 'limit_workdays' | 'limit_daily_hours': Allows companies to define how annual working hours are spread across the year to ensure compliance with legal limits.
  - `de_base_salary_type_id` string: Identifier for the German base salary type. References a payroll concept available via the /payroll/concepts endpoint.
  - `country_data_inputs` object[]: List of country-specific field inputs (e.g. contract_type). Each entry sets one templated field. Discover valid field_name/value_id combinations per country and legal entity via GET /resources/contracts/materialized_templates.
    - `field_name` string, required: The templated field to set (e.g. contract_type).
    - `value_id` string, required: The id of the option to assign to the field.
    - `integration_source` string: Only used when the option was sourced from an installed payroll integration (e.g. A3innuva). Leave unset for regular field inputs.
    - `label` string: Only used together with integration_source, to label an option that does not yet exist locally. Leave unset for regular field inputs.

## Response `200`

OK

- ContractsContractVersion
  - `id` string: identifier for the contract version.
  - `company_id` string, required: identifier for company.
  - `employee_id` string, required: employee identifier, refers to /employees/employees endpoint.
  - `effective_on` string, required: the day the specific contract starts, in case of hiring the same than starts_on.
  - `country` string: nationality country code of the employee (Spain ES, United Kingdom GB).
  - `contracts_contract_id` string: contract identifier, refers to the /contracts/contracts endpoint. Use it to read the contract this version belongs to, and its activity periods.
  - `job_title` string: job title of the employee.
  - `job_catalog_level_id` string: job catalog level identifier, refers to /job_catalog/levels endpoint.
  - `job_catalog_tree_node_uuid` string: the uuid node in the job catalog tree. For now it only supports level nodes. From this point in the job catalog tree you can get the full ancestor path to the root node including the role. Refer to job_catalog/tree_nodes endpoint.
  - `starts_on` string: the day the employee is hired.
  - `ends_on` string: the day the employee is terminated. It has nothing to do with trial period, these are concepts totally unrelated.
  - `has_payroll` boolean, required: boolean that indicates if the employee asociated to this contract belongs to a payroll policy.
  - `has_trial_period` boolean: a flag that indicates if the contract version has ever had a trial period.
  - `trial_period_ends_on` string: when the trial period ends. If there is no date, it means that the employee has never been in trial. This date is not related with the end date of a contract.
  - `salary_amount` integer: the amount of money the employee earns in cents.
  - `salary_currency` string: the currency of the salary amount, inherited from the governing legal entity.
  - `salary_frequency` string: the frequency of the salary payment.
  - `working_week_days` string: the days of the week the employee works.
  - `working_hours` integer: the amount of hours the employee works.
  - `working_hours_frequency` string: the frequency of the working hours.
  - `max_legal_yearly_hours` integer: the maximum amount of hours the employee can work in a year.
  - `maximum_weekly_hours` integer: the maximum amount of hours the employee can work in a week.
  - `bank_holiday_treatment` 'workable' | 'non_workable', required: Defines whether a bank holiday should be considered as a workable or non-workable day.
  - `working_time_percentage_in_cents` integer: Working time percentage in cents (e.g., when an employee is working part-time, the percentage of full-time hours they are working).
  - `annual_working_time_distribution` 'limit_workdays' | 'limit_daily_hours': Allows companies to define how annual working hours are spread across the year to ensure compliance with legal limits.
  - `version_data` object: Country-specific contract data (template fragments and fields).
    - `country_data` object
      - `country` string, required: Country code (e.g. es, fr, de, pt).
      - `fields` object[], required
        - `name` string, required
        - `field_name` string, required
        - `value_label` string
        - `value_id` string, required
      - `template_fragments` object, required: Identifiers of the materialized_template_fragment records that produced this country data. Compare against the current template's source_fragment_ids to detect when this data originated from a different template (e.g. after a legal entity or country change).
        - `company_fragment_id` string
        - `country_fragment_id` string
        - `legal_entity_fragment_id` string
  - `min_rest_minutes_between_days` integer: the minimum amount of minutes the employee must rest between working periods.
  - `max_work_minutes_per_day` integer: the maximum amount of minutes the employee can work in a day.
  - `max_work_days_in_row` integer: the maximum amount of days the employee can work in a row.
  - `min_rest_hours_in_row` integer: the minimum amount of hours the employee must rest in a row.
  - `created_at` string, required: the date the contract version was created.
  - `updated_at` string, required: the date of the last contract version updated.
  - `es_has_teleworking_contract` boolean: flag that indicates if the contract has teleworking.
  - `es_cotization_group` integer: the group of cotization of the employee.
  - `contracts_es_tariff_group_id` string: the group of cotization of the employee.
  - `es_contract_observations` string: observations of the contract.
  - `es_job_description` string: the job description of the employee.
  - `es_contract_type_id` string: contract type identifier.
  - `es_working_day_type_id` string: working day type identifier.
  - `es_education_level_id` string: education level identifier.
  - `es_professional_category_id` string: professional category identifier.
  - `fr_employee_type` string: employee type.
  - `fr_forfait_jours` boolean, required: flag that indicates if the employee is allowed to work within the framework of a fixed number of days.
  - `fr_jours_par_an` integer: the number of days the employee is allowed to work.
  - `fr_coefficient` string: coefficient for france contracts.
  - `fr_contract_type_id` string: contract type identifier.
  - `fr_level_id` string: level identifier.
  - `fr_step_id` string: step identifier.
  - `fr_mutual_id` string: mutual identifier.
  - `fr_professional_category_id` string: professional category identifier.
  - `fr_work_type_id` string: work type identifier.
  - `de_contract_type_id` string: contract type identifier.
  - `de_base_salary_type_id` string: Identifier for the German base salary type. References a payroll concept available via the /payroll/concepts endpoint.
  - `pt_contract_type_id` string: contract type identifier.

## Changes

- **2026-11-03** `83ac9aa1de50`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/factorialhr/apis/factorial-api/changes/api/2026-10-01/resources/contracts/contract_versions/:id/put.md)

---

[API](https://skmtc.dev/factorialhr/apis/factorial-api.md) - [All operations](https://skmtc.dev/factorialhr/apis/factorial-api/llms.txt) - [OpenAPI document](https://skmtc.dev/factorialhr/apis/factorial-api/revisions/83ac9aa1de50?raw)
