Cover incident creation with active, approved, and no active contract, plus employee patches with both blocked values, mixed profile/blocking fields, and fully omitted blocked. Cover dry-run and real-write behavior in an authorized test process. Existing incidents must remain editable.
POST /incidents requires a contract with status active. Status approved is insufficient. Without an active contract, the request fails with HTTP 422 and EMPLOYEE_HAS_NO_ACTIVE_CONTRACT, including when dryRun=true; no incident is created. Resolve the contract state through the responsible business process before submitting a new request with a new X-Request-ID.Existing incidents remain editable under their existing lifecycle and field restrictions. This new prerequisite applies to creation. The employee activation prerequisite remains documented separately; no precedence between validation errors is specified.
For PATCH /employees/{id}, an active contract prohibits both blocked: true and blocked: false. If blocked is included, the API rejects the entire patch with HTTP 422 and EMPLOYEE_HAS_ACTIVE_CONTRACT, including when dryRun=true. Other fields in that rejected request are not applied. Sending the employee’s existing blocked value does not avoid this rule.For profile-only updates, omit blocked entirely. Configure serializers and synchronization mappings so they do not add blocked: false as a default. For example:
{ "phoneNumber": "+49 221 5550199"}
Do not retry an unchanged rejected patch. Resolve the blocking request through the responsible business process, or, for an independently intended profile update, send a new patch containing only the intended supported profile fields. A successful dry run does not reserve contract state; handle the same validation on the real write.The contract version is 2.0.0. The documented production base URL remains:
https://api.jobhandy.io/v1
The OpenAPI document identifies the JobHandy Public API as version 2.0.0 and uses OpenAPI 3.1.0.
Version 2.0.0 introduces incompatible behavior changes. A schema-only diff or regenerated client is insufficient for migration. The documented URL path remains /v1.
A future deprecation should be communicated through the public changelog and migration guidance before removal. Do not rely on an undocumented endpoint or field merely because it is observable in an internal environment.
Last modified on October 20, 2026
{"docsConfig":{"theme":"aspen","$schema":"https://mintlify.com/docs.json","name":"JobHandy Developers","description":"Official JobHandy API documentation for secure HR, workforce, order, incident, division, and payroll integrations.","colors":{"primary":"#00505A","light":"#1FD1B6","dark":"#00505A"},"logo":{"light":"https://mintcdn.com/jobhandy/7JrsobpOBQPnQpU4/images/Jobhandy_Logo_green_white_RGB.png?fit=max\u0026auto=format\u0026n=7JrsobpOBQPnQpU4\u0026q=85\u0026s=a7e7a836fc983b471c30c9252f19ea28","dark":"https://mintcdn.com/jobhandy/15Qr7gvPLlVjKkPN/images/jobhandy-logo-dark.svg?fit=max\u0026auto=format\u0026n=15Qr7gvPLlVjKkPN\u0026q=85\u0026s=889e8811bb06f18e9df26f6fca07f85a","href":"https://www.jobhandy.io"},"favicon":{"light":"https://mintcdn.com/jobhandy/7JrsobpOBQPnQpU4/images/Jobhandy-Favicon_256x256_space.png?fit=max\u0026auto=format\u0026n=7JrsobpOBQPnQpU4\u0026q=85\u0026s=8ce840bfd195e203339ad55f07cef2c1","dark":"https://mintcdn.com/jobhandy/7JrsobpOBQPnQpU4/images/Jobhandy-Favicon_256x256_space.png?fit=max\u0026auto=format\u0026n=7JrsobpOBQPnQpU4\u0026q=85\u0026s=8ce840bfd195e203339ad55f07cef2c1"},"api":{"openapi":{"source":"https://assets.jobhandy.io/api-spec/jobhandy-public-api.openapi.json?rev=20261020-api-2.0.0"},"params":{"expanded":"closed","post":["x-client-default-state"]},"playground":{"display":"interactive","proxy":true},"examples":{"defaults":"required","languages":["bash","javascript","python","csharp","powershell"],"prefill":false,"autogenerate":true},"url":"full"},"appearance":{"default":"system"},"background":{"color":{"light":"#FFFFFF","dark":"#00505A"}},"navbar":{"links":[{"href":"https://www.jobhandy.io","label":"JobHandy"},{"href":"https://app.jobhandy.io/admin","label":"Administration"}],"primary":{"type":"button","label":"Open JobHandy","href":"https://app.jobhandy.io"}},"search":{"prompt":"How do I create an API key?"},"fonts":{"heading":{"family":"Satoshi","weight":700,"source":"https://cdn.prod.website-files.com/69b933d003ce13513e3316b1/69b93f6637dfed5a30f079d9_satoshi-bold.woff2","format":"woff2"},"body":{"family":"Satoshi","weight":400,"source":"https://cdn.prod.website-files.com/69b933d003ce13513e3316b1/69b93f66c771407c02111b70_satoshi-regular.woff2","format":"woff2"}},"icons":{"library":"lucide"},"styling":{"eyebrows":"breadcrumbs","codeblocks":{"theme":{"light":"github-light","dark":"github-dark"}},"latex":false},"contextual":{"options":["copy","download-spec","chatgpt","claude"],"display":"header"},"thumbnails":{"fonts":{"family":"Poppins"}},"interaction":{"drilldown":false},"metadata":{"timestamp":true},"navigation":{"directory":"card","languages":[{"language":"en","default":true,"href":"get-started/introduction"},{"language":"de","navbar":{"links":[{"href":"https://www.jobhandy.io","label":"JobHandy"},{"href":"https://app.jobhandy.io/admin","label":"Administration"}],"primary":{"type":"button","label":"JobHandy öffnen","href":"https://app.jobhandy.io"}},"href":"de/get-started/introduction"}]}},"deployment":{"deploymentMetadataValue":{"subdomain":"jobhandy","hasAudioNarration":false,"actualSubdomain":"jobhandy","customDomains":["developers.jobhandy.io"],"gitSource":{"type":"gitlab","owner":"jobhandy","repo":"jobhandy_apidocs","deployBranch":"import-mintlify-docs","contentDirectory":"","isPrivate":true,"projectId":88749629,"mountPath":"","label":"","_id":"6af30f5c2461d4bf973a09a4"},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6af30f5c2461d4bf973a09ae","clientVersion":"0.0.4102","searchFilterCounts":[{"language":"en","tag":"Documentation","count":32},{"language":"de","tag":"Dokumentation","count":32},{"language":"en","tag":"API Reference","count":29},{"language":"de","tag":"API-Referenz","count":29},{"language":"en","tag":"Architecture \u0026 Concepts","count":15},{"language":"de","tag":"Architektur \u0026 Konzepte","count":15},{"language":"en","tag":"Integration Guides","count":7},{"language":"de","tag":"Integrationsleitfäden","count":7},{"language":"en","tag":"Data Models","count":6},{"language":"de","tag":"Datenmodelle","count":6},{"language":"en","tag":"Incidents","count":5},{"language":"en","tag":"Get Started","count":5},{"language":"en","tag":"Operations","count":5},{"language":"de","tag":"Vorfälle","count":5},{"language":"de","tag":"Erste Schritte","count":5},{"language":"de","tag":"Betrieb","count":5},{"language":"en","tag":"Divisions","count":4},{"language":"en","tag":"Employees","count":4},{"language":"de","tag":"Divisionen","count":4},{"language":"de","tag":"Mitarbeiter","count":4}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true,"deflection":{"enabled":true,"email":"frank.offermann@jobhandy.io"}},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-rbac-roles","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"privacy":{"consentBanner":{"enabled":true}},"googleFontsInlined":false},"customCss":[{"filePath":"custom.css","content":"@font-face{font-family:'JobHandy Display';src:url('https://cdn.prod.website-files.com/69b933d003ce13513e3316b1/69b93f6625e131cbe61fab09_GT-Walsheim-black.woff2') format('woff2');font-style:normal;font-weight:900;font-display:swap}#page-title{font-family:'JobHandy Display', 'Satoshi', 'Poppins', sans-serif;font-weight:900;line-height:1}html.dark{--gray-400: 255 255 255;--gray-500: 255 255 255}"}],"page":{"pagePath":"concepts/versioning","slug":"/concepts/versioning","pageMetadata":{"title":"Versioning and compatibility","sidebarTitle":"Versioning","description":"Understand URL versioning, additive changes, breaking changes, enum evolution, and contract-update responsibilities.","href":"/concepts/versioning"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Understand URL versioning, additive changes, breaking changes, enum evolution, and contract-update responsibilities.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Mermaid,Table,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Mermaid)_missingMdxReference(`Mermaid`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(Heading,{level:`2`,id:`migration-from-1-0-0-to-2-0-0`,children:`Migration from 1.0.0 to 2.0.0`}),`\n`,_jsxs(_components.p,{children:[`Cover incident creation with `,_jsx(_components.code,{children:`active`}),`, `,_jsx(_components.code,{children:`approved`}),`, and no active contract, plus employee patches with both `,_jsx(_components.code,{children:`blocked`}),` values, mixed profile/blocking fields, and fully omitted `,_jsx(_components.code,{children:`blocked`}),`. Cover dry-run and real-write behavior in an authorized test process. Existing incidents must remain editable.`]}),`\n`,_jsx(Heading,{level:`2`,id:`api-2-0-0-active-contract-required`,children:`API 2.0.0: active contract required`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`POST /incidents`}),` requires a contract with status `,_jsx(_components.code,{children:`active`}),`. Status `,_jsx(_components.code,{children:`approved`}),` is insufficient. Without an active contract, the request fails with HTTP `,_jsx(_components.code,{children:`422`}),` and `,_jsx(_components.code,{children:`EMPLOYEE_HAS_NO_ACTIVE_CONTRACT`}),`, including when `,_jsx(_components.code,{children:`dryRun=true`}),`; no incident is created. Resolve the contract state through the responsible business process before submitting a new request with a new `,_jsx(_components.code,{children:`X-Request-ID`}),`.`]}),`\n`,_jsx(_components.p,{children:`Existing incidents remain editable under their existing lifecycle and field restrictions. This new prerequisite applies to creation. The employee activation prerequisite remains documented separately; no precedence between validation errors is specified.`}),`\n`,_jsx(Heading,{level:`2`,id:`api-2-0-0-blocking-changes-and-active-contracts`,children:`API 2.0.0: blocking changes and active contracts`}),`\n`,_jsxs(_components.p,{children:[`For `,_jsx(_components.code,{children:`PATCH /employees/{id}`}),`, an active contract prohibits both `,_jsx(_components.code,{children:`blocked: true`}),` and `,_jsx(_components.code,{children:`blocked: false`}),`. If `,_jsx(_components.code,{children:`blocked`}),` is included, the API rejects the `,_jsx(_components.strong,{children:`entire patch`}),` with HTTP `,_jsx(_components.code,{children:`422`}),` and `,_jsx(_components.code,{children:`EMPLOYEE_HAS_ACTIVE_CONTRACT`}),`, including when `,_jsx(_components.code,{children:`dryRun=true`}),`. Other fields in that rejected request are not applied. Sending the employee’s existing `,_jsx(_components.code,{children:`blocked`}),` value does not avoid this rule.`]}),`\n`,_jsxs(_components.p,{children:[`For profile-only updates, `,_jsxs(_components.strong,{children:[`omit `,_jsx(_components.code,{children:`blocked`}),` entirely`]}),`. Configure serializers and synchronization mappings so they do not add `,_jsx(_components.code,{children:`blocked: false`}),` as a default. For example:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`3`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light github-dark`,style:{backgroundColor:`#fff`,\"--shiki-dark-bg\":`#24292e`,color:`#24292e`,\"--shiki-dark\":`#e1e4e8`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`3`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#24292E`,\"--shiki-dark\":`#E1E4E8`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#005CC5`,\"--shiki-dark\":`#79B8FF`},children:` \"phoneNumber\"`}),_jsx(_components.span,{style:{color:`#24292E`,\"--shiki-dark\":`#E1E4E8`},children:`: `}),_jsx(_components.span,{style:{color:`#032F62`,\"--shiki-dark\":`#9ECBFF`},children:`\"+49 221 5550199\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#24292E`,\"--shiki-dark\":`#E1E4E8`},children:`}`})}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`Do not retry an unchanged rejected patch. Resolve the blocking request through the responsible business process, or, for an independently intended profile update, send a new patch containing only the intended supported profile fields. A successful dry run does not reserve contract state; handle the same validation on the real write.`}),`\n`,_jsxs(_components.p,{children:[`The contract version is `,_jsx(_components.code,{children:`2.0.0`}),`. The documented production base URL remains:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light github-dark`,style:{backgroundColor:`#fff`,\"--shiki-dark-bg\":`#24292e`,color:`#24292e`,\"--shiki-dark\":`#e1e4e8`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`https://api.jobhandy.io/v1`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsxs(_components.p,{children:[`The OpenAPI document identifies the JobHandy Public API as version `,_jsx(_components.code,{children:`2.0.0`}),` and uses OpenAPI `,_jsx(_components.code,{children:`3.1.0`}),`.`]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`Version `,_jsx(_components.code,{children:`2.0.0`}),` introduces incompatible behavior changes. A schema-only diff or regenerated client is insufficient for migration. The documented URL path remains `,_jsx(_components.code,{children:`/v1`}),`.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`change-classification`,children:`Change classification`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Change`}),_jsx(_components.th,{children:`Expected handling`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`New optional response property`}),_jsx(_components.td,{children:`Compatible; clients should ignore unknown properties`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`New endpoint or schema`}),_jsx(_components.td,{children:`Compatible addition`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`New optional request parameter`}),_jsx(_components.td,{children:`Compatible addition`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`New enum value in a response`}),_jsx(_components.td,{children:`Treat as additive; log unknown value for mapping review`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Existing field becomes required in a request`}),_jsx(_components.td,{children:`Breaking unless a documented default/omission behavior preserves compatibility`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Field removed or renamed`}),_jsx(_components.td,{children:`Breaking`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Meaning of an existing value changes`}),_jsx(_components.td,{children:`Breaking`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`New required authentication behavior`}),_jsx(_components.td,{children:`Breaking`})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`client-design-rules`,children:`Client design rules`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Do not use strict response deserialization that rejects unknown properties.`}),`\n`,_jsx(_components.li,{children:`Do not assume an enum list can never grow.`}),`\n`,_jsx(_components.li,{children:`Send only documented request properties because request schemas are closed.`}),`\n`,_jsx(_components.li,{children:`Pin and archive the OpenAPI file used to generate or validate the client.`}),`\n`,_jsx(_components.li,{children:`Compare each new contract against the pinned version before deployment.`}),`\n`,_jsxs(_components.li,{children:[`Review the `,_jsx(_components.a,{href:`/operations/changelog`,children:`Changelog`}),` for migration notes.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`contract-update-flow`,children:`Contract update flow`}),`\n`,_jsx(Mermaid,{chart:`flowchart LR\n A[New OpenAPI release] --> B[Automated diff]\n B --> C{Breaking or behavior change?}\n C -- No --> D[Regenerate or validate client]\n C -- Yes --> E[Plan migration and testing]\n D --> F[Acceptance tests]\n E --> F\n F --> G[Deploy client]\n G --> H[Record adopted contract version]`}),`\n`,_jsx(Heading,{level:`2`,id:`deprecation`,children:`Deprecation`}),`\n`,_jsx(_components.p,{children:`A future deprecation should be communicated through the public changelog and migration guidance before removal. Do not rely on an undocumented endpoint or field merely because it is observable in an internal environment.`})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"codeStyling":{"theme":{"light":"github-light","dark":"github-dark"}},"config":{},"pageMetadata":{"title":"Versioning and compatibility","sidebarTitle":"Versioning","description":"Understand URL versioning, additive changes, breaking changes, enum evolution, and contract-update responsibilities.","href":"/concepts/versioning"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Migration from 1.0.0 to 2.0.0","slug":"migration-from-1-0-0-to-2-0-0","depth":2,"children":[]},{"title":"API 2.0.0: active contract required","slug":"api-2-0-0-active-contract-required","depth":2,"children":[]},{"title":"API 2.0.0: blocking changes and active contracts","slug":"api-2-0-0-blocking-changes-and-active-contracts","depth":2,"children":[]},{"title":"Change classification","slug":"change-classification","depth":2,"children":[]},{"title":"Client design rules","slug":"client-design-rules","depth":2,"children":[]},{"title":"Contract update flow","slug":"contract-update-flow","depth":2,"children":[]},{"title":"Deprecation","slug":"deprecation","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"jobhandy","siteName":"JobHandy Developers","title":"Versioning and compatibility - JobHandy Developers","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{"en":{"href":"/concepts/versioning","matchLevel":0},"de":{"href":"/de/concepts/versioning","matchLevel":1}}},"lastModified":"2026-10-20T15:19:50.713Z","gitLastModified":"2026-10-20T15:19:33.000Z","originalFileLocation":"concepts/versioning.mdx","locale":"en"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Understand URL versioning, additive changes, breaking changes, enum evolution, and contract-update responsibilities.\">\u003cmeta data-mint-head name=\"application-name\" content=\"JobHandy Developers\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/jobhandy/SP5ZgDt4U4Hbtqxi/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/jobhandy/SP5ZgDt4U4Hbtqxi/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/jobhandy/SP5ZgDt4U4Hbtqxi/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/jobhandy/SP5ZgDt4U4Hbtqxi/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/jobhandy/SP5ZgDt4U4Hbtqxi/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/jobhandy/SP5ZgDt4U4Hbtqxi/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/jobhandy/SP5ZgDt4U4Hbtqxi/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/jobhandy/SP5ZgDt4U4Hbtqxi/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/jobhandy/SP5ZgDt4U4Hbtqxi/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Versioning and compatibility - JobHandy Developers\">\u003cmeta data-mint-head property=\"og:description\" content=\"Understand URL versioning, additive changes, breaking changes, enum evolution, and contract-update responsibilities.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"JobHandy Developers\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://developers.jobhandy.io/concepts/versioning\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://jobhandy.mintlify.site/_mintlify/api/og/v2?division=Architecture+%26+Concepts\u0026amp;title=Versioning+and+compatibility\u0026amp;description=Understand+URL+versioning%2C+additive+changes%2C+breaking+changes%2C+enum+evolution%2C+and+contract-update+responsibilities.\u0026amp;theme=084c06ca2711223b8e18ec62\u0026amp;signature=336ecc157f9d01e84930f44123a0dc8e326afdd3111d2fd9f79e680714a3b4ea\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Versioning and compatibility - JobHandy Developers\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Understand URL versioning, additive changes, breaking changes, enum evolution, and contract-update responsibilities.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://jobhandy.mintlify.site/_mintlify/api/og/v2?division=Architecture+%26+Concepts\u0026amp;title=Versioning+and+compatibility\u0026amp;description=Understand+URL+versioning%2C+additive+changes%2C+breaking+changes%2C+enum+evolution%2C+and+contract-update+responsibilities.\u0026amp;theme=084c06ca2711223b8e18ec62\u0026amp;signature=336ecc157f9d01e84930f44123a0dc8e326afdd3111d2fd9f79e680714a3b4ea\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/jobhandy/SP5ZgDt4U4Hbtqxi/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"JobHandy Developers\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#00505A\">\u003clink data-mint-head rel=\"canonical\" href=\"https://developers.jobhandy.io/concepts/versioning\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/concepts/versioning.md\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"en\" href=\"https://developers.jobhandy.io/concepts/versioning\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"de\" href=\"https://developers.jobhandy.io/de/concepts/versioning\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"x-default\" href=\"https://developers.jobhandy.io/concepts/versioning\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://developers.jobhandy.io/#organization\",\"name\":\"JobHandy Developers\",\"url\":\"https://developers.jobhandy.io\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/jobhandy/7JrsobpOBQPnQpU4/images/Jobhandy_Logo_green_white_RGB.png?fit=max\u0026auto=format\u0026n=7JrsobpOBQPnQpU4\u0026q=85\u0026s=a7e7a836fc983b471c30c9252f19ea28\"}},{\"@type\":\"WebSite\",\"@id\":\"https://developers.jobhandy.io#website\",\"name\":\"JobHandy Developers\",\"url\":\"https://developers.jobhandy.io\",\"publisher\":{\"@id\":\"https://developers.jobhandy.io/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://developers.jobhandy.io/concepts/versioning#webpage\",\"url\":\"https://developers.jobhandy.io/concepts/versioning\",\"name\":\"Versioning and compatibility\",\"description\":\"Understand URL versioning, additive changes, breaking changes, enum evolution, and contract-update responsibilities.\",\"dateModified\":\"2026-10-20T15:19:33.000Z\",\"isPartOf\":{\"@id\":\"https://developers.jobhandy.io#website\"},\"breadcrumb\":{\"@id\":\"https://developers.jobhandy.io/concepts/versioning#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://developers.jobhandy.io/concepts/versioning#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Architecture \u0026 Concepts\",\"item\":\"https://developers.jobhandy.io/concepts/architecture-resource-model\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Versioning and compatibility\",\"item\":\"https://developers.jobhandy.io/concepts/versioning\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://developers.jobhandy.io/concepts/versioning#article\",\"headline\":\"Versioning and compatibility\",\"name\":\"Versioning and compatibility\",\"description\":\"Understand URL versioning, additive changes, breaking changes, enum evolution, and contract-update responsibilities.\",\"url\":\"https://developers.jobhandy.io/concepts/versioning\",\"mainEntityOfPage\":{\"@id\":\"https://developers.jobhandy.io/concepts/versioning#webpage\"},\"dateModified\":\"2026-10-20T15:19:33.000Z\",\"publisher\":{\"@id\":\"https://developers.jobhandy.io/#organization\"},\"isPartOf\":{\"@id\":\"https://developers.jobhandy.io#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"JobHandy Developers\",\"publisher\":{\"@type\":\"Organization\",\"name\":\"JobHandy Developers\"},\"provider\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","agentPointerHref":"/concepts/versioning.md","siteName":"JobHandy Developers","nav":{"global":null,"directory":"card","languages":[{"language":"en","default":true,"tabs":[{"tab":"Documentation","groups":[{"group":"Get Started","pages":[{"title":"JobHandy Public API","sidebarTitle":"Introduction","mode":"wide","href":"/get-started/introduction"},{"title":"Create and manage API keys","sidebarTitle":"API Key Management","mode":"wide","href":"/get-started/api-key-management"},{"title":"Authentication and access scope","sidebarTitle":"Authentication","href":"/get-started/authentication"},{"title":"Quickstart","sidebarTitle":"Quickstart","mode":"wide","href":"/get-started/quickstart"},{"title":"Go-live checklist","sidebarTitle":"Go-live Checklist","href":"/get-started/go-live-checklist"}]},{"group":"Architecture \u0026 Concepts","pages":[{"title":"Architecture and resource model","sidebarTitle":"Architecture \u0026 Resource Model","mode":"wide","href":"/concepts/architecture-resource-model"},{"title":"Terminology","sidebarTitle":"Terminology","href":"/concepts/terminology"},{"title":"Environments and testing","sidebarTitle":"Environments \u0026 Testing","href":"/concepts/environments-testing"},{"title":"Tenant scope and resource placement","sidebarTitle":"Tenant Scope","href":"/concepts/tenant-scope"},{"title":"Request and response conventions","sidebarTitle":"Request \u0026 Response","href":"/concepts/request-response"},{"title":"Data types and formats","sidebarTitle":"Data Types \u0026 Formats","href":"/concepts/data-types-formats"},{"title":"Pagination, filtering, and sorting","sidebarTitle":"Pagination \u0026 Filtering","mode":"wide","href":"/concepts/pagination-filtering"},{"title":"Dry-run validation","sidebarTitle":"Dry Runs","href":"/concepts/dry-runs"},{"title":"Request IDs and correlation","sidebarTitle":"Request IDs","href":"/concepts/request-ids"},{"title":"Retries, idempotency, and ambiguous outcomes","sidebarTitle":"Retries \u0026 Idempotency","mode":"wide","href":"/concepts/retries-idempotency"},{"title":"Error handling","sidebarTitle":"Error Handling","mode":"wide","href":"/concepts/error-handling"},{"title":"Rate limits and backoff","sidebarTitle":"Rate Limits","href":"/concepts/rate-limits"},{"title":"Security and data protection","sidebarTitle":"Security \u0026 Data Protection","href":"/concepts/security-data-protection"},{"title":"Capabilities and limitations","sidebarTitle":"Capabilities \u0026 Limitations","description":"Know which functions are available in public v1 and which workflows remain outside the current API contract.","mode":"wide","href":"/concepts/capabilities-limitations"},{"title":"Versioning and compatibility","sidebarTitle":"Versioning","href":"/concepts/versioning"}]},{"group":"Integration Guides","pages":[{"title":"Synchronize employees","sidebarTitle":"Sync Employees","description":"Design a resumable employee synchronization with stable identity, explicit placement, dry-run validation, partial updates, and reconciliation.","mode":"wide","href":"/guides/sync-employees"},{"title":"Employee offboarding","sidebarTitle":"Employee Offboarding","href":"/guides/employee-offboarding"},{"title":"Process orders and HR decisions","sidebarTitle":"Process Orders","mode":"wide","href":"/guides/process-orders"},{"title":"Manage employee incidents","sidebarTitle":"Manage Incidents","mode":"wide","href":"/guides/manage-incidents"},{"title":"Manage division hierarchies","sidebarTitle":"Manage Divisions","mode":"wide","href":"/guides/manage-divisions"},{"title":"Retrieve payroll export documents","sidebarTitle":"Payroll Exports","mode":"wide","href":"/guides/payroll-exports"},{"title":"Rotate API keys","sidebarTitle":"Rotate API Keys","href":"/guides/rotate-api-keys"}]},{"group":"Operations","pages":[{"title":"Tooling and OpenAPI","sidebarTitle":"Tooling \u0026 OpenAPI","href":"/operations/tooling-openapi"},{"title":"Troubleshooting","sidebarTitle":"Troubleshooting","mode":"wide","href":"/operations/troubleshooting"},{"title":"Frequently asked questions","sidebarTitle":"FAQ","href":"/operations/faq"},{"title":"Support and escalation","sidebarTitle":"Support","href":"/operations/support"},{"title":"API changelog","sidebarTitle":"Changelog","href":"/operations/changelog"}]}]},{"tab":"API Reference","pages":[{"title":"API Reference","href":"/api-reference/overview"}]}]},{"language":"de","navbar":{"links":[{"href":"https://www.jobhandy.io","label":"JobHandy"},{"href":"https://app.jobhandy.io/admin","label":"Administration"}],"primary":{"type":"button","label":"JobHandy öffnen","href":"https://app.jobhandy.io"}},"pages":[{"title":"de","href":"/de/concepts/versioning"}]}]},"basePath":"","title":"Versioning and compatibility - JobHandy Developers","buildId":"dpl_596ePT575z4qnAFksq1biRW97aLY","deploymentId":"dpl_596ePT575z4qnAFksq1biRW97aLY","dynamics":[],"chunks":[]}