Name, ClientId and at least one service line are required; each line needs
Name and LaborTermsId, plus the one details object matching its labor terms
(none for No Labor Terms). A setting a labor term can’t have is a 400 naming it, where the
app would silently turn it off. Every id is checked against the service provider, and the
client’s own locations and contacts, before anything is written.
Line items need ItemId and Quantity; the rest falls back to the item’s own
values. Amounts, tax and the recurring totals are calculated. A Block Hours line also raises a
Draft invoice for the block and opens its hours ledger, as in the app; that invoice is listed
by GET /v1/invoices.
Returns the contract in the GET /v1/contracts/{contractId} shape.
Your Gorelo API key. See Generate API key. If your data is hosted in Australia, click the base URL at the top of this page and select https://api.aue.gorelo.io.
Creates a contract with its service lines. Name, ClientId and at least one service line are
required; each line needs Name and LaborTermsId. Returns the contract in the
GET /v1/contracts/{contractId} shape.
Everything about one contract: the client and locations it covers, its billing schedule, and
each service line with the actual products/labor billed on it.
{"docsConfig":{"theme":"maple","$schema":"https://mintlify.com/docs.json","name":"Gorelo Documentation","colors":{"primary":"#1DAF94","light":"#8AEFDD","dark":"#1DAF94"},"logo":{"light":"https://mintcdn.com/gorelo/J8h_fLstMj_tYUTJ/logo/logo-light.svg?fit=max\u0026auto=format\u0026n=J8h_fLstMj_tYUTJ\u0026q=85\u0026s=3c12ffa7afbcef131d2c6fb36f00e159","dark":"https://mintcdn.com/gorelo/J8h_fLstMj_tYUTJ/logo/logo-dark.svg?fit=max\u0026auto=format\u0026n=J8h_fLstMj_tYUTJ\u0026q=85\u0026s=2dc592c604dd68bb156e97c047088df2"},"favicon":"https://mintcdn.com/gorelo/eK-NlDv-DeG3Jk2m/favicon.svg?fit=max\u0026auto=format\u0026n=eK-NlDv-DeG3Jk2m\u0026q=85\u0026s=99510712391acd38a7057cf358869244","api":{"url":"full"},"appearance":{"default":"dark"},"background":{"color":{"light":"#FBFBFB","dark":"#1F2023"}},"navbar":{"links":[{"href":"https://feedback.gorelo.io/changelog","label":"Changelog"}],"primary":{"type":"button","label":"Dashboard","href":"https://dashboard.mintlify.com"}},"footer":{"socials":{"x":"https://twitter.com/Goreloio","facebook":"https://www.facebook.com/gorelo.io","linkedin":"https://www.linkedin.com/company/gorelo","youtube":"https://www.youtube.com/@gorelotech","discord":"https://discord.com/invite/BpmP8BSrj6","website":"https://www.gorelo.io/"}},"seo":{"indexing":"navigable"},"fonts":{"family":"Inter","weight":400},"contextual":{"options":["copy","view","chatgpt","claude","perplexity","mcp","cursor","vscode"],"display":"header"},"styling":{"latex":false},"navigation":{"languages":[{"language":"en","default":true,"href":"what-is-gorelo"},{"language":"ar","href":"ar/what-is-gorelo"},{"language":"pt-BR","href":"pt-BR/what-is-gorelo"},{"language":"fr-CA","href":"fr-CA/what-is-gorelo"},{"language":"ca","href":"ca/what-is-gorelo"},{"language":"cn","href":"cn/what-is-gorelo"},{"language":"zh","href":"zh/what-is-gorelo"}]}},"deployment":{"deploymentMetadataValue":{"subdomain":"gorelo","hasAudioNarration":false,"actualSubdomain":"gorelo","customDomains":["help.gorelo.io"],"gitSource":{"type":"github","owner":"gorelo","repo":"gorelo_public_docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ae0e7e8f954e5368715cbc6","collectionId":"9e2c5cbd-ad8e-42d1-aeb6-bcda615db32d","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ae0e7e8f954e5368715cbc6"},"feedback":{"thumbs":true,"agentFeedback":true},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6ae361329ee4546ca4eb47b6","clientVersion":"0.0.4006","searchFilterCounts":[{"language":"en","tag":"API","count":174},{"language":"ar","tag":"API","count":174},{"language":"ca","tag":"API","count":174},{"language":"cn","tag":"API","count":174},{"language":"fr-CA","tag":"API","count":174},{"language":"pt-BR","tag":"API","count":174},{"language":"zh","tag":"API","count":174},{"language":"en","tag":"API reference","count":171},{"language":"ar","tag":"مرجع API","count":171},{"language":"ca","tag":"Referència de l'API","count":171},{"language":"cn","tag":"API 参考","count":171},{"language":"fr-CA","tag":"Référence de l'API","count":171},{"language":"pt-BR","tag":"Referência da API","count":171},{"language":"zh","tag":"API 參考","count":171},{"language":"en","tag":"Billing","count":46},{"language":"en","tag":"Service Delivery","count":40},{"language":"ar","tag":"تقديم الخدمة","count":40},{"language":"ca","tag":"Prestació de servei","count":40},{"language":"cn","tag":"服务交付","count":40},{"language":"fr-CA","tag":"Prestation de services","count":40},{"language":"pt-BR","tag":"Entrega de serviços","count":40},{"language":"zh","tag":"服務交付","count":40},{"language":"ar","tag":"Billing","count":36},{"language":"ca","tag":"Billing","count":36},{"language":"cn","tag":"Billing","count":36},{"language":"fr-CA","tag":"Billing","count":36},{"language":"pt-BR","tag":"Billing","count":36},{"language":"zh","tag":"Billing","count":36},{"language":"en","tag":"Remote Management","count":35},{"language":"ar","tag":"الإدارة عن بُعد","count":35},{"language":"ca","tag":"Gestió remota","count":35},{"language":"cn","tag":"远程管理","count":35},{"language":"fr-CA","tag":"Gestion à distance","count":35},{"language":"pt-BR","tag":"Gerenciamento remoto","count":35},{"language":"zh","tag":"遠端管理","count":35},{"language":"en","tag":"Projects","count":34},{"language":"en","tag":"Assets","count":34},{"language":"ar","tag":"Projects","count":31},{"language":"ca","tag":"Projects","count":31},{"language":"cn","tag":"Projects","count":31},{"language":"fr-CA","tag":"Projects","count":31},{"language":"pt-BR","tag":"Projects","count":31},{"language":"zh","tag":"Projects","count":31},{"language":"ar","tag":"Assets","count":30},{"language":"ca","tag":"Assets","count":30},{"language":"cn","tag":"Assets","count":30},{"language":"fr-CA","tag":"Assets","count":30},{"language":"pt-BR","tag":"Assets","count":30},{"language":"zh","tag":"Assets","count":30},{"language":"en","tag":"Tickets","count":25},{"language":"pt-BR","tag":"Tickets","count":25},{"language":"en","tag":"How-to guides","count":19},{"language":"en","tag":"Documents","count":19},{"language":"ar","tag":"أدلة الكيفية","count":19},{"language":"ar","tag":"Tickets","count":19},{"language":"ca","tag":"Guies pràctiques","count":19},{"language":"ca","tag":"Documents","count":19},{"language":"ca","tag":"Tickets","count":19},{"language":"cn","tag":"操作指南","count":19},{"language":"cn","tag":"Tickets","count":19},{"language":"fr-CA","tag":"Guides pratiques","count":19},{"language":"fr-CA","tag":"Documents","count":19},{"language":"fr-CA","tag":"Tickets","count":19},{"language":"pt-BR","tag":"Guias práticos","count":19},{"language":"zh","tag":"操作指南","count":19},{"language":"zh","tag":"Tickets","count":19},{"language":"ar","tag":"Documents","count":16},{"language":"cn","tag":"Documents","count":16},{"language":"pt-BR","tag":"Documents","count":16},{"language":"zh","tag":"Documents","count":16}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":true,"enableContextualStarterQuestions":true,"enableAskAiSearchBar":true,"deflection":{"enabled":true,"email":"help@gorelo.io","showHelpButton":true}},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","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":"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":"pause-universal-search-reconcile","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":"per-site-search-delta","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":"editor-private-page-search","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":"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":"byok-sep-25","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":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","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":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"api-reference/billing/creates-a-contract-with-its-service-lines","slug":"/api-reference/billing/creates-a-contract-with-its-service-lines","pageMetadata":{"title":"Creates a contract with its service lines.","description":"\n\r\n `Name`, `ClientId` and at least one service line are required; each line needs\r\n `Name` and `LaborTermsId`, plus the one details object matching its labor terms\r\n (none for No Labor Terms). A setting a labor term can't have is a 400 naming it, where the\r\n app would silently turn it off. Every id is checked against the service provider, and the\r\n client's own locations and contacts, before anything is written.\r\n \r\n\n\r\n Line items need `ItemId` and `Quantity`; the rest falls back to the item's own\r\n values. Amounts, tax and the recurring totals are calculated. A Block Hours line also raises a\r\n Draft invoice for the block and opens its hours ledger, as in the app; that invoice is listed\r\n by `GET /v1/invoices`.\r\n \r\n\nReturns the contract in the `GET /v1/contracts/{contractId}` shape.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /v1/contracts","href":"/api-reference/billing/creates-a-contract-with-its-service-lines","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {Fragment: _Fragment, jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsxs(_components.p, {\n children: [_jsx(_components.code, {\n children: \"Name\"\n }), \", \", _jsx(_components.code, {\n children: \"ClientId\"\n }), \" and at least one service line are required; each line needs\\r\\n\", _jsx(_components.code, {\n children: \"Name\"\n }), \" and \", _jsx(_components.code, {\n children: \"LaborTermsId\"\n }), \", plus the one details object matching its labor terms\\r\\n(none for No Labor Terms). A setting a labor term can’t have is a 400 naming it, where the\\r\\napp would silently turn it off. Every id is checked against the service provider, and the\\r\\nclient’s own locations and contacts, before anything is written.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Line items need \", _jsx(_components.code, {\n children: \"ItemId\"\n }), \" and \", _jsx(_components.code, {\n children: \"Quantity\"\n }), \"; the rest falls back to the item’s own\\r\\nvalues. Amounts, tax and the recurring totals are calculated. A Block Hours line also raises a\\r\\nDraft invoice for the block and opens its hours ledger, as in the app; that invoice is listed\\r\\nby \", _jsx(_components.code, {\n children: \"GET /v1/invoices\"\n }), \".\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Returns the contract in the \", _jsx(_components.code, {\n children: \"GET /v1/contracts/{contractId}\"\n }), \" shape.\"]\n })]\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}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Creates a contract with its service lines.","description":"\n\r\n `Name`, `ClientId` and at least one service line are required; each line needs\r\n `Name` and `LaborTermsId`, plus the one details object matching its labor terms\r\n (none for No Labor Terms). A setting a labor term can't have is a 400 naming it, where the\r\n app would silently turn it off. Every id is checked against the service provider, and the\r\n client's own locations and contacts, before anything is written.\r\n \r\n\n\r\n Line items need `ItemId` and `Quantity`; the rest falls back to the item's own\r\n values. Amounts, tax and the recurring totals are calculated. A Block Hours line also raises a\r\n Draft invoice for the block and opens its hours ledger, as in the app; that invoice is listed\r\n by `GET /v1/invoices`.\r\n \r\n\nReturns the contract in the `GET /v1/contracts/{contractId}` shape.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /v1/contracts","href":"/api-reference/billing/creates-a-contract-with-its-service-lines","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"tags":["Billing"],"summary":"Creates a contract with its service lines.","description":"\n\r\n `Name`, `ClientId` and at least one service line are required; each line needs\r\n `Name` and `LaborTermsId`, plus the one details object matching its labor terms\r\n (none for No Labor Terms). A setting a labor term can't have is a 400 naming it, where the\r\n app would silently turn it off. Every id is checked against the service provider, and the\r\n client's own locations and contacts, before anything is written.\r\n \r\n\n\r\n Line items need `ItemId` and `Quantity`; the rest falls back to the item's own\r\n values. Amounts, tax and the recurring totals are calculated. A Block Hours line also raises a\r\n Draft invoice for the block and opens its hours ledger, as in the app; that invoice is listed\r\n by `GET /v1/invoices`.\r\n \r\n\nReturns the contract in the `GET /v1/contracts/{contractId}` shape.","operationId":"post_v1_contracts","requestBody":"5ff0c303-2a58-4a25-95f3-3730e7265b5c","responses":{"200":"48046cf5-ef48-484a-bf04-b5b572ad4deb","400":"599283e6-cb8b-4806-89ca-133ab3519cec","401":"61f99471-0627-4cf0-9376-fc98cdf4ada3","500":"9aa6c055-9049-4fd3-a19e-e0bd0fc957eb"},"method":"post","type":"path","servers":["b46ffe4c-4a54-4e1e-a59b-94a3878c23e4","31fc67d7-965e-4c8a-946c-9895ebae16df"],"security":["7b6acf03-bfa6-4539-9826-c3ecbd3f6d24"],"path":"/v1/contracts","baseUrlOptions":["https://api.usw.gorelo.io","https://api.aue.gorelo.io"],"title":"Creates a contract with its service lines.","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated","urlDisplay":"full"},"dependencies":{"parameters":{},"requestBody":{"description":"The contract to create.","content":{"application/json-patch+json":{"schema":{"type":"object","properties":{"Name":{"oneOf":[{"type":"string","description":"Name of the contract. Required.","example":"All Labor Terms Example","uniqueKey":"Name.oneOf.0","typeLabel":"string"},{"type":"null","description":"Name of the contract. Required.","example":"All Labor Terms Example","uniqueKey":"Name.oneOf.1","typeLabel":"null"}],"uniqueKey":"Name","typeLabel":"string | null"},"ClientId":{"oneOf":[{"type":"integer","description":"The client the contract bills. Required.","format":"int64","example":88,"uniqueKey":"ClientId.oneOf.0","typeLabel":"integer\u003cint64>"},{"type":"null","description":"The client the contract bills. Required.","format":"int64","example":88,"uniqueKey":"ClientId.oneOf.1","typeLabel":"null"}],"uniqueKey":"ClientId","typeLabel":"integer\u003cint64> | null"},"IsForAllLocations":{"oneOf":[{"type":"boolean","description":"Whether the contract covers every one of the client's locations. Default true.","uniqueKey":"IsForAllLocations.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"Whether the contract covers every one of the client's locations. Default true.","uniqueKey":"IsForAllLocations.oneOf.1","typeLabel":"null"}],"uniqueKey":"IsForAllLocations","typeLabel":"boolean | null"},"LocationIds":{"oneOf":[{"type":"array","items":{"type":"integer","format":"int64","uniqueKey":"LocationIds.oneOf.0.items.[INDEX]","typeLabel":"integer\u003cint64>"},"description":"The locations covered when IsForAllLocations is false: at least one, each the client's own. Ignored otherwise.","uniqueKey":"LocationIds.oneOf.0","typeLabel":"integer\u003cint64>[]"},{"type":"null","items":{"type":"integer","format":"int64"},"description":"The locations covered when IsForAllLocations is false: at least one, each the client's own. Ignored otherwise.","uniqueKey":"LocationIds.oneOf.1","typeLabel":"null"}],"uniqueKey":"LocationIds","typeLabel":"integer\u003cint64>[] | null"},"Reference":{"oneOf":[{"type":"string","description":"Free-text reference printed on the contract's invoices.","example":"MSA-2025-014","uniqueKey":"Reference.oneOf.0","typeLabel":"string"},{"type":"null","description":"Free-text reference printed on the contract's invoices.","example":"MSA-2025-014","uniqueKey":"Reference.oneOf.1","typeLabel":"null"}],"uniqueKey":"Reference","typeLabel":"string | null"},"StartDate":{"oneOf":[{"type":"string","description":"Date coverage starts, a calendar date. Defaults to today in the service provider's zone.","format":"date-time","example":"2026-01-15T00:00:00.0000000+00:00","uniqueKey":"StartDate.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","description":"Date coverage starts, a calendar date. Defaults to today in the service provider's zone.","format":"date-time","example":"2026-01-15T00:00:00.0000000+00:00","uniqueKey":"StartDate.oneOf.1","typeLabel":"null"}],"uniqueKey":"StartDate","typeLabel":"string\u003cdate-time> | null"},"EndDate":{"oneOf":[{"type":"string","description":"Date coverage ends, a calendar date, after StartDate. Left out, the contract is open-ended.","format":"date-time","uniqueKey":"EndDate.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","description":"Date coverage ends, a calendar date, after StartDate. Left out, the contract is open-ended.","format":"date-time","uniqueKey":"EndDate.oneOf.1","typeLabel":"null"}],"uniqueKey":"EndDate","typeLabel":"string\u003cdate-time> | null"},"ProrateTypeId":{"oneOf":[{"type":"integer","description":"0 Do not prorate (default), 1 Prorate and add to next invoice, 2 Prorate and generate standalone invoice.","format":"int32","example":0,"uniqueKey":"ProrateTypeId.oneOf.0","typeLabel":"integer\u003cint32>"},{"type":"null","description":"0 Do not prorate (default), 1 Prorate and add to next invoice, 2 Prorate and generate standalone invoice.","format":"int32","example":0,"uniqueKey":"ProrateTypeId.oneOf.1","typeLabel":"null"}],"uniqueKey":"ProrateTypeId","typeLabel":"integer\u003cint32> | null"},"AutoInvoiceTicketProducts":{"oneOf":[{"type":"boolean","description":"Sweep approved ticket products for this client into the next recurring invoice. Only with\r\nIsForAllLocations true. Default false.","uniqueKey":"AutoInvoiceTicketProducts.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"Sweep approved ticket products for this client into the next recurring invoice. Only with\r\nIsForAllLocations true. Default false.","uniqueKey":"AutoInvoiceTicketProducts.oneOf.1","typeLabel":"null"}],"uniqueKey":"AutoInvoiceTicketProducts","typeLabel":"boolean | null"},"RepeatPeriodId":{"oneOf":[{"type":"integer","description":"1 Monthly (default), 2 Quarterly, 3 Yearly, 4 Half Yearly.","format":"int32","example":1,"uniqueKey":"RepeatPeriodId.oneOf.0","typeLabel":"integer\u003cint32>"},{"type":"null","description":"1 Monthly (default), 2 Quarterly, 3 Yearly, 4 Half Yearly.","format":"int32","example":1,"uniqueKey":"RepeatPeriodId.oneOf.1","typeLabel":"null"}],"uniqueKey":"RepeatPeriodId","typeLabel":"integer\u003cint32> | null"},"DaysBeforeInvoiceCreation":{"oneOf":[{"type":"integer","description":"Days before the billing period ends that the invoice is created, 0-31. Default 0.","format":"int32","example":0,"uniqueKey":"DaysBeforeInvoiceCreation.oneOf.0","typeLabel":"integer\u003cint32>"},{"type":"null","description":"Days before the billing period ends that the invoice is created, 0-31. Default 0.","format":"int32","example":0,"uniqueKey":"DaysBeforeInvoiceCreation.oneOf.1","typeLabel":"null"}],"uniqueKey":"DaysBeforeInvoiceCreation","typeLabel":"integer\u003cint32> | null"},"DaysUntilDue":{"oneOf":[{"type":"integer","description":"Days the client has to pay. Defaults to the service provider's invoice setting.","format":"int32","example":30,"uniqueKey":"DaysUntilDue.oneOf.0","typeLabel":"integer\u003cint32>"},{"type":"null","description":"Days the client has to pay. Defaults to the service provider's invoice setting.","format":"int32","example":30,"uniqueKey":"DaysUntilDue.oneOf.1","typeLabel":"null"}],"uniqueKey":"DaysUntilDue","typeLabel":"integer\u003cint32> | null"},"AutoApproveAndSend":{"oneOf":[{"type":"boolean","description":"Approve and send each invoice raised from the contract automatically. Default false.","uniqueKey":"AutoApproveAndSend.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"Approve and send each invoice raised from the contract automatically. Default false.","uniqueKey":"AutoApproveAndSend.oneOf.1","typeLabel":"null"}],"uniqueKey":"AutoApproveAndSend","typeLabel":"boolean | null"},"ContactIds":{"oneOf":[{"type":"array","items":{"type":"integer","format":"int64","uniqueKey":"ContactIds.oneOf.0.items.[INDEX]","typeLabel":"integer\u003cint64>"},"description":"The client's contacts who can auto-approve the contract's invoices.","uniqueKey":"ContactIds.oneOf.0","typeLabel":"integer\u003cint64>[]"},{"type":"null","items":{"type":"integer","format":"int64"},"description":"The client's contacts who can auto-approve the contract's invoices.","uniqueKey":"ContactIds.oneOf.1","typeLabel":"null"}],"uniqueKey":"ContactIds","typeLabel":"integer\u003cint64>[] | null"},"InvoiceTemplateId":{"oneOf":[{"type":"integer","description":"Invoice template for the contract's invoices. Left out, the service provider's default applies.","format":"int64","uniqueKey":"InvoiceTemplateId.oneOf.0","typeLabel":"integer\u003cint64>"},{"type":"null","description":"Invoice template for the contract's invoices. Left out, the service provider's default applies.","format":"int64","uniqueKey":"InvoiceTemplateId.oneOf.1","typeLabel":"null"}],"uniqueKey":"InvoiceTemplateId","typeLabel":"integer\u003cint64> | null"},"InvoiceEmailTemplateId":{"oneOf":[{"type":"integer","description":"Email template for the contract's invoices. Left out, the service provider's default applies.","format":"int64","uniqueKey":"InvoiceEmailTemplateId.oneOf.0","typeLabel":"integer\u003cint64>"},{"type":"null","description":"Email template for the contract's invoices. Left out, the service provider's default applies.","format":"int64","uniqueKey":"InvoiceEmailTemplateId.oneOf.1","typeLabel":"null"}],"uniqueKey":"InvoiceEmailTemplateId","typeLabel":"integer\u003cint64> | null"},"BrandingThemeId":{"oneOf":[{"type":"string","description":"Accounting-system branding theme for the contract's invoices.","format":"uuid","uniqueKey":"BrandingThemeId.oneOf.0","typeLabel":"string\u003cuuid>"},{"type":"null","description":"Accounting-system branding theme for the contract's invoices.","format":"uuid","uniqueKey":"BrandingThemeId.oneOf.1","typeLabel":"null"}],"uniqueKey":"BrandingThemeId","typeLabel":"string\u003cuuid> | null"},"ServiceLines":{"oneOf":[{"type":"array","items":{"type":"object","properties":{"Id":{"oneOf":[{"type":"integer","description":"PATCH only: the service line to keep and update. Leave it out to add a line. Not accepted on\r\nPOST.","format":"int64","example":88214,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].Id.oneOf.0","typeLabel":"integer\u003cint64>"},{"type":"null","description":"PATCH only: the service line to keep and update. Leave it out to add a line. Not accepted on\r\nPOST.","format":"int64","example":88214,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].Id.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].Id","typeLabel":"integer\u003cint64> | null"},"Name":{"oneOf":[{"type":"string","description":"Name of the service line. Required on a new line.","example":"Managed Services","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].Name.oneOf.0","typeLabel":"string"},{"type":"null","description":"Name of the service line. Required on a new line.","example":"Managed Services","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].Name.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].Name","typeLabel":"string | null"},"LaborTermsId":{"oneOf":[{"type":"integer","description":"How the line bills time: 1 Unlimited Hours, 2 Hourly, 3 Block Hours, 4 No Labor Terms,\r\n5 Limited Hours. Required on a new line. On an existing line only a No Labor Terms line can\r\nchange, once.","format":"int32","example":1,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LaborTermsId.oneOf.0","typeLabel":"integer\u003cint32>"},{"type":"null","description":"How the line bills time: 1 Unlimited Hours, 2 Hourly, 3 Block Hours, 4 No Labor Terms,\r\n5 Limited Hours. Required on a new line. On an existing line only a No Labor Terms line can\r\nchange, once.","format":"int32","example":1,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LaborTermsId.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LaborTermsId","typeLabel":"integer\u003cint32> | null"},"WorkTypeIds":{"oneOf":[{"type":"array","items":{"type":"integer","format":"int64","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].WorkTypeIds.oneOf.0.items.[INDEX]","typeLabel":"integer\u003cint64>"},"description":"The work types the line covers. Left out on a new line, every work type is covered, as in the\r\napp. Not accepted on a No Labor Terms line.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].WorkTypeIds.oneOf.0","typeLabel":"integer\u003cint64>[]"},{"type":"null","items":{"type":"integer","format":"int64"},"description":"The work types the line covers. Left out on a new line, every work type is covered, as in the\r\napp. Not accepted on a No Labor Terms line.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].WorkTypeIds.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].WorkTypeIds","typeLabel":"integer\u003cint64>[] | null"},"WorkRoleIds":{"oneOf":[{"type":"array","items":{"type":"integer","format":"int64","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].WorkRoleIds.oneOf.0.items.[INDEX]","typeLabel":"integer\u003cint64>"},"description":"The billing roles the line covers. Same rules as `WorkTypeIds`.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].WorkRoleIds.oneOf.0","typeLabel":"integer\u003cint64>[]"},{"type":"null","items":{"type":"integer","format":"int64"},"description":"The billing roles the line covers. Same rules as `WorkTypeIds`.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].WorkRoleIds.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].WorkRoleIds","typeLabel":"integer\u003cint64>[] | null"},"AutoApproveTime":{"oneOf":[{"type":"boolean","description":"Approve time logged against the line automatically. Every labor term except No Labor Terms. Default false.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].AutoApproveTime.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"Approve time logged against the line automatically. Every labor term except No Labor Terms. Default false.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].AutoApproveTime.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].AutoApproveTime","typeLabel":"boolean | null"},"AutoInvoiceTime":{"oneOf":[{"type":"boolean","description":"Sweep approved time waiting on the line into the contract's recurring invoice. Every labor term\r\nexcept No Labor Terms. Default false.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].AutoInvoiceTime.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"Sweep approved time waiting on the line into the contract's recurring invoice. Every labor term\r\nexcept No Labor Terms. Default false.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].AutoInvoiceTime.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].AutoInvoiceTime","typeLabel":"boolean | null"},"IncludedTimeGoesToId":{"oneOf":[{"type":"integer","description":"Where covered time lands when it is approved: 1 Complete (default) or 2 Waiting to invoice.\r\nUnlimited, Block and Limited Hours only.","format":"int32","example":1,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].IncludedTimeGoesToId.oneOf.0","typeLabel":"integer\u003cint32>"},{"type":"null","description":"Where covered time lands when it is approved: 1 Complete (default) or 2 Waiting to invoice.\r\nUnlimited, Block and Limited Hours only.","format":"int32","example":1,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].IncludedTimeGoesToId.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].IncludedTimeGoesToId","typeLabel":"integer\u003cint32> | null"},"UnlimitedHoursDetails":{"type":"object","additionalProperties":false,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].UnlimitedHoursDetails","typeLabel":"object"},"PerHourDetails":{"type":"object","properties":{"RateTypeId":{"oneOf":[{"type":"integer","description":"1 Use default labor rates, 2 Use fixed labor rate, 3 Custom labor rates. Default 1.","format":"int32","example":2,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.RateTypeId.oneOf.0","typeLabel":"integer\u003cint32>"},{"type":"null","description":"1 Use default labor rates, 2 Use fixed labor rate, 3 Custom labor rates. Default 1.","format":"int32","example":2,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.RateTypeId.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.RateTypeId","typeLabel":"integer\u003cint32> | null"},"HourlyRate":{"oneOf":[{"type":"number","description":"The flat rate per hour. Required with RateTypeId 2, refused with any other.","format":"double","example":150,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.HourlyRate.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"The flat rate per hour. Required with RateTypeId 2, refused with any other.","format":"double","example":150,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.HourlyRate.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.HourlyRate","typeLabel":"number\u003cdouble> | null"},"CustomRates":{"type":"object","properties":{"WorkRoles":{"oneOf":[{"type":"array","items":{"type":"object","properties":{"WorkRoleId":{"oneOf":[{"type":"integer","description":"The billing role this row prices. Required.","format":"int64","example":12,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX].WorkRoleId.oneOf.0","typeLabel":"integer\u003cint64>"},{"type":"null","description":"The billing role this row prices. Required.","format":"int64","example":12,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX].WorkRoleId.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX].WorkRoleId","typeLabel":"integer\u003cint64> | null"},"HourlyRate":{"oneOf":[{"type":"number","description":"Rate per hour. Left out, the current rate is kept.","format":"double","example":95,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX].HourlyRate.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"Rate per hour. Left out, the current rate is kept.","format":"double","example":95,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX].HourlyRate.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX].HourlyRate","typeLabel":"number\u003cdouble> | null"},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code. Left out, the current code is kept.","example":"270","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX].CoaCode.oneOf.0","typeLabel":"string"},{"type":"null","description":"Accounting code. Left out, the current code is kept.","example":"270","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX].CoaCode.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX].CoaCode","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX]","typeLabel":"object"},"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkRoles.oneOf.0","typeLabel":"object[]"},{"type":"null","items":{"type":"object","properties":{"WorkRoleId":{"oneOf":[{"type":"integer","description":"The billing role this row prices. Required.","format":"int64","example":12},{"type":"null","description":"The billing role this row prices. Required.","format":"int64","example":12}]},"HourlyRate":{"oneOf":[{"type":"number","description":"Rate per hour. Left out, the current rate is kept.","format":"double","example":95},{"type":"null","description":"Rate per hour. Left out, the current rate is kept.","format":"double","example":95}]},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code. Left out, the current code is kept.","example":"270"},{"type":"null","description":"Accounting code. Left out, the current code is kept.","example":"270"}]}},"additionalProperties":false},"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkRoles.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkRoles","typeLabel":"object[] | null"},"WorkTypes":{"oneOf":[{"type":"array","items":{"type":"object","properties":{"WorkTypeId":{"oneOf":[{"type":"integer","description":"The work type this row prices. Required.","format":"int64","example":176,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX].WorkTypeId.oneOf.0","typeLabel":"integer\u003cint64>"},{"type":"null","description":"The work type this row prices. Required.","format":"int64","example":176,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX].WorkTypeId.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX].WorkTypeId","typeLabel":"integer\u003cint64> | null"},"HourlyMultiplier":{"oneOf":[{"type":"number","description":"Multiplier on the role's rate. Left out, the current multiplier is kept.","format":"double","example":1.5,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX].HourlyMultiplier.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"Multiplier on the role's rate. Left out, the current multiplier is kept.","format":"double","example":1.5,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX].HourlyMultiplier.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX].HourlyMultiplier","typeLabel":"number\u003cdouble> | null"},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code. Left out, the current code is kept.","example":"200","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX].CoaCode.oneOf.0","typeLabel":"string"},{"type":"null","description":"Accounting code. Left out, the current code is kept.","example":"200","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX].CoaCode.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX].CoaCode","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX]","typeLabel":"object"},"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkTypes.oneOf.0","typeLabel":"object[]"},{"type":"null","items":{"type":"object","properties":{"WorkTypeId":{"oneOf":[{"type":"integer","description":"The work type this row prices. Required.","format":"int64","example":176},{"type":"null","description":"The work type this row prices. Required.","format":"int64","example":176}]},"HourlyMultiplier":{"oneOf":[{"type":"number","description":"Multiplier on the role's rate. Left out, the current multiplier is kept.","format":"double","example":1.5},{"type":"null","description":"Multiplier on the role's rate. Left out, the current multiplier is kept.","format":"double","example":1.5}]},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code. Left out, the current code is kept.","example":"200"},{"type":"null","description":"Accounting code. Left out, the current code is kept.","example":"200"}]}},"additionalProperties":false},"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkTypes.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkTypes","typeLabel":"object[] | null"}},"additionalProperties":false,"description":"Overrides for the Custom labor rates grid. The line starts from every billing role and work type\r\nat the service provider's own rates; only the rows sent here change. On PATCH, entries merge by\r\nid into the line's existing rows.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates","typeLabel":"object"}},"additionalProperties":false,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails","typeLabel":"object"},"LimitedHoursDetails":{"type":"object","properties":{"ShowRemainingHoursInClientPortal":{"oneOf":[{"type":"boolean","description":"Show the client the hours left in the allocation in the client portal. Default false.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.ShowRemainingHoursInClientPortal.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"Show the client the hours left in the allocation in the client portal. Default false.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.ShowRemainingHoursInClientPortal.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.ShowRemainingHoursInClientPortal","typeLabel":"boolean | null"},"AllocatedHours":{"oneOf":[{"type":"number","description":"Hours included each billing period. Required on a new line.","format":"double","example":10,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.AllocatedHours.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"Hours included each billing period. Required on a new line.","format":"double","example":10,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.AllocatedHours.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.AllocatedHours","typeLabel":"number\u003cdouble> | null"},"RateTypeId":{"oneOf":[{"type":"integer","description":"Same as on `PerHourDetails`.","format":"int32","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.RateTypeId.oneOf.0","typeLabel":"integer\u003cint32>"},{"type":"null","description":"Same as on `PerHourDetails`.","format":"int32","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.RateTypeId.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.RateTypeId","typeLabel":"integer\u003cint32> | null"},"HourlyRate":{"oneOf":[{"type":"number","description":"Same as on `PerHourDetails`.","format":"double","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.HourlyRate.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"Same as on `PerHourDetails`.","format":"double","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.HourlyRate.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.HourlyRate","typeLabel":"number\u003cdouble> | null"},"CustomRates":{"type":"object","properties":{"WorkRoles":{"oneOf":[{"type":"array","items":{"type":"object","properties":{"WorkRoleId":{"oneOf":[{"type":"integer","description":"The billing role this row prices. Required.","format":"int64","example":12,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX].WorkRoleId.oneOf.0","typeLabel":"integer\u003cint64>"},{"type":"null","description":"The billing role this row prices. Required.","format":"int64","example":12,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX].WorkRoleId.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX].WorkRoleId","typeLabel":"integer\u003cint64> | null"},"HourlyRate":{"oneOf":[{"type":"number","description":"Rate per hour. Left out, the current rate is kept.","format":"double","example":95,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX].HourlyRate.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"Rate per hour. Left out, the current rate is kept.","format":"double","example":95,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX].HourlyRate.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX].HourlyRate","typeLabel":"number\u003cdouble> | null"},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code. Left out, the current code is kept.","example":"270","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX].CoaCode.oneOf.0","typeLabel":"string"},{"type":"null","description":"Accounting code. Left out, the current code is kept.","example":"270","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX].CoaCode.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX].CoaCode","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX]","typeLabel":"object"},"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles.oneOf.0","typeLabel":"object[]"},{"type":"null","items":{"type":"object","properties":{"WorkRoleId":{"oneOf":[{"type":"integer","description":"The billing role this row prices. Required.","format":"int64","example":12},{"type":"null","description":"The billing role this row prices. Required.","format":"int64","example":12}]},"HourlyRate":{"oneOf":[{"type":"number","description":"Rate per hour. Left out, the current rate is kept.","format":"double","example":95},{"type":"null","description":"Rate per hour. Left out, the current rate is kept.","format":"double","example":95}]},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code. Left out, the current code is kept.","example":"270"},{"type":"null","description":"Accounting code. Left out, the current code is kept.","example":"270"}]}},"additionalProperties":false},"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles","typeLabel":"object[] | null"},"WorkTypes":{"oneOf":[{"type":"array","items":{"type":"object","properties":{"WorkTypeId":{"oneOf":[{"type":"integer","description":"The work type this row prices. Required.","format":"int64","example":176,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX].WorkTypeId.oneOf.0","typeLabel":"integer\u003cint64>"},{"type":"null","description":"The work type this row prices. Required.","format":"int64","example":176,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX].WorkTypeId.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX].WorkTypeId","typeLabel":"integer\u003cint64> | null"},"HourlyMultiplier":{"oneOf":[{"type":"number","description":"Multiplier on the role's rate. Left out, the current multiplier is kept.","format":"double","example":1.5,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX].HourlyMultiplier.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"Multiplier on the role's rate. Left out, the current multiplier is kept.","format":"double","example":1.5,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX].HourlyMultiplier.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX].HourlyMultiplier","typeLabel":"number\u003cdouble> | null"},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code. Left out, the current code is kept.","example":"200","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX].CoaCode.oneOf.0","typeLabel":"string"},{"type":"null","description":"Accounting code. Left out, the current code is kept.","example":"200","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX].CoaCode.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX].CoaCode","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX]","typeLabel":"object"},"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes.oneOf.0","typeLabel":"object[]"},{"type":"null","items":{"type":"object","properties":{"WorkTypeId":{"oneOf":[{"type":"integer","description":"The work type this row prices. Required.","format":"int64","example":176},{"type":"null","description":"The work type this row prices. Required.","format":"int64","example":176}]},"HourlyMultiplier":{"oneOf":[{"type":"number","description":"Multiplier on the role's rate. Left out, the current multiplier is kept.","format":"double","example":1.5},{"type":"null","description":"Multiplier on the role's rate. Left out, the current multiplier is kept.","format":"double","example":1.5}]},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code. Left out, the current code is kept.","example":"200"},{"type":"null","description":"Accounting code. Left out, the current code is kept.","example":"200"}]}},"additionalProperties":false},"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes","typeLabel":"object[] | null"}},"additionalProperties":false,"description":"Overrides for the Custom labor rates grid. The line starts from every billing role and work type\r\nat the service provider's own rates; only the rows sent here change. On PATCH, entries merge by\r\nid into the line's existing rows.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates","typeLabel":"object"}},"additionalProperties":false,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails","typeLabel":"object"},"BlockHoursDetails":{"type":"object","properties":{"ShowRemainingHoursInClientPortal":{"oneOf":[{"type":"boolean","description":"Show the client the hours left in the block in the client portal. Default false.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails.ShowRemainingHoursInClientPortal.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"Show the client the hours left in the block in the client portal. Default false.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails.ShowRemainingHoursInClientPortal.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails.ShowRemainingHoursInClientPortal","typeLabel":"boolean | null"},"TemplateId":{"oneOf":[{"type":"integer","description":"A Block Hours Template id, or 0 for Custom. With a template, Balance and Price come from it and\r\nare refused on the request, as the app disables both once a template is picked. Required on a\r\nnew line.","format":"int64","example":0,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails.TemplateId.oneOf.0","typeLabel":"integer\u003cint64>"},{"type":"null","description":"A Block Hours Template id, or 0 for Custom. With a template, Balance and Price come from it and\r\nare refused on the request, as the app disables both once a template is picked. Required on a\r\nnew line.","format":"int64","example":0,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails.TemplateId.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails.TemplateId","typeLabel":"integer\u003cint64> | null"},"Balance":{"oneOf":[{"type":"number","description":"Hours in the block. Custom (TemplateId 0) only, and then required on a new line.","format":"double","example":20,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails.Balance.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"Hours in the block. Custom (TemplateId 0) only, and then required on a new line.","format":"double","example":20,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails.Balance.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails.Balance","typeLabel":"number\u003cdouble> | null"},"Price":{"oneOf":[{"type":"number","description":"The price of the block, billed once on the Draft invoice the new line raises. Custom\r\n(TemplateId 0) only, and then required on a new line.","format":"double","example":2000,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails.Price.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"The price of the block, billed once on the Draft invoice the new line raises. Custom\r\n(TemplateId 0) only, and then required on a new line.","format":"double","example":2000,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails.Price.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails.Price","typeLabel":"number\u003cdouble> | null"},"WarningThreshold":{"oneOf":[{"type":"integer","description":"Percentage of the block left that raises a low-balance warning, a whole number 0-90.","format":"int32","example":20,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails.WarningThreshold.oneOf.0","typeLabel":"integer\u003cint32>"},{"type":"null","description":"Percentage of the block left that raises a low-balance warning, a whole number 0-90.","format":"int32","example":20,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails.WarningThreshold.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails.WarningThreshold","typeLabel":"integer\u003cint32> | null"},"OverrunThreshold":{"oneOf":[{"type":"integer","description":"Percentage of the block the client may run past zero, a whole number 0-50.","format":"int32","example":10,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails.OverrunThreshold.oneOf.0","typeLabel":"integer\u003cint32>"},{"type":"null","description":"Percentage of the block the client may run past zero, a whole number 0-50.","format":"int32","example":10,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails.OverrunThreshold.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails.OverrunThreshold","typeLabel":"integer\u003cint32> | null"}},"additionalProperties":false,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails","typeLabel":"object"},"LineItems":{"oneOf":[{"type":"array","items":{"type":"object","properties":{"Id":{"oneOf":[{"type":"integer","description":"PATCH only: the existing line item to keep and update. Leave it out to add one.","format":"int64","example":991204,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].Id.oneOf.0","typeLabel":"integer\u003cint64>"},{"type":"null","description":"PATCH only: the existing line item to keep and update. Leave it out to add one.","format":"int64","example":991204,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].Id.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].Id","typeLabel":"integer\u003cint64> | null"},"ItemId":{"oneOf":[{"type":"string","description":"The catalog item to bill. Required on a new entry, not accepted on an existing one.","format":"uuid","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].ItemId.oneOf.0","typeLabel":"string\u003cuuid>"},{"type":"null","description":"The catalog item to bill. Required on a new entry, not accepted on an existing one.","format":"uuid","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].ItemId.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].ItemId","typeLabel":"string\u003cuuid> | null"},"Quantity":{"oneOf":[{"type":"number","description":"Quantity billed each period. Required on a new entry. Greater than 0.","format":"double","example":12,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].Quantity.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"Quantity billed each period. Required on a new entry. Greater than 0.","format":"double","example":12,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].Quantity.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].Quantity","typeLabel":"number\u003cdouble> | null"},"Description":{"oneOf":[{"type":"string","description":"Description on the invoice. Defaults to the item's. Send null to clear it.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].Description.oneOf.0","typeLabel":"string"},{"type":"null","description":"Description on the invoice. Defaults to the item's. Send null to clear it.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].Description.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].Description","typeLabel":"string | null"},"UnitPrice":{"oneOf":[{"type":"number","description":"Unit price charged. Defaults to the item's price. Not negative.","format":"double","example":24.2,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].UnitPrice.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"Unit price charged. Defaults to the item's price. Not negative.","format":"double","example":24.2,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].UnitPrice.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].UnitPrice","typeLabel":"number\u003cdouble> | null"},"UnitCost":{"oneOf":[{"type":"number","description":"Unit cost. Defaults to the item's cost. Not negative.","format":"double","example":18.4,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].UnitCost.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"Unit cost. Defaults to the item's cost. Not negative.","format":"double","example":18.4,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].UnitCost.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].UnitCost","typeLabel":"number\u003cdouble> | null"},"DiscountPercent":{"oneOf":[{"type":"number","description":"Discount percentage, 0-100. Default 0.","format":"double","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].DiscountPercent.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"Discount percentage, 0-100. Default 0.","format":"double","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].DiscountPercent.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].DiscountPercent","typeLabel":"number\u003cdouble> | null"},"TaxId":{"oneOf":[{"type":"integer","description":"Tax applied. Null, or left out on a new line item, gives the tax the app would pick for the item; left out on an existing one, its tax is kept. To bill no tax, send the tax-exempt rate's id.","format":"int64","example":2419,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].TaxId.oneOf.0","typeLabel":"integer\u003cint64>"},{"type":"null","description":"Tax applied. Null, or left out on a new line item, gives the tax the app would pick for the item; left out on an existing one, its tax is kept. To bill no tax, send the tax-exempt rate's id.","format":"int64","example":2419,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].TaxId.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].TaxId","typeLabel":"integer\u003cint64> | null"},"BillableStatusId":{"oneOf":[{"type":"integer","description":"1 Billable (default), 2 No charge, 3 Non-billable. A line that isn't Billable bills 0.","format":"int32","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].BillableStatusId.oneOf.0","typeLabel":"integer\u003cint32>"},{"type":"null","description":"1 Billable (default), 2 No charge, 3 Non-billable. A line that isn't Billable bills 0.","format":"int32","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].BillableStatusId.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].BillableStatusId","typeLabel":"integer\u003cint32> | null"},"StartDate":{"oneOf":[{"type":"string","description":"Date the line starts billing, a calendar date. Defaults to today in the service provider's zone,\r\nor the contract's start date if that is later.","format":"date-time","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].StartDate.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","description":"Date the line starts billing, a calendar date. Defaults to today in the service provider's zone,\r\nor the contract's start date if that is later.","format":"date-time","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].StartDate.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].StartDate","typeLabel":"string\u003cdate-time> | null"},"EndDate":{"oneOf":[{"type":"string","description":"Date the line stops billing, a calendar date. Send null to make it open-ended.","format":"date-time","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].EndDate.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","description":"Date the line stops billing, a calendar date. Send null to make it open-ended.","format":"date-time","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].EndDate.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].EndDate","typeLabel":"string\u003cdate-time> | null"}},"additionalProperties":false,"description":"One product or bundle billed on a service line. A new entry needs ItemId and Quantity; the rest\r\nfalls back to the item's own values, as an invoice line does. Amount and TaxAmount are always\r\ncalculated.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX]","typeLabel":"object"},"description":"The products and bundles billed on the line. On PATCH the list replaces the set, matched by\r\n`Id`; leave it out to keep the line items as they are.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0","typeLabel":"object[]"},{"type":"null","items":{"type":"object","properties":{"Id":{"oneOf":[{"type":"integer","description":"PATCH only: the existing line item to keep and update. Leave it out to add one.","format":"int64","example":991204},{"type":"null","description":"PATCH only: the existing line item to keep and update. Leave it out to add one.","format":"int64","example":991204}]},"ItemId":{"oneOf":[{"type":"string","description":"The catalog item to bill. Required on a new entry, not accepted on an existing one.","format":"uuid"},{"type":"null","description":"The catalog item to bill. Required on a new entry, not accepted on an existing one.","format":"uuid"}]},"Quantity":{"oneOf":[{"type":"number","description":"Quantity billed each period. Required on a new entry. Greater than 0.","format":"double","example":12},{"type":"null","description":"Quantity billed each period. Required on a new entry. Greater than 0.","format":"double","example":12}]},"Description":{"oneOf":[{"type":"string","description":"Description on the invoice. Defaults to the item's. Send null to clear it."},{"type":"null","description":"Description on the invoice. Defaults to the item's. Send null to clear it."}]},"UnitPrice":{"oneOf":[{"type":"number","description":"Unit price charged. Defaults to the item's price. Not negative.","format":"double","example":24.2},{"type":"null","description":"Unit price charged. Defaults to the item's price. Not negative.","format":"double","example":24.2}]},"UnitCost":{"oneOf":[{"type":"number","description":"Unit cost. Defaults to the item's cost. Not negative.","format":"double","example":18.4},{"type":"null","description":"Unit cost. Defaults to the item's cost. Not negative.","format":"double","example":18.4}]},"DiscountPercent":{"oneOf":[{"type":"number","description":"Discount percentage, 0-100. Default 0.","format":"double"},{"type":"null","description":"Discount percentage, 0-100. Default 0.","format":"double"}]},"TaxId":{"oneOf":[{"type":"integer","description":"Tax applied. Null, or left out on a new line item, gives the tax the app would pick for the item; left out on an existing one, its tax is kept. To bill no tax, send the tax-exempt rate's id.","format":"int64","example":2419},{"type":"null","description":"Tax applied. Null, or left out on a new line item, gives the tax the app would pick for the item; left out on an existing one, its tax is kept. To bill no tax, send the tax-exempt rate's id.","format":"int64","example":2419}]},"BillableStatusId":{"oneOf":[{"type":"integer","description":"1 Billable (default), 2 No charge, 3 Non-billable. A line that isn't Billable bills 0.","format":"int32"},{"type":"null","description":"1 Billable (default), 2 No charge, 3 Non-billable. A line that isn't Billable bills 0.","format":"int32"}]},"StartDate":{"oneOf":[{"type":"string","description":"Date the line starts billing, a calendar date. Defaults to today in the service provider's zone,\r\nor the contract's start date if that is later.","format":"date-time"},{"type":"null","description":"Date the line starts billing, a calendar date. Defaults to today in the service provider's zone,\r\nor the contract's start date if that is later.","format":"date-time"}]},"EndDate":{"oneOf":[{"type":"string","description":"Date the line stops billing, a calendar date. Send null to make it open-ended.","format":"date-time"},{"type":"null","description":"Date the line stops billing, a calendar date. Send null to make it open-ended.","format":"date-time"}]}},"additionalProperties":false,"description":"One product or bundle billed on a service line. A new entry needs ItemId and Quantity; the rest\r\nfalls back to the item's own values, as an invoice line does. Amount and TaxAmount are always\r\ncalculated."},"description":"The products and bundles billed on the line. On PATCH the list replaces the set, matched by\r\n`Id`; leave it out to keep the line items as they are.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems","typeLabel":"object[] | null"}},"additionalProperties":false,"description":"One service line on `POST /v1/contracts` or `PATCH /v1/contracts/{contractId}`. Send\r\nexactly one details object, the one matching `LaborTermsId`; No Labor Terms takes none.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX]","typeLabel":"object"},"description":"The service lines. At least one.","uniqueKey":"ServiceLines.oneOf.0","typeLabel":"object[]"},{"type":"null","items":{"type":"object","properties":{"Id":{"oneOf":[{"type":"integer","description":"PATCH only: the service line to keep and update. Leave it out to add a line. Not accepted on\r\nPOST.","format":"int64","example":88214},{"type":"null","description":"PATCH only: the service line to keep and update. Leave it out to add a line. Not accepted on\r\nPOST.","format":"int64","example":88214}]},"Name":{"oneOf":[{"type":"string","description":"Name of the service line. Required on a new line.","example":"Managed Services"},{"type":"null","description":"Name of the service line. Required on a new line.","example":"Managed Services"}]},"LaborTermsId":{"oneOf":[{"type":"integer","description":"How the line bills time: 1 Unlimited Hours, 2 Hourly, 3 Block Hours, 4 No Labor Terms,\r\n5 Limited Hours. Required on a new line. On an existing line only a No Labor Terms line can\r\nchange, once.","format":"int32","example":1},{"type":"null","description":"How the line bills time: 1 Unlimited Hours, 2 Hourly, 3 Block Hours, 4 No Labor Terms,\r\n5 Limited Hours. Required on a new line. On an existing line only a No Labor Terms line can\r\nchange, once.","format":"int32","example":1}]},"WorkTypeIds":{"oneOf":[{"type":"array","items":{"type":"integer","format":"int64"},"description":"The work types the line covers. Left out on a new line, every work type is covered, as in the\r\napp. Not accepted on a No Labor Terms line."},{"type":"null","items":{"type":"integer","format":"int64"},"description":"The work types the line covers. Left out on a new line, every work type is covered, as in the\r\napp. Not accepted on a No Labor Terms line."}]},"WorkRoleIds":{"oneOf":[{"type":"array","items":{"type":"integer","format":"int64"},"description":"The billing roles the line covers. Same rules as `WorkTypeIds`."},{"type":"null","items":{"type":"integer","format":"int64"},"description":"The billing roles the line covers. Same rules as `WorkTypeIds`."}]},"AutoApproveTime":{"oneOf":[{"type":"boolean","description":"Approve time logged against the line automatically. Every labor term except No Labor Terms. Default false."},{"type":"null","description":"Approve time logged against the line automatically. Every labor term except No Labor Terms. Default false."}]},"AutoInvoiceTime":{"oneOf":[{"type":"boolean","description":"Sweep approved time waiting on the line into the contract's recurring invoice. Every labor term\r\nexcept No Labor Terms. Default false."},{"type":"null","description":"Sweep approved time waiting on the line into the contract's recurring invoice. Every labor term\r\nexcept No Labor Terms. Default false."}]},"IncludedTimeGoesToId":{"oneOf":[{"type":"integer","description":"Where covered time lands when it is approved: 1 Complete (default) or 2 Waiting to invoice.\r\nUnlimited, Block and Limited Hours only.","format":"int32","example":1},{"type":"null","description":"Where covered time lands when it is approved: 1 Complete (default) or 2 Waiting to invoice.\r\nUnlimited, Block and Limited Hours only.","format":"int32","example":1}]},"UnlimitedHoursDetails":{"type":"object","additionalProperties":false},"PerHourDetails":{"type":"object","properties":{"RateTypeId":{"oneOf":[{"type":"integer","description":"1 Use default labor rates, 2 Use fixed labor rate, 3 Custom labor rates. Default 1.","format":"int32","example":2},{"type":"null","description":"1 Use default labor rates, 2 Use fixed labor rate, 3 Custom labor rates. Default 1.","format":"int32","example":2}]},"HourlyRate":{"oneOf":[{"type":"number","description":"The flat rate per hour. Required with RateTypeId 2, refused with any other.","format":"double","example":150},{"type":"null","description":"The flat rate per hour. Required with RateTypeId 2, refused with any other.","format":"double","example":150}]},"CustomRates":{"type":"object","properties":{"WorkRoles":{"oneOf":[{"type":"array","items":{"type":"object","properties":{"WorkRoleId":{"oneOf":[{"type":"integer","description":"The billing role this row prices. Required.","format":"int64","example":12},{"type":"null","description":"The billing role this row prices. Required.","format":"int64","example":12}]},"HourlyRate":{"oneOf":[{"type":"number","description":"Rate per hour. Left out, the current rate is kept.","format":"double","example":95},{"type":"null","description":"Rate per hour. Left out, the current rate is kept.","format":"double","example":95}]},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code. Left out, the current code is kept.","example":"270"},{"type":"null","description":"Accounting code. Left out, the current code is kept.","example":"270"}]}},"additionalProperties":false}},{"type":"null","items":{"type":"object","properties":{"WorkRoleId":{"oneOf":[{"type":"integer","description":"The billing role this row prices. Required.","format":"int64","example":12},{"type":"null","description":"The billing role this row prices. Required.","format":"int64","example":12}]},"HourlyRate":{"oneOf":[{"type":"number","description":"Rate per hour. Left out, the current rate is kept.","format":"double","example":95},{"type":"null","description":"Rate per hour. Left out, the current rate is kept.","format":"double","example":95}]},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code. Left out, the current code is kept.","example":"270"},{"type":"null","description":"Accounting code. Left out, the current code is kept.","example":"270"}]}},"additionalProperties":false}}]},"WorkTypes":{"oneOf":[{"type":"array","items":{"type":"object","properties":{"WorkTypeId":{"oneOf":[{"type":"integer","description":"The work type this row prices. Required.","format":"int64","example":176},{"type":"null","description":"The work type this row prices. Required.","format":"int64","example":176}]},"HourlyMultiplier":{"oneOf":[{"type":"number","description":"Multiplier on the role's rate. Left out, the current multiplier is kept.","format":"double","example":1.5},{"type":"null","description":"Multiplier on the role's rate. Left out, the current multiplier is kept.","format":"double","example":1.5}]},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code. Left out, the current code is kept.","example":"200"},{"type":"null","description":"Accounting code. Left out, the current code is kept.","example":"200"}]}},"additionalProperties":false}},{"type":"null","items":{"type":"object","properties":{"WorkTypeId":{"oneOf":[{"type":"integer","description":"The work type this row prices. Required.","format":"int64","example":176},{"type":"null","description":"The work type this row prices. Required.","format":"int64","example":176}]},"HourlyMultiplier":{"oneOf":[{"type":"number","description":"Multiplier on the role's rate. Left out, the current multiplier is kept.","format":"double","example":1.5},{"type":"null","description":"Multiplier on the role's rate. Left out, the current multiplier is kept.","format":"double","example":1.5}]},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code. Left out, the current code is kept.","example":"200"},{"type":"null","description":"Accounting code. Left out, the current code is kept.","example":"200"}]}},"additionalProperties":false}}]}},"additionalProperties":false,"description":"Overrides for the Custom labor rates grid. The line starts from every billing role and work type\r\nat the service provider's own rates; only the rows sent here change. On PATCH, entries merge by\r\nid into the line's existing rows."}},"additionalProperties":false},"LimitedHoursDetails":{"type":"object","properties":{"ShowRemainingHoursInClientPortal":{"oneOf":[{"type":"boolean","description":"Show the client the hours left in the allocation in the client portal. Default false."},{"type":"null","description":"Show the client the hours left in the allocation in the client portal. Default false."}]},"AllocatedHours":{"oneOf":[{"type":"number","description":"Hours included each billing period. Required on a new line.","format":"double","example":10},{"type":"null","description":"Hours included each billing period. Required on a new line.","format":"double","example":10}]},"RateTypeId":{"oneOf":[{"type":"integer","description":"Same as on `PerHourDetails`.","format":"int32"},{"type":"null","description":"Same as on `PerHourDetails`.","format":"int32"}]},"HourlyRate":{"oneOf":[{"type":"number","description":"Same as on `PerHourDetails`.","format":"double"},{"type":"null","description":"Same as on `PerHourDetails`.","format":"double"}]},"CustomRates":{"type":"object","properties":{"WorkRoles":{"oneOf":[{"type":"array","items":{"type":"object","properties":{"WorkRoleId":{"oneOf":[{"type":"integer","description":"The billing role this row prices. Required.","format":"int64","example":12},{"type":"null","description":"The billing role this row prices. Required.","format":"int64","example":12}]},"HourlyRate":{"oneOf":[{"type":"number","description":"Rate per hour. Left out, the current rate is kept.","format":"double","example":95},{"type":"null","description":"Rate per hour. Left out, the current rate is kept.","format":"double","example":95}]},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code. Left out, the current code is kept.","example":"270"},{"type":"null","description":"Accounting code. Left out, the current code is kept.","example":"270"}]}},"additionalProperties":false}},{"type":"null","items":{"type":"object","properties":{"WorkRoleId":{"oneOf":[{"type":"integer","description":"The billing role this row prices. Required.","format":"int64","example":12},{"type":"null","description":"The billing role this row prices. Required.","format":"int64","example":12}]},"HourlyRate":{"oneOf":[{"type":"number","description":"Rate per hour. Left out, the current rate is kept.","format":"double","example":95},{"type":"null","description":"Rate per hour. Left out, the current rate is kept.","format":"double","example":95}]},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code. Left out, the current code is kept.","example":"270"},{"type":"null","description":"Accounting code. Left out, the current code is kept.","example":"270"}]}},"additionalProperties":false}}]},"WorkTypes":{"oneOf":[{"type":"array","items":{"type":"object","properties":{"WorkTypeId":{"oneOf":[{"type":"integer","description":"The work type this row prices. Required.","format":"int64","example":176},{"type":"null","description":"The work type this row prices. Required.","format":"int64","example":176}]},"HourlyMultiplier":{"oneOf":[{"type":"number","description":"Multiplier on the role's rate. Left out, the current multiplier is kept.","format":"double","example":1.5},{"type":"null","description":"Multiplier on the role's rate. Left out, the current multiplier is kept.","format":"double","example":1.5}]},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code. Left out, the current code is kept.","example":"200"},{"type":"null","description":"Accounting code. Left out, the current code is kept.","example":"200"}]}},"additionalProperties":false}},{"type":"null","items":{"type":"object","properties":{"WorkTypeId":{"oneOf":[{"type":"integer","description":"The work type this row prices. Required.","format":"int64","example":176},{"type":"null","description":"The work type this row prices. Required.","format":"int64","example":176}]},"HourlyMultiplier":{"oneOf":[{"type":"number","description":"Multiplier on the role's rate. Left out, the current multiplier is kept.","format":"double","example":1.5},{"type":"null","description":"Multiplier on the role's rate. Left out, the current multiplier is kept.","format":"double","example":1.5}]},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code. Left out, the current code is kept.","example":"200"},{"type":"null","description":"Accounting code. Left out, the current code is kept.","example":"200"}]}},"additionalProperties":false}}]}},"additionalProperties":false,"description":"Overrides for the Custom labor rates grid. The line starts from every billing role and work type\r\nat the service provider's own rates; only the rows sent here change. On PATCH, entries merge by\r\nid into the line's existing rows."}},"additionalProperties":false},"BlockHoursDetails":{"type":"object","properties":{"ShowRemainingHoursInClientPortal":{"oneOf":[{"type":"boolean","description":"Show the client the hours left in the block in the client portal. Default false."},{"type":"null","description":"Show the client the hours left in the block in the client portal. Default false."}]},"TemplateId":{"oneOf":[{"type":"integer","description":"A Block Hours Template id, or 0 for Custom. With a template, Balance and Price come from it and\r\nare refused on the request, as the app disables both once a template is picked. Required on a\r\nnew line.","format":"int64","example":0},{"type":"null","description":"A Block Hours Template id, or 0 for Custom. With a template, Balance and Price come from it and\r\nare refused on the request, as the app disables both once a template is picked. Required on a\r\nnew line.","format":"int64","example":0}]},"Balance":{"oneOf":[{"type":"number","description":"Hours in the block. Custom (TemplateId 0) only, and then required on a new line.","format":"double","example":20},{"type":"null","description":"Hours in the block. Custom (TemplateId 0) only, and then required on a new line.","format":"double","example":20}]},"Price":{"oneOf":[{"type":"number","description":"The price of the block, billed once on the Draft invoice the new line raises. Custom\r\n(TemplateId 0) only, and then required on a new line.","format":"double","example":2000},{"type":"null","description":"The price of the block, billed once on the Draft invoice the new line raises. Custom\r\n(TemplateId 0) only, and then required on a new line.","format":"double","example":2000}]},"WarningThreshold":{"oneOf":[{"type":"integer","description":"Percentage of the block left that raises a low-balance warning, a whole number 0-90.","format":"int32","example":20},{"type":"null","description":"Percentage of the block left that raises a low-balance warning, a whole number 0-90.","format":"int32","example":20}]},"OverrunThreshold":{"oneOf":[{"type":"integer","description":"Percentage of the block the client may run past zero, a whole number 0-50.","format":"int32","example":10},{"type":"null","description":"Percentage of the block the client may run past zero, a whole number 0-50.","format":"int32","example":10}]}},"additionalProperties":false},"LineItems":{"oneOf":[{"type":"array","items":{"type":"object","properties":{"Id":{"oneOf":[{"type":"integer","description":"PATCH only: the existing line item to keep and update. Leave it out to add one.","format":"int64","example":991204},{"type":"null","description":"PATCH only: the existing line item to keep and update. Leave it out to add one.","format":"int64","example":991204}]},"ItemId":{"oneOf":[{"type":"string","description":"The catalog item to bill. Required on a new entry, not accepted on an existing one.","format":"uuid"},{"type":"null","description":"The catalog item to bill. Required on a new entry, not accepted on an existing one.","format":"uuid"}]},"Quantity":{"oneOf":[{"type":"number","description":"Quantity billed each period. Required on a new entry. Greater than 0.","format":"double","example":12},{"type":"null","description":"Quantity billed each period. Required on a new entry. Greater than 0.","format":"double","example":12}]},"Description":{"oneOf":[{"type":"string","description":"Description on the invoice. Defaults to the item's. Send null to clear it."},{"type":"null","description":"Description on the invoice. Defaults to the item's. Send null to clear it."}]},"UnitPrice":{"oneOf":[{"type":"number","description":"Unit price charged. Defaults to the item's price. Not negative.","format":"double","example":24.2},{"type":"null","description":"Unit price charged. Defaults to the item's price. Not negative.","format":"double","example":24.2}]},"UnitCost":{"oneOf":[{"type":"number","description":"Unit cost. Defaults to the item's cost. Not negative.","format":"double","example":18.4},{"type":"null","description":"Unit cost. Defaults to the item's cost. Not negative.","format":"double","example":18.4}]},"DiscountPercent":{"oneOf":[{"type":"number","description":"Discount percentage, 0-100. Default 0.","format":"double"},{"type":"null","description":"Discount percentage, 0-100. Default 0.","format":"double"}]},"TaxId":{"oneOf":[{"type":"integer","description":"Tax applied. Null, or left out on a new line item, gives the tax the app would pick for the item; left out on an existing one, its tax is kept. To bill no tax, send the tax-exempt rate's id.","format":"int64","example":2419},{"type":"null","description":"Tax applied. Null, or left out on a new line item, gives the tax the app would pick for the item; left out on an existing one, its tax is kept. To bill no tax, send the tax-exempt rate's id.","format":"int64","example":2419}]},"BillableStatusId":{"oneOf":[{"type":"integer","description":"1 Billable (default), 2 No charge, 3 Non-billable. A line that isn't Billable bills 0.","format":"int32"},{"type":"null","description":"1 Billable (default), 2 No charge, 3 Non-billable. A line that isn't Billable bills 0.","format":"int32"}]},"StartDate":{"oneOf":[{"type":"string","description":"Date the line starts billing, a calendar date. Defaults to today in the service provider's zone,\r\nor the contract's start date if that is later.","format":"date-time"},{"type":"null","description":"Date the line starts billing, a calendar date. Defaults to today in the service provider's zone,\r\nor the contract's start date if that is later.","format":"date-time"}]},"EndDate":{"oneOf":[{"type":"string","description":"Date the line stops billing, a calendar date. Send null to make it open-ended.","format":"date-time"},{"type":"null","description":"Date the line stops billing, a calendar date. Send null to make it open-ended.","format":"date-time"}]}},"additionalProperties":false,"description":"One product or bundle billed on a service line. A new entry needs ItemId and Quantity; the rest\r\nfalls back to the item's own values, as an invoice line does. Amount and TaxAmount are always\r\ncalculated."},"description":"The products and bundles billed on the line. On PATCH the list replaces the set, matched by\r\n`Id`; leave it out to keep the line items as they are."},{"type":"null","items":{"type":"object","properties":{"Id":{"oneOf":[{"type":"integer","description":"PATCH only: the existing line item to keep and update. Leave it out to add one.","format":"int64","example":991204},{"type":"null","description":"PATCH only: the existing line item to keep and update. Leave it out to add one.","format":"int64","example":991204}]},"ItemId":{"oneOf":[{"type":"string","description":"The catalog item to bill. Required on a new entry, not accepted on an existing one.","format":"uuid"},{"type":"null","description":"The catalog item to bill. Required on a new entry, not accepted on an existing one.","format":"uuid"}]},"Quantity":{"oneOf":[{"type":"number","description":"Quantity billed each period. Required on a new entry. Greater than 0.","format":"double","example":12},{"type":"null","description":"Quantity billed each period. Required on a new entry. Greater than 0.","format":"double","example":12}]},"Description":{"oneOf":[{"type":"string","description":"Description on the invoice. Defaults to the item's. Send null to clear it."},{"type":"null","description":"Description on the invoice. Defaults to the item's. Send null to clear it."}]},"UnitPrice":{"oneOf":[{"type":"number","description":"Unit price charged. Defaults to the item's price. Not negative.","format":"double","example":24.2},{"type":"null","description":"Unit price charged. Defaults to the item's price. Not negative.","format":"double","example":24.2}]},"UnitCost":{"oneOf":[{"type":"number","description":"Unit cost. Defaults to the item's cost. Not negative.","format":"double","example":18.4},{"type":"null","description":"Unit cost. Defaults to the item's cost. Not negative.","format":"double","example":18.4}]},"DiscountPercent":{"oneOf":[{"type":"number","description":"Discount percentage, 0-100. Default 0.","format":"double"},{"type":"null","description":"Discount percentage, 0-100. Default 0.","format":"double"}]},"TaxId":{"oneOf":[{"type":"integer","description":"Tax applied. Null, or left out on a new line item, gives the tax the app would pick for the item; left out on an existing one, its tax is kept. To bill no tax, send the tax-exempt rate's id.","format":"int64","example":2419},{"type":"null","description":"Tax applied. Null, or left out on a new line item, gives the tax the app would pick for the item; left out on an existing one, its tax is kept. To bill no tax, send the tax-exempt rate's id.","format":"int64","example":2419}]},"BillableStatusId":{"oneOf":[{"type":"integer","description":"1 Billable (default), 2 No charge, 3 Non-billable. A line that isn't Billable bills 0.","format":"int32"},{"type":"null","description":"1 Billable (default), 2 No charge, 3 Non-billable. A line that isn't Billable bills 0.","format":"int32"}]},"StartDate":{"oneOf":[{"type":"string","description":"Date the line starts billing, a calendar date. Defaults to today in the service provider's zone,\r\nor the contract's start date if that is later.","format":"date-time"},{"type":"null","description":"Date the line starts billing, a calendar date. Defaults to today in the service provider's zone,\r\nor the contract's start date if that is later.","format":"date-time"}]},"EndDate":{"oneOf":[{"type":"string","description":"Date the line stops billing, a calendar date. Send null to make it open-ended.","format":"date-time"},{"type":"null","description":"Date the line stops billing, a calendar date. Send null to make it open-ended.","format":"date-time"}]}},"additionalProperties":false,"description":"One product or bundle billed on a service line. A new entry needs ItemId and Quantity; the rest\r\nfalls back to the item's own values, as an invoice line does. Amount and TaxAmount are always\r\ncalculated."},"description":"The products and bundles billed on the line. On PATCH the list replaces the set, matched by\r\n`Id`; leave it out to keep the line items as they are."}]}},"additionalProperties":false,"description":"One service line on `POST /v1/contracts` or `PATCH /v1/contracts/{contractId}`. Send\r\nexactly one details object, the one matching `LaborTermsId`; No Labor Terms takes none."},"description":"The service lines. At least one.","uniqueKey":"ServiceLines.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines","typeLabel":"object[] | null"}},"additionalProperties":false,"description":"Creates a contract with its service lines. Name, ClientId and at least one service line are\r\nrequired; each line needs Name and LaborTermsId. Returns the contract in the\r\n`GET /v1/contracts/{contractId}` shape.","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"Name":"All Labor Terms Example","ClientId":88,"IsForAllLocations":true,"LocationIds":[123],"Reference":"MSA-2025-014","StartDate":"2026-01-15T00:00:00.0000000+00:00","EndDate":"2023-11-07T05:31:56Z","ProrateTypeId":0,"AutoInvoiceTicketProducts":true,"RepeatPeriodId":1,"DaysBeforeInvoiceCreation":0,"DaysUntilDue":30,"AutoApproveAndSend":true,"ContactIds":[123],"InvoiceTemplateId":123,"InvoiceEmailTemplateId":123,"BrandingThemeId":"3c90c3cc-0d44-4b50-8888-8dd25736052a","ServiceLines":[{"Id":88214,"Name":"Managed Services","LaborTermsId":1,"WorkTypeIds":[123],"WorkRoleIds":[123],"AutoApproveTime":true,"AutoInvoiceTime":true,"IncludedTimeGoesToId":1,"UnlimitedHoursDetails":{},"PerHourDetails":{"RateTypeId":2,"HourlyRate":150,"CustomRates":{"WorkRoles":[{"WorkRoleId":12,"HourlyRate":95,"CoaCode":"270"}],"WorkTypes":[{"WorkTypeId":176,"HourlyMultiplier":1.5,"CoaCode":"200"}]}},"LimitedHoursDetails":{"ShowRemainingHoursInClientPortal":true,"AllocatedHours":10,"RateTypeId":123,"HourlyRate":123,"CustomRates":{"WorkRoles":[{"WorkRoleId":12,"HourlyRate":95,"CoaCode":"270"}],"WorkTypes":[{"WorkTypeId":176,"HourlyMultiplier":1.5,"CoaCode":"200"}]}},"BlockHoursDetails":{"ShowRemainingHoursInClientPortal":true,"TemplateId":0,"Balance":20,"Price":2000,"WarningThreshold":20,"OverrunThreshold":10},"LineItems":[{"Id":991204,"ItemId":"3c90c3cc-0d44-4b50-8888-8dd25736052a","Quantity":12,"Description":"\u003cstring>","UnitPrice":24.2,"UnitCost":18.4,"DiscountPercent":123,"TaxId":2419,"BillableStatusId":123,"StartDate":"2023-11-07T05:31:56Z","EndDate":"2023-11-07T05:31:56Z"}]}]}}},"exampleType":"generated"},"application/json":{"schema":{"type":"object","properties":{"Name":{"oneOf":[{"type":"string","description":"Name of the contract. Required.","example":"All Labor Terms Example","uniqueKey":"Name.oneOf.0","typeLabel":"string"},{"type":"null","description":"Name of the contract. Required.","example":"All Labor Terms Example","uniqueKey":"Name.oneOf.1","typeLabel":"null"}],"uniqueKey":"Name","typeLabel":"string | null"},"ClientId":{"oneOf":[{"type":"integer","description":"The client the contract bills. Required.","format":"int64","example":88,"uniqueKey":"ClientId.oneOf.0","typeLabel":"integer\u003cint64>"},{"type":"null","description":"The client the contract bills. Required.","format":"int64","example":88,"uniqueKey":"ClientId.oneOf.1","typeLabel":"null"}],"uniqueKey":"ClientId","typeLabel":"integer\u003cint64> | null"},"IsForAllLocations":{"oneOf":[{"type":"boolean","description":"Whether the contract covers every one of the client's locations. Default true.","uniqueKey":"IsForAllLocations.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"Whether the contract covers every one of the client's locations. Default true.","uniqueKey":"IsForAllLocations.oneOf.1","typeLabel":"null"}],"uniqueKey":"IsForAllLocations","typeLabel":"boolean | null"},"LocationIds":{"oneOf":[{"type":"array","items":{"type":"integer","format":"int64","uniqueKey":"LocationIds.oneOf.0.items.[INDEX]","typeLabel":"integer\u003cint64>"},"description":"The locations covered when IsForAllLocations is false: at least one, each the client's own. Ignored otherwise.","uniqueKey":"LocationIds.oneOf.0","typeLabel":"integer\u003cint64>[]"},{"type":"null","items":{"type":"integer","format":"int64"},"description":"The locations covered when IsForAllLocations is false: at least one, each the client's own. Ignored otherwise.","uniqueKey":"LocationIds.oneOf.1","typeLabel":"null"}],"uniqueKey":"LocationIds","typeLabel":"integer\u003cint64>[] | null"},"Reference":{"oneOf":[{"type":"string","description":"Free-text reference printed on the contract's invoices.","example":"MSA-2025-014","uniqueKey":"Reference.oneOf.0","typeLabel":"string"},{"type":"null","description":"Free-text reference printed on the contract's invoices.","example":"MSA-2025-014","uniqueKey":"Reference.oneOf.1","typeLabel":"null"}],"uniqueKey":"Reference","typeLabel":"string | null"},"StartDate":{"oneOf":[{"type":"string","description":"Date coverage starts, a calendar date. Defaults to today in the service provider's zone.","format":"date-time","example":"2026-01-15T00:00:00.0000000+00:00","uniqueKey":"StartDate.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","description":"Date coverage starts, a calendar date. Defaults to today in the service provider's zone.","format":"date-time","example":"2026-01-15T00:00:00.0000000+00:00","uniqueKey":"StartDate.oneOf.1","typeLabel":"null"}],"uniqueKey":"StartDate","typeLabel":"string\u003cdate-time> | null"},"EndDate":{"oneOf":[{"type":"string","description":"Date coverage ends, a calendar date, after StartDate. Left out, the contract is open-ended.","format":"date-time","uniqueKey":"EndDate.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","description":"Date coverage ends, a calendar date, after StartDate. Left out, the contract is open-ended.","format":"date-time","uniqueKey":"EndDate.oneOf.1","typeLabel":"null"}],"uniqueKey":"EndDate","typeLabel":"string\u003cdate-time> | null"},"ProrateTypeId":{"oneOf":[{"type":"integer","description":"0 Do not prorate (default), 1 Prorate and add to next invoice, 2 Prorate and generate standalone invoice.","format":"int32","example":0,"uniqueKey":"ProrateTypeId.oneOf.0","typeLabel":"integer\u003cint32>"},{"type":"null","description":"0 Do not prorate (default), 1 Prorate and add to next invoice, 2 Prorate and generate standalone invoice.","format":"int32","example":0,"uniqueKey":"ProrateTypeId.oneOf.1","typeLabel":"null"}],"uniqueKey":"ProrateTypeId","typeLabel":"integer\u003cint32> | null"},"AutoInvoiceTicketProducts":{"oneOf":[{"type":"boolean","description":"Sweep approved ticket products for this client into the next recurring invoice. Only with\r\nIsForAllLocations true. Default false.","uniqueKey":"AutoInvoiceTicketProducts.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"Sweep approved ticket products for this client into the next recurring invoice. Only with\r\nIsForAllLocations true. Default false.","uniqueKey":"AutoInvoiceTicketProducts.oneOf.1","typeLabel":"null"}],"uniqueKey":"AutoInvoiceTicketProducts","typeLabel":"boolean | null"},"RepeatPeriodId":{"oneOf":[{"type":"integer","description":"1 Monthly (default), 2 Quarterly, 3 Yearly, 4 Half Yearly.","format":"int32","example":1,"uniqueKey":"RepeatPeriodId.oneOf.0","typeLabel":"integer\u003cint32>"},{"type":"null","description":"1 Monthly (default), 2 Quarterly, 3 Yearly, 4 Half Yearly.","format":"int32","example":1,"uniqueKey":"RepeatPeriodId.oneOf.1","typeLabel":"null"}],"uniqueKey":"RepeatPeriodId","typeLabel":"integer\u003cint32> | null"},"DaysBeforeInvoiceCreation":{"oneOf":[{"type":"integer","description":"Days before the billing period ends that the invoice is created, 0-31. Default 0.","format":"int32","example":0,"uniqueKey":"DaysBeforeInvoiceCreation.oneOf.0","typeLabel":"integer\u003cint32>"},{"type":"null","description":"Days before the billing period ends that the invoice is created, 0-31. Default 0.","format":"int32","example":0,"uniqueKey":"DaysBeforeInvoiceCreation.oneOf.1","typeLabel":"null"}],"uniqueKey":"DaysBeforeInvoiceCreation","typeLabel":"integer\u003cint32> | null"},"DaysUntilDue":{"oneOf":[{"type":"integer","description":"Days the client has to pay. Defaults to the service provider's invoice setting.","format":"int32","example":30,"uniqueKey":"DaysUntilDue.oneOf.0","typeLabel":"integer\u003cint32>"},{"type":"null","description":"Days the client has to pay. Defaults to the service provider's invoice setting.","format":"int32","example":30,"uniqueKey":"DaysUntilDue.oneOf.1","typeLabel":"null"}],"uniqueKey":"DaysUntilDue","typeLabel":"integer\u003cint32> | null"},"AutoApproveAndSend":{"oneOf":[{"type":"boolean","description":"Approve and send each invoice raised from the contract automatically. Default false.","uniqueKey":"AutoApproveAndSend.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"Approve and send each invoice raised from the contract automatically. Default false.","uniqueKey":"AutoApproveAndSend.oneOf.1","typeLabel":"null"}],"uniqueKey":"AutoApproveAndSend","typeLabel":"boolean | null"},"ContactIds":{"oneOf":[{"type":"array","items":{"type":"integer","format":"int64","uniqueKey":"ContactIds.oneOf.0.items.[INDEX]","typeLabel":"integer\u003cint64>"},"description":"The client's contacts who can auto-approve the contract's invoices.","uniqueKey":"ContactIds.oneOf.0","typeLabel":"integer\u003cint64>[]"},{"type":"null","items":{"type":"integer","format":"int64"},"description":"The client's contacts who can auto-approve the contract's invoices.","uniqueKey":"ContactIds.oneOf.1","typeLabel":"null"}],"uniqueKey":"ContactIds","typeLabel":"integer\u003cint64>[] | null"},"InvoiceTemplateId":{"oneOf":[{"type":"integer","description":"Invoice template for the contract's invoices. Left out, the service provider's default applies.","format":"int64","uniqueKey":"InvoiceTemplateId.oneOf.0","typeLabel":"integer\u003cint64>"},{"type":"null","description":"Invoice template for the contract's invoices. Left out, the service provider's default applies.","format":"int64","uniqueKey":"InvoiceTemplateId.oneOf.1","typeLabel":"null"}],"uniqueKey":"InvoiceTemplateId","typeLabel":"integer\u003cint64> | null"},"InvoiceEmailTemplateId":{"oneOf":[{"type":"integer","description":"Email template for the contract's invoices. Left out, the service provider's default applies.","format":"int64","uniqueKey":"InvoiceEmailTemplateId.oneOf.0","typeLabel":"integer\u003cint64>"},{"type":"null","description":"Email template for the contract's invoices. Left out, the service provider's default applies.","format":"int64","uniqueKey":"InvoiceEmailTemplateId.oneOf.1","typeLabel":"null"}],"uniqueKey":"InvoiceEmailTemplateId","typeLabel":"integer\u003cint64> | null"},"BrandingThemeId":{"oneOf":[{"type":"string","description":"Accounting-system branding theme for the contract's invoices.","format":"uuid","uniqueKey":"BrandingThemeId.oneOf.0","typeLabel":"string\u003cuuid>"},{"type":"null","description":"Accounting-system branding theme for the contract's invoices.","format":"uuid","uniqueKey":"BrandingThemeId.oneOf.1","typeLabel":"null"}],"uniqueKey":"BrandingThemeId","typeLabel":"string\u003cuuid> | null"},"ServiceLines":{"oneOf":[{"type":"array","items":{"type":"object","properties":{"Id":{"oneOf":[{"type":"integer","description":"PATCH only: the service line to keep and update. Leave it out to add a line. Not accepted on\r\nPOST.","format":"int64","example":88214,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].Id.oneOf.0","typeLabel":"integer\u003cint64>"},{"type":"null","description":"PATCH only: the service line to keep and update. Leave it out to add a line. Not accepted on\r\nPOST.","format":"int64","example":88214,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].Id.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].Id","typeLabel":"integer\u003cint64> | null"},"Name":{"oneOf":[{"type":"string","description":"Name of the service line. Required on a new line.","example":"Managed Services","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].Name.oneOf.0","typeLabel":"string"},{"type":"null","description":"Name of the service line. Required on a new line.","example":"Managed Services","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].Name.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].Name","typeLabel":"string | null"},"LaborTermsId":{"oneOf":[{"type":"integer","description":"How the line bills time: 1 Unlimited Hours, 2 Hourly, 3 Block Hours, 4 No Labor Terms,\r\n5 Limited Hours. Required on a new line. On an existing line only a No Labor Terms line can\r\nchange, once.","format":"int32","example":1,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LaborTermsId.oneOf.0","typeLabel":"integer\u003cint32>"},{"type":"null","description":"How the line bills time: 1 Unlimited Hours, 2 Hourly, 3 Block Hours, 4 No Labor Terms,\r\n5 Limited Hours. Required on a new line. On an existing line only a No Labor Terms line can\r\nchange, once.","format":"int32","example":1,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LaborTermsId.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LaborTermsId","typeLabel":"integer\u003cint32> | null"},"WorkTypeIds":{"oneOf":[{"type":"array","items":{"type":"integer","format":"int64","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].WorkTypeIds.oneOf.0.items.[INDEX]","typeLabel":"integer\u003cint64>"},"description":"The work types the line covers. Left out on a new line, every work type is covered, as in the\r\napp. Not accepted on a No Labor Terms line.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].WorkTypeIds.oneOf.0","typeLabel":"integer\u003cint64>[]"},{"type":"null","items":{"type":"integer","format":"int64"},"description":"The work types the line covers. Left out on a new line, every work type is covered, as in the\r\napp. Not accepted on a No Labor Terms line.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].WorkTypeIds.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].WorkTypeIds","typeLabel":"integer\u003cint64>[] | null"},"WorkRoleIds":{"oneOf":[{"type":"array","items":{"type":"integer","format":"int64","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].WorkRoleIds.oneOf.0.items.[INDEX]","typeLabel":"integer\u003cint64>"},"description":"The billing roles the line covers. Same rules as `WorkTypeIds`.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].WorkRoleIds.oneOf.0","typeLabel":"integer\u003cint64>[]"},{"type":"null","items":{"type":"integer","format":"int64"},"description":"The billing roles the line covers. Same rules as `WorkTypeIds`.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].WorkRoleIds.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].WorkRoleIds","typeLabel":"integer\u003cint64>[] | null"},"AutoApproveTime":{"oneOf":[{"type":"boolean","description":"Approve time logged against the line automatically. Every labor term except No Labor Terms. Default false.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].AutoApproveTime.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"Approve time logged against the line automatically. Every labor term except No Labor Terms. Default false.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].AutoApproveTime.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].AutoApproveTime","typeLabel":"boolean | null"},"AutoInvoiceTime":{"oneOf":[{"type":"boolean","description":"Sweep approved time waiting on the line into the contract's recurring invoice. Every labor term\r\nexcept No Labor Terms. Default false.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].AutoInvoiceTime.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"Sweep approved time waiting on the line into the contract's recurring invoice. Every labor term\r\nexcept No Labor Terms. Default false.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].AutoInvoiceTime.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].AutoInvoiceTime","typeLabel":"boolean | null"},"IncludedTimeGoesToId":{"oneOf":[{"type":"integer","description":"Where covered time lands when it is approved: 1 Complete (default) or 2 Waiting to invoice.\r\nUnlimited, Block and Limited Hours only.","format":"int32","example":1,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].IncludedTimeGoesToId.oneOf.0","typeLabel":"integer\u003cint32>"},{"type":"null","description":"Where covered time lands when it is approved: 1 Complete (default) or 2 Waiting to invoice.\r\nUnlimited, Block and Limited Hours only.","format":"int32","example":1,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].IncludedTimeGoesToId.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].IncludedTimeGoesToId","typeLabel":"integer\u003cint32> | null"},"UnlimitedHoursDetails":{"type":"object","additionalProperties":false,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].UnlimitedHoursDetails","typeLabel":"object"},"PerHourDetails":{"type":"object","properties":{"RateTypeId":{"oneOf":[{"type":"integer","description":"1 Use default labor rates, 2 Use fixed labor rate, 3 Custom labor rates. Default 1.","format":"int32","example":2,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.RateTypeId.oneOf.0","typeLabel":"integer\u003cint32>"},{"type":"null","description":"1 Use default labor rates, 2 Use fixed labor rate, 3 Custom labor rates. Default 1.","format":"int32","example":2,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.RateTypeId.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.RateTypeId","typeLabel":"integer\u003cint32> | null"},"HourlyRate":{"oneOf":[{"type":"number","description":"The flat rate per hour. Required with RateTypeId 2, refused with any other.","format":"double","example":150,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.HourlyRate.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"The flat rate per hour. Required with RateTypeId 2, refused with any other.","format":"double","example":150,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.HourlyRate.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.HourlyRate","typeLabel":"number\u003cdouble> | null"},"CustomRates":{"type":"object","properties":{"WorkRoles":{"oneOf":[{"type":"array","items":{"type":"object","properties":{"WorkRoleId":{"oneOf":[{"type":"integer","description":"The billing role this row prices. Required.","format":"int64","example":12,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX].WorkRoleId.oneOf.0","typeLabel":"integer\u003cint64>"},{"type":"null","description":"The billing role this row prices. Required.","format":"int64","example":12,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX].WorkRoleId.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX].WorkRoleId","typeLabel":"integer\u003cint64> | null"},"HourlyRate":{"oneOf":[{"type":"number","description":"Rate per hour. Left out, the current rate is kept.","format":"double","example":95,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX].HourlyRate.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"Rate per hour. Left out, the current rate is kept.","format":"double","example":95,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX].HourlyRate.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX].HourlyRate","typeLabel":"number\u003cdouble> | null"},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code. Left out, the current code is kept.","example":"270","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX].CoaCode.oneOf.0","typeLabel":"string"},{"type":"null","description":"Accounting code. Left out, the current code is kept.","example":"270","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX].CoaCode.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX].CoaCode","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX]","typeLabel":"object"},"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkRoles.oneOf.0","typeLabel":"object[]"},{"type":"null","items":{"type":"object","properties":{"WorkRoleId":{"oneOf":[{"type":"integer","description":"The billing role this row prices. Required.","format":"int64","example":12},{"type":"null","description":"The billing role this row prices. Required.","format":"int64","example":12}]},"HourlyRate":{"oneOf":[{"type":"number","description":"Rate per hour. Left out, the current rate is kept.","format":"double","example":95},{"type":"null","description":"Rate per hour. Left out, the current rate is kept.","format":"double","example":95}]},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code. Left out, the current code is kept.","example":"270"},{"type":"null","description":"Accounting code. Left out, the current code is kept.","example":"270"}]}},"additionalProperties":false},"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkRoles.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkRoles","typeLabel":"object[] | null"},"WorkTypes":{"oneOf":[{"type":"array","items":{"type":"object","properties":{"WorkTypeId":{"oneOf":[{"type":"integer","description":"The work type this row prices. Required.","format":"int64","example":176,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX].WorkTypeId.oneOf.0","typeLabel":"integer\u003cint64>"},{"type":"null","description":"The work type this row prices. Required.","format":"int64","example":176,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX].WorkTypeId.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX].WorkTypeId","typeLabel":"integer\u003cint64> | null"},"HourlyMultiplier":{"oneOf":[{"type":"number","description":"Multiplier on the role's rate. Left out, the current multiplier is kept.","format":"double","example":1.5,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX].HourlyMultiplier.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"Multiplier on the role's rate. Left out, the current multiplier is kept.","format":"double","example":1.5,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX].HourlyMultiplier.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX].HourlyMultiplier","typeLabel":"number\u003cdouble> | null"},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code. Left out, the current code is kept.","example":"200","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX].CoaCode.oneOf.0","typeLabel":"string"},{"type":"null","description":"Accounting code. Left out, the current code is kept.","example":"200","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX].CoaCode.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX].CoaCode","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX]","typeLabel":"object"},"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkTypes.oneOf.0","typeLabel":"object[]"},{"type":"null","items":{"type":"object","properties":{"WorkTypeId":{"oneOf":[{"type":"integer","description":"The work type this row prices. Required.","format":"int64","example":176},{"type":"null","description":"The work type this row prices. Required.","format":"int64","example":176}]},"HourlyMultiplier":{"oneOf":[{"type":"number","description":"Multiplier on the role's rate. Left out, the current multiplier is kept.","format":"double","example":1.5},{"type":"null","description":"Multiplier on the role's rate. Left out, the current multiplier is kept.","format":"double","example":1.5}]},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code. Left out, the current code is kept.","example":"200"},{"type":"null","description":"Accounting code. Left out, the current code is kept.","example":"200"}]}},"additionalProperties":false},"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkTypes.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkTypes","typeLabel":"object[] | null"}},"additionalProperties":false,"description":"Overrides for the Custom labor rates grid. The line starts from every billing role and work type\r\nat the service provider's own rates; only the rows sent here change. On PATCH, entries merge by\r\nid into the line's existing rows.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates","typeLabel":"object"}},"additionalProperties":false,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails","typeLabel":"object"},"LimitedHoursDetails":{"type":"object","properties":{"ShowRemainingHoursInClientPortal":{"oneOf":[{"type":"boolean","description":"Show the client the hours left in the allocation in the client portal. Default false.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.ShowRemainingHoursInClientPortal.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"Show the client the hours left in the allocation in the client portal. Default false.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.ShowRemainingHoursInClientPortal.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.ShowRemainingHoursInClientPortal","typeLabel":"boolean | null"},"AllocatedHours":{"oneOf":[{"type":"number","description":"Hours included each billing period. Required on a new line.","format":"double","example":10,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.AllocatedHours.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"Hours included each billing period. Required on a new line.","format":"double","example":10,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.AllocatedHours.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.AllocatedHours","typeLabel":"number\u003cdouble> | null"},"RateTypeId":{"oneOf":[{"type":"integer","description":"Same as on `PerHourDetails`.","format":"int32","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.RateTypeId.oneOf.0","typeLabel":"integer\u003cint32>"},{"type":"null","description":"Same as on `PerHourDetails`.","format":"int32","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.RateTypeId.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.RateTypeId","typeLabel":"integer\u003cint32> | null"},"HourlyRate":{"oneOf":[{"type":"number","description":"Same as on `PerHourDetails`.","format":"double","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.HourlyRate.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"Same as on `PerHourDetails`.","format":"double","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.HourlyRate.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.HourlyRate","typeLabel":"number\u003cdouble> | null"},"CustomRates":{"type":"object","properties":{"WorkRoles":{"oneOf":[{"type":"array","items":{"type":"object","properties":{"WorkRoleId":{"oneOf":[{"type":"integer","description":"The billing role this row prices. Required.","format":"int64","example":12,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX].WorkRoleId.oneOf.0","typeLabel":"integer\u003cint64>"},{"type":"null","description":"The billing role this row prices. Required.","format":"int64","example":12,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX].WorkRoleId.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX].WorkRoleId","typeLabel":"integer\u003cint64> | null"},"HourlyRate":{"oneOf":[{"type":"number","description":"Rate per hour. Left out, the current rate is kept.","format":"double","example":95,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX].HourlyRate.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"Rate per hour. Left out, the current rate is kept.","format":"double","example":95,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX].HourlyRate.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX].HourlyRate","typeLabel":"number\u003cdouble> | null"},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code. Left out, the current code is kept.","example":"270","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX].CoaCode.oneOf.0","typeLabel":"string"},{"type":"null","description":"Accounting code. Left out, the current code is kept.","example":"270","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX].CoaCode.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX].CoaCode","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX]","typeLabel":"object"},"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles.oneOf.0","typeLabel":"object[]"},{"type":"null","items":{"type":"object","properties":{"WorkRoleId":{"oneOf":[{"type":"integer","description":"The billing role this row prices. Required.","format":"int64","example":12},{"type":"null","description":"The billing role this row prices. Required.","format":"int64","example":12}]},"HourlyRate":{"oneOf":[{"type":"number","description":"Rate per hour. Left out, the current rate is kept.","format":"double","example":95},{"type":"null","description":"Rate per hour. Left out, the current rate is kept.","format":"double","example":95}]},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code. Left out, the current code is kept.","example":"270"},{"type":"null","description":"Accounting code. Left out, the current code is kept.","example":"270"}]}},"additionalProperties":false},"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles","typeLabel":"object[] | null"},"WorkTypes":{"oneOf":[{"type":"array","items":{"type":"object","properties":{"WorkTypeId":{"oneOf":[{"type":"integer","description":"The work type this row prices. Required.","format":"int64","example":176,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX].WorkTypeId.oneOf.0","typeLabel":"integer\u003cint64>"},{"type":"null","description":"The work type this row prices. Required.","format":"int64","example":176,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX].WorkTypeId.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX].WorkTypeId","typeLabel":"integer\u003cint64> | null"},"HourlyMultiplier":{"oneOf":[{"type":"number","description":"Multiplier on the role's rate. Left out, the current multiplier is kept.","format":"double","example":1.5,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX].HourlyMultiplier.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"Multiplier on the role's rate. Left out, the current multiplier is kept.","format":"double","example":1.5,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX].HourlyMultiplier.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX].HourlyMultiplier","typeLabel":"number\u003cdouble> | null"},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code. Left out, the current code is kept.","example":"200","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX].CoaCode.oneOf.0","typeLabel":"string"},{"type":"null","description":"Accounting code. Left out, the current code is kept.","example":"200","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX].CoaCode.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX].CoaCode","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX]","typeLabel":"object"},"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes.oneOf.0","typeLabel":"object[]"},{"type":"null","items":{"type":"object","properties":{"WorkTypeId":{"oneOf":[{"type":"integer","description":"The work type this row prices. Required.","format":"int64","example":176},{"type":"null","description":"The work type this row prices. Required.","format":"int64","example":176}]},"HourlyMultiplier":{"oneOf":[{"type":"number","description":"Multiplier on the role's rate. Left out, the current multiplier is kept.","format":"double","example":1.5},{"type":"null","description":"Multiplier on the role's rate. Left out, the current multiplier is kept.","format":"double","example":1.5}]},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code. Left out, the current code is kept.","example":"200"},{"type":"null","description":"Accounting code. Left out, the current code is kept.","example":"200"}]}},"additionalProperties":false},"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes","typeLabel":"object[] | null"}},"additionalProperties":false,"description":"Overrides for the Custom labor rates grid. The line starts from every billing role and work type\r\nat the service provider's own rates; only the rows sent here change. On PATCH, entries merge by\r\nid into the line's existing rows.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates","typeLabel":"object"}},"additionalProperties":false,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails","typeLabel":"object"},"BlockHoursDetails":{"type":"object","properties":{"ShowRemainingHoursInClientPortal":{"oneOf":[{"type":"boolean","description":"Show the client the hours left in the block in the client portal. Default false.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails.ShowRemainingHoursInClientPortal.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"Show the client the hours left in the block in the client portal. Default false.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails.ShowRemainingHoursInClientPortal.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails.ShowRemainingHoursInClientPortal","typeLabel":"boolean | null"},"TemplateId":{"oneOf":[{"type":"integer","description":"A Block Hours Template id, or 0 for Custom. With a template, Balance and Price come from it and\r\nare refused on the request, as the app disables both once a template is picked. Required on a\r\nnew line.","format":"int64","example":0,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails.TemplateId.oneOf.0","typeLabel":"integer\u003cint64>"},{"type":"null","description":"A Block Hours Template id, or 0 for Custom. With a template, Balance and Price come from it and\r\nare refused on the request, as the app disables both once a template is picked. Required on a\r\nnew line.","format":"int64","example":0,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails.TemplateId.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails.TemplateId","typeLabel":"integer\u003cint64> | null"},"Balance":{"oneOf":[{"type":"number","description":"Hours in the block. Custom (TemplateId 0) only, and then required on a new line.","format":"double","example":20,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails.Balance.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"Hours in the block. Custom (TemplateId 0) only, and then required on a new line.","format":"double","example":20,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails.Balance.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails.Balance","typeLabel":"number\u003cdouble> | null"},"Price":{"oneOf":[{"type":"number","description":"The price of the block, billed once on the Draft invoice the new line raises. Custom\r\n(TemplateId 0) only, and then required on a new line.","format":"double","example":2000,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails.Price.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"The price of the block, billed once on the Draft invoice the new line raises. Custom\r\n(TemplateId 0) only, and then required on a new line.","format":"double","example":2000,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails.Price.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails.Price","typeLabel":"number\u003cdouble> | null"},"WarningThreshold":{"oneOf":[{"type":"integer","description":"Percentage of the block left that raises a low-balance warning, a whole number 0-90.","format":"int32","example":20,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails.WarningThreshold.oneOf.0","typeLabel":"integer\u003cint32>"},{"type":"null","description":"Percentage of the block left that raises a low-balance warning, a whole number 0-90.","format":"int32","example":20,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails.WarningThreshold.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails.WarningThreshold","typeLabel":"integer\u003cint32> | null"},"OverrunThreshold":{"oneOf":[{"type":"integer","description":"Percentage of the block the client may run past zero, a whole number 0-50.","format":"int32","example":10,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails.OverrunThreshold.oneOf.0","typeLabel":"integer\u003cint32>"},{"type":"null","description":"Percentage of the block the client may run past zero, a whole number 0-50.","format":"int32","example":10,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails.OverrunThreshold.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails.OverrunThreshold","typeLabel":"integer\u003cint32> | null"}},"additionalProperties":false,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails","typeLabel":"object"},"LineItems":{"oneOf":[{"type":"array","items":{"type":"object","properties":{"Id":{"oneOf":[{"type":"integer","description":"PATCH only: the existing line item to keep and update. Leave it out to add one.","format":"int64","example":991204,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].Id.oneOf.0","typeLabel":"integer\u003cint64>"},{"type":"null","description":"PATCH only: the existing line item to keep and update. Leave it out to add one.","format":"int64","example":991204,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].Id.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].Id","typeLabel":"integer\u003cint64> | null"},"ItemId":{"oneOf":[{"type":"string","description":"The catalog item to bill. Required on a new entry, not accepted on an existing one.","format":"uuid","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].ItemId.oneOf.0","typeLabel":"string\u003cuuid>"},{"type":"null","description":"The catalog item to bill. Required on a new entry, not accepted on an existing one.","format":"uuid","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].ItemId.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].ItemId","typeLabel":"string\u003cuuid> | null"},"Quantity":{"oneOf":[{"type":"number","description":"Quantity billed each period. Required on a new entry. Greater than 0.","format":"double","example":12,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].Quantity.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"Quantity billed each period. Required on a new entry. Greater than 0.","format":"double","example":12,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].Quantity.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].Quantity","typeLabel":"number\u003cdouble> | null"},"Description":{"oneOf":[{"type":"string","description":"Description on the invoice. Defaults to the item's. Send null to clear it.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].Description.oneOf.0","typeLabel":"string"},{"type":"null","description":"Description on the invoice. Defaults to the item's. Send null to clear it.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].Description.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].Description","typeLabel":"string | null"},"UnitPrice":{"oneOf":[{"type":"number","description":"Unit price charged. Defaults to the item's price. Not negative.","format":"double","example":24.2,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].UnitPrice.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"Unit price charged. Defaults to the item's price. Not negative.","format":"double","example":24.2,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].UnitPrice.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].UnitPrice","typeLabel":"number\u003cdouble> | null"},"UnitCost":{"oneOf":[{"type":"number","description":"Unit cost. Defaults to the item's cost. Not negative.","format":"double","example":18.4,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].UnitCost.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"Unit cost. Defaults to the item's cost. Not negative.","format":"double","example":18.4,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].UnitCost.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].UnitCost","typeLabel":"number\u003cdouble> | null"},"DiscountPercent":{"oneOf":[{"type":"number","description":"Discount percentage, 0-100. Default 0.","format":"double","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].DiscountPercent.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"Discount percentage, 0-100. Default 0.","format":"double","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].DiscountPercent.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].DiscountPercent","typeLabel":"number\u003cdouble> | null"},"TaxId":{"oneOf":[{"type":"integer","description":"Tax applied. Null, or left out on a new line item, gives the tax the app would pick for the item; left out on an existing one, its tax is kept. To bill no tax, send the tax-exempt rate's id.","format":"int64","example":2419,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].TaxId.oneOf.0","typeLabel":"integer\u003cint64>"},{"type":"null","description":"Tax applied. Null, or left out on a new line item, gives the tax the app would pick for the item; left out on an existing one, its tax is kept. To bill no tax, send the tax-exempt rate's id.","format":"int64","example":2419,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].TaxId.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].TaxId","typeLabel":"integer\u003cint64> | null"},"BillableStatusId":{"oneOf":[{"type":"integer","description":"1 Billable (default), 2 No charge, 3 Non-billable. A line that isn't Billable bills 0.","format":"int32","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].BillableStatusId.oneOf.0","typeLabel":"integer\u003cint32>"},{"type":"null","description":"1 Billable (default), 2 No charge, 3 Non-billable. A line that isn't Billable bills 0.","format":"int32","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].BillableStatusId.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].BillableStatusId","typeLabel":"integer\u003cint32> | null"},"StartDate":{"oneOf":[{"type":"string","description":"Date the line starts billing, a calendar date. Defaults to today in the service provider's zone,\r\nor the contract's start date if that is later.","format":"date-time","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].StartDate.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","description":"Date the line starts billing, a calendar date. Defaults to today in the service provider's zone,\r\nor the contract's start date if that is later.","format":"date-time","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].StartDate.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].StartDate","typeLabel":"string\u003cdate-time> | null"},"EndDate":{"oneOf":[{"type":"string","description":"Date the line stops billing, a calendar date. Send null to make it open-ended.","format":"date-time","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].EndDate.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","description":"Date the line stops billing, a calendar date. Send null to make it open-ended.","format":"date-time","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].EndDate.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].EndDate","typeLabel":"string\u003cdate-time> | null"}},"additionalProperties":false,"description":"One product or bundle billed on a service line. A new entry needs ItemId and Quantity; the rest\r\nfalls back to the item's own values, as an invoice line does. Amount and TaxAmount are always\r\ncalculated.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX]","typeLabel":"object"},"description":"The products and bundles billed on the line. On PATCH the list replaces the set, matched by\r\n`Id`; leave it out to keep the line items as they are.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0","typeLabel":"object[]"},{"type":"null","items":{"type":"object","properties":{"Id":{"oneOf":[{"type":"integer","description":"PATCH only: the existing line item to keep and update. Leave it out to add one.","format":"int64","example":991204},{"type":"null","description":"PATCH only: the existing line item to keep and update. Leave it out to add one.","format":"int64","example":991204}]},"ItemId":{"oneOf":[{"type":"string","description":"The catalog item to bill. Required on a new entry, not accepted on an existing one.","format":"uuid"},{"type":"null","description":"The catalog item to bill. Required on a new entry, not accepted on an existing one.","format":"uuid"}]},"Quantity":{"oneOf":[{"type":"number","description":"Quantity billed each period. Required on a new entry. Greater than 0.","format":"double","example":12},{"type":"null","description":"Quantity billed each period. Required on a new entry. Greater than 0.","format":"double","example":12}]},"Description":{"oneOf":[{"type":"string","description":"Description on the invoice. Defaults to the item's. Send null to clear it."},{"type":"null","description":"Description on the invoice. Defaults to the item's. Send null to clear it."}]},"UnitPrice":{"oneOf":[{"type":"number","description":"Unit price charged. Defaults to the item's price. Not negative.","format":"double","example":24.2},{"type":"null","description":"Unit price charged. Defaults to the item's price. Not negative.","format":"double","example":24.2}]},"UnitCost":{"oneOf":[{"type":"number","description":"Unit cost. Defaults to the item's cost. Not negative.","format":"double","example":18.4},{"type":"null","description":"Unit cost. Defaults to the item's cost. Not negative.","format":"double","example":18.4}]},"DiscountPercent":{"oneOf":[{"type":"number","description":"Discount percentage, 0-100. Default 0.","format":"double"},{"type":"null","description":"Discount percentage, 0-100. Default 0.","format":"double"}]},"TaxId":{"oneOf":[{"type":"integer","description":"Tax applied. Null, or left out on a new line item, gives the tax the app would pick for the item; left out on an existing one, its tax is kept. To bill no tax, send the tax-exempt rate's id.","format":"int64","example":2419},{"type":"null","description":"Tax applied. Null, or left out on a new line item, gives the tax the app would pick for the item; left out on an existing one, its tax is kept. To bill no tax, send the tax-exempt rate's id.","format":"int64","example":2419}]},"BillableStatusId":{"oneOf":[{"type":"integer","description":"1 Billable (default), 2 No charge, 3 Non-billable. A line that isn't Billable bills 0.","format":"int32"},{"type":"null","description":"1 Billable (default), 2 No charge, 3 Non-billable. A line that isn't Billable bills 0.","format":"int32"}]},"StartDate":{"oneOf":[{"type":"string","description":"Date the line starts billing, a calendar date. Defaults to today in the service provider's zone,\r\nor the contract's start date if that is later.","format":"date-time"},{"type":"null","description":"Date the line starts billing, a calendar date. Defaults to today in the service provider's zone,\r\nor the contract's start date if that is later.","format":"date-time"}]},"EndDate":{"oneOf":[{"type":"string","description":"Date the line stops billing, a calendar date. Send null to make it open-ended.","format":"date-time"},{"type":"null","description":"Date the line stops billing, a calendar date. Send null to make it open-ended.","format":"date-time"}]}},"additionalProperties":false,"description":"One product or bundle billed on a service line. A new entry needs ItemId and Quantity; the rest\r\nfalls back to the item's own values, as an invoice line does. Amount and TaxAmount are always\r\ncalculated."},"description":"The products and bundles billed on the line. On PATCH the list replaces the set, matched by\r\n`Id`; leave it out to keep the line items as they are.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems","typeLabel":"object[] | null"}},"additionalProperties":false,"description":"One service line on `POST /v1/contracts` or `PATCH /v1/contracts/{contractId}`. Send\r\nexactly one details object, the one matching `LaborTermsId`; No Labor Terms takes none.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX]","typeLabel":"object"},"description":"The service lines. At least one.","uniqueKey":"ServiceLines.oneOf.0","typeLabel":"object[]"},{"type":"null","items":{"type":"object","properties":{"Id":{"oneOf":[{"type":"integer","description":"PATCH only: the service line to keep and update. Leave it out to add a line. Not accepted on\r\nPOST.","format":"int64","example":88214},{"type":"null","description":"PATCH only: the service line to keep and update. Leave it out to add a line. Not accepted on\r\nPOST.","format":"int64","example":88214}]},"Name":{"oneOf":[{"type":"string","description":"Name of the service line. Required on a new line.","example":"Managed Services"},{"type":"null","description":"Name of the service line. Required on a new line.","example":"Managed Services"}]},"LaborTermsId":{"oneOf":[{"type":"integer","description":"How the line bills time: 1 Unlimited Hours, 2 Hourly, 3 Block Hours, 4 No Labor Terms,\r\n5 Limited Hours. Required on a new line. On an existing line only a No Labor Terms line can\r\nchange, once.","format":"int32","example":1},{"type":"null","description":"How the line bills time: 1 Unlimited Hours, 2 Hourly, 3 Block Hours, 4 No Labor Terms,\r\n5 Limited Hours. Required on a new line. On an existing line only a No Labor Terms line can\r\nchange, once.","format":"int32","example":1}]},"WorkTypeIds":{"oneOf":[{"type":"array","items":{"type":"integer","format":"int64"},"description":"The work types the line covers. Left out on a new line, every work type is covered, as in the\r\napp. Not accepted on a No Labor Terms line."},{"type":"null","items":{"type":"integer","format":"int64"},"description":"The work types the line covers. Left out on a new line, every work type is covered, as in the\r\napp. Not accepted on a No Labor Terms line."}]},"WorkRoleIds":{"oneOf":[{"type":"array","items":{"type":"integer","format":"int64"},"description":"The billing roles the line covers. Same rules as `WorkTypeIds`."},{"type":"null","items":{"type":"integer","format":"int64"},"description":"The billing roles the line covers. Same rules as `WorkTypeIds`."}]},"AutoApproveTime":{"oneOf":[{"type":"boolean","description":"Approve time logged against the line automatically. Every labor term except No Labor Terms. Default false."},{"type":"null","description":"Approve time logged against the line automatically. Every labor term except No Labor Terms. Default false."}]},"AutoInvoiceTime":{"oneOf":[{"type":"boolean","description":"Sweep approved time waiting on the line into the contract's recurring invoice. Every labor term\r\nexcept No Labor Terms. Default false."},{"type":"null","description":"Sweep approved time waiting on the line into the contract's recurring invoice. Every labor term\r\nexcept No Labor Terms. Default false."}]},"IncludedTimeGoesToId":{"oneOf":[{"type":"integer","description":"Where covered time lands when it is approved: 1 Complete (default) or 2 Waiting to invoice.\r\nUnlimited, Block and Limited Hours only.","format":"int32","example":1},{"type":"null","description":"Where covered time lands when it is approved: 1 Complete (default) or 2 Waiting to invoice.\r\nUnlimited, Block and Limited Hours only.","format":"int32","example":1}]},"UnlimitedHoursDetails":{"type":"object","additionalProperties":false},"PerHourDetails":{"type":"object","properties":{"RateTypeId":{"oneOf":[{"type":"integer","description":"1 Use default labor rates, 2 Use fixed labor rate, 3 Custom labor rates. Default 1.","format":"int32","example":2},{"type":"null","description":"1 Use default labor rates, 2 Use fixed labor rate, 3 Custom labor rates. Default 1.","format":"int32","example":2}]},"HourlyRate":{"oneOf":[{"type":"number","description":"The flat rate per hour. Required with RateTypeId 2, refused with any other.","format":"double","example":150},{"type":"null","description":"The flat rate per hour. Required with RateTypeId 2, refused with any other.","format":"double","example":150}]},"CustomRates":{"type":"object","properties":{"WorkRoles":{"oneOf":[{"type":"array","items":{"type":"object","properties":{"WorkRoleId":{"oneOf":[{"type":"integer","description":"The billing role this row prices. Required.","format":"int64","example":12},{"type":"null","description":"The billing role this row prices. Required.","format":"int64","example":12}]},"HourlyRate":{"oneOf":[{"type":"number","description":"Rate per hour. Left out, the current rate is kept.","format":"double","example":95},{"type":"null","description":"Rate per hour. Left out, the current rate is kept.","format":"double","example":95}]},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code. Left out, the current code is kept.","example":"270"},{"type":"null","description":"Accounting code. Left out, the current code is kept.","example":"270"}]}},"additionalProperties":false}},{"type":"null","items":{"type":"object","properties":{"WorkRoleId":{"oneOf":[{"type":"integer","description":"The billing role this row prices. Required.","format":"int64","example":12},{"type":"null","description":"The billing role this row prices. Required.","format":"int64","example":12}]},"HourlyRate":{"oneOf":[{"type":"number","description":"Rate per hour. Left out, the current rate is kept.","format":"double","example":95},{"type":"null","description":"Rate per hour. Left out, the current rate is kept.","format":"double","example":95}]},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code. Left out, the current code is kept.","example":"270"},{"type":"null","description":"Accounting code. Left out, the current code is kept.","example":"270"}]}},"additionalProperties":false}}]},"WorkTypes":{"oneOf":[{"type":"array","items":{"type":"object","properties":{"WorkTypeId":{"oneOf":[{"type":"integer","description":"The work type this row prices. Required.","format":"int64","example":176},{"type":"null","description":"The work type this row prices. Required.","format":"int64","example":176}]},"HourlyMultiplier":{"oneOf":[{"type":"number","description":"Multiplier on the role's rate. Left out, the current multiplier is kept.","format":"double","example":1.5},{"type":"null","description":"Multiplier on the role's rate. Left out, the current multiplier is kept.","format":"double","example":1.5}]},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code. Left out, the current code is kept.","example":"200"},{"type":"null","description":"Accounting code. Left out, the current code is kept.","example":"200"}]}},"additionalProperties":false}},{"type":"null","items":{"type":"object","properties":{"WorkTypeId":{"oneOf":[{"type":"integer","description":"The work type this row prices. Required.","format":"int64","example":176},{"type":"null","description":"The work type this row prices. Required.","format":"int64","example":176}]},"HourlyMultiplier":{"oneOf":[{"type":"number","description":"Multiplier on the role's rate. Left out, the current multiplier is kept.","format":"double","example":1.5},{"type":"null","description":"Multiplier on the role's rate. Left out, the current multiplier is kept.","format":"double","example":1.5}]},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code. Left out, the current code is kept.","example":"200"},{"type":"null","description":"Accounting code. Left out, the current code is kept.","example":"200"}]}},"additionalProperties":false}}]}},"additionalProperties":false,"description":"Overrides for the Custom labor rates grid. The line starts from every billing role and work type\r\nat the service provider's own rates; only the rows sent here change. On PATCH, entries merge by\r\nid into the line's existing rows."}},"additionalProperties":false},"LimitedHoursDetails":{"type":"object","properties":{"ShowRemainingHoursInClientPortal":{"oneOf":[{"type":"boolean","description":"Show the client the hours left in the allocation in the client portal. Default false."},{"type":"null","description":"Show the client the hours left in the allocation in the client portal. Default false."}]},"AllocatedHours":{"oneOf":[{"type":"number","description":"Hours included each billing period. Required on a new line.","format":"double","example":10},{"type":"null","description":"Hours included each billing period. Required on a new line.","format":"double","example":10}]},"RateTypeId":{"oneOf":[{"type":"integer","description":"Same as on `PerHourDetails`.","format":"int32"},{"type":"null","description":"Same as on `PerHourDetails`.","format":"int32"}]},"HourlyRate":{"oneOf":[{"type":"number","description":"Same as on `PerHourDetails`.","format":"double"},{"type":"null","description":"Same as on `PerHourDetails`.","format":"double"}]},"CustomRates":{"type":"object","properties":{"WorkRoles":{"oneOf":[{"type":"array","items":{"type":"object","properties":{"WorkRoleId":{"oneOf":[{"type":"integer","description":"The billing role this row prices. Required.","format":"int64","example":12},{"type":"null","description":"The billing role this row prices. Required.","format":"int64","example":12}]},"HourlyRate":{"oneOf":[{"type":"number","description":"Rate per hour. Left out, the current rate is kept.","format":"double","example":95},{"type":"null","description":"Rate per hour. Left out, the current rate is kept.","format":"double","example":95}]},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code. Left out, the current code is kept.","example":"270"},{"type":"null","description":"Accounting code. Left out, the current code is kept.","example":"270"}]}},"additionalProperties":false}},{"type":"null","items":{"type":"object","properties":{"WorkRoleId":{"oneOf":[{"type":"integer","description":"The billing role this row prices. Required.","format":"int64","example":12},{"type":"null","description":"The billing role this row prices. Required.","format":"int64","example":12}]},"HourlyRate":{"oneOf":[{"type":"number","description":"Rate per hour. Left out, the current rate is kept.","format":"double","example":95},{"type":"null","description":"Rate per hour. Left out, the current rate is kept.","format":"double","example":95}]},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code. Left out, the current code is kept.","example":"270"},{"type":"null","description":"Accounting code. Left out, the current code is kept.","example":"270"}]}},"additionalProperties":false}}]},"WorkTypes":{"oneOf":[{"type":"array","items":{"type":"object","properties":{"WorkTypeId":{"oneOf":[{"type":"integer","description":"The work type this row prices. Required.","format":"int64","example":176},{"type":"null","description":"The work type this row prices. Required.","format":"int64","example":176}]},"HourlyMultiplier":{"oneOf":[{"type":"number","description":"Multiplier on the role's rate. Left out, the current multiplier is kept.","format":"double","example":1.5},{"type":"null","description":"Multiplier on the role's rate. Left out, the current multiplier is kept.","format":"double","example":1.5}]},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code. Left out, the current code is kept.","example":"200"},{"type":"null","description":"Accounting code. Left out, the current code is kept.","example":"200"}]}},"additionalProperties":false}},{"type":"null","items":{"type":"object","properties":{"WorkTypeId":{"oneOf":[{"type":"integer","description":"The work type this row prices. Required.","format":"int64","example":176},{"type":"null","description":"The work type this row prices. Required.","format":"int64","example":176}]},"HourlyMultiplier":{"oneOf":[{"type":"number","description":"Multiplier on the role's rate. Left out, the current multiplier is kept.","format":"double","example":1.5},{"type":"null","description":"Multiplier on the role's rate. Left out, the current multiplier is kept.","format":"double","example":1.5}]},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code. Left out, the current code is kept.","example":"200"},{"type":"null","description":"Accounting code. Left out, the current code is kept.","example":"200"}]}},"additionalProperties":false}}]}},"additionalProperties":false,"description":"Overrides for the Custom labor rates grid. The line starts from every billing role and work type\r\nat the service provider's own rates; only the rows sent here change. On PATCH, entries merge by\r\nid into the line's existing rows."}},"additionalProperties":false},"BlockHoursDetails":{"type":"object","properties":{"ShowRemainingHoursInClientPortal":{"oneOf":[{"type":"boolean","description":"Show the client the hours left in the block in the client portal. Default false."},{"type":"null","description":"Show the client the hours left in the block in the client portal. Default false."}]},"TemplateId":{"oneOf":[{"type":"integer","description":"A Block Hours Template id, or 0 for Custom. With a template, Balance and Price come from it and\r\nare refused on the request, as the app disables both once a template is picked. Required on a\r\nnew line.","format":"int64","example":0},{"type":"null","description":"A Block Hours Template id, or 0 for Custom. With a template, Balance and Price come from it and\r\nare refused on the request, as the app disables both once a template is picked. Required on a\r\nnew line.","format":"int64","example":0}]},"Balance":{"oneOf":[{"type":"number","description":"Hours in the block. Custom (TemplateId 0) only, and then required on a new line.","format":"double","example":20},{"type":"null","description":"Hours in the block. Custom (TemplateId 0) only, and then required on a new line.","format":"double","example":20}]},"Price":{"oneOf":[{"type":"number","description":"The price of the block, billed once on the Draft invoice the new line raises. Custom\r\n(TemplateId 0) only, and then required on a new line.","format":"double","example":2000},{"type":"null","description":"The price of the block, billed once on the Draft invoice the new line raises. Custom\r\n(TemplateId 0) only, and then required on a new line.","format":"double","example":2000}]},"WarningThreshold":{"oneOf":[{"type":"integer","description":"Percentage of the block left that raises a low-balance warning, a whole number 0-90.","format":"int32","example":20},{"type":"null","description":"Percentage of the block left that raises a low-balance warning, a whole number 0-90.","format":"int32","example":20}]},"OverrunThreshold":{"oneOf":[{"type":"integer","description":"Percentage of the block the client may run past zero, a whole number 0-50.","format":"int32","example":10},{"type":"null","description":"Percentage of the block the client may run past zero, a whole number 0-50.","format":"int32","example":10}]}},"additionalProperties":false},"LineItems":{"oneOf":[{"type":"array","items":{"type":"object","properties":{"Id":{"oneOf":[{"type":"integer","description":"PATCH only: the existing line item to keep and update. Leave it out to add one.","format":"int64","example":991204},{"type":"null","description":"PATCH only: the existing line item to keep and update. Leave it out to add one.","format":"int64","example":991204}]},"ItemId":{"oneOf":[{"type":"string","description":"The catalog item to bill. Required on a new entry, not accepted on an existing one.","format":"uuid"},{"type":"null","description":"The catalog item to bill. Required on a new entry, not accepted on an existing one.","format":"uuid"}]},"Quantity":{"oneOf":[{"type":"number","description":"Quantity billed each period. Required on a new entry. Greater than 0.","format":"double","example":12},{"type":"null","description":"Quantity billed each period. Required on a new entry. Greater than 0.","format":"double","example":12}]},"Description":{"oneOf":[{"type":"string","description":"Description on the invoice. Defaults to the item's. Send null to clear it."},{"type":"null","description":"Description on the invoice. Defaults to the item's. Send null to clear it."}]},"UnitPrice":{"oneOf":[{"type":"number","description":"Unit price charged. Defaults to the item's price. Not negative.","format":"double","example":24.2},{"type":"null","description":"Unit price charged. Defaults to the item's price. Not negative.","format":"double","example":24.2}]},"UnitCost":{"oneOf":[{"type":"number","description":"Unit cost. Defaults to the item's cost. Not negative.","format":"double","example":18.4},{"type":"null","description":"Unit cost. Defaults to the item's cost. Not negative.","format":"double","example":18.4}]},"DiscountPercent":{"oneOf":[{"type":"number","description":"Discount percentage, 0-100. Default 0.","format":"double"},{"type":"null","description":"Discount percentage, 0-100. Default 0.","format":"double"}]},"TaxId":{"oneOf":[{"type":"integer","description":"Tax applied. Null, or left out on a new line item, gives the tax the app would pick for the item; left out on an existing one, its tax is kept. To bill no tax, send the tax-exempt rate's id.","format":"int64","example":2419},{"type":"null","description":"Tax applied. Null, or left out on a new line item, gives the tax the app would pick for the item; left out on an existing one, its tax is kept. To bill no tax, send the tax-exempt rate's id.","format":"int64","example":2419}]},"BillableStatusId":{"oneOf":[{"type":"integer","description":"1 Billable (default), 2 No charge, 3 Non-billable. A line that isn't Billable bills 0.","format":"int32"},{"type":"null","description":"1 Billable (default), 2 No charge, 3 Non-billable. A line that isn't Billable bills 0.","format":"int32"}]},"StartDate":{"oneOf":[{"type":"string","description":"Date the line starts billing, a calendar date. Defaults to today in the service provider's zone,\r\nor the contract's start date if that is later.","format":"date-time"},{"type":"null","description":"Date the line starts billing, a calendar date. Defaults to today in the service provider's zone,\r\nor the contract's start date if that is later.","format":"date-time"}]},"EndDate":{"oneOf":[{"type":"string","description":"Date the line stops billing, a calendar date. Send null to make it open-ended.","format":"date-time"},{"type":"null","description":"Date the line stops billing, a calendar date. Send null to make it open-ended.","format":"date-time"}]}},"additionalProperties":false,"description":"One product or bundle billed on a service line. A new entry needs ItemId and Quantity; the rest\r\nfalls back to the item's own values, as an invoice line does. Amount and TaxAmount are always\r\ncalculated."},"description":"The products and bundles billed on the line. On PATCH the list replaces the set, matched by\r\n`Id`; leave it out to keep the line items as they are."},{"type":"null","items":{"type":"object","properties":{"Id":{"oneOf":[{"type":"integer","description":"PATCH only: the existing line item to keep and update. Leave it out to add one.","format":"int64","example":991204},{"type":"null","description":"PATCH only: the existing line item to keep and update. Leave it out to add one.","format":"int64","example":991204}]},"ItemId":{"oneOf":[{"type":"string","description":"The catalog item to bill. Required on a new entry, not accepted on an existing one.","format":"uuid"},{"type":"null","description":"The catalog item to bill. Required on a new entry, not accepted on an existing one.","format":"uuid"}]},"Quantity":{"oneOf":[{"type":"number","description":"Quantity billed each period. Required on a new entry. Greater than 0.","format":"double","example":12},{"type":"null","description":"Quantity billed each period. Required on a new entry. Greater than 0.","format":"double","example":12}]},"Description":{"oneOf":[{"type":"string","description":"Description on the invoice. Defaults to the item's. Send null to clear it."},{"type":"null","description":"Description on the invoice. Defaults to the item's. Send null to clear it."}]},"UnitPrice":{"oneOf":[{"type":"number","description":"Unit price charged. Defaults to the item's price. Not negative.","format":"double","example":24.2},{"type":"null","description":"Unit price charged. Defaults to the item's price. Not negative.","format":"double","example":24.2}]},"UnitCost":{"oneOf":[{"type":"number","description":"Unit cost. Defaults to the item's cost. Not negative.","format":"double","example":18.4},{"type":"null","description":"Unit cost. Defaults to the item's cost. Not negative.","format":"double","example":18.4}]},"DiscountPercent":{"oneOf":[{"type":"number","description":"Discount percentage, 0-100. Default 0.","format":"double"},{"type":"null","description":"Discount percentage, 0-100. Default 0.","format":"double"}]},"TaxId":{"oneOf":[{"type":"integer","description":"Tax applied. Null, or left out on a new line item, gives the tax the app would pick for the item; left out on an existing one, its tax is kept. To bill no tax, send the tax-exempt rate's id.","format":"int64","example":2419},{"type":"null","description":"Tax applied. Null, or left out on a new line item, gives the tax the app would pick for the item; left out on an existing one, its tax is kept. To bill no tax, send the tax-exempt rate's id.","format":"int64","example":2419}]},"BillableStatusId":{"oneOf":[{"type":"integer","description":"1 Billable (default), 2 No charge, 3 Non-billable. A line that isn't Billable bills 0.","format":"int32"},{"type":"null","description":"1 Billable (default), 2 No charge, 3 Non-billable. A line that isn't Billable bills 0.","format":"int32"}]},"StartDate":{"oneOf":[{"type":"string","description":"Date the line starts billing, a calendar date. Defaults to today in the service provider's zone,\r\nor the contract's start date if that is later.","format":"date-time"},{"type":"null","description":"Date the line starts billing, a calendar date. Defaults to today in the service provider's zone,\r\nor the contract's start date if that is later.","format":"date-time"}]},"EndDate":{"oneOf":[{"type":"string","description":"Date the line stops billing, a calendar date. Send null to make it open-ended.","format":"date-time"},{"type":"null","description":"Date the line stops billing, a calendar date. Send null to make it open-ended.","format":"date-time"}]}},"additionalProperties":false,"description":"One product or bundle billed on a service line. A new entry needs ItemId and Quantity; the rest\r\nfalls back to the item's own values, as an invoice line does. Amount and TaxAmount are always\r\ncalculated."},"description":"The products and bundles billed on the line. On PATCH the list replaces the set, matched by\r\n`Id`; leave it out to keep the line items as they are."}]}},"additionalProperties":false,"description":"One service line on `POST /v1/contracts` or `PATCH /v1/contracts/{contractId}`. Send\r\nexactly one details object, the one matching `LaborTermsId`; No Labor Terms takes none."},"description":"The service lines. At least one.","uniqueKey":"ServiceLines.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines","typeLabel":"object[] | null"}},"additionalProperties":false,"description":"Creates a contract with its service lines. Name, ClientId and at least one service line are\r\nrequired; each line needs Name and LaborTermsId. Returns the contract in the\r\n`GET /v1/contracts/{contractId}` shape.","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"Name":"All Labor Terms Example","ClientId":88,"IsForAllLocations":true,"LocationIds":[123],"Reference":"MSA-2025-014","StartDate":"2026-01-15T00:00:00.0000000+00:00","EndDate":"2023-11-07T05:31:56Z","ProrateTypeId":0,"AutoInvoiceTicketProducts":true,"RepeatPeriodId":1,"DaysBeforeInvoiceCreation":0,"DaysUntilDue":30,"AutoApproveAndSend":true,"ContactIds":[123],"InvoiceTemplateId":123,"InvoiceEmailTemplateId":123,"BrandingThemeId":"3c90c3cc-0d44-4b50-8888-8dd25736052a","ServiceLines":[{"Id":88214,"Name":"Managed Services","LaborTermsId":1,"WorkTypeIds":[123],"WorkRoleIds":[123],"AutoApproveTime":true,"AutoInvoiceTime":true,"IncludedTimeGoesToId":1,"UnlimitedHoursDetails":{},"PerHourDetails":{"RateTypeId":2,"HourlyRate":150,"CustomRates":{"WorkRoles":[{"WorkRoleId":12,"HourlyRate":95,"CoaCode":"270"}],"WorkTypes":[{"WorkTypeId":176,"HourlyMultiplier":1.5,"CoaCode":"200"}]}},"LimitedHoursDetails":{"ShowRemainingHoursInClientPortal":true,"AllocatedHours":10,"RateTypeId":123,"HourlyRate":123,"CustomRates":{"WorkRoles":[{"WorkRoleId":12,"HourlyRate":95,"CoaCode":"270"}],"WorkTypes":[{"WorkTypeId":176,"HourlyMultiplier":1.5,"CoaCode":"200"}]}},"BlockHoursDetails":{"ShowRemainingHoursInClientPortal":true,"TemplateId":0,"Balance":20,"Price":2000,"WarningThreshold":20,"OverrunThreshold":10},"LineItems":[{"Id":991204,"ItemId":"3c90c3cc-0d44-4b50-8888-8dd25736052a","Quantity":12,"Description":"\u003cstring>","UnitPrice":24.2,"UnitCost":18.4,"DiscountPercent":123,"TaxId":2419,"BillableStatusId":123,"StartDate":"2023-11-07T05:31:56Z","EndDate":"2023-11-07T05:31:56Z"}]}]}}},"exampleType":"generated"},"text/json":{"schema":{"type":"object","properties":{"Name":{"oneOf":[{"type":"string","description":"Name of the contract. Required.","example":"All Labor Terms Example","uniqueKey":"Name.oneOf.0","typeLabel":"string"},{"type":"null","description":"Name of the contract. Required.","example":"All Labor Terms Example","uniqueKey":"Name.oneOf.1","typeLabel":"null"}],"uniqueKey":"Name","typeLabel":"string | null"},"ClientId":{"oneOf":[{"type":"integer","description":"The client the contract bills. Required.","format":"int64","example":88,"uniqueKey":"ClientId.oneOf.0","typeLabel":"integer\u003cint64>"},{"type":"null","description":"The client the contract bills. Required.","format":"int64","example":88,"uniqueKey":"ClientId.oneOf.1","typeLabel":"null"}],"uniqueKey":"ClientId","typeLabel":"integer\u003cint64> | null"},"IsForAllLocations":{"oneOf":[{"type":"boolean","description":"Whether the contract covers every one of the client's locations. Default true.","uniqueKey":"IsForAllLocations.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"Whether the contract covers every one of the client's locations. Default true.","uniqueKey":"IsForAllLocations.oneOf.1","typeLabel":"null"}],"uniqueKey":"IsForAllLocations","typeLabel":"boolean | null"},"LocationIds":{"oneOf":[{"type":"array","items":{"type":"integer","format":"int64","uniqueKey":"LocationIds.oneOf.0.items.[INDEX]","typeLabel":"integer\u003cint64>"},"description":"The locations covered when IsForAllLocations is false: at least one, each the client's own. Ignored otherwise.","uniqueKey":"LocationIds.oneOf.0","typeLabel":"integer\u003cint64>[]"},{"type":"null","items":{"type":"integer","format":"int64"},"description":"The locations covered when IsForAllLocations is false: at least one, each the client's own. Ignored otherwise.","uniqueKey":"LocationIds.oneOf.1","typeLabel":"null"}],"uniqueKey":"LocationIds","typeLabel":"integer\u003cint64>[] | null"},"Reference":{"oneOf":[{"type":"string","description":"Free-text reference printed on the contract's invoices.","example":"MSA-2025-014","uniqueKey":"Reference.oneOf.0","typeLabel":"string"},{"type":"null","description":"Free-text reference printed on the contract's invoices.","example":"MSA-2025-014","uniqueKey":"Reference.oneOf.1","typeLabel":"null"}],"uniqueKey":"Reference","typeLabel":"string | null"},"StartDate":{"oneOf":[{"type":"string","description":"Date coverage starts, a calendar date. Defaults to today in the service provider's zone.","format":"date-time","example":"2026-01-15T00:00:00.0000000+00:00","uniqueKey":"StartDate.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","description":"Date coverage starts, a calendar date. Defaults to today in the service provider's zone.","format":"date-time","example":"2026-01-15T00:00:00.0000000+00:00","uniqueKey":"StartDate.oneOf.1","typeLabel":"null"}],"uniqueKey":"StartDate","typeLabel":"string\u003cdate-time> | null"},"EndDate":{"oneOf":[{"type":"string","description":"Date coverage ends, a calendar date, after StartDate. Left out, the contract is open-ended.","format":"date-time","uniqueKey":"EndDate.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","description":"Date coverage ends, a calendar date, after StartDate. Left out, the contract is open-ended.","format":"date-time","uniqueKey":"EndDate.oneOf.1","typeLabel":"null"}],"uniqueKey":"EndDate","typeLabel":"string\u003cdate-time> | null"},"ProrateTypeId":{"oneOf":[{"type":"integer","description":"0 Do not prorate (default), 1 Prorate and add to next invoice, 2 Prorate and generate standalone invoice.","format":"int32","example":0,"uniqueKey":"ProrateTypeId.oneOf.0","typeLabel":"integer\u003cint32>"},{"type":"null","description":"0 Do not prorate (default), 1 Prorate and add to next invoice, 2 Prorate and generate standalone invoice.","format":"int32","example":0,"uniqueKey":"ProrateTypeId.oneOf.1","typeLabel":"null"}],"uniqueKey":"ProrateTypeId","typeLabel":"integer\u003cint32> | null"},"AutoInvoiceTicketProducts":{"oneOf":[{"type":"boolean","description":"Sweep approved ticket products for this client into the next recurring invoice. Only with\r\nIsForAllLocations true. Default false.","uniqueKey":"AutoInvoiceTicketProducts.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"Sweep approved ticket products for this client into the next recurring invoice. Only with\r\nIsForAllLocations true. Default false.","uniqueKey":"AutoInvoiceTicketProducts.oneOf.1","typeLabel":"null"}],"uniqueKey":"AutoInvoiceTicketProducts","typeLabel":"boolean | null"},"RepeatPeriodId":{"oneOf":[{"type":"integer","description":"1 Monthly (default), 2 Quarterly, 3 Yearly, 4 Half Yearly.","format":"int32","example":1,"uniqueKey":"RepeatPeriodId.oneOf.0","typeLabel":"integer\u003cint32>"},{"type":"null","description":"1 Monthly (default), 2 Quarterly, 3 Yearly, 4 Half Yearly.","format":"int32","example":1,"uniqueKey":"RepeatPeriodId.oneOf.1","typeLabel":"null"}],"uniqueKey":"RepeatPeriodId","typeLabel":"integer\u003cint32> | null"},"DaysBeforeInvoiceCreation":{"oneOf":[{"type":"integer","description":"Days before the billing period ends that the invoice is created, 0-31. Default 0.","format":"int32","example":0,"uniqueKey":"DaysBeforeInvoiceCreation.oneOf.0","typeLabel":"integer\u003cint32>"},{"type":"null","description":"Days before the billing period ends that the invoice is created, 0-31. Default 0.","format":"int32","example":0,"uniqueKey":"DaysBeforeInvoiceCreation.oneOf.1","typeLabel":"null"}],"uniqueKey":"DaysBeforeInvoiceCreation","typeLabel":"integer\u003cint32> | null"},"DaysUntilDue":{"oneOf":[{"type":"integer","description":"Days the client has to pay. Defaults to the service provider's invoice setting.","format":"int32","example":30,"uniqueKey":"DaysUntilDue.oneOf.0","typeLabel":"integer\u003cint32>"},{"type":"null","description":"Days the client has to pay. Defaults to the service provider's invoice setting.","format":"int32","example":30,"uniqueKey":"DaysUntilDue.oneOf.1","typeLabel":"null"}],"uniqueKey":"DaysUntilDue","typeLabel":"integer\u003cint32> | null"},"AutoApproveAndSend":{"oneOf":[{"type":"boolean","description":"Approve and send each invoice raised from the contract automatically. Default false.","uniqueKey":"AutoApproveAndSend.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"Approve and send each invoice raised from the contract automatically. Default false.","uniqueKey":"AutoApproveAndSend.oneOf.1","typeLabel":"null"}],"uniqueKey":"AutoApproveAndSend","typeLabel":"boolean | null"},"ContactIds":{"oneOf":[{"type":"array","items":{"type":"integer","format":"int64","uniqueKey":"ContactIds.oneOf.0.items.[INDEX]","typeLabel":"integer\u003cint64>"},"description":"The client's contacts who can auto-approve the contract's invoices.","uniqueKey":"ContactIds.oneOf.0","typeLabel":"integer\u003cint64>[]"},{"type":"null","items":{"type":"integer","format":"int64"},"description":"The client's contacts who can auto-approve the contract's invoices.","uniqueKey":"ContactIds.oneOf.1","typeLabel":"null"}],"uniqueKey":"ContactIds","typeLabel":"integer\u003cint64>[] | null"},"InvoiceTemplateId":{"oneOf":[{"type":"integer","description":"Invoice template for the contract's invoices. Left out, the service provider's default applies.","format":"int64","uniqueKey":"InvoiceTemplateId.oneOf.0","typeLabel":"integer\u003cint64>"},{"type":"null","description":"Invoice template for the contract's invoices. Left out, the service provider's default applies.","format":"int64","uniqueKey":"InvoiceTemplateId.oneOf.1","typeLabel":"null"}],"uniqueKey":"InvoiceTemplateId","typeLabel":"integer\u003cint64> | null"},"InvoiceEmailTemplateId":{"oneOf":[{"type":"integer","description":"Email template for the contract's invoices. Left out, the service provider's default applies.","format":"int64","uniqueKey":"InvoiceEmailTemplateId.oneOf.0","typeLabel":"integer\u003cint64>"},{"type":"null","description":"Email template for the contract's invoices. Left out, the service provider's default applies.","format":"int64","uniqueKey":"InvoiceEmailTemplateId.oneOf.1","typeLabel":"null"}],"uniqueKey":"InvoiceEmailTemplateId","typeLabel":"integer\u003cint64> | null"},"BrandingThemeId":{"oneOf":[{"type":"string","description":"Accounting-system branding theme for the contract's invoices.","format":"uuid","uniqueKey":"BrandingThemeId.oneOf.0","typeLabel":"string\u003cuuid>"},{"type":"null","description":"Accounting-system branding theme for the contract's invoices.","format":"uuid","uniqueKey":"BrandingThemeId.oneOf.1","typeLabel":"null"}],"uniqueKey":"BrandingThemeId","typeLabel":"string\u003cuuid> | null"},"ServiceLines":{"oneOf":[{"type":"array","items":{"type":"object","properties":{"Id":{"oneOf":[{"type":"integer","description":"PATCH only: the service line to keep and update. Leave it out to add a line. Not accepted on\r\nPOST.","format":"int64","example":88214,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].Id.oneOf.0","typeLabel":"integer\u003cint64>"},{"type":"null","description":"PATCH only: the service line to keep and update. Leave it out to add a line. Not accepted on\r\nPOST.","format":"int64","example":88214,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].Id.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].Id","typeLabel":"integer\u003cint64> | null"},"Name":{"oneOf":[{"type":"string","description":"Name of the service line. Required on a new line.","example":"Managed Services","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].Name.oneOf.0","typeLabel":"string"},{"type":"null","description":"Name of the service line. Required on a new line.","example":"Managed Services","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].Name.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].Name","typeLabel":"string | null"},"LaborTermsId":{"oneOf":[{"type":"integer","description":"How the line bills time: 1 Unlimited Hours, 2 Hourly, 3 Block Hours, 4 No Labor Terms,\r\n5 Limited Hours. Required on a new line. On an existing line only a No Labor Terms line can\r\nchange, once.","format":"int32","example":1,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LaborTermsId.oneOf.0","typeLabel":"integer\u003cint32>"},{"type":"null","description":"How the line bills time: 1 Unlimited Hours, 2 Hourly, 3 Block Hours, 4 No Labor Terms,\r\n5 Limited Hours. Required on a new line. On an existing line only a No Labor Terms line can\r\nchange, once.","format":"int32","example":1,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LaborTermsId.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LaborTermsId","typeLabel":"integer\u003cint32> | null"},"WorkTypeIds":{"oneOf":[{"type":"array","items":{"type":"integer","format":"int64","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].WorkTypeIds.oneOf.0.items.[INDEX]","typeLabel":"integer\u003cint64>"},"description":"The work types the line covers. Left out on a new line, every work type is covered, as in the\r\napp. Not accepted on a No Labor Terms line.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].WorkTypeIds.oneOf.0","typeLabel":"integer\u003cint64>[]"},{"type":"null","items":{"type":"integer","format":"int64"},"description":"The work types the line covers. Left out on a new line, every work type is covered, as in the\r\napp. Not accepted on a No Labor Terms line.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].WorkTypeIds.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].WorkTypeIds","typeLabel":"integer\u003cint64>[] | null"},"WorkRoleIds":{"oneOf":[{"type":"array","items":{"type":"integer","format":"int64","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].WorkRoleIds.oneOf.0.items.[INDEX]","typeLabel":"integer\u003cint64>"},"description":"The billing roles the line covers. Same rules as `WorkTypeIds`.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].WorkRoleIds.oneOf.0","typeLabel":"integer\u003cint64>[]"},{"type":"null","items":{"type":"integer","format":"int64"},"description":"The billing roles the line covers. Same rules as `WorkTypeIds`.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].WorkRoleIds.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].WorkRoleIds","typeLabel":"integer\u003cint64>[] | null"},"AutoApproveTime":{"oneOf":[{"type":"boolean","description":"Approve time logged against the line automatically. Every labor term except No Labor Terms. Default false.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].AutoApproveTime.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"Approve time logged against the line automatically. Every labor term except No Labor Terms. Default false.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].AutoApproveTime.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].AutoApproveTime","typeLabel":"boolean | null"},"AutoInvoiceTime":{"oneOf":[{"type":"boolean","description":"Sweep approved time waiting on the line into the contract's recurring invoice. Every labor term\r\nexcept No Labor Terms. Default false.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].AutoInvoiceTime.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"Sweep approved time waiting on the line into the contract's recurring invoice. Every labor term\r\nexcept No Labor Terms. Default false.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].AutoInvoiceTime.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].AutoInvoiceTime","typeLabel":"boolean | null"},"IncludedTimeGoesToId":{"oneOf":[{"type":"integer","description":"Where covered time lands when it is approved: 1 Complete (default) or 2 Waiting to invoice.\r\nUnlimited, Block and Limited Hours only.","format":"int32","example":1,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].IncludedTimeGoesToId.oneOf.0","typeLabel":"integer\u003cint32>"},{"type":"null","description":"Where covered time lands when it is approved: 1 Complete (default) or 2 Waiting to invoice.\r\nUnlimited, Block and Limited Hours only.","format":"int32","example":1,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].IncludedTimeGoesToId.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].IncludedTimeGoesToId","typeLabel":"integer\u003cint32> | null"},"UnlimitedHoursDetails":{"type":"object","additionalProperties":false,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].UnlimitedHoursDetails","typeLabel":"object"},"PerHourDetails":{"type":"object","properties":{"RateTypeId":{"oneOf":[{"type":"integer","description":"1 Use default labor rates, 2 Use fixed labor rate, 3 Custom labor rates. Default 1.","format":"int32","example":2,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.RateTypeId.oneOf.0","typeLabel":"integer\u003cint32>"},{"type":"null","description":"1 Use default labor rates, 2 Use fixed labor rate, 3 Custom labor rates. Default 1.","format":"int32","example":2,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.RateTypeId.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.RateTypeId","typeLabel":"integer\u003cint32> | null"},"HourlyRate":{"oneOf":[{"type":"number","description":"The flat rate per hour. Required with RateTypeId 2, refused with any other.","format":"double","example":150,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.HourlyRate.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"The flat rate per hour. Required with RateTypeId 2, refused with any other.","format":"double","example":150,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.HourlyRate.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.HourlyRate","typeLabel":"number\u003cdouble> | null"},"CustomRates":{"type":"object","properties":{"WorkRoles":{"oneOf":[{"type":"array","items":{"type":"object","properties":{"WorkRoleId":{"oneOf":[{"type":"integer","description":"The billing role this row prices. Required.","format":"int64","example":12,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX].WorkRoleId.oneOf.0","typeLabel":"integer\u003cint64>"},{"type":"null","description":"The billing role this row prices. Required.","format":"int64","example":12,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX].WorkRoleId.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX].WorkRoleId","typeLabel":"integer\u003cint64> | null"},"HourlyRate":{"oneOf":[{"type":"number","description":"Rate per hour. Left out, the current rate is kept.","format":"double","example":95,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX].HourlyRate.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"Rate per hour. Left out, the current rate is kept.","format":"double","example":95,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX].HourlyRate.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX].HourlyRate","typeLabel":"number\u003cdouble> | null"},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code. Left out, the current code is kept.","example":"270","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX].CoaCode.oneOf.0","typeLabel":"string"},{"type":"null","description":"Accounting code. Left out, the current code is kept.","example":"270","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX].CoaCode.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX].CoaCode","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX]","typeLabel":"object"},"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkRoles.oneOf.0","typeLabel":"object[]"},{"type":"null","items":{"type":"object","properties":{"WorkRoleId":{"oneOf":[{"type":"integer","description":"The billing role this row prices. Required.","format":"int64","example":12},{"type":"null","description":"The billing role this row prices. Required.","format":"int64","example":12}]},"HourlyRate":{"oneOf":[{"type":"number","description":"Rate per hour. Left out, the current rate is kept.","format":"double","example":95},{"type":"null","description":"Rate per hour. Left out, the current rate is kept.","format":"double","example":95}]},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code. Left out, the current code is kept.","example":"270"},{"type":"null","description":"Accounting code. Left out, the current code is kept.","example":"270"}]}},"additionalProperties":false},"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkRoles.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkRoles","typeLabel":"object[] | null"},"WorkTypes":{"oneOf":[{"type":"array","items":{"type":"object","properties":{"WorkTypeId":{"oneOf":[{"type":"integer","description":"The work type this row prices. Required.","format":"int64","example":176,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX].WorkTypeId.oneOf.0","typeLabel":"integer\u003cint64>"},{"type":"null","description":"The work type this row prices. Required.","format":"int64","example":176,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX].WorkTypeId.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX].WorkTypeId","typeLabel":"integer\u003cint64> | null"},"HourlyMultiplier":{"oneOf":[{"type":"number","description":"Multiplier on the role's rate. Left out, the current multiplier is kept.","format":"double","example":1.5,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX].HourlyMultiplier.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"Multiplier on the role's rate. Left out, the current multiplier is kept.","format":"double","example":1.5,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX].HourlyMultiplier.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX].HourlyMultiplier","typeLabel":"number\u003cdouble> | null"},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code. Left out, the current code is kept.","example":"200","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX].CoaCode.oneOf.0","typeLabel":"string"},{"type":"null","description":"Accounting code. Left out, the current code is kept.","example":"200","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX].CoaCode.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX].CoaCode","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX]","typeLabel":"object"},"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkTypes.oneOf.0","typeLabel":"object[]"},{"type":"null","items":{"type":"object","properties":{"WorkTypeId":{"oneOf":[{"type":"integer","description":"The work type this row prices. Required.","format":"int64","example":176},{"type":"null","description":"The work type this row prices. Required.","format":"int64","example":176}]},"HourlyMultiplier":{"oneOf":[{"type":"number","description":"Multiplier on the role's rate. Left out, the current multiplier is kept.","format":"double","example":1.5},{"type":"null","description":"Multiplier on the role's rate. Left out, the current multiplier is kept.","format":"double","example":1.5}]},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code. Left out, the current code is kept.","example":"200"},{"type":"null","description":"Accounting code. Left out, the current code is kept.","example":"200"}]}},"additionalProperties":false},"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkTypes.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkTypes","typeLabel":"object[] | null"}},"additionalProperties":false,"description":"Overrides for the Custom labor rates grid. The line starts from every billing role and work type\r\nat the service provider's own rates; only the rows sent here change. On PATCH, entries merge by\r\nid into the line's existing rows.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates","typeLabel":"object"}},"additionalProperties":false,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails","typeLabel":"object"},"LimitedHoursDetails":{"type":"object","properties":{"ShowRemainingHoursInClientPortal":{"oneOf":[{"type":"boolean","description":"Show the client the hours left in the allocation in the client portal. Default false.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.ShowRemainingHoursInClientPortal.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"Show the client the hours left in the allocation in the client portal. Default false.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.ShowRemainingHoursInClientPortal.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.ShowRemainingHoursInClientPortal","typeLabel":"boolean | null"},"AllocatedHours":{"oneOf":[{"type":"number","description":"Hours included each billing period. Required on a new line.","format":"double","example":10,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.AllocatedHours.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"Hours included each billing period. Required on a new line.","format":"double","example":10,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.AllocatedHours.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.AllocatedHours","typeLabel":"number\u003cdouble> | null"},"RateTypeId":{"oneOf":[{"type":"integer","description":"Same as on `PerHourDetails`.","format":"int32","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.RateTypeId.oneOf.0","typeLabel":"integer\u003cint32>"},{"type":"null","description":"Same as on `PerHourDetails`.","format":"int32","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.RateTypeId.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.RateTypeId","typeLabel":"integer\u003cint32> | null"},"HourlyRate":{"oneOf":[{"type":"number","description":"Same as on `PerHourDetails`.","format":"double","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.HourlyRate.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"Same as on `PerHourDetails`.","format":"double","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.HourlyRate.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.HourlyRate","typeLabel":"number\u003cdouble> | null"},"CustomRates":{"type":"object","properties":{"WorkRoles":{"oneOf":[{"type":"array","items":{"type":"object","properties":{"WorkRoleId":{"oneOf":[{"type":"integer","description":"The billing role this row prices. Required.","format":"int64","example":12,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX].WorkRoleId.oneOf.0","typeLabel":"integer\u003cint64>"},{"type":"null","description":"The billing role this row prices. Required.","format":"int64","example":12,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX].WorkRoleId.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX].WorkRoleId","typeLabel":"integer\u003cint64> | null"},"HourlyRate":{"oneOf":[{"type":"number","description":"Rate per hour. Left out, the current rate is kept.","format":"double","example":95,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX].HourlyRate.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"Rate per hour. Left out, the current rate is kept.","format":"double","example":95,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX].HourlyRate.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX].HourlyRate","typeLabel":"number\u003cdouble> | null"},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code. Left out, the current code is kept.","example":"270","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX].CoaCode.oneOf.0","typeLabel":"string"},{"type":"null","description":"Accounting code. Left out, the current code is kept.","example":"270","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX].CoaCode.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX].CoaCode","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX]","typeLabel":"object"},"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles.oneOf.0","typeLabel":"object[]"},{"type":"null","items":{"type":"object","properties":{"WorkRoleId":{"oneOf":[{"type":"integer","description":"The billing role this row prices. Required.","format":"int64","example":12},{"type":"null","description":"The billing role this row prices. Required.","format":"int64","example":12}]},"HourlyRate":{"oneOf":[{"type":"number","description":"Rate per hour. Left out, the current rate is kept.","format":"double","example":95},{"type":"null","description":"Rate per hour. Left out, the current rate is kept.","format":"double","example":95}]},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code. Left out, the current code is kept.","example":"270"},{"type":"null","description":"Accounting code. Left out, the current code is kept.","example":"270"}]}},"additionalProperties":false},"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles","typeLabel":"object[] | null"},"WorkTypes":{"oneOf":[{"type":"array","items":{"type":"object","properties":{"WorkTypeId":{"oneOf":[{"type":"integer","description":"The work type this row prices. Required.","format":"int64","example":176,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX].WorkTypeId.oneOf.0","typeLabel":"integer\u003cint64>"},{"type":"null","description":"The work type this row prices. Required.","format":"int64","example":176,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX].WorkTypeId.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX].WorkTypeId","typeLabel":"integer\u003cint64> | null"},"HourlyMultiplier":{"oneOf":[{"type":"number","description":"Multiplier on the role's rate. Left out, the current multiplier is kept.","format":"double","example":1.5,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX].HourlyMultiplier.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"Multiplier on the role's rate. Left out, the current multiplier is kept.","format":"double","example":1.5,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX].HourlyMultiplier.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX].HourlyMultiplier","typeLabel":"number\u003cdouble> | null"},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code. Left out, the current code is kept.","example":"200","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX].CoaCode.oneOf.0","typeLabel":"string"},{"type":"null","description":"Accounting code. Left out, the current code is kept.","example":"200","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX].CoaCode.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX].CoaCode","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX]","typeLabel":"object"},"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes.oneOf.0","typeLabel":"object[]"},{"type":"null","items":{"type":"object","properties":{"WorkTypeId":{"oneOf":[{"type":"integer","description":"The work type this row prices. Required.","format":"int64","example":176},{"type":"null","description":"The work type this row prices. Required.","format":"int64","example":176}]},"HourlyMultiplier":{"oneOf":[{"type":"number","description":"Multiplier on the role's rate. Left out, the current multiplier is kept.","format":"double","example":1.5},{"type":"null","description":"Multiplier on the role's rate. Left out, the current multiplier is kept.","format":"double","example":1.5}]},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code. Left out, the current code is kept.","example":"200"},{"type":"null","description":"Accounting code. Left out, the current code is kept.","example":"200"}]}},"additionalProperties":false},"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes","typeLabel":"object[] | null"}},"additionalProperties":false,"description":"Overrides for the Custom labor rates grid. The line starts from every billing role and work type\r\nat the service provider's own rates; only the rows sent here change. On PATCH, entries merge by\r\nid into the line's existing rows.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates","typeLabel":"object"}},"additionalProperties":false,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails","typeLabel":"object"},"BlockHoursDetails":{"type":"object","properties":{"ShowRemainingHoursInClientPortal":{"oneOf":[{"type":"boolean","description":"Show the client the hours left in the block in the client portal. Default false.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails.ShowRemainingHoursInClientPortal.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"Show the client the hours left in the block in the client portal. Default false.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails.ShowRemainingHoursInClientPortal.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails.ShowRemainingHoursInClientPortal","typeLabel":"boolean | null"},"TemplateId":{"oneOf":[{"type":"integer","description":"A Block Hours Template id, or 0 for Custom. With a template, Balance and Price come from it and\r\nare refused on the request, as the app disables both once a template is picked. Required on a\r\nnew line.","format":"int64","example":0,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails.TemplateId.oneOf.0","typeLabel":"integer\u003cint64>"},{"type":"null","description":"A Block Hours Template id, or 0 for Custom. With a template, Balance and Price come from it and\r\nare refused on the request, as the app disables both once a template is picked. Required on a\r\nnew line.","format":"int64","example":0,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails.TemplateId.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails.TemplateId","typeLabel":"integer\u003cint64> | null"},"Balance":{"oneOf":[{"type":"number","description":"Hours in the block. Custom (TemplateId 0) only, and then required on a new line.","format":"double","example":20,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails.Balance.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"Hours in the block. Custom (TemplateId 0) only, and then required on a new line.","format":"double","example":20,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails.Balance.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails.Balance","typeLabel":"number\u003cdouble> | null"},"Price":{"oneOf":[{"type":"number","description":"The price of the block, billed once on the Draft invoice the new line raises. Custom\r\n(TemplateId 0) only, and then required on a new line.","format":"double","example":2000,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails.Price.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"The price of the block, billed once on the Draft invoice the new line raises. Custom\r\n(TemplateId 0) only, and then required on a new line.","format":"double","example":2000,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails.Price.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails.Price","typeLabel":"number\u003cdouble> | null"},"WarningThreshold":{"oneOf":[{"type":"integer","description":"Percentage of the block left that raises a low-balance warning, a whole number 0-90.","format":"int32","example":20,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails.WarningThreshold.oneOf.0","typeLabel":"integer\u003cint32>"},{"type":"null","description":"Percentage of the block left that raises a low-balance warning, a whole number 0-90.","format":"int32","example":20,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails.WarningThreshold.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails.WarningThreshold","typeLabel":"integer\u003cint32> | null"},"OverrunThreshold":{"oneOf":[{"type":"integer","description":"Percentage of the block the client may run past zero, a whole number 0-50.","format":"int32","example":10,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails.OverrunThreshold.oneOf.0","typeLabel":"integer\u003cint32>"},{"type":"null","description":"Percentage of the block the client may run past zero, a whole number 0-50.","format":"int32","example":10,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails.OverrunThreshold.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails.OverrunThreshold","typeLabel":"integer\u003cint32> | null"}},"additionalProperties":false,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails","typeLabel":"object"},"LineItems":{"oneOf":[{"type":"array","items":{"type":"object","properties":{"Id":{"oneOf":[{"type":"integer","description":"PATCH only: the existing line item to keep and update. Leave it out to add one.","format":"int64","example":991204,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].Id.oneOf.0","typeLabel":"integer\u003cint64>"},{"type":"null","description":"PATCH only: the existing line item to keep and update. Leave it out to add one.","format":"int64","example":991204,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].Id.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].Id","typeLabel":"integer\u003cint64> | null"},"ItemId":{"oneOf":[{"type":"string","description":"The catalog item to bill. Required on a new entry, not accepted on an existing one.","format":"uuid","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].ItemId.oneOf.0","typeLabel":"string\u003cuuid>"},{"type":"null","description":"The catalog item to bill. Required on a new entry, not accepted on an existing one.","format":"uuid","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].ItemId.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].ItemId","typeLabel":"string\u003cuuid> | null"},"Quantity":{"oneOf":[{"type":"number","description":"Quantity billed each period. Required on a new entry. Greater than 0.","format":"double","example":12,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].Quantity.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"Quantity billed each period. Required on a new entry. Greater than 0.","format":"double","example":12,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].Quantity.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].Quantity","typeLabel":"number\u003cdouble> | null"},"Description":{"oneOf":[{"type":"string","description":"Description on the invoice. Defaults to the item's. Send null to clear it.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].Description.oneOf.0","typeLabel":"string"},{"type":"null","description":"Description on the invoice. Defaults to the item's. Send null to clear it.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].Description.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].Description","typeLabel":"string | null"},"UnitPrice":{"oneOf":[{"type":"number","description":"Unit price charged. Defaults to the item's price. Not negative.","format":"double","example":24.2,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].UnitPrice.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"Unit price charged. Defaults to the item's price. Not negative.","format":"double","example":24.2,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].UnitPrice.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].UnitPrice","typeLabel":"number\u003cdouble> | null"},"UnitCost":{"oneOf":[{"type":"number","description":"Unit cost. Defaults to the item's cost. Not negative.","format":"double","example":18.4,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].UnitCost.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"Unit cost. Defaults to the item's cost. Not negative.","format":"double","example":18.4,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].UnitCost.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].UnitCost","typeLabel":"number\u003cdouble> | null"},"DiscountPercent":{"oneOf":[{"type":"number","description":"Discount percentage, 0-100. Default 0.","format":"double","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].DiscountPercent.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"Discount percentage, 0-100. Default 0.","format":"double","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].DiscountPercent.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].DiscountPercent","typeLabel":"number\u003cdouble> | null"},"TaxId":{"oneOf":[{"type":"integer","description":"Tax applied. Null, or left out on a new line item, gives the tax the app would pick for the item; left out on an existing one, its tax is kept. To bill no tax, send the tax-exempt rate's id.","format":"int64","example":2419,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].TaxId.oneOf.0","typeLabel":"integer\u003cint64>"},{"type":"null","description":"Tax applied. Null, or left out on a new line item, gives the tax the app would pick for the item; left out on an existing one, its tax is kept. To bill no tax, send the tax-exempt rate's id.","format":"int64","example":2419,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].TaxId.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].TaxId","typeLabel":"integer\u003cint64> | null"},"BillableStatusId":{"oneOf":[{"type":"integer","description":"1 Billable (default), 2 No charge, 3 Non-billable. A line that isn't Billable bills 0.","format":"int32","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].BillableStatusId.oneOf.0","typeLabel":"integer\u003cint32>"},{"type":"null","description":"1 Billable (default), 2 No charge, 3 Non-billable. A line that isn't Billable bills 0.","format":"int32","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].BillableStatusId.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].BillableStatusId","typeLabel":"integer\u003cint32> | null"},"StartDate":{"oneOf":[{"type":"string","description":"Date the line starts billing, a calendar date. Defaults to today in the service provider's zone,\r\nor the contract's start date if that is later.","format":"date-time","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].StartDate.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","description":"Date the line starts billing, a calendar date. Defaults to today in the service provider's zone,\r\nor the contract's start date if that is later.","format":"date-time","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].StartDate.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].StartDate","typeLabel":"string\u003cdate-time> | null"},"EndDate":{"oneOf":[{"type":"string","description":"Date the line stops billing, a calendar date. Send null to make it open-ended.","format":"date-time","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].EndDate.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","description":"Date the line stops billing, a calendar date. Send null to make it open-ended.","format":"date-time","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].EndDate.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].EndDate","typeLabel":"string\u003cdate-time> | null"}},"additionalProperties":false,"description":"One product or bundle billed on a service line. A new entry needs ItemId and Quantity; the rest\r\nfalls back to the item's own values, as an invoice line does. Amount and TaxAmount are always\r\ncalculated.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX]","typeLabel":"object"},"description":"The products and bundles billed on the line. On PATCH the list replaces the set, matched by\r\n`Id`; leave it out to keep the line items as they are.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0","typeLabel":"object[]"},{"type":"null","items":{"type":"object","properties":{"Id":{"oneOf":[{"type":"integer","description":"PATCH only: the existing line item to keep and update. Leave it out to add one.","format":"int64","example":991204},{"type":"null","description":"PATCH only: the existing line item to keep and update. Leave it out to add one.","format":"int64","example":991204}]},"ItemId":{"oneOf":[{"type":"string","description":"The catalog item to bill. Required on a new entry, not accepted on an existing one.","format":"uuid"},{"type":"null","description":"The catalog item to bill. Required on a new entry, not accepted on an existing one.","format":"uuid"}]},"Quantity":{"oneOf":[{"type":"number","description":"Quantity billed each period. Required on a new entry. Greater than 0.","format":"double","example":12},{"type":"null","description":"Quantity billed each period. Required on a new entry. Greater than 0.","format":"double","example":12}]},"Description":{"oneOf":[{"type":"string","description":"Description on the invoice. Defaults to the item's. Send null to clear it."},{"type":"null","description":"Description on the invoice. Defaults to the item's. Send null to clear it."}]},"UnitPrice":{"oneOf":[{"type":"number","description":"Unit price charged. Defaults to the item's price. Not negative.","format":"double","example":24.2},{"type":"null","description":"Unit price charged. Defaults to the item's price. Not negative.","format":"double","example":24.2}]},"UnitCost":{"oneOf":[{"type":"number","description":"Unit cost. Defaults to the item's cost. Not negative.","format":"double","example":18.4},{"type":"null","description":"Unit cost. Defaults to the item's cost. Not negative.","format":"double","example":18.4}]},"DiscountPercent":{"oneOf":[{"type":"number","description":"Discount percentage, 0-100. Default 0.","format":"double"},{"type":"null","description":"Discount percentage, 0-100. Default 0.","format":"double"}]},"TaxId":{"oneOf":[{"type":"integer","description":"Tax applied. Null, or left out on a new line item, gives the tax the app would pick for the item; left out on an existing one, its tax is kept. To bill no tax, send the tax-exempt rate's id.","format":"int64","example":2419},{"type":"null","description":"Tax applied. Null, or left out on a new line item, gives the tax the app would pick for the item; left out on an existing one, its tax is kept. To bill no tax, send the tax-exempt rate's id.","format":"int64","example":2419}]},"BillableStatusId":{"oneOf":[{"type":"integer","description":"1 Billable (default), 2 No charge, 3 Non-billable. A line that isn't Billable bills 0.","format":"int32"},{"type":"null","description":"1 Billable (default), 2 No charge, 3 Non-billable. A line that isn't Billable bills 0.","format":"int32"}]},"StartDate":{"oneOf":[{"type":"string","description":"Date the line starts billing, a calendar date. Defaults to today in the service provider's zone,\r\nor the contract's start date if that is later.","format":"date-time"},{"type":"null","description":"Date the line starts billing, a calendar date. Defaults to today in the service provider's zone,\r\nor the contract's start date if that is later.","format":"date-time"}]},"EndDate":{"oneOf":[{"type":"string","description":"Date the line stops billing, a calendar date. Send null to make it open-ended.","format":"date-time"},{"type":"null","description":"Date the line stops billing, a calendar date. Send null to make it open-ended.","format":"date-time"}]}},"additionalProperties":false,"description":"One product or bundle billed on a service line. A new entry needs ItemId and Quantity; the rest\r\nfalls back to the item's own values, as an invoice line does. Amount and TaxAmount are always\r\ncalculated."},"description":"The products and bundles billed on the line. On PATCH the list replaces the set, matched by\r\n`Id`; leave it out to keep the line items as they are.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems","typeLabel":"object[] | null"}},"additionalProperties":false,"description":"One service line on `POST /v1/contracts` or `PATCH /v1/contracts/{contractId}`. Send\r\nexactly one details object, the one matching `LaborTermsId`; No Labor Terms takes none.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX]","typeLabel":"object"},"description":"The service lines. At least one.","uniqueKey":"ServiceLines.oneOf.0","typeLabel":"object[]"},{"type":"null","items":{"type":"object","properties":{"Id":{"oneOf":[{"type":"integer","description":"PATCH only: the service line to keep and update. Leave it out to add a line. Not accepted on\r\nPOST.","format":"int64","example":88214},{"type":"null","description":"PATCH only: the service line to keep and update. Leave it out to add a line. Not accepted on\r\nPOST.","format":"int64","example":88214}]},"Name":{"oneOf":[{"type":"string","description":"Name of the service line. Required on a new line.","example":"Managed Services"},{"type":"null","description":"Name of the service line. Required on a new line.","example":"Managed Services"}]},"LaborTermsId":{"oneOf":[{"type":"integer","description":"How the line bills time: 1 Unlimited Hours, 2 Hourly, 3 Block Hours, 4 No Labor Terms,\r\n5 Limited Hours. Required on a new line. On an existing line only a No Labor Terms line can\r\nchange, once.","format":"int32","example":1},{"type":"null","description":"How the line bills time: 1 Unlimited Hours, 2 Hourly, 3 Block Hours, 4 No Labor Terms,\r\n5 Limited Hours. Required on a new line. On an existing line only a No Labor Terms line can\r\nchange, once.","format":"int32","example":1}]},"WorkTypeIds":{"oneOf":[{"type":"array","items":{"type":"integer","format":"int64"},"description":"The work types the line covers. Left out on a new line, every work type is covered, as in the\r\napp. Not accepted on a No Labor Terms line."},{"type":"null","items":{"type":"integer","format":"int64"},"description":"The work types the line covers. Left out on a new line, every work type is covered, as in the\r\napp. Not accepted on a No Labor Terms line."}]},"WorkRoleIds":{"oneOf":[{"type":"array","items":{"type":"integer","format":"int64"},"description":"The billing roles the line covers. Same rules as `WorkTypeIds`."},{"type":"null","items":{"type":"integer","format":"int64"},"description":"The billing roles the line covers. Same rules as `WorkTypeIds`."}]},"AutoApproveTime":{"oneOf":[{"type":"boolean","description":"Approve time logged against the line automatically. Every labor term except No Labor Terms. Default false."},{"type":"null","description":"Approve time logged against the line automatically. Every labor term except No Labor Terms. Default false."}]},"AutoInvoiceTime":{"oneOf":[{"type":"boolean","description":"Sweep approved time waiting on the line into the contract's recurring invoice. Every labor term\r\nexcept No Labor Terms. Default false."},{"type":"null","description":"Sweep approved time waiting on the line into the contract's recurring invoice. Every labor term\r\nexcept No Labor Terms. Default false."}]},"IncludedTimeGoesToId":{"oneOf":[{"type":"integer","description":"Where covered time lands when it is approved: 1 Complete (default) or 2 Waiting to invoice.\r\nUnlimited, Block and Limited Hours only.","format":"int32","example":1},{"type":"null","description":"Where covered time lands when it is approved: 1 Complete (default) or 2 Waiting to invoice.\r\nUnlimited, Block and Limited Hours only.","format":"int32","example":1}]},"UnlimitedHoursDetails":{"type":"object","additionalProperties":false},"PerHourDetails":{"type":"object","properties":{"RateTypeId":{"oneOf":[{"type":"integer","description":"1 Use default labor rates, 2 Use fixed labor rate, 3 Custom labor rates. Default 1.","format":"int32","example":2},{"type":"null","description":"1 Use default labor rates, 2 Use fixed labor rate, 3 Custom labor rates. Default 1.","format":"int32","example":2}]},"HourlyRate":{"oneOf":[{"type":"number","description":"The flat rate per hour. Required with RateTypeId 2, refused with any other.","format":"double","example":150},{"type":"null","description":"The flat rate per hour. Required with RateTypeId 2, refused with any other.","format":"double","example":150}]},"CustomRates":{"type":"object","properties":{"WorkRoles":{"oneOf":[{"type":"array","items":{"type":"object","properties":{"WorkRoleId":{"oneOf":[{"type":"integer","description":"The billing role this row prices. Required.","format":"int64","example":12},{"type":"null","description":"The billing role this row prices. Required.","format":"int64","example":12}]},"HourlyRate":{"oneOf":[{"type":"number","description":"Rate per hour. Left out, the current rate is kept.","format":"double","example":95},{"type":"null","description":"Rate per hour. Left out, the current rate is kept.","format":"double","example":95}]},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code. Left out, the current code is kept.","example":"270"},{"type":"null","description":"Accounting code. Left out, the current code is kept.","example":"270"}]}},"additionalProperties":false}},{"type":"null","items":{"type":"object","properties":{"WorkRoleId":{"oneOf":[{"type":"integer","description":"The billing role this row prices. Required.","format":"int64","example":12},{"type":"null","description":"The billing role this row prices. Required.","format":"int64","example":12}]},"HourlyRate":{"oneOf":[{"type":"number","description":"Rate per hour. Left out, the current rate is kept.","format":"double","example":95},{"type":"null","description":"Rate per hour. Left out, the current rate is kept.","format":"double","example":95}]},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code. Left out, the current code is kept.","example":"270"},{"type":"null","description":"Accounting code. Left out, the current code is kept.","example":"270"}]}},"additionalProperties":false}}]},"WorkTypes":{"oneOf":[{"type":"array","items":{"type":"object","properties":{"WorkTypeId":{"oneOf":[{"type":"integer","description":"The work type this row prices. Required.","format":"int64","example":176},{"type":"null","description":"The work type this row prices. Required.","format":"int64","example":176}]},"HourlyMultiplier":{"oneOf":[{"type":"number","description":"Multiplier on the role's rate. Left out, the current multiplier is kept.","format":"double","example":1.5},{"type":"null","description":"Multiplier on the role's rate. Left out, the current multiplier is kept.","format":"double","example":1.5}]},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code. Left out, the current code is kept.","example":"200"},{"type":"null","description":"Accounting code. Left out, the current code is kept.","example":"200"}]}},"additionalProperties":false}},{"type":"null","items":{"type":"object","properties":{"WorkTypeId":{"oneOf":[{"type":"integer","description":"The work type this row prices. Required.","format":"int64","example":176},{"type":"null","description":"The work type this row prices. Required.","format":"int64","example":176}]},"HourlyMultiplier":{"oneOf":[{"type":"number","description":"Multiplier on the role's rate. Left out, the current multiplier is kept.","format":"double","example":1.5},{"type":"null","description":"Multiplier on the role's rate. Left out, the current multiplier is kept.","format":"double","example":1.5}]},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code. Left out, the current code is kept.","example":"200"},{"type":"null","description":"Accounting code. Left out, the current code is kept.","example":"200"}]}},"additionalProperties":false}}]}},"additionalProperties":false,"description":"Overrides for the Custom labor rates grid. The line starts from every billing role and work type\r\nat the service provider's own rates; only the rows sent here change. On PATCH, entries merge by\r\nid into the line's existing rows."}},"additionalProperties":false},"LimitedHoursDetails":{"type":"object","properties":{"ShowRemainingHoursInClientPortal":{"oneOf":[{"type":"boolean","description":"Show the client the hours left in the allocation in the client portal. Default false."},{"type":"null","description":"Show the client the hours left in the allocation in the client portal. Default false."}]},"AllocatedHours":{"oneOf":[{"type":"number","description":"Hours included each billing period. Required on a new line.","format":"double","example":10},{"type":"null","description":"Hours included each billing period. Required on a new line.","format":"double","example":10}]},"RateTypeId":{"oneOf":[{"type":"integer","description":"Same as on `PerHourDetails`.","format":"int32"},{"type":"null","description":"Same as on `PerHourDetails`.","format":"int32"}]},"HourlyRate":{"oneOf":[{"type":"number","description":"Same as on `PerHourDetails`.","format":"double"},{"type":"null","description":"Same as on `PerHourDetails`.","format":"double"}]},"CustomRates":{"type":"object","properties":{"WorkRoles":{"oneOf":[{"type":"array","items":{"type":"object","properties":{"WorkRoleId":{"oneOf":[{"type":"integer","description":"The billing role this row prices. Required.","format":"int64","example":12},{"type":"null","description":"The billing role this row prices. Required.","format":"int64","example":12}]},"HourlyRate":{"oneOf":[{"type":"number","description":"Rate per hour. Left out, the current rate is kept.","format":"double","example":95},{"type":"null","description":"Rate per hour. Left out, the current rate is kept.","format":"double","example":95}]},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code. Left out, the current code is kept.","example":"270"},{"type":"null","description":"Accounting code. Left out, the current code is kept.","example":"270"}]}},"additionalProperties":false}},{"type":"null","items":{"type":"object","properties":{"WorkRoleId":{"oneOf":[{"type":"integer","description":"The billing role this row prices. Required.","format":"int64","example":12},{"type":"null","description":"The billing role this row prices. Required.","format":"int64","example":12}]},"HourlyRate":{"oneOf":[{"type":"number","description":"Rate per hour. Left out, the current rate is kept.","format":"double","example":95},{"type":"null","description":"Rate per hour. Left out, the current rate is kept.","format":"double","example":95}]},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code. Left out, the current code is kept.","example":"270"},{"type":"null","description":"Accounting code. Left out, the current code is kept.","example":"270"}]}},"additionalProperties":false}}]},"WorkTypes":{"oneOf":[{"type":"array","items":{"type":"object","properties":{"WorkTypeId":{"oneOf":[{"type":"integer","description":"The work type this row prices. Required.","format":"int64","example":176},{"type":"null","description":"The work type this row prices. Required.","format":"int64","example":176}]},"HourlyMultiplier":{"oneOf":[{"type":"number","description":"Multiplier on the role's rate. Left out, the current multiplier is kept.","format":"double","example":1.5},{"type":"null","description":"Multiplier on the role's rate. Left out, the current multiplier is kept.","format":"double","example":1.5}]},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code. Left out, the current code is kept.","example":"200"},{"type":"null","description":"Accounting code. Left out, the current code is kept.","example":"200"}]}},"additionalProperties":false}},{"type":"null","items":{"type":"object","properties":{"WorkTypeId":{"oneOf":[{"type":"integer","description":"The work type this row prices. Required.","format":"int64","example":176},{"type":"null","description":"The work type this row prices. Required.","format":"int64","example":176}]},"HourlyMultiplier":{"oneOf":[{"type":"number","description":"Multiplier on the role's rate. Left out, the current multiplier is kept.","format":"double","example":1.5},{"type":"null","description":"Multiplier on the role's rate. Left out, the current multiplier is kept.","format":"double","example":1.5}]},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code. Left out, the current code is kept.","example":"200"},{"type":"null","description":"Accounting code. Left out, the current code is kept.","example":"200"}]}},"additionalProperties":false}}]}},"additionalProperties":false,"description":"Overrides for the Custom labor rates grid. The line starts from every billing role and work type\r\nat the service provider's own rates; only the rows sent here change. On PATCH, entries merge by\r\nid into the line's existing rows."}},"additionalProperties":false},"BlockHoursDetails":{"type":"object","properties":{"ShowRemainingHoursInClientPortal":{"oneOf":[{"type":"boolean","description":"Show the client the hours left in the block in the client portal. Default false."},{"type":"null","description":"Show the client the hours left in the block in the client portal. Default false."}]},"TemplateId":{"oneOf":[{"type":"integer","description":"A Block Hours Template id, or 0 for Custom. With a template, Balance and Price come from it and\r\nare refused on the request, as the app disables both once a template is picked. Required on a\r\nnew line.","format":"int64","example":0},{"type":"null","description":"A Block Hours Template id, or 0 for Custom. With a template, Balance and Price come from it and\r\nare refused on the request, as the app disables both once a template is picked. Required on a\r\nnew line.","format":"int64","example":0}]},"Balance":{"oneOf":[{"type":"number","description":"Hours in the block. Custom (TemplateId 0) only, and then required on a new line.","format":"double","example":20},{"type":"null","description":"Hours in the block. Custom (TemplateId 0) only, and then required on a new line.","format":"double","example":20}]},"Price":{"oneOf":[{"type":"number","description":"The price of the block, billed once on the Draft invoice the new line raises. Custom\r\n(TemplateId 0) only, and then required on a new line.","format":"double","example":2000},{"type":"null","description":"The price of the block, billed once on the Draft invoice the new line raises. Custom\r\n(TemplateId 0) only, and then required on a new line.","format":"double","example":2000}]},"WarningThreshold":{"oneOf":[{"type":"integer","description":"Percentage of the block left that raises a low-balance warning, a whole number 0-90.","format":"int32","example":20},{"type":"null","description":"Percentage of the block left that raises a low-balance warning, a whole number 0-90.","format":"int32","example":20}]},"OverrunThreshold":{"oneOf":[{"type":"integer","description":"Percentage of the block the client may run past zero, a whole number 0-50.","format":"int32","example":10},{"type":"null","description":"Percentage of the block the client may run past zero, a whole number 0-50.","format":"int32","example":10}]}},"additionalProperties":false},"LineItems":{"oneOf":[{"type":"array","items":{"type":"object","properties":{"Id":{"oneOf":[{"type":"integer","description":"PATCH only: the existing line item to keep and update. Leave it out to add one.","format":"int64","example":991204},{"type":"null","description":"PATCH only: the existing line item to keep and update. Leave it out to add one.","format":"int64","example":991204}]},"ItemId":{"oneOf":[{"type":"string","description":"The catalog item to bill. Required on a new entry, not accepted on an existing one.","format":"uuid"},{"type":"null","description":"The catalog item to bill. Required on a new entry, not accepted on an existing one.","format":"uuid"}]},"Quantity":{"oneOf":[{"type":"number","description":"Quantity billed each period. Required on a new entry. Greater than 0.","format":"double","example":12},{"type":"null","description":"Quantity billed each period. Required on a new entry. Greater than 0.","format":"double","example":12}]},"Description":{"oneOf":[{"type":"string","description":"Description on the invoice. Defaults to the item's. Send null to clear it."},{"type":"null","description":"Description on the invoice. Defaults to the item's. Send null to clear it."}]},"UnitPrice":{"oneOf":[{"type":"number","description":"Unit price charged. Defaults to the item's price. Not negative.","format":"double","example":24.2},{"type":"null","description":"Unit price charged. Defaults to the item's price. Not negative.","format":"double","example":24.2}]},"UnitCost":{"oneOf":[{"type":"number","description":"Unit cost. Defaults to the item's cost. Not negative.","format":"double","example":18.4},{"type":"null","description":"Unit cost. Defaults to the item's cost. Not negative.","format":"double","example":18.4}]},"DiscountPercent":{"oneOf":[{"type":"number","description":"Discount percentage, 0-100. Default 0.","format":"double"},{"type":"null","description":"Discount percentage, 0-100. Default 0.","format":"double"}]},"TaxId":{"oneOf":[{"type":"integer","description":"Tax applied. Null, or left out on a new line item, gives the tax the app would pick for the item; left out on an existing one, its tax is kept. To bill no tax, send the tax-exempt rate's id.","format":"int64","example":2419},{"type":"null","description":"Tax applied. Null, or left out on a new line item, gives the tax the app would pick for the item; left out on an existing one, its tax is kept. To bill no tax, send the tax-exempt rate's id.","format":"int64","example":2419}]},"BillableStatusId":{"oneOf":[{"type":"integer","description":"1 Billable (default), 2 No charge, 3 Non-billable. A line that isn't Billable bills 0.","format":"int32"},{"type":"null","description":"1 Billable (default), 2 No charge, 3 Non-billable. A line that isn't Billable bills 0.","format":"int32"}]},"StartDate":{"oneOf":[{"type":"string","description":"Date the line starts billing, a calendar date. Defaults to today in the service provider's zone,\r\nor the contract's start date if that is later.","format":"date-time"},{"type":"null","description":"Date the line starts billing, a calendar date. Defaults to today in the service provider's zone,\r\nor the contract's start date if that is later.","format":"date-time"}]},"EndDate":{"oneOf":[{"type":"string","description":"Date the line stops billing, a calendar date. Send null to make it open-ended.","format":"date-time"},{"type":"null","description":"Date the line stops billing, a calendar date. Send null to make it open-ended.","format":"date-time"}]}},"additionalProperties":false,"description":"One product or bundle billed on a service line. A new entry needs ItemId and Quantity; the rest\r\nfalls back to the item's own values, as an invoice line does. Amount and TaxAmount are always\r\ncalculated."},"description":"The products and bundles billed on the line. On PATCH the list replaces the set, matched by\r\n`Id`; leave it out to keep the line items as they are."},{"type":"null","items":{"type":"object","properties":{"Id":{"oneOf":[{"type":"integer","description":"PATCH only: the existing line item to keep and update. Leave it out to add one.","format":"int64","example":991204},{"type":"null","description":"PATCH only: the existing line item to keep and update. Leave it out to add one.","format":"int64","example":991204}]},"ItemId":{"oneOf":[{"type":"string","description":"The catalog item to bill. Required on a new entry, not accepted on an existing one.","format":"uuid"},{"type":"null","description":"The catalog item to bill. Required on a new entry, not accepted on an existing one.","format":"uuid"}]},"Quantity":{"oneOf":[{"type":"number","description":"Quantity billed each period. Required on a new entry. Greater than 0.","format":"double","example":12},{"type":"null","description":"Quantity billed each period. Required on a new entry. Greater than 0.","format":"double","example":12}]},"Description":{"oneOf":[{"type":"string","description":"Description on the invoice. Defaults to the item's. Send null to clear it."},{"type":"null","description":"Description on the invoice. Defaults to the item's. Send null to clear it."}]},"UnitPrice":{"oneOf":[{"type":"number","description":"Unit price charged. Defaults to the item's price. Not negative.","format":"double","example":24.2},{"type":"null","description":"Unit price charged. Defaults to the item's price. Not negative.","format":"double","example":24.2}]},"UnitCost":{"oneOf":[{"type":"number","description":"Unit cost. Defaults to the item's cost. Not negative.","format":"double","example":18.4},{"type":"null","description":"Unit cost. Defaults to the item's cost. Not negative.","format":"double","example":18.4}]},"DiscountPercent":{"oneOf":[{"type":"number","description":"Discount percentage, 0-100. Default 0.","format":"double"},{"type":"null","description":"Discount percentage, 0-100. Default 0.","format":"double"}]},"TaxId":{"oneOf":[{"type":"integer","description":"Tax applied. Null, or left out on a new line item, gives the tax the app would pick for the item; left out on an existing one, its tax is kept. To bill no tax, send the tax-exempt rate's id.","format":"int64","example":2419},{"type":"null","description":"Tax applied. Null, or left out on a new line item, gives the tax the app would pick for the item; left out on an existing one, its tax is kept. To bill no tax, send the tax-exempt rate's id.","format":"int64","example":2419}]},"BillableStatusId":{"oneOf":[{"type":"integer","description":"1 Billable (default), 2 No charge, 3 Non-billable. A line that isn't Billable bills 0.","format":"int32"},{"type":"null","description":"1 Billable (default), 2 No charge, 3 Non-billable. A line that isn't Billable bills 0.","format":"int32"}]},"StartDate":{"oneOf":[{"type":"string","description":"Date the line starts billing, a calendar date. Defaults to today in the service provider's zone,\r\nor the contract's start date if that is later.","format":"date-time"},{"type":"null","description":"Date the line starts billing, a calendar date. Defaults to today in the service provider's zone,\r\nor the contract's start date if that is later.","format":"date-time"}]},"EndDate":{"oneOf":[{"type":"string","description":"Date the line stops billing, a calendar date. Send null to make it open-ended.","format":"date-time"},{"type":"null","description":"Date the line stops billing, a calendar date. Send null to make it open-ended.","format":"date-time"}]}},"additionalProperties":false,"description":"One product or bundle billed on a service line. A new entry needs ItemId and Quantity; the rest\r\nfalls back to the item's own values, as an invoice line does. Amount and TaxAmount are always\r\ncalculated."},"description":"The products and bundles billed on the line. On PATCH the list replaces the set, matched by\r\n`Id`; leave it out to keep the line items as they are."}]}},"additionalProperties":false,"description":"One service line on `POST /v1/contracts` or `PATCH /v1/contracts/{contractId}`. Send\r\nexactly one details object, the one matching `LaborTermsId`; No Labor Terms takes none."},"description":"The service lines. At least one.","uniqueKey":"ServiceLines.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines","typeLabel":"object[] | null"}},"additionalProperties":false,"description":"Creates a contract with its service lines. Name, ClientId and at least one service line are\r\nrequired; each line needs Name and LaborTermsId. Returns the contract in the\r\n`GET /v1/contracts/{contractId}` shape.","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"Name":"All Labor Terms Example","ClientId":88,"IsForAllLocations":true,"LocationIds":[123],"Reference":"MSA-2025-014","StartDate":"2026-01-15T00:00:00.0000000+00:00","EndDate":"2023-11-07T05:31:56Z","ProrateTypeId":0,"AutoInvoiceTicketProducts":true,"RepeatPeriodId":1,"DaysBeforeInvoiceCreation":0,"DaysUntilDue":30,"AutoApproveAndSend":true,"ContactIds":[123],"InvoiceTemplateId":123,"InvoiceEmailTemplateId":123,"BrandingThemeId":"3c90c3cc-0d44-4b50-8888-8dd25736052a","ServiceLines":[{"Id":88214,"Name":"Managed Services","LaborTermsId":1,"WorkTypeIds":[123],"WorkRoleIds":[123],"AutoApproveTime":true,"AutoInvoiceTime":true,"IncludedTimeGoesToId":1,"UnlimitedHoursDetails":{},"PerHourDetails":{"RateTypeId":2,"HourlyRate":150,"CustomRates":{"WorkRoles":[{"WorkRoleId":12,"HourlyRate":95,"CoaCode":"270"}],"WorkTypes":[{"WorkTypeId":176,"HourlyMultiplier":1.5,"CoaCode":"200"}]}},"LimitedHoursDetails":{"ShowRemainingHoursInClientPortal":true,"AllocatedHours":10,"RateTypeId":123,"HourlyRate":123,"CustomRates":{"WorkRoles":[{"WorkRoleId":12,"HourlyRate":95,"CoaCode":"270"}],"WorkTypes":[{"WorkTypeId":176,"HourlyMultiplier":1.5,"CoaCode":"200"}]}},"BlockHoursDetails":{"ShowRemainingHoursInClientPortal":true,"TemplateId":0,"Balance":20,"Price":2000,"WarningThreshold":20,"OverrunThreshold":10},"LineItems":[{"Id":991204,"ItemId":"3c90c3cc-0d44-4b50-8888-8dd25736052a","Quantity":12,"Description":"\u003cstring>","UnitPrice":24.2,"UnitCost":18.4,"DiscountPercent":123,"TaxId":2419,"BillableStatusId":123,"StartDate":"2023-11-07T05:31:56Z","EndDate":"2023-11-07T05:31:56Z"}]}]}}},"exampleType":"generated"},"application/*+json":{"schema":{"type":"object","properties":{"Name":{"oneOf":[{"type":"string","description":"Name of the contract. Required.","example":"All Labor Terms Example","uniqueKey":"Name.oneOf.0","typeLabel":"string"},{"type":"null","description":"Name of the contract. Required.","example":"All Labor Terms Example","uniqueKey":"Name.oneOf.1","typeLabel":"null"}],"uniqueKey":"Name","typeLabel":"string | null"},"ClientId":{"oneOf":[{"type":"integer","description":"The client the contract bills. Required.","format":"int64","example":88,"uniqueKey":"ClientId.oneOf.0","typeLabel":"integer\u003cint64>"},{"type":"null","description":"The client the contract bills. Required.","format":"int64","example":88,"uniqueKey":"ClientId.oneOf.1","typeLabel":"null"}],"uniqueKey":"ClientId","typeLabel":"integer\u003cint64> | null"},"IsForAllLocations":{"oneOf":[{"type":"boolean","description":"Whether the contract covers every one of the client's locations. Default true.","uniqueKey":"IsForAllLocations.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"Whether the contract covers every one of the client's locations. Default true.","uniqueKey":"IsForAllLocations.oneOf.1","typeLabel":"null"}],"uniqueKey":"IsForAllLocations","typeLabel":"boolean | null"},"LocationIds":{"oneOf":[{"type":"array","items":{"type":"integer","format":"int64","uniqueKey":"LocationIds.oneOf.0.items.[INDEX]","typeLabel":"integer\u003cint64>"},"description":"The locations covered when IsForAllLocations is false: at least one, each the client's own. Ignored otherwise.","uniqueKey":"LocationIds.oneOf.0","typeLabel":"integer\u003cint64>[]"},{"type":"null","items":{"type":"integer","format":"int64"},"description":"The locations covered when IsForAllLocations is false: at least one, each the client's own. Ignored otherwise.","uniqueKey":"LocationIds.oneOf.1","typeLabel":"null"}],"uniqueKey":"LocationIds","typeLabel":"integer\u003cint64>[] | null"},"Reference":{"oneOf":[{"type":"string","description":"Free-text reference printed on the contract's invoices.","example":"MSA-2025-014","uniqueKey":"Reference.oneOf.0","typeLabel":"string"},{"type":"null","description":"Free-text reference printed on the contract's invoices.","example":"MSA-2025-014","uniqueKey":"Reference.oneOf.1","typeLabel":"null"}],"uniqueKey":"Reference","typeLabel":"string | null"},"StartDate":{"oneOf":[{"type":"string","description":"Date coverage starts, a calendar date. Defaults to today in the service provider's zone.","format":"date-time","example":"2026-01-15T00:00:00.0000000+00:00","uniqueKey":"StartDate.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","description":"Date coverage starts, a calendar date. Defaults to today in the service provider's zone.","format":"date-time","example":"2026-01-15T00:00:00.0000000+00:00","uniqueKey":"StartDate.oneOf.1","typeLabel":"null"}],"uniqueKey":"StartDate","typeLabel":"string\u003cdate-time> | null"},"EndDate":{"oneOf":[{"type":"string","description":"Date coverage ends, a calendar date, after StartDate. Left out, the contract is open-ended.","format":"date-time","uniqueKey":"EndDate.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","description":"Date coverage ends, a calendar date, after StartDate. Left out, the contract is open-ended.","format":"date-time","uniqueKey":"EndDate.oneOf.1","typeLabel":"null"}],"uniqueKey":"EndDate","typeLabel":"string\u003cdate-time> | null"},"ProrateTypeId":{"oneOf":[{"type":"integer","description":"0 Do not prorate (default), 1 Prorate and add to next invoice, 2 Prorate and generate standalone invoice.","format":"int32","example":0,"uniqueKey":"ProrateTypeId.oneOf.0","typeLabel":"integer\u003cint32>"},{"type":"null","description":"0 Do not prorate (default), 1 Prorate and add to next invoice, 2 Prorate and generate standalone invoice.","format":"int32","example":0,"uniqueKey":"ProrateTypeId.oneOf.1","typeLabel":"null"}],"uniqueKey":"ProrateTypeId","typeLabel":"integer\u003cint32> | null"},"AutoInvoiceTicketProducts":{"oneOf":[{"type":"boolean","description":"Sweep approved ticket products for this client into the next recurring invoice. Only with\r\nIsForAllLocations true. Default false.","uniqueKey":"AutoInvoiceTicketProducts.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"Sweep approved ticket products for this client into the next recurring invoice. Only with\r\nIsForAllLocations true. Default false.","uniqueKey":"AutoInvoiceTicketProducts.oneOf.1","typeLabel":"null"}],"uniqueKey":"AutoInvoiceTicketProducts","typeLabel":"boolean | null"},"RepeatPeriodId":{"oneOf":[{"type":"integer","description":"1 Monthly (default), 2 Quarterly, 3 Yearly, 4 Half Yearly.","format":"int32","example":1,"uniqueKey":"RepeatPeriodId.oneOf.0","typeLabel":"integer\u003cint32>"},{"type":"null","description":"1 Monthly (default), 2 Quarterly, 3 Yearly, 4 Half Yearly.","format":"int32","example":1,"uniqueKey":"RepeatPeriodId.oneOf.1","typeLabel":"null"}],"uniqueKey":"RepeatPeriodId","typeLabel":"integer\u003cint32> | null"},"DaysBeforeInvoiceCreation":{"oneOf":[{"type":"integer","description":"Days before the billing period ends that the invoice is created, 0-31. Default 0.","format":"int32","example":0,"uniqueKey":"DaysBeforeInvoiceCreation.oneOf.0","typeLabel":"integer\u003cint32>"},{"type":"null","description":"Days before the billing period ends that the invoice is created, 0-31. Default 0.","format":"int32","example":0,"uniqueKey":"DaysBeforeInvoiceCreation.oneOf.1","typeLabel":"null"}],"uniqueKey":"DaysBeforeInvoiceCreation","typeLabel":"integer\u003cint32> | null"},"DaysUntilDue":{"oneOf":[{"type":"integer","description":"Days the client has to pay. Defaults to the service provider's invoice setting.","format":"int32","example":30,"uniqueKey":"DaysUntilDue.oneOf.0","typeLabel":"integer\u003cint32>"},{"type":"null","description":"Days the client has to pay. Defaults to the service provider's invoice setting.","format":"int32","example":30,"uniqueKey":"DaysUntilDue.oneOf.1","typeLabel":"null"}],"uniqueKey":"DaysUntilDue","typeLabel":"integer\u003cint32> | null"},"AutoApproveAndSend":{"oneOf":[{"type":"boolean","description":"Approve and send each invoice raised from the contract automatically. Default false.","uniqueKey":"AutoApproveAndSend.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"Approve and send each invoice raised from the contract automatically. Default false.","uniqueKey":"AutoApproveAndSend.oneOf.1","typeLabel":"null"}],"uniqueKey":"AutoApproveAndSend","typeLabel":"boolean | null"},"ContactIds":{"oneOf":[{"type":"array","items":{"type":"integer","format":"int64","uniqueKey":"ContactIds.oneOf.0.items.[INDEX]","typeLabel":"integer\u003cint64>"},"description":"The client's contacts who can auto-approve the contract's invoices.","uniqueKey":"ContactIds.oneOf.0","typeLabel":"integer\u003cint64>[]"},{"type":"null","items":{"type":"integer","format":"int64"},"description":"The client's contacts who can auto-approve the contract's invoices.","uniqueKey":"ContactIds.oneOf.1","typeLabel":"null"}],"uniqueKey":"ContactIds","typeLabel":"integer\u003cint64>[] | null"},"InvoiceTemplateId":{"oneOf":[{"type":"integer","description":"Invoice template for the contract's invoices. Left out, the service provider's default applies.","format":"int64","uniqueKey":"InvoiceTemplateId.oneOf.0","typeLabel":"integer\u003cint64>"},{"type":"null","description":"Invoice template for the contract's invoices. Left out, the service provider's default applies.","format":"int64","uniqueKey":"InvoiceTemplateId.oneOf.1","typeLabel":"null"}],"uniqueKey":"InvoiceTemplateId","typeLabel":"integer\u003cint64> | null"},"InvoiceEmailTemplateId":{"oneOf":[{"type":"integer","description":"Email template for the contract's invoices. Left out, the service provider's default applies.","format":"int64","uniqueKey":"InvoiceEmailTemplateId.oneOf.0","typeLabel":"integer\u003cint64>"},{"type":"null","description":"Email template for the contract's invoices. Left out, the service provider's default applies.","format":"int64","uniqueKey":"InvoiceEmailTemplateId.oneOf.1","typeLabel":"null"}],"uniqueKey":"InvoiceEmailTemplateId","typeLabel":"integer\u003cint64> | null"},"BrandingThemeId":{"oneOf":[{"type":"string","description":"Accounting-system branding theme for the contract's invoices.","format":"uuid","uniqueKey":"BrandingThemeId.oneOf.0","typeLabel":"string\u003cuuid>"},{"type":"null","description":"Accounting-system branding theme for the contract's invoices.","format":"uuid","uniqueKey":"BrandingThemeId.oneOf.1","typeLabel":"null"}],"uniqueKey":"BrandingThemeId","typeLabel":"string\u003cuuid> | null"},"ServiceLines":{"oneOf":[{"type":"array","items":{"type":"object","properties":{"Id":{"oneOf":[{"type":"integer","description":"PATCH only: the service line to keep and update. Leave it out to add a line. Not accepted on\r\nPOST.","format":"int64","example":88214,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].Id.oneOf.0","typeLabel":"integer\u003cint64>"},{"type":"null","description":"PATCH only: the service line to keep and update. Leave it out to add a line. Not accepted on\r\nPOST.","format":"int64","example":88214,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].Id.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].Id","typeLabel":"integer\u003cint64> | null"},"Name":{"oneOf":[{"type":"string","description":"Name of the service line. Required on a new line.","example":"Managed Services","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].Name.oneOf.0","typeLabel":"string"},{"type":"null","description":"Name of the service line. Required on a new line.","example":"Managed Services","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].Name.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].Name","typeLabel":"string | null"},"LaborTermsId":{"oneOf":[{"type":"integer","description":"How the line bills time: 1 Unlimited Hours, 2 Hourly, 3 Block Hours, 4 No Labor Terms,\r\n5 Limited Hours. Required on a new line. On an existing line only a No Labor Terms line can\r\nchange, once.","format":"int32","example":1,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LaborTermsId.oneOf.0","typeLabel":"integer\u003cint32>"},{"type":"null","description":"How the line bills time: 1 Unlimited Hours, 2 Hourly, 3 Block Hours, 4 No Labor Terms,\r\n5 Limited Hours. Required on a new line. On an existing line only a No Labor Terms line can\r\nchange, once.","format":"int32","example":1,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LaborTermsId.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LaborTermsId","typeLabel":"integer\u003cint32> | null"},"WorkTypeIds":{"oneOf":[{"type":"array","items":{"type":"integer","format":"int64","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].WorkTypeIds.oneOf.0.items.[INDEX]","typeLabel":"integer\u003cint64>"},"description":"The work types the line covers. Left out on a new line, every work type is covered, as in the\r\napp. Not accepted on a No Labor Terms line.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].WorkTypeIds.oneOf.0","typeLabel":"integer\u003cint64>[]"},{"type":"null","items":{"type":"integer","format":"int64"},"description":"The work types the line covers. Left out on a new line, every work type is covered, as in the\r\napp. Not accepted on a No Labor Terms line.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].WorkTypeIds.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].WorkTypeIds","typeLabel":"integer\u003cint64>[] | null"},"WorkRoleIds":{"oneOf":[{"type":"array","items":{"type":"integer","format":"int64","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].WorkRoleIds.oneOf.0.items.[INDEX]","typeLabel":"integer\u003cint64>"},"description":"The billing roles the line covers. Same rules as `WorkTypeIds`.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].WorkRoleIds.oneOf.0","typeLabel":"integer\u003cint64>[]"},{"type":"null","items":{"type":"integer","format":"int64"},"description":"The billing roles the line covers. Same rules as `WorkTypeIds`.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].WorkRoleIds.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].WorkRoleIds","typeLabel":"integer\u003cint64>[] | null"},"AutoApproveTime":{"oneOf":[{"type":"boolean","description":"Approve time logged against the line automatically. Every labor term except No Labor Terms. Default false.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].AutoApproveTime.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"Approve time logged against the line automatically. Every labor term except No Labor Terms. Default false.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].AutoApproveTime.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].AutoApproveTime","typeLabel":"boolean | null"},"AutoInvoiceTime":{"oneOf":[{"type":"boolean","description":"Sweep approved time waiting on the line into the contract's recurring invoice. Every labor term\r\nexcept No Labor Terms. Default false.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].AutoInvoiceTime.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"Sweep approved time waiting on the line into the contract's recurring invoice. Every labor term\r\nexcept No Labor Terms. Default false.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].AutoInvoiceTime.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].AutoInvoiceTime","typeLabel":"boolean | null"},"IncludedTimeGoesToId":{"oneOf":[{"type":"integer","description":"Where covered time lands when it is approved: 1 Complete (default) or 2 Waiting to invoice.\r\nUnlimited, Block and Limited Hours only.","format":"int32","example":1,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].IncludedTimeGoesToId.oneOf.0","typeLabel":"integer\u003cint32>"},{"type":"null","description":"Where covered time lands when it is approved: 1 Complete (default) or 2 Waiting to invoice.\r\nUnlimited, Block and Limited Hours only.","format":"int32","example":1,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].IncludedTimeGoesToId.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].IncludedTimeGoesToId","typeLabel":"integer\u003cint32> | null"},"UnlimitedHoursDetails":{"type":"object","additionalProperties":false,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].UnlimitedHoursDetails","typeLabel":"object"},"PerHourDetails":{"type":"object","properties":{"RateTypeId":{"oneOf":[{"type":"integer","description":"1 Use default labor rates, 2 Use fixed labor rate, 3 Custom labor rates. Default 1.","format":"int32","example":2,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.RateTypeId.oneOf.0","typeLabel":"integer\u003cint32>"},{"type":"null","description":"1 Use default labor rates, 2 Use fixed labor rate, 3 Custom labor rates. Default 1.","format":"int32","example":2,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.RateTypeId.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.RateTypeId","typeLabel":"integer\u003cint32> | null"},"HourlyRate":{"oneOf":[{"type":"number","description":"The flat rate per hour. Required with RateTypeId 2, refused with any other.","format":"double","example":150,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.HourlyRate.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"The flat rate per hour. Required with RateTypeId 2, refused with any other.","format":"double","example":150,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.HourlyRate.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.HourlyRate","typeLabel":"number\u003cdouble> | null"},"CustomRates":{"type":"object","properties":{"WorkRoles":{"oneOf":[{"type":"array","items":{"type":"object","properties":{"WorkRoleId":{"oneOf":[{"type":"integer","description":"The billing role this row prices. Required.","format":"int64","example":12,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX].WorkRoleId.oneOf.0","typeLabel":"integer\u003cint64>"},{"type":"null","description":"The billing role this row prices. Required.","format":"int64","example":12,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX].WorkRoleId.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX].WorkRoleId","typeLabel":"integer\u003cint64> | null"},"HourlyRate":{"oneOf":[{"type":"number","description":"Rate per hour. Left out, the current rate is kept.","format":"double","example":95,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX].HourlyRate.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"Rate per hour. Left out, the current rate is kept.","format":"double","example":95,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX].HourlyRate.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX].HourlyRate","typeLabel":"number\u003cdouble> | null"},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code. Left out, the current code is kept.","example":"270","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX].CoaCode.oneOf.0","typeLabel":"string"},{"type":"null","description":"Accounting code. Left out, the current code is kept.","example":"270","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX].CoaCode.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX].CoaCode","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX]","typeLabel":"object"},"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkRoles.oneOf.0","typeLabel":"object[]"},{"type":"null","items":{"type":"object","properties":{"WorkRoleId":{"oneOf":[{"type":"integer","description":"The billing role this row prices. Required.","format":"int64","example":12},{"type":"null","description":"The billing role this row prices. Required.","format":"int64","example":12}]},"HourlyRate":{"oneOf":[{"type":"number","description":"Rate per hour. Left out, the current rate is kept.","format":"double","example":95},{"type":"null","description":"Rate per hour. Left out, the current rate is kept.","format":"double","example":95}]},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code. Left out, the current code is kept.","example":"270"},{"type":"null","description":"Accounting code. Left out, the current code is kept.","example":"270"}]}},"additionalProperties":false},"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkRoles.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkRoles","typeLabel":"object[] | null"},"WorkTypes":{"oneOf":[{"type":"array","items":{"type":"object","properties":{"WorkTypeId":{"oneOf":[{"type":"integer","description":"The work type this row prices. Required.","format":"int64","example":176,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX].WorkTypeId.oneOf.0","typeLabel":"integer\u003cint64>"},{"type":"null","description":"The work type this row prices. Required.","format":"int64","example":176,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX].WorkTypeId.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX].WorkTypeId","typeLabel":"integer\u003cint64> | null"},"HourlyMultiplier":{"oneOf":[{"type":"number","description":"Multiplier on the role's rate. Left out, the current multiplier is kept.","format":"double","example":1.5,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX].HourlyMultiplier.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"Multiplier on the role's rate. Left out, the current multiplier is kept.","format":"double","example":1.5,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX].HourlyMultiplier.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX].HourlyMultiplier","typeLabel":"number\u003cdouble> | null"},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code. Left out, the current code is kept.","example":"200","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX].CoaCode.oneOf.0","typeLabel":"string"},{"type":"null","description":"Accounting code. Left out, the current code is kept.","example":"200","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX].CoaCode.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX].CoaCode","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX]","typeLabel":"object"},"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkTypes.oneOf.0","typeLabel":"object[]"},{"type":"null","items":{"type":"object","properties":{"WorkTypeId":{"oneOf":[{"type":"integer","description":"The work type this row prices. Required.","format":"int64","example":176},{"type":"null","description":"The work type this row prices. Required.","format":"int64","example":176}]},"HourlyMultiplier":{"oneOf":[{"type":"number","description":"Multiplier on the role's rate. Left out, the current multiplier is kept.","format":"double","example":1.5},{"type":"null","description":"Multiplier on the role's rate. Left out, the current multiplier is kept.","format":"double","example":1.5}]},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code. Left out, the current code is kept.","example":"200"},{"type":"null","description":"Accounting code. Left out, the current code is kept.","example":"200"}]}},"additionalProperties":false},"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkTypes.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates.WorkTypes","typeLabel":"object[] | null"}},"additionalProperties":false,"description":"Overrides for the Custom labor rates grid. The line starts from every billing role and work type\r\nat the service provider's own rates; only the rows sent here change. On PATCH, entries merge by\r\nid into the line's existing rows.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails.CustomRates","typeLabel":"object"}},"additionalProperties":false,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].PerHourDetails","typeLabel":"object"},"LimitedHoursDetails":{"type":"object","properties":{"ShowRemainingHoursInClientPortal":{"oneOf":[{"type":"boolean","description":"Show the client the hours left in the allocation in the client portal. Default false.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.ShowRemainingHoursInClientPortal.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"Show the client the hours left in the allocation in the client portal. Default false.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.ShowRemainingHoursInClientPortal.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.ShowRemainingHoursInClientPortal","typeLabel":"boolean | null"},"AllocatedHours":{"oneOf":[{"type":"number","description":"Hours included each billing period. Required on a new line.","format":"double","example":10,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.AllocatedHours.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"Hours included each billing period. Required on a new line.","format":"double","example":10,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.AllocatedHours.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.AllocatedHours","typeLabel":"number\u003cdouble> | null"},"RateTypeId":{"oneOf":[{"type":"integer","description":"Same as on `PerHourDetails`.","format":"int32","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.RateTypeId.oneOf.0","typeLabel":"integer\u003cint32>"},{"type":"null","description":"Same as on `PerHourDetails`.","format":"int32","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.RateTypeId.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.RateTypeId","typeLabel":"integer\u003cint32> | null"},"HourlyRate":{"oneOf":[{"type":"number","description":"Same as on `PerHourDetails`.","format":"double","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.HourlyRate.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"Same as on `PerHourDetails`.","format":"double","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.HourlyRate.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.HourlyRate","typeLabel":"number\u003cdouble> | null"},"CustomRates":{"type":"object","properties":{"WorkRoles":{"oneOf":[{"type":"array","items":{"type":"object","properties":{"WorkRoleId":{"oneOf":[{"type":"integer","description":"The billing role this row prices. Required.","format":"int64","example":12,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX].WorkRoleId.oneOf.0","typeLabel":"integer\u003cint64>"},{"type":"null","description":"The billing role this row prices. Required.","format":"int64","example":12,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX].WorkRoleId.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX].WorkRoleId","typeLabel":"integer\u003cint64> | null"},"HourlyRate":{"oneOf":[{"type":"number","description":"Rate per hour. Left out, the current rate is kept.","format":"double","example":95,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX].HourlyRate.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"Rate per hour. Left out, the current rate is kept.","format":"double","example":95,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX].HourlyRate.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX].HourlyRate","typeLabel":"number\u003cdouble> | null"},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code. Left out, the current code is kept.","example":"270","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX].CoaCode.oneOf.0","typeLabel":"string"},{"type":"null","description":"Accounting code. Left out, the current code is kept.","example":"270","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX].CoaCode.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX].CoaCode","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles.oneOf.0.items.[INDEX]","typeLabel":"object"},"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles.oneOf.0","typeLabel":"object[]"},{"type":"null","items":{"type":"object","properties":{"WorkRoleId":{"oneOf":[{"type":"integer","description":"The billing role this row prices. Required.","format":"int64","example":12},{"type":"null","description":"The billing role this row prices. Required.","format":"int64","example":12}]},"HourlyRate":{"oneOf":[{"type":"number","description":"Rate per hour. Left out, the current rate is kept.","format":"double","example":95},{"type":"null","description":"Rate per hour. Left out, the current rate is kept.","format":"double","example":95}]},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code. Left out, the current code is kept.","example":"270"},{"type":"null","description":"Accounting code. Left out, the current code is kept.","example":"270"}]}},"additionalProperties":false},"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles","typeLabel":"object[] | null"},"WorkTypes":{"oneOf":[{"type":"array","items":{"type":"object","properties":{"WorkTypeId":{"oneOf":[{"type":"integer","description":"The work type this row prices. Required.","format":"int64","example":176,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX].WorkTypeId.oneOf.0","typeLabel":"integer\u003cint64>"},{"type":"null","description":"The work type this row prices. Required.","format":"int64","example":176,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX].WorkTypeId.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX].WorkTypeId","typeLabel":"integer\u003cint64> | null"},"HourlyMultiplier":{"oneOf":[{"type":"number","description":"Multiplier on the role's rate. Left out, the current multiplier is kept.","format":"double","example":1.5,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX].HourlyMultiplier.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"Multiplier on the role's rate. Left out, the current multiplier is kept.","format":"double","example":1.5,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX].HourlyMultiplier.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX].HourlyMultiplier","typeLabel":"number\u003cdouble> | null"},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code. Left out, the current code is kept.","example":"200","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX].CoaCode.oneOf.0","typeLabel":"string"},{"type":"null","description":"Accounting code. Left out, the current code is kept.","example":"200","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX].CoaCode.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX].CoaCode","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes.oneOf.0.items.[INDEX]","typeLabel":"object"},"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes.oneOf.0","typeLabel":"object[]"},{"type":"null","items":{"type":"object","properties":{"WorkTypeId":{"oneOf":[{"type":"integer","description":"The work type this row prices. Required.","format":"int64","example":176},{"type":"null","description":"The work type this row prices. Required.","format":"int64","example":176}]},"HourlyMultiplier":{"oneOf":[{"type":"number","description":"Multiplier on the role's rate. Left out, the current multiplier is kept.","format":"double","example":1.5},{"type":"null","description":"Multiplier on the role's rate. Left out, the current multiplier is kept.","format":"double","example":1.5}]},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code. Left out, the current code is kept.","example":"200"},{"type":"null","description":"Accounting code. Left out, the current code is kept.","example":"200"}]}},"additionalProperties":false},"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes","typeLabel":"object[] | null"}},"additionalProperties":false,"description":"Overrides for the Custom labor rates grid. The line starts from every billing role and work type\r\nat the service provider's own rates; only the rows sent here change. On PATCH, entries merge by\r\nid into the line's existing rows.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails.CustomRates","typeLabel":"object"}},"additionalProperties":false,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LimitedHoursDetails","typeLabel":"object"},"BlockHoursDetails":{"type":"object","properties":{"ShowRemainingHoursInClientPortal":{"oneOf":[{"type":"boolean","description":"Show the client the hours left in the block in the client portal. Default false.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails.ShowRemainingHoursInClientPortal.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"Show the client the hours left in the block in the client portal. Default false.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails.ShowRemainingHoursInClientPortal.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails.ShowRemainingHoursInClientPortal","typeLabel":"boolean | null"},"TemplateId":{"oneOf":[{"type":"integer","description":"A Block Hours Template id, or 0 for Custom. With a template, Balance and Price come from it and\r\nare refused on the request, as the app disables both once a template is picked. Required on a\r\nnew line.","format":"int64","example":0,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails.TemplateId.oneOf.0","typeLabel":"integer\u003cint64>"},{"type":"null","description":"A Block Hours Template id, or 0 for Custom. With a template, Balance and Price come from it and\r\nare refused on the request, as the app disables both once a template is picked. Required on a\r\nnew line.","format":"int64","example":0,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails.TemplateId.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails.TemplateId","typeLabel":"integer\u003cint64> | null"},"Balance":{"oneOf":[{"type":"number","description":"Hours in the block. Custom (TemplateId 0) only, and then required on a new line.","format":"double","example":20,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails.Balance.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"Hours in the block. Custom (TemplateId 0) only, and then required on a new line.","format":"double","example":20,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails.Balance.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails.Balance","typeLabel":"number\u003cdouble> | null"},"Price":{"oneOf":[{"type":"number","description":"The price of the block, billed once on the Draft invoice the new line raises. Custom\r\n(TemplateId 0) only, and then required on a new line.","format":"double","example":2000,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails.Price.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"The price of the block, billed once on the Draft invoice the new line raises. Custom\r\n(TemplateId 0) only, and then required on a new line.","format":"double","example":2000,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails.Price.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails.Price","typeLabel":"number\u003cdouble> | null"},"WarningThreshold":{"oneOf":[{"type":"integer","description":"Percentage of the block left that raises a low-balance warning, a whole number 0-90.","format":"int32","example":20,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails.WarningThreshold.oneOf.0","typeLabel":"integer\u003cint32>"},{"type":"null","description":"Percentage of the block left that raises a low-balance warning, a whole number 0-90.","format":"int32","example":20,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails.WarningThreshold.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails.WarningThreshold","typeLabel":"integer\u003cint32> | null"},"OverrunThreshold":{"oneOf":[{"type":"integer","description":"Percentage of the block the client may run past zero, a whole number 0-50.","format":"int32","example":10,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails.OverrunThreshold.oneOf.0","typeLabel":"integer\u003cint32>"},{"type":"null","description":"Percentage of the block the client may run past zero, a whole number 0-50.","format":"int32","example":10,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails.OverrunThreshold.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails.OverrunThreshold","typeLabel":"integer\u003cint32> | null"}},"additionalProperties":false,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].BlockHoursDetails","typeLabel":"object"},"LineItems":{"oneOf":[{"type":"array","items":{"type":"object","properties":{"Id":{"oneOf":[{"type":"integer","description":"PATCH only: the existing line item to keep and update. Leave it out to add one.","format":"int64","example":991204,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].Id.oneOf.0","typeLabel":"integer\u003cint64>"},{"type":"null","description":"PATCH only: the existing line item to keep and update. Leave it out to add one.","format":"int64","example":991204,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].Id.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].Id","typeLabel":"integer\u003cint64> | null"},"ItemId":{"oneOf":[{"type":"string","description":"The catalog item to bill. Required on a new entry, not accepted on an existing one.","format":"uuid","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].ItemId.oneOf.0","typeLabel":"string\u003cuuid>"},{"type":"null","description":"The catalog item to bill. Required on a new entry, not accepted on an existing one.","format":"uuid","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].ItemId.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].ItemId","typeLabel":"string\u003cuuid> | null"},"Quantity":{"oneOf":[{"type":"number","description":"Quantity billed each period. Required on a new entry. Greater than 0.","format":"double","example":12,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].Quantity.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"Quantity billed each period. Required on a new entry. Greater than 0.","format":"double","example":12,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].Quantity.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].Quantity","typeLabel":"number\u003cdouble> | null"},"Description":{"oneOf":[{"type":"string","description":"Description on the invoice. Defaults to the item's. Send null to clear it.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].Description.oneOf.0","typeLabel":"string"},{"type":"null","description":"Description on the invoice. Defaults to the item's. Send null to clear it.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].Description.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].Description","typeLabel":"string | null"},"UnitPrice":{"oneOf":[{"type":"number","description":"Unit price charged. Defaults to the item's price. Not negative.","format":"double","example":24.2,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].UnitPrice.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"Unit price charged. Defaults to the item's price. Not negative.","format":"double","example":24.2,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].UnitPrice.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].UnitPrice","typeLabel":"number\u003cdouble> | null"},"UnitCost":{"oneOf":[{"type":"number","description":"Unit cost. Defaults to the item's cost. Not negative.","format":"double","example":18.4,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].UnitCost.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"Unit cost. Defaults to the item's cost. Not negative.","format":"double","example":18.4,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].UnitCost.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].UnitCost","typeLabel":"number\u003cdouble> | null"},"DiscountPercent":{"oneOf":[{"type":"number","description":"Discount percentage, 0-100. Default 0.","format":"double","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].DiscountPercent.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"Discount percentage, 0-100. Default 0.","format":"double","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].DiscountPercent.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].DiscountPercent","typeLabel":"number\u003cdouble> | null"},"TaxId":{"oneOf":[{"type":"integer","description":"Tax applied. Null, or left out on a new line item, gives the tax the app would pick for the item; left out on an existing one, its tax is kept. To bill no tax, send the tax-exempt rate's id.","format":"int64","example":2419,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].TaxId.oneOf.0","typeLabel":"integer\u003cint64>"},{"type":"null","description":"Tax applied. Null, or left out on a new line item, gives the tax the app would pick for the item; left out on an existing one, its tax is kept. To bill no tax, send the tax-exempt rate's id.","format":"int64","example":2419,"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].TaxId.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].TaxId","typeLabel":"integer\u003cint64> | null"},"BillableStatusId":{"oneOf":[{"type":"integer","description":"1 Billable (default), 2 No charge, 3 Non-billable. A line that isn't Billable bills 0.","format":"int32","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].BillableStatusId.oneOf.0","typeLabel":"integer\u003cint32>"},{"type":"null","description":"1 Billable (default), 2 No charge, 3 Non-billable. A line that isn't Billable bills 0.","format":"int32","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].BillableStatusId.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].BillableStatusId","typeLabel":"integer\u003cint32> | null"},"StartDate":{"oneOf":[{"type":"string","description":"Date the line starts billing, a calendar date. Defaults to today in the service provider's zone,\r\nor the contract's start date if that is later.","format":"date-time","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].StartDate.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","description":"Date the line starts billing, a calendar date. Defaults to today in the service provider's zone,\r\nor the contract's start date if that is later.","format":"date-time","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].StartDate.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].StartDate","typeLabel":"string\u003cdate-time> | null"},"EndDate":{"oneOf":[{"type":"string","description":"Date the line stops billing, a calendar date. Send null to make it open-ended.","format":"date-time","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].EndDate.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","description":"Date the line stops billing, a calendar date. Send null to make it open-ended.","format":"date-time","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].EndDate.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX].EndDate","typeLabel":"string\u003cdate-time> | null"}},"additionalProperties":false,"description":"One product or bundle billed on a service line. A new entry needs ItemId and Quantity; the rest\r\nfalls back to the item's own values, as an invoice line does. Amount and TaxAmount are always\r\ncalculated.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0.items.[INDEX]","typeLabel":"object"},"description":"The products and bundles billed on the line. On PATCH the list replaces the set, matched by\r\n`Id`; leave it out to keep the line items as they are.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.0","typeLabel":"object[]"},{"type":"null","items":{"type":"object","properties":{"Id":{"oneOf":[{"type":"integer","description":"PATCH only: the existing line item to keep and update. Leave it out to add one.","format":"int64","example":991204},{"type":"null","description":"PATCH only: the existing line item to keep and update. Leave it out to add one.","format":"int64","example":991204}]},"ItemId":{"oneOf":[{"type":"string","description":"The catalog item to bill. Required on a new entry, not accepted on an existing one.","format":"uuid"},{"type":"null","description":"The catalog item to bill. Required on a new entry, not accepted on an existing one.","format":"uuid"}]},"Quantity":{"oneOf":[{"type":"number","description":"Quantity billed each period. Required on a new entry. Greater than 0.","format":"double","example":12},{"type":"null","description":"Quantity billed each period. Required on a new entry. Greater than 0.","format":"double","example":12}]},"Description":{"oneOf":[{"type":"string","description":"Description on the invoice. Defaults to the item's. Send null to clear it."},{"type":"null","description":"Description on the invoice. Defaults to the item's. Send null to clear it."}]},"UnitPrice":{"oneOf":[{"type":"number","description":"Unit price charged. Defaults to the item's price. Not negative.","format":"double","example":24.2},{"type":"null","description":"Unit price charged. Defaults to the item's price. Not negative.","format":"double","example":24.2}]},"UnitCost":{"oneOf":[{"type":"number","description":"Unit cost. Defaults to the item's cost. Not negative.","format":"double","example":18.4},{"type":"null","description":"Unit cost. Defaults to the item's cost. Not negative.","format":"double","example":18.4}]},"DiscountPercent":{"oneOf":[{"type":"number","description":"Discount percentage, 0-100. Default 0.","format":"double"},{"type":"null","description":"Discount percentage, 0-100. Default 0.","format":"double"}]},"TaxId":{"oneOf":[{"type":"integer","description":"Tax applied. Null, or left out on a new line item, gives the tax the app would pick for the item; left out on an existing one, its tax is kept. To bill no tax, send the tax-exempt rate's id.","format":"int64","example":2419},{"type":"null","description":"Tax applied. Null, or left out on a new line item, gives the tax the app would pick for the item; left out on an existing one, its tax is kept. To bill no tax, send the tax-exempt rate's id.","format":"int64","example":2419}]},"BillableStatusId":{"oneOf":[{"type":"integer","description":"1 Billable (default), 2 No charge, 3 Non-billable. A line that isn't Billable bills 0.","format":"int32"},{"type":"null","description":"1 Billable (default), 2 No charge, 3 Non-billable. A line that isn't Billable bills 0.","format":"int32"}]},"StartDate":{"oneOf":[{"type":"string","description":"Date the line starts billing, a calendar date. Defaults to today in the service provider's zone,\r\nor the contract's start date if that is later.","format":"date-time"},{"type":"null","description":"Date the line starts billing, a calendar date. Defaults to today in the service provider's zone,\r\nor the contract's start date if that is later.","format":"date-time"}]},"EndDate":{"oneOf":[{"type":"string","description":"Date the line stops billing, a calendar date. Send null to make it open-ended.","format":"date-time"},{"type":"null","description":"Date the line stops billing, a calendar date. Send null to make it open-ended.","format":"date-time"}]}},"additionalProperties":false,"description":"One product or bundle billed on a service line. A new entry needs ItemId and Quantity; the rest\r\nfalls back to the item's own values, as an invoice line does. Amount and TaxAmount are always\r\ncalculated."},"description":"The products and bundles billed on the line. On PATCH the list replaces the set, matched by\r\n`Id`; leave it out to keep the line items as they are.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines.oneOf.0.items.[INDEX].LineItems","typeLabel":"object[] | null"}},"additionalProperties":false,"description":"One service line on `POST /v1/contracts` or `PATCH /v1/contracts/{contractId}`. Send\r\nexactly one details object, the one matching `LaborTermsId`; No Labor Terms takes none.","uniqueKey":"ServiceLines.oneOf.0.items.[INDEX]","typeLabel":"object"},"description":"The service lines. At least one.","uniqueKey":"ServiceLines.oneOf.0","typeLabel":"object[]"},{"type":"null","items":{"type":"object","properties":{"Id":{"oneOf":[{"type":"integer","description":"PATCH only: the service line to keep and update. Leave it out to add a line. Not accepted on\r\nPOST.","format":"int64","example":88214},{"type":"null","description":"PATCH only: the service line to keep and update. Leave it out to add a line. Not accepted on\r\nPOST.","format":"int64","example":88214}]},"Name":{"oneOf":[{"type":"string","description":"Name of the service line. Required on a new line.","example":"Managed Services"},{"type":"null","description":"Name of the service line. Required on a new line.","example":"Managed Services"}]},"LaborTermsId":{"oneOf":[{"type":"integer","description":"How the line bills time: 1 Unlimited Hours, 2 Hourly, 3 Block Hours, 4 No Labor Terms,\r\n5 Limited Hours. Required on a new line. On an existing line only a No Labor Terms line can\r\nchange, once.","format":"int32","example":1},{"type":"null","description":"How the line bills time: 1 Unlimited Hours, 2 Hourly, 3 Block Hours, 4 No Labor Terms,\r\n5 Limited Hours. Required on a new line. On an existing line only a No Labor Terms line can\r\nchange, once.","format":"int32","example":1}]},"WorkTypeIds":{"oneOf":[{"type":"array","items":{"type":"integer","format":"int64"},"description":"The work types the line covers. Left out on a new line, every work type is covered, as in the\r\napp. Not accepted on a No Labor Terms line."},{"type":"null","items":{"type":"integer","format":"int64"},"description":"The work types the line covers. Left out on a new line, every work type is covered, as in the\r\napp. Not accepted on a No Labor Terms line."}]},"WorkRoleIds":{"oneOf":[{"type":"array","items":{"type":"integer","format":"int64"},"description":"The billing roles the line covers. Same rules as `WorkTypeIds`."},{"type":"null","items":{"type":"integer","format":"int64"},"description":"The billing roles the line covers. Same rules as `WorkTypeIds`."}]},"AutoApproveTime":{"oneOf":[{"type":"boolean","description":"Approve time logged against the line automatically. Every labor term except No Labor Terms. Default false."},{"type":"null","description":"Approve time logged against the line automatically. Every labor term except No Labor Terms. Default false."}]},"AutoInvoiceTime":{"oneOf":[{"type":"boolean","description":"Sweep approved time waiting on the line into the contract's recurring invoice. Every labor term\r\nexcept No Labor Terms. Default false."},{"type":"null","description":"Sweep approved time waiting on the line into the contract's recurring invoice. Every labor term\r\nexcept No Labor Terms. Default false."}]},"IncludedTimeGoesToId":{"oneOf":[{"type":"integer","description":"Where covered time lands when it is approved: 1 Complete (default) or 2 Waiting to invoice.\r\nUnlimited, Block and Limited Hours only.","format":"int32","example":1},{"type":"null","description":"Where covered time lands when it is approved: 1 Complete (default) or 2 Waiting to invoice.\r\nUnlimited, Block and Limited Hours only.","format":"int32","example":1}]},"UnlimitedHoursDetails":{"type":"object","additionalProperties":false},"PerHourDetails":{"type":"object","properties":{"RateTypeId":{"oneOf":[{"type":"integer","description":"1 Use default labor rates, 2 Use fixed labor rate, 3 Custom labor rates. Default 1.","format":"int32","example":2},{"type":"null","description":"1 Use default labor rates, 2 Use fixed labor rate, 3 Custom labor rates. Default 1.","format":"int32","example":2}]},"HourlyRate":{"oneOf":[{"type":"number","description":"The flat rate per hour. Required with RateTypeId 2, refused with any other.","format":"double","example":150},{"type":"null","description":"The flat rate per hour. Required with RateTypeId 2, refused with any other.","format":"double","example":150}]},"CustomRates":{"type":"object","properties":{"WorkRoles":{"oneOf":[{"type":"array","items":{"type":"object","properties":{"WorkRoleId":{"oneOf":[{"type":"integer","description":"The billing role this row prices. Required.","format":"int64","example":12},{"type":"null","description":"The billing role this row prices. Required.","format":"int64","example":12}]},"HourlyRate":{"oneOf":[{"type":"number","description":"Rate per hour. Left out, the current rate is kept.","format":"double","example":95},{"type":"null","description":"Rate per hour. Left out, the current rate is kept.","format":"double","example":95}]},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code. Left out, the current code is kept.","example":"270"},{"type":"null","description":"Accounting code. Left out, the current code is kept.","example":"270"}]}},"additionalProperties":false}},{"type":"null","items":{"type":"object","properties":{"WorkRoleId":{"oneOf":[{"type":"integer","description":"The billing role this row prices. Required.","format":"int64","example":12},{"type":"null","description":"The billing role this row prices. Required.","format":"int64","example":12}]},"HourlyRate":{"oneOf":[{"type":"number","description":"Rate per hour. Left out, the current rate is kept.","format":"double","example":95},{"type":"null","description":"Rate per hour. Left out, the current rate is kept.","format":"double","example":95}]},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code. Left out, the current code is kept.","example":"270"},{"type":"null","description":"Accounting code. Left out, the current code is kept.","example":"270"}]}},"additionalProperties":false}}]},"WorkTypes":{"oneOf":[{"type":"array","items":{"type":"object","properties":{"WorkTypeId":{"oneOf":[{"type":"integer","description":"The work type this row prices. Required.","format":"int64","example":176},{"type":"null","description":"The work type this row prices. Required.","format":"int64","example":176}]},"HourlyMultiplier":{"oneOf":[{"type":"number","description":"Multiplier on the role's rate. Left out, the current multiplier is kept.","format":"double","example":1.5},{"type":"null","description":"Multiplier on the role's rate. Left out, the current multiplier is kept.","format":"double","example":1.5}]},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code. Left out, the current code is kept.","example":"200"},{"type":"null","description":"Accounting code. Left out, the current code is kept.","example":"200"}]}},"additionalProperties":false}},{"type":"null","items":{"type":"object","properties":{"WorkTypeId":{"oneOf":[{"type":"integer","description":"The work type this row prices. Required.","format":"int64","example":176},{"type":"null","description":"The work type this row prices. Required.","format":"int64","example":176}]},"HourlyMultiplier":{"oneOf":[{"type":"number","description":"Multiplier on the role's rate. Left out, the current multiplier is kept.","format":"double","example":1.5},{"type":"null","description":"Multiplier on the role's rate. Left out, the current multiplier is kept.","format":"double","example":1.5}]},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code. Left out, the current code is kept.","example":"200"},{"type":"null","description":"Accounting code. Left out, the current code is kept.","example":"200"}]}},"additionalProperties":false}}]}},"additionalProperties":false,"description":"Overrides for the Custom labor rates grid. The line starts from every billing role and work type\r\nat the service provider's own rates; only the rows sent here change. On PATCH, entries merge by\r\nid into the line's existing rows."}},"additionalProperties":false},"LimitedHoursDetails":{"type":"object","properties":{"ShowRemainingHoursInClientPortal":{"oneOf":[{"type":"boolean","description":"Show the client the hours left in the allocation in the client portal. Default false."},{"type":"null","description":"Show the client the hours left in the allocation in the client portal. Default false."}]},"AllocatedHours":{"oneOf":[{"type":"number","description":"Hours included each billing period. Required on a new line.","format":"double","example":10},{"type":"null","description":"Hours included each billing period. Required on a new line.","format":"double","example":10}]},"RateTypeId":{"oneOf":[{"type":"integer","description":"Same as on `PerHourDetails`.","format":"int32"},{"type":"null","description":"Same as on `PerHourDetails`.","format":"int32"}]},"HourlyRate":{"oneOf":[{"type":"number","description":"Same as on `PerHourDetails`.","format":"double"},{"type":"null","description":"Same as on `PerHourDetails`.","format":"double"}]},"CustomRates":{"type":"object","properties":{"WorkRoles":{"oneOf":[{"type":"array","items":{"type":"object","properties":{"WorkRoleId":{"oneOf":[{"type":"integer","description":"The billing role this row prices. Required.","format":"int64","example":12},{"type":"null","description":"The billing role this row prices. Required.","format":"int64","example":12}]},"HourlyRate":{"oneOf":[{"type":"number","description":"Rate per hour. Left out, the current rate is kept.","format":"double","example":95},{"type":"null","description":"Rate per hour. Left out, the current rate is kept.","format":"double","example":95}]},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code. Left out, the current code is kept.","example":"270"},{"type":"null","description":"Accounting code. Left out, the current code is kept.","example":"270"}]}},"additionalProperties":false}},{"type":"null","items":{"type":"object","properties":{"WorkRoleId":{"oneOf":[{"type":"integer","description":"The billing role this row prices. Required.","format":"int64","example":12},{"type":"null","description":"The billing role this row prices. Required.","format":"int64","example":12}]},"HourlyRate":{"oneOf":[{"type":"number","description":"Rate per hour. Left out, the current rate is kept.","format":"double","example":95},{"type":"null","description":"Rate per hour. Left out, the current rate is kept.","format":"double","example":95}]},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code. Left out, the current code is kept.","example":"270"},{"type":"null","description":"Accounting code. Left out, the current code is kept.","example":"270"}]}},"additionalProperties":false}}]},"WorkTypes":{"oneOf":[{"type":"array","items":{"type":"object","properties":{"WorkTypeId":{"oneOf":[{"type":"integer","description":"The work type this row prices. Required.","format":"int64","example":176},{"type":"null","description":"The work type this row prices. Required.","format":"int64","example":176}]},"HourlyMultiplier":{"oneOf":[{"type":"number","description":"Multiplier on the role's rate. Left out, the current multiplier is kept.","format":"double","example":1.5},{"type":"null","description":"Multiplier on the role's rate. Left out, the current multiplier is kept.","format":"double","example":1.5}]},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code. Left out, the current code is kept.","example":"200"},{"type":"null","description":"Accounting code. Left out, the current code is kept.","example":"200"}]}},"additionalProperties":false}},{"type":"null","items":{"type":"object","properties":{"WorkTypeId":{"oneOf":[{"type":"integer","description":"The work type this row prices. Required.","format":"int64","example":176},{"type":"null","description":"The work type this row prices. Required.","format":"int64","example":176}]},"HourlyMultiplier":{"oneOf":[{"type":"number","description":"Multiplier on the role's rate. Left out, the current multiplier is kept.","format":"double","example":1.5},{"type":"null","description":"Multiplier on the role's rate. Left out, the current multiplier is kept.","format":"double","example":1.5}]},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code. Left out, the current code is kept.","example":"200"},{"type":"null","description":"Accounting code. Left out, the current code is kept.","example":"200"}]}},"additionalProperties":false}}]}},"additionalProperties":false,"description":"Overrides for the Custom labor rates grid. The line starts from every billing role and work type\r\nat the service provider's own rates; only the rows sent here change. On PATCH, entries merge by\r\nid into the line's existing rows."}},"additionalProperties":false},"BlockHoursDetails":{"type":"object","properties":{"ShowRemainingHoursInClientPortal":{"oneOf":[{"type":"boolean","description":"Show the client the hours left in the block in the client portal. Default false."},{"type":"null","description":"Show the client the hours left in the block in the client portal. Default false."}]},"TemplateId":{"oneOf":[{"type":"integer","description":"A Block Hours Template id, or 0 for Custom. With a template, Balance and Price come from it and\r\nare refused on the request, as the app disables both once a template is picked. Required on a\r\nnew line.","format":"int64","example":0},{"type":"null","description":"A Block Hours Template id, or 0 for Custom. With a template, Balance and Price come from it and\r\nare refused on the request, as the app disables both once a template is picked. Required on a\r\nnew line.","format":"int64","example":0}]},"Balance":{"oneOf":[{"type":"number","description":"Hours in the block. Custom (TemplateId 0) only, and then required on a new line.","format":"double","example":20},{"type":"null","description":"Hours in the block. Custom (TemplateId 0) only, and then required on a new line.","format":"double","example":20}]},"Price":{"oneOf":[{"type":"number","description":"The price of the block, billed once on the Draft invoice the new line raises. Custom\r\n(TemplateId 0) only, and then required on a new line.","format":"double","example":2000},{"type":"null","description":"The price of the block, billed once on the Draft invoice the new line raises. Custom\r\n(TemplateId 0) only, and then required on a new line.","format":"double","example":2000}]},"WarningThreshold":{"oneOf":[{"type":"integer","description":"Percentage of the block left that raises a low-balance warning, a whole number 0-90.","format":"int32","example":20},{"type":"null","description":"Percentage of the block left that raises a low-balance warning, a whole number 0-90.","format":"int32","example":20}]},"OverrunThreshold":{"oneOf":[{"type":"integer","description":"Percentage of the block the client may run past zero, a whole number 0-50.","format":"int32","example":10},{"type":"null","description":"Percentage of the block the client may run past zero, a whole number 0-50.","format":"int32","example":10}]}},"additionalProperties":false},"LineItems":{"oneOf":[{"type":"array","items":{"type":"object","properties":{"Id":{"oneOf":[{"type":"integer","description":"PATCH only: the existing line item to keep and update. Leave it out to add one.","format":"int64","example":991204},{"type":"null","description":"PATCH only: the existing line item to keep and update. Leave it out to add one.","format":"int64","example":991204}]},"ItemId":{"oneOf":[{"type":"string","description":"The catalog item to bill. Required on a new entry, not accepted on an existing one.","format":"uuid"},{"type":"null","description":"The catalog item to bill. Required on a new entry, not accepted on an existing one.","format":"uuid"}]},"Quantity":{"oneOf":[{"type":"number","description":"Quantity billed each period. Required on a new entry. Greater than 0.","format":"double","example":12},{"type":"null","description":"Quantity billed each period. Required on a new entry. Greater than 0.","format":"double","example":12}]},"Description":{"oneOf":[{"type":"string","description":"Description on the invoice. Defaults to the item's. Send null to clear it."},{"type":"null","description":"Description on the invoice. Defaults to the item's. Send null to clear it."}]},"UnitPrice":{"oneOf":[{"type":"number","description":"Unit price charged. Defaults to the item's price. Not negative.","format":"double","example":24.2},{"type":"null","description":"Unit price charged. Defaults to the item's price. Not negative.","format":"double","example":24.2}]},"UnitCost":{"oneOf":[{"type":"number","description":"Unit cost. Defaults to the item's cost. Not negative.","format":"double","example":18.4},{"type":"null","description":"Unit cost. Defaults to the item's cost. Not negative.","format":"double","example":18.4}]},"DiscountPercent":{"oneOf":[{"type":"number","description":"Discount percentage, 0-100. Default 0.","format":"double"},{"type":"null","description":"Discount percentage, 0-100. Default 0.","format":"double"}]},"TaxId":{"oneOf":[{"type":"integer","description":"Tax applied. Null, or left out on a new line item, gives the tax the app would pick for the item; left out on an existing one, its tax is kept. To bill no tax, send the tax-exempt rate's id.","format":"int64","example":2419},{"type":"null","description":"Tax applied. Null, or left out on a new line item, gives the tax the app would pick for the item; left out on an existing one, its tax is kept. To bill no tax, send the tax-exempt rate's id.","format":"int64","example":2419}]},"BillableStatusId":{"oneOf":[{"type":"integer","description":"1 Billable (default), 2 No charge, 3 Non-billable. A line that isn't Billable bills 0.","format":"int32"},{"type":"null","description":"1 Billable (default), 2 No charge, 3 Non-billable. A line that isn't Billable bills 0.","format":"int32"}]},"StartDate":{"oneOf":[{"type":"string","description":"Date the line starts billing, a calendar date. Defaults to today in the service provider's zone,\r\nor the contract's start date if that is later.","format":"date-time"},{"type":"null","description":"Date the line starts billing, a calendar date. Defaults to today in the service provider's zone,\r\nor the contract's start date if that is later.","format":"date-time"}]},"EndDate":{"oneOf":[{"type":"string","description":"Date the line stops billing, a calendar date. Send null to make it open-ended.","format":"date-time"},{"type":"null","description":"Date the line stops billing, a calendar date. Send null to make it open-ended.","format":"date-time"}]}},"additionalProperties":false,"description":"One product or bundle billed on a service line. A new entry needs ItemId and Quantity; the rest\r\nfalls back to the item's own values, as an invoice line does. Amount and TaxAmount are always\r\ncalculated."},"description":"The products and bundles billed on the line. On PATCH the list replaces the set, matched by\r\n`Id`; leave it out to keep the line items as they are."},{"type":"null","items":{"type":"object","properties":{"Id":{"oneOf":[{"type":"integer","description":"PATCH only: the existing line item to keep and update. Leave it out to add one.","format":"int64","example":991204},{"type":"null","description":"PATCH only: the existing line item to keep and update. Leave it out to add one.","format":"int64","example":991204}]},"ItemId":{"oneOf":[{"type":"string","description":"The catalog item to bill. Required on a new entry, not accepted on an existing one.","format":"uuid"},{"type":"null","description":"The catalog item to bill. Required on a new entry, not accepted on an existing one.","format":"uuid"}]},"Quantity":{"oneOf":[{"type":"number","description":"Quantity billed each period. Required on a new entry. Greater than 0.","format":"double","example":12},{"type":"null","description":"Quantity billed each period. Required on a new entry. Greater than 0.","format":"double","example":12}]},"Description":{"oneOf":[{"type":"string","description":"Description on the invoice. Defaults to the item's. Send null to clear it."},{"type":"null","description":"Description on the invoice. Defaults to the item's. Send null to clear it."}]},"UnitPrice":{"oneOf":[{"type":"number","description":"Unit price charged. Defaults to the item's price. Not negative.","format":"double","example":24.2},{"type":"null","description":"Unit price charged. Defaults to the item's price. Not negative.","format":"double","example":24.2}]},"UnitCost":{"oneOf":[{"type":"number","description":"Unit cost. Defaults to the item's cost. Not negative.","format":"double","example":18.4},{"type":"null","description":"Unit cost. Defaults to the item's cost. Not negative.","format":"double","example":18.4}]},"DiscountPercent":{"oneOf":[{"type":"number","description":"Discount percentage, 0-100. Default 0.","format":"double"},{"type":"null","description":"Discount percentage, 0-100. Default 0.","format":"double"}]},"TaxId":{"oneOf":[{"type":"integer","description":"Tax applied. Null, or left out on a new line item, gives the tax the app would pick for the item; left out on an existing one, its tax is kept. To bill no tax, send the tax-exempt rate's id.","format":"int64","example":2419},{"type":"null","description":"Tax applied. Null, or left out on a new line item, gives the tax the app would pick for the item; left out on an existing one, its tax is kept. To bill no tax, send the tax-exempt rate's id.","format":"int64","example":2419}]},"BillableStatusId":{"oneOf":[{"type":"integer","description":"1 Billable (default), 2 No charge, 3 Non-billable. A line that isn't Billable bills 0.","format":"int32"},{"type":"null","description":"1 Billable (default), 2 No charge, 3 Non-billable. A line that isn't Billable bills 0.","format":"int32"}]},"StartDate":{"oneOf":[{"type":"string","description":"Date the line starts billing, a calendar date. Defaults to today in the service provider's zone,\r\nor the contract's start date if that is later.","format":"date-time"},{"type":"null","description":"Date the line starts billing, a calendar date. Defaults to today in the service provider's zone,\r\nor the contract's start date if that is later.","format":"date-time"}]},"EndDate":{"oneOf":[{"type":"string","description":"Date the line stops billing, a calendar date. Send null to make it open-ended.","format":"date-time"},{"type":"null","description":"Date the line stops billing, a calendar date. Send null to make it open-ended.","format":"date-time"}]}},"additionalProperties":false,"description":"One product or bundle billed on a service line. A new entry needs ItemId and Quantity; the rest\r\nfalls back to the item's own values, as an invoice line does. Amount and TaxAmount are always\r\ncalculated."},"description":"The products and bundles billed on the line. On PATCH the list replaces the set, matched by\r\n`Id`; leave it out to keep the line items as they are."}]}},"additionalProperties":false,"description":"One service line on `POST /v1/contracts` or `PATCH /v1/contracts/{contractId}`. Send\r\nexactly one details object, the one matching `LaborTermsId`; No Labor Terms takes none."},"description":"The service lines. At least one.","uniqueKey":"ServiceLines.oneOf.1","typeLabel":"null"}],"uniqueKey":"ServiceLines","typeLabel":"object[] | null"}},"additionalProperties":false,"description":"Creates a contract with its service lines. Name, ClientId and at least one service line are\r\nrequired; each line needs Name and LaborTermsId. Returns the contract in the\r\n`GET /v1/contracts/{contractId}` shape.","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"Name":"All Labor Terms Example","ClientId":88,"IsForAllLocations":true,"LocationIds":[123],"Reference":"MSA-2025-014","StartDate":"2026-01-15T00:00:00.0000000+00:00","EndDate":"2023-11-07T05:31:56Z","ProrateTypeId":0,"AutoInvoiceTicketProducts":true,"RepeatPeriodId":1,"DaysBeforeInvoiceCreation":0,"DaysUntilDue":30,"AutoApproveAndSend":true,"ContactIds":[123],"InvoiceTemplateId":123,"InvoiceEmailTemplateId":123,"BrandingThemeId":"3c90c3cc-0d44-4b50-8888-8dd25736052a","ServiceLines":[{"Id":88214,"Name":"Managed Services","LaborTermsId":1,"WorkTypeIds":[123],"WorkRoleIds":[123],"AutoApproveTime":true,"AutoInvoiceTime":true,"IncludedTimeGoesToId":1,"UnlimitedHoursDetails":{},"PerHourDetails":{"RateTypeId":2,"HourlyRate":150,"CustomRates":{"WorkRoles":[{"WorkRoleId":12,"HourlyRate":95,"CoaCode":"270"}],"WorkTypes":[{"WorkTypeId":176,"HourlyMultiplier":1.5,"CoaCode":"200"}]}},"LimitedHoursDetails":{"ShowRemainingHoursInClientPortal":true,"AllocatedHours":10,"RateTypeId":123,"HourlyRate":123,"CustomRates":{"WorkRoles":[{"WorkRoleId":12,"HourlyRate":95,"CoaCode":"270"}],"WorkTypes":[{"WorkTypeId":176,"HourlyMultiplier":1.5,"CoaCode":"200"}]}},"BlockHoursDetails":{"ShowRemainingHoursInClientPortal":true,"TemplateId":0,"Balance":20,"Price":2000,"WarningThreshold":20,"OverrunThreshold":10},"LineItems":[{"Id":991204,"ItemId":"3c90c3cc-0d44-4b50-8888-8dd25736052a","Quantity":12,"Description":"\u003cstring>","UnitPrice":24.2,"UnitCost":18.4,"DiscountPercent":123,"TaxId":2419,"BillableStatusId":123,"StartDate":"2023-11-07T05:31:56Z","EndDate":"2023-11-07T05:31:56Z"}]}]}}},"exampleType":"generated"}},"exampleType":"generated"},"responses":{"48046cf5-ef48-484a-bf04-b5b572ad4deb":{"description":"OK","content":{"text/plain":{"schema":{"type":"object","properties":{"StatusCode":{"enum":[100,101,102,103,200,201,202,203,204,205,206,207,208,226,300,301,302,303,304,305,306,307,308,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,421,422,423,424,426,428,429,431,451,500,501,502,503,504,505,506,507,508,510,511],"type":"integer","format":"int32","uniqueKey":"StatusCode","typeLabel":"enum\u003cinteger>"},"IsSuccess":{"type":"boolean","uniqueKey":"IsSuccess","typeLabel":"boolean"},"Data":{"type":"object","properties":{"Id":{"type":"integer","description":"Identifier of the contract.","format":"int64","example":4021,"uniqueKey":"Data.Id","typeLabel":"integer\u003cint64>"},"Name":{"type":"string","description":"Name of the contract.","example":"All Labor Terms Example","uniqueKey":"Data.Name","typeLabel":"string"},"Status":{"type":"object","properties":{"Id":{"type":"integer","description":"Numeric identifier of the coded value (e.g. status, priority, type, or source id).","format":"int64","example":1,"uniqueKey":"Data.Status.Id","typeLabel":"integer\u003cint64>"},"Name":{"type":"string","description":"Display name of the coded value.","uniqueKey":"Data.Status.Name","typeLabel":"string"}},"additionalProperties":false,"description":"A coded value, such as a status, priority, type or source, as an id and a display name.","uniqueKey":"Data.Status","typeLabel":"object"},"Client":{"type":"object","properties":{"Id":{"type":"integer","description":"Numeric identifier of the coded value (e.g. status, priority, type, or source id).","format":"int64","example":1,"uniqueKey":"Data.Client.Id","typeLabel":"integer\u003cint64>"},"Name":{"type":"string","description":"Display name of the coded value.","uniqueKey":"Data.Client.Name","typeLabel":"string"}},"additionalProperties":false,"description":"A coded value, such as a status, priority, type or source, as an id and a display name.","uniqueKey":"Data.Client","typeLabel":"object"},"LocationIds":{"type":"array","items":{"type":"integer","format":"int64","uniqueKey":"Data.LocationIds.items.[INDEX]","typeLabel":"integer\u003cint64>"},"description":"The client locations the contract is scoped to, as location ids. Empty\r\nwhen the contract covers every one of the client's locations (see\r\n`IsForAllLocations`) as well as when a location-scoped contract's rows have all\r\nbeen removed; never null.","uniqueKey":"Data.LocationIds","typeLabel":"integer\u003cint64>[]"},"IsForAllLocations":{"type":"boolean","description":"Whether the contract covers every one of the client's locations rather than the specific\r\nones named in `LocationIds`. When true, `LocationIds` is empty by\r\ndefinition.","uniqueKey":"Data.IsForAllLocations","typeLabel":"boolean"},"CreatedOn":{"oneOf":[{"type":"string","description":"When the contract was created, in UTC.","format":"date-time","uniqueKey":"Data.CreatedOn.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","description":"When the contract was created, in UTC.","format":"date-time","uniqueKey":"Data.CreatedOn.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.CreatedOn","typeLabel":"string\u003cdate-time> | null"},"UpdatedOn":{"oneOf":[{"type":"string","description":"When the contract was last changed, in UTC. Null when it has never been changed.","format":"date-time","uniqueKey":"Data.UpdatedOn.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","description":"When the contract was last changed, in UTC. Null when it has never been changed.","format":"date-time","uniqueKey":"Data.UpdatedOn.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.UpdatedOn","typeLabel":"string\u003cdate-time> | null"},"Reference":{"oneOf":[{"type":"string","description":"The contract's invoice reference, free text. Null when it is not set.","example":"MSA-2025-014","uniqueKey":"Data.Reference.oneOf.0","typeLabel":"string"},{"type":"null","description":"The contract's invoice reference, free text. Null when it is not set.","example":"MSA-2025-014","uniqueKey":"Data.Reference.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.Reference","typeLabel":"string | null"},"StartDate":{"type":"string","description":"Date the contract's coverage starts, a calendar date.","format":"date","uniqueKey":"Data.StartDate","typeLabel":"string\u003cdate>"},"EndDate":{"oneOf":[{"type":"string","description":"Date the contract's coverage ends, a calendar date, or null when it is open-ended.","format":"date","uniqueKey":"Data.EndDate.oneOf.0","typeLabel":"string\u003cdate>"},{"type":"null","description":"Date the contract's coverage ends, a calendar date, or null when it is open-ended.","format":"date","uniqueKey":"Data.EndDate.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.EndDate","typeLabel":"string\u003cdate> | null"},"RepeatPeriod":{"type":"object","properties":{"Id":{"type":"integer","description":"Numeric identifier of the coded value (e.g. status, priority, type, or source id).","format":"int64","example":1,"uniqueKey":"Data.RepeatPeriod.Id","typeLabel":"integer\u003cint64>"},"Name":{"type":"string","description":"Display name of the coded value.","uniqueKey":"Data.RepeatPeriod.Name","typeLabel":"string"}},"additionalProperties":false,"description":"A coded value, such as a status, priority, type or source, as an id and a display name.","uniqueKey":"Data.RepeatPeriod","typeLabel":"object"},"DaysBeforeInvoiceCreation":{"oneOf":[{"type":"integer","description":"How many days before the billing period ends the invoice is generated.","format":"int32","uniqueKey":"Data.DaysBeforeInvoiceCreation.oneOf.0","typeLabel":"integer\u003cint32>"},{"type":"null","description":"How many days before the billing period ends the invoice is generated.","format":"int32","uniqueKey":"Data.DaysBeforeInvoiceCreation.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.DaysBeforeInvoiceCreation","typeLabel":"integer\u003cint32> | null"},"DaysUntilDue":{"type":"integer","description":"How many days the client has to pay once invoiced. Renamed from `InvoiceDue` (ENG-7288).","format":"int32","example":30,"uniqueKey":"Data.DaysUntilDue","typeLabel":"integer\u003cint32>"},"ProrateType":{"type":"object","properties":{"Id":{"type":"integer","description":"Numeric identifier of the coded value (e.g. status, priority, type, or source id).","format":"int64","example":1,"uniqueKey":"Data.ProrateType.Id","typeLabel":"integer\u003cint64>"},"Name":{"type":"string","description":"Display name of the coded value.","uniqueKey":"Data.ProrateType.Name","typeLabel":"string"}},"additionalProperties":false,"description":"A coded value, such as a status, priority, type or source, as an id and a display name.","uniqueKey":"Data.ProrateType","typeLabel":"object"},"AutoInvoiceTicketProducts":{"type":"boolean","description":"Whether approved ticket products for this client are swept into the contract's next\r\nrecurring invoice. Only ever true on a contract that covers all the client's locations.","uniqueKey":"Data.AutoInvoiceTicketProducts","typeLabel":"boolean"},"InvoiceTemplateId":{"oneOf":[{"type":"integer","description":"Invoice template invoices raised from this contract use. Null means the service provider's default.","format":"int64","uniqueKey":"Data.InvoiceTemplateId.oneOf.0","typeLabel":"integer\u003cint64>"},{"type":"null","description":"Invoice template invoices raised from this contract use. Null means the service provider's default.","format":"int64","uniqueKey":"Data.InvoiceTemplateId.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.InvoiceTemplateId","typeLabel":"integer\u003cint64> | null"},"InvoiceEmailTemplateId":{"oneOf":[{"type":"integer","description":"Email template invoices raised from this contract are sent with. Null means the service provider's default.","format":"int64","uniqueKey":"Data.InvoiceEmailTemplateId.oneOf.0","typeLabel":"integer\u003cint64>"},{"type":"null","description":"Email template invoices raised from this contract are sent with. Null means the service provider's default.","format":"int64","uniqueKey":"Data.InvoiceEmailTemplateId.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.InvoiceEmailTemplateId","typeLabel":"integer\u003cint64> | null"},"BrandingThemeId":{"oneOf":[{"type":"string","description":"Accounting-system branding theme invoices raised from this contract use. Null means the default.","format":"uuid","uniqueKey":"Data.BrandingThemeId.oneOf.0","typeLabel":"string\u003cuuid>"},{"type":"null","description":"Accounting-system branding theme invoices raised from this contract use. Null means the default.","format":"uuid","uniqueKey":"Data.BrandingThemeId.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.BrandingThemeId","typeLabel":"string\u003cuuid> | null"},"AutoApproveAndSend":{"oneOf":[{"type":"boolean","description":"Whether an invoice raised from this contract is approved and sent automatically.","uniqueKey":"Data.AutoApproveAndSend.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"Whether an invoice raised from this contract is approved and sent automatically.","uniqueKey":"Data.AutoApproveAndSend.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.AutoApproveAndSend","typeLabel":"boolean | null"},"Contacts":{"type":"array","items":{"type":"object","properties":{"Id":{"type":"integer","description":"Numeric identifier of the coded value (e.g. status, priority, type, or source id).","format":"int64","example":1,"uniqueKey":"Data.Contacts.items.[INDEX].Id","typeLabel":"integer\u003cint64>"},"Name":{"type":"string","description":"Display name of the coded value.","uniqueKey":"Data.Contacts.items.[INDEX].Name","typeLabel":"string"}},"additionalProperties":false,"description":"A coded value, such as a status, priority, type or source, as an id and a display name.","uniqueKey":"Data.Contacts.items.[INDEX]","typeLabel":"object"},"description":"The contacts who can auto-approve invoices on this contract. Empty when none are set.","uniqueKey":"Data.Contacts","typeLabel":"object[]"},"RecurringAmount":{"type":"number","description":"Total recurring amount the contract bills each period, before tax.","format":"double","example":6870,"uniqueKey":"Data.RecurringAmount","typeLabel":"number\u003cdouble>"},"RecurringCost":{"type":"number","description":"Total recurring cost of the contract's recurring products each period.","format":"double","example":2981.36,"uniqueKey":"Data.RecurringCost","typeLabel":"number\u003cdouble>"},"ServiceLines":{"type":"array","items":{"type":"object","properties":{"Id":{"type":"integer","description":"Identifier of the service line. The same value a time entry's ServiceLineId carries.","format":"int64","example":88214,"uniqueKey":"Data.ServiceLines.items.[INDEX].Id","typeLabel":"integer\u003cint64>"},"Name":{"type":"string","description":"Name of the service line.","uniqueKey":"Data.ServiceLines.items.[INDEX].Name","typeLabel":"string"},"CreatedOn":{"oneOf":[{"type":"string","description":"When the service line was created, in UTC.","format":"date-time","uniqueKey":"Data.ServiceLines.items.[INDEX].CreatedOn.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","description":"When the service line was created, in UTC.","format":"date-time","uniqueKey":"Data.ServiceLines.items.[INDEX].CreatedOn.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.ServiceLines.items.[INDEX].CreatedOn","typeLabel":"string\u003cdate-time> | null"},"UpdatedOn":{"oneOf":[{"type":"string","description":"When the service line was last changed, in UTC. Null when it has never been changed.","format":"date-time","uniqueKey":"Data.ServiceLines.items.[INDEX].UpdatedOn.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","description":"When the service line was last changed, in UTC. Null when it has never been changed.","format":"date-time","uniqueKey":"Data.ServiceLines.items.[INDEX].UpdatedOn.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.ServiceLines.items.[INDEX].UpdatedOn","typeLabel":"string\u003cdate-time> | null"},"LaborTerms":{"type":"object","properties":{"Id":{"type":"integer","description":"Numeric identifier of the coded value (e.g. status, priority, type, or source id).","format":"int64","example":1,"uniqueKey":"Data.ServiceLines.items.[INDEX].LaborTerms.Id","typeLabel":"integer\u003cint64>"},"Name":{"type":"string","description":"Display name of the coded value.","uniqueKey":"Data.ServiceLines.items.[INDEX].LaborTerms.Name","typeLabel":"string"}},"additionalProperties":false,"description":"A coded value, such as a status, priority, type or source, as an id and a display name.","uniqueKey":"Data.ServiceLines.items.[INDEX].LaborTerms","typeLabel":"object"},"WorkTypes":{"type":"array","items":{"type":"object","properties":{"Id":{"type":"integer","description":"Numeric identifier of the coded value (e.g. status, priority, type, or source id).","format":"int64","example":1,"uniqueKey":"Data.ServiceLines.items.[INDEX].WorkTypes.items.[INDEX].Id","typeLabel":"integer\u003cint64>"},"Name":{"type":"string","description":"Display name of the coded value.","uniqueKey":"Data.ServiceLines.items.[INDEX].WorkTypes.items.[INDEX].Name","typeLabel":"string"}},"additionalProperties":false,"description":"A coded value, such as a status, priority, type or source, as an id and a display name.","uniqueKey":"Data.ServiceLines.items.[INDEX].WorkTypes.items.[INDEX]","typeLabel":"object"},"description":"The work types this line applies to. Only recorded for an Unlimited Hours line; empty for\r\nevery other `LaborTerms` today, since the other labor terms carry no work-type\r\nselection of their own in storage.","uniqueKey":"Data.ServiceLines.items.[INDEX].WorkTypes","typeLabel":"object[]"},"WorkRoles":{"type":"array","items":{"type":"object","properties":{"Id":{"type":"integer","description":"Numeric identifier of the coded value (e.g. status, priority, type, or source id).","format":"int64","example":1,"uniqueKey":"Data.ServiceLines.items.[INDEX].WorkRoles.items.[INDEX].Id","typeLabel":"integer\u003cint64>"},"Name":{"type":"string","description":"Display name of the coded value.","uniqueKey":"Data.ServiceLines.items.[INDEX].WorkRoles.items.[INDEX].Name","typeLabel":"string"}},"additionalProperties":false,"description":"A coded value, such as a status, priority, type or source, as an id and a display name.","uniqueKey":"Data.ServiceLines.items.[INDEX].WorkRoles.items.[INDEX]","typeLabel":"object"},"description":"Same coverage as `WorkTypes`, for billing roles.","uniqueKey":"Data.ServiceLines.items.[INDEX].WorkRoles","typeLabel":"object[]"},"AutoApproveTime":{"type":"boolean","description":"Whether time logged against this line is approved automatically. False on a No Labor Terms line.","uniqueKey":"Data.ServiceLines.items.[INDEX].AutoApproveTime","typeLabel":"boolean"},"AutoInvoiceTime":{"type":"boolean","description":"The app's \"Auto Invoice Time\": approved time waiting on this line is swept into the\r\ncontract's recurring invoice. False on a No Labor Terms line.","uniqueKey":"Data.ServiceLines.items.[INDEX].AutoInvoiceTime","typeLabel":"boolean"},"IncludedTimeGoesTo":{"type":"object","properties":{"Id":{"type":"integer","description":"Numeric identifier of the coded value (e.g. status, priority, type, or source id).","format":"int64","example":1,"uniqueKey":"Data.ServiceLines.items.[INDEX].IncludedTimeGoesTo.Id","typeLabel":"integer\u003cint64>"},"Name":{"type":"string","description":"Display name of the coded value.","uniqueKey":"Data.ServiceLines.items.[INDEX].IncludedTimeGoesTo.Name","typeLabel":"string"}},"additionalProperties":false,"description":"A coded value, such as a status, priority, type or source, as an id and a display name.","uniqueKey":"Data.ServiceLines.items.[INDEX].IncludedTimeGoesTo","typeLabel":"object"},"UnlimitedHoursDetails":{"type":"object","additionalProperties":false,"description":"Nothing is specific to an Unlimited Hours line today. `AutoApprove` moved to the service\r\nline as `AutoApproveTime` (ENG-7288).","uniqueKey":"Data.ServiceLines.items.[INDEX].UnlimitedHoursDetails","typeLabel":"object"},"PerHourDetails":{"type":"object","properties":{"RateType":{"type":"object","properties":{"Id":{"type":"integer","description":"Numeric identifier of the coded value (e.g. status, priority, type, or source id).","format":"int64","example":1,"uniqueKey":"Data.ServiceLines.items.[INDEX].PerHourDetails.RateType.Id","typeLabel":"integer\u003cint64>"},"Name":{"type":"string","description":"Display name of the coded value.","uniqueKey":"Data.ServiceLines.items.[INDEX].PerHourDetails.RateType.Name","typeLabel":"string"}},"additionalProperties":false,"description":"A coded value, such as a status, priority, type or source, as an id and a display name.","uniqueKey":"Data.ServiceLines.items.[INDEX].PerHourDetails.RateType","typeLabel":"object"},"HourlyRate":{"oneOf":[{"type":"number","description":"The flat rate charged per hour. Set only when `RateType` is Fixed; null otherwise.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].PerHourDetails.HourlyRate.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"The flat rate charged per hour. Set only when `RateType` is Fixed; null otherwise.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].PerHourDetails.HourlyRate.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.ServiceLines.items.[INDEX].PerHourDetails.HourlyRate","typeLabel":"number\u003cdouble> | null"},"CustomRates":{"type":"object","properties":{"WorkRoles":{"type":"array","items":{"type":"object","properties":{"WorkRoleId":{"type":"integer","description":"The billing role.","format":"int64","uniqueKey":"Data.ServiceLines.items.[INDEX].PerHourDetails.CustomRates.WorkRoles.items.[INDEX].WorkRoleId","typeLabel":"integer\u003cint64>"},"HourlyRate":{"type":"number","description":"Rate charged per hour for this role on this line.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].PerHourDetails.CustomRates.WorkRoles.items.[INDEX].HourlyRate","typeLabel":"number\u003cdouble>"},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code the role's time is posted to. Null when not set.","uniqueKey":"Data.ServiceLines.items.[INDEX].PerHourDetails.CustomRates.WorkRoles.items.[INDEX].CoaCode.oneOf.0","typeLabel":"string"},{"type":"null","description":"Accounting code the role's time is posted to. Null when not set.","uniqueKey":"Data.ServiceLines.items.[INDEX].PerHourDetails.CustomRates.WorkRoles.items.[INDEX].CoaCode.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.ServiceLines.items.[INDEX].PerHourDetails.CustomRates.WorkRoles.items.[INDEX].CoaCode","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"Data.ServiceLines.items.[INDEX].PerHourDetails.CustomRates.WorkRoles.items.[INDEX]","typeLabel":"object"},"description":"The rate per billing role.","uniqueKey":"Data.ServiceLines.items.[INDEX].PerHourDetails.CustomRates.WorkRoles","typeLabel":"object[]"},"WorkTypes":{"type":"array","items":{"type":"object","properties":{"WorkTypeId":{"type":"integer","description":"The work type.","format":"int64","uniqueKey":"Data.ServiceLines.items.[INDEX].PerHourDetails.CustomRates.WorkTypes.items.[INDEX].WorkTypeId","typeLabel":"integer\u003cint64>"},"HourlyMultiplier":{"type":"number","description":"Multiplier applied to the role's rate for this work type on this line.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].PerHourDetails.CustomRates.WorkTypes.items.[INDEX].HourlyMultiplier","typeLabel":"number\u003cdouble>"},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code the work type's time is posted to. Null when not set.","uniqueKey":"Data.ServiceLines.items.[INDEX].PerHourDetails.CustomRates.WorkTypes.items.[INDEX].CoaCode.oneOf.0","typeLabel":"string"},{"type":"null","description":"Accounting code the work type's time is posted to. Null when not set.","uniqueKey":"Data.ServiceLines.items.[INDEX].PerHourDetails.CustomRates.WorkTypes.items.[INDEX].CoaCode.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.ServiceLines.items.[INDEX].PerHourDetails.CustomRates.WorkTypes.items.[INDEX].CoaCode","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"Data.ServiceLines.items.[INDEX].PerHourDetails.CustomRates.WorkTypes.items.[INDEX]","typeLabel":"object"},"description":"The multiplier per work type.","uniqueKey":"Data.ServiceLines.items.[INDEX].PerHourDetails.CustomRates.WorkTypes","typeLabel":"object[]"}},"additionalProperties":false,"description":"The Custom labor rates grid of a Per Hour or Limited Hours line: one row per billing role and per work type.","uniqueKey":"Data.ServiceLines.items.[INDEX].PerHourDetails.CustomRates","typeLabel":"object"}},"additionalProperties":false,"uniqueKey":"Data.ServiceLines.items.[INDEX].PerHourDetails","typeLabel":"object"},"LimitedHoursDetails":{"type":"object","properties":{"ShowRemainingHoursInClientPortal":{"type":"boolean","description":"Whether the client portal shows the client the hours left in the allocation.","uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.ShowRemainingHoursInClientPortal","typeLabel":"boolean"},"AllocatedHours":{"oneOf":[{"type":"number","description":"Hours included each billing period.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.AllocatedHours.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"Hours included each billing period.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.AllocatedHours.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.AllocatedHours","typeLabel":"number\u003cdouble> | null"},"RateType":{"type":"object","properties":{"Id":{"type":"integer","description":"Numeric identifier of the coded value (e.g. status, priority, type, or source id).","format":"int64","example":1,"uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.RateType.Id","typeLabel":"integer\u003cint64>"},"Name":{"type":"string","description":"Display name of the coded value.","uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.RateType.Name","typeLabel":"string"}},"additionalProperties":false,"description":"A coded value, such as a status, priority, type or source, as an id and a display name.","uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.RateType","typeLabel":"object"},"HourlyRate":{"oneOf":[{"type":"number","description":"The flat rate charged per hour. Set only when `RateType` is Fixed; null otherwise.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.HourlyRate.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"The flat rate charged per hour. Set only when `RateType` is Fixed; null otherwise.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.HourlyRate.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.HourlyRate","typeLabel":"number\u003cdouble> | null"},"CustomRates":{"type":"object","properties":{"WorkRoles":{"type":"array","items":{"type":"object","properties":{"WorkRoleId":{"type":"integer","description":"The billing role.","format":"int64","uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles.items.[INDEX].WorkRoleId","typeLabel":"integer\u003cint64>"},"HourlyRate":{"type":"number","description":"Rate charged per hour for this role on this line.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles.items.[INDEX].HourlyRate","typeLabel":"number\u003cdouble>"},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code the role's time is posted to. Null when not set.","uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles.items.[INDEX].CoaCode.oneOf.0","typeLabel":"string"},{"type":"null","description":"Accounting code the role's time is posted to. Null when not set.","uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles.items.[INDEX].CoaCode.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles.items.[INDEX].CoaCode","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles.items.[INDEX]","typeLabel":"object"},"description":"The rate per billing role.","uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles","typeLabel":"object[]"},"WorkTypes":{"type":"array","items":{"type":"object","properties":{"WorkTypeId":{"type":"integer","description":"The work type.","format":"int64","uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes.items.[INDEX].WorkTypeId","typeLabel":"integer\u003cint64>"},"HourlyMultiplier":{"type":"number","description":"Multiplier applied to the role's rate for this work type on this line.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes.items.[INDEX].HourlyMultiplier","typeLabel":"number\u003cdouble>"},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code the work type's time is posted to. Null when not set.","uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes.items.[INDEX].CoaCode.oneOf.0","typeLabel":"string"},{"type":"null","description":"Accounting code the work type's time is posted to. Null when not set.","uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes.items.[INDEX].CoaCode.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes.items.[INDEX].CoaCode","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes.items.[INDEX]","typeLabel":"object"},"description":"The multiplier per work type.","uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes","typeLabel":"object[]"}},"additionalProperties":false,"description":"The Custom labor rates grid of a Per Hour or Limited Hours line: one row per billing role and per work type.","uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.CustomRates","typeLabel":"object"}},"additionalProperties":false,"uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails","typeLabel":"object"},"BlockHoursDetails":{"type":"object","properties":{"ShowRemainingHoursInClientPortal":{"type":"boolean","description":"Whether the client portal shows the client the hours left in the block.","uniqueKey":"Data.ServiceLines.items.[INDEX].BlockHoursDetails.ShowRemainingHoursInClientPortal","typeLabel":"boolean"},"TemplateId":{"type":"integer","description":"The Block Hours Template the block was created from. 0 means Custom: no template applies.","format":"int64","uniqueKey":"Data.ServiceLines.items.[INDEX].BlockHoursDetails.TemplateId","typeLabel":"integer\u003cint64>"},"Balance":{"oneOf":[{"type":"number","description":"The block's total balance, in hours.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].BlockHoursDetails.Balance.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"The block's total balance, in hours.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].BlockHoursDetails.Balance.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.ServiceLines.items.[INDEX].BlockHoursDetails.Balance","typeLabel":"number\u003cdouble> | null"},"WarningThreshold":{"oneOf":[{"type":"number","description":"Percentage of the block left at which a low-balance warning is raised, a whole number from\r\n0 to 90. Earlier documented as hours, which it never was.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].BlockHoursDetails.WarningThreshold.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"Percentage of the block left at which a low-balance warning is raised, a whole number from\r\n0 to 90. Earlier documented as hours, which it never was.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].BlockHoursDetails.WarningThreshold.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.ServiceLines.items.[INDEX].BlockHoursDetails.WarningThreshold","typeLabel":"number\u003cdouble> | null"},"OverrunThreshold":{"oneOf":[{"type":"number","description":"Percentage of the block the client may run past zero before the block counts as overrun, a\r\nwhole number from 0 to 50. Earlier documented as hours, which it never was.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].BlockHoursDetails.OverrunThreshold.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"Percentage of the block the client may run past zero before the block counts as overrun, a\r\nwhole number from 0 to 50. Earlier documented as hours, which it never was.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].BlockHoursDetails.OverrunThreshold.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.ServiceLines.items.[INDEX].BlockHoursDetails.OverrunThreshold","typeLabel":"number\u003cdouble> | null"}},"additionalProperties":false,"uniqueKey":"Data.ServiceLines.items.[INDEX].BlockHoursDetails","typeLabel":"object"},"RecurringAmount":{"type":"number","description":"Recurring amount this service line bills each period, before tax.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].RecurringAmount","typeLabel":"number\u003cdouble>"},"RecurringCost":{"type":"number","description":"Recurring cost of this service line's recurring products each period.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].RecurringCost","typeLabel":"number\u003cdouble>"},"LineItems":{"type":"array","items":{"type":"object","properties":{"Id":{"type":"integer","description":"Identifier of this line.","format":"int64","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].Id","typeLabel":"integer\u003cint64>"},"ItemId":{"oneOf":[{"type":"string","description":"The catalog item this line bills, resolving against `GET /v1/items`. Null for a line\r\nthat does not reference a catalog item.","format":"uuid","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].ItemId.oneOf.0","typeLabel":"string\u003cuuid>"},{"type":"null","description":"The catalog item this line bills, resolving against `GET /v1/items`. Null for a line\r\nthat does not reference a catalog item.","format":"uuid","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].ItemId.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].ItemId","typeLabel":"string\u003cuuid> | null"},"ItemType":{"type":"object","properties":{"Id":{"type":"integer","description":"Numeric identifier of the coded value (e.g. status, priority, type, or source id).","format":"int64","example":1,"uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].ItemType.Id","typeLabel":"integer\u003cint64>"},"Name":{"type":"string","description":"Display name of the coded value.","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].ItemType.Name","typeLabel":"string"}},"additionalProperties":false,"description":"A coded value, such as a status, priority, type or source, as an id and a display name.","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].ItemType","typeLabel":"object"},"Name":{"type":"string","description":"Name of the line as billed.","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].Name","typeLabel":"string"},"Description":{"oneOf":[{"type":"string","description":"Description of the line as billed, if any.","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].Description.oneOf.0","typeLabel":"string"},{"type":"null","description":"Description of the line as billed, if any.","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].Description.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].Description","typeLabel":"string | null"},"Quantity":{"oneOf":[{"type":"number","description":"Quantity billed.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].Quantity.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"Quantity billed.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].Quantity.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].Quantity","typeLabel":"number\u003cdouble> | null"},"UnitCost":{"oneOf":[{"type":"number","description":"Unit cost of the line. Renamed from `Cost` (ENG-7288), the name items and invoice lines use.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].UnitCost.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"Unit cost of the line. Renamed from `Cost` (ENG-7288), the name items and invoice lines use.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].UnitCost.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].UnitCost","typeLabel":"number\u003cdouble> | null"},"UnitPrice":{"type":"number","description":"Unit price charged.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].UnitPrice","typeLabel":"number\u003cdouble>"},"DiscountPercent":{"oneOf":[{"type":"number","description":"Discount percentage applied to this line, 0-100.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].DiscountPercent.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"Discount percentage applied to this line, 0-100.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].DiscountPercent.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].DiscountPercent","typeLabel":"number\u003cdouble> | null"},"StartDate":{"oneOf":[{"type":"string","description":"Date this line's coverage starts, if it is date-scoped. A calendar date.","format":"date","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].StartDate.oneOf.0","typeLabel":"string\u003cdate>"},{"type":"null","description":"Date this line's coverage starts, if it is date-scoped. A calendar date.","format":"date","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].StartDate.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].StartDate","typeLabel":"string\u003cdate> | null"},"EndDate":{"oneOf":[{"type":"string","description":"Date this line's coverage ends, if it is date-scoped. A calendar date.","format":"date","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].EndDate.oneOf.0","typeLabel":"string\u003cdate>"},{"type":"null","description":"Date this line's coverage ends, if it is date-scoped. A calendar date.","format":"date","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].EndDate.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].EndDate","typeLabel":"string\u003cdate> | null"},"Tax":{"type":"object","properties":{"Id":{"type":"integer","description":"Numeric identifier of the coded value (e.g. status, priority, type, or source id).","format":"int64","example":1,"uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].Tax.Id","typeLabel":"integer\u003cint64>"},"Name":{"type":"string","description":"Display name of the coded value.","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].Tax.Name","typeLabel":"string"}},"additionalProperties":false,"description":"A coded value, such as a status, priority, type or source, as an id and a display name.","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].Tax","typeLabel":"object"},"Amount":{"type":"number","description":"Line total after discount, before tax.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].Amount","typeLabel":"number\u003cdouble>"},"TaxAmount":{"oneOf":[{"type":"number","description":"Tax on this line.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].TaxAmount.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"Tax on this line.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].TaxAmount.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].TaxAmount","typeLabel":"number\u003cdouble> | null"},"BillableStatus":{"type":"object","properties":{"Id":{"type":"integer","description":"Numeric identifier of the coded value (e.g. status, priority, type, or source id).","format":"int64","example":1,"uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].BillableStatus.Id","typeLabel":"integer\u003cint64>"},"Name":{"type":"string","description":"Display name of the coded value.","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].BillableStatus.Name","typeLabel":"string"}},"additionalProperties":false,"description":"A coded value, such as a status, priority, type or source, as an id and a display name.","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].BillableStatus","typeLabel":"object"}},"additionalProperties":false,"description":"One product, bundle or labor charge billed on a contract's service line.","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX]","typeLabel":"object"},"description":"The actual products/labor billed on this line. Empty array when nothing is billed on it\r\nyet; never null.","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems","typeLabel":"object[]"}},"additionalProperties":false,"description":"One service line inside a contract, with the products/labor billed on it.","uniqueKey":"Data.ServiceLines.items.[INDEX]","typeLabel":"object"},"description":"The contract's service lines. Empty when the contract has none; never null.","uniqueKey":"Data.ServiceLines","typeLabel":"object[]"}},"additionalProperties":false,"description":"Everything about one contract: the client and locations it covers, its billing schedule, and\r\neach service line with the actual products/labor billed on it.","uniqueKey":"Data","typeLabel":"object"},"DataContext":{"oneOf":[{"type":"object","additionalProperties":false,"example":null,"uniqueKey":"DataContext.oneOf.0","typeLabel":"object"},{"type":"null","additionalProperties":false,"example":null,"uniqueKey":"DataContext.oneOf.1","typeLabel":"null"}],"uniqueKey":"DataContext","typeLabel":"object | null"},"Notifications":{"type":"array","items":{"type":"object","properties":{"Code":{"pattern":"^[0-9]{6}$","type":"string","description":"6-digit MMTTNN error code. See the Public API error-code registry.","example":"070101","uniqueKey":"Notifications.items.[INDEX].Code","typeLabel":"string"},"Message":{"type":"string","uniqueKey":"Notifications.items.[INDEX].Message","typeLabel":"string"},"PropertyName":{"oneOf":[{"type":"string","uniqueKey":"Notifications.items.[INDEX].PropertyName.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"Notifications.items.[INDEX].PropertyName.oneOf.1","typeLabel":"null"}],"uniqueKey":"Notifications.items.[INDEX].PropertyName","typeLabel":"string | null"},"ActionHint":{"oneOf":[{"type":"string","uniqueKey":"Notifications.items.[INDEX].ActionHint.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"Notifications.items.[INDEX].ActionHint.oneOf.1","typeLabel":"null"}],"uniqueKey":"Notifications.items.[INDEX].ActionHint","typeLabel":"string | null"},"DocUrl":{"oneOf":[{"type":"string","uniqueKey":"Notifications.items.[INDEX].DocUrl.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"Notifications.items.[INDEX].DocUrl.oneOf.1","typeLabel":"null"}],"uniqueKey":"Notifications.items.[INDEX].DocUrl","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"Notifications.items.[INDEX]","typeLabel":"object"},"uniqueKey":"Notifications","typeLabel":"object[]"}},"additionalProperties":false,"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"StatusCode":100,"IsSuccess":true,"Data":{"Id":4021,"Name":"All Labor Terms Example","Status":{"Id":1,"Name":"\u003cstring>"},"Client":{"Id":1,"Name":"\u003cstring>"},"LocationIds":[123],"IsForAllLocations":true,"CreatedOn":"2023-11-07T05:31:56Z","UpdatedOn":"2023-11-07T05:31:56Z","Reference":"MSA-2025-014","StartDate":"2023-12-25","EndDate":"2023-12-25","RepeatPeriod":{"Id":1,"Name":"\u003cstring>"},"DaysBeforeInvoiceCreation":123,"DaysUntilDue":30,"ProrateType":{"Id":1,"Name":"\u003cstring>"},"AutoInvoiceTicketProducts":true,"InvoiceTemplateId":123,"InvoiceEmailTemplateId":123,"BrandingThemeId":"3c90c3cc-0d44-4b50-8888-8dd25736052a","AutoApproveAndSend":true,"Contacts":[{"Id":1,"Name":"\u003cstring>"}],"RecurringAmount":6870,"RecurringCost":2981.36,"ServiceLines":[{"Id":88214,"Name":"\u003cstring>","CreatedOn":"2023-11-07T05:31:56Z","UpdatedOn":"2023-11-07T05:31:56Z","LaborTerms":{"Id":1,"Name":"\u003cstring>"},"WorkTypes":[{"Id":1,"Name":"\u003cstring>"}],"WorkRoles":[{"Id":1,"Name":"\u003cstring>"}],"AutoApproveTime":true,"AutoInvoiceTime":true,"IncludedTimeGoesTo":{"Id":1,"Name":"\u003cstring>"},"UnlimitedHoursDetails":{},"PerHourDetails":{"RateType":{"Id":1,"Name":"\u003cstring>"},"HourlyRate":123,"CustomRates":{"WorkRoles":[{"WorkRoleId":123,"HourlyRate":123,"CoaCode":"\u003cstring>"}],"WorkTypes":[{"WorkTypeId":123,"HourlyMultiplier":123,"CoaCode":"\u003cstring>"}]}},"LimitedHoursDetails":{"ShowRemainingHoursInClientPortal":true,"AllocatedHours":123,"RateType":{"Id":1,"Name":"\u003cstring>"},"HourlyRate":123,"CustomRates":{"WorkRoles":[{"WorkRoleId":123,"HourlyRate":123,"CoaCode":"\u003cstring>"}],"WorkTypes":[{"WorkTypeId":123,"HourlyMultiplier":123,"CoaCode":"\u003cstring>"}]}},"BlockHoursDetails":{"ShowRemainingHoursInClientPortal":true,"TemplateId":123,"Balance":123,"WarningThreshold":123,"OverrunThreshold":123},"RecurringAmount":123,"RecurringCost":123,"LineItems":[{"Id":123,"ItemId":"3c90c3cc-0d44-4b50-8888-8dd25736052a","ItemType":{"Id":1,"Name":"\u003cstring>"},"Name":"\u003cstring>","Description":"\u003cstring>","Quantity":123,"UnitCost":123,"UnitPrice":123,"DiscountPercent":123,"StartDate":"2023-12-25","EndDate":"2023-12-25","Tax":{"Id":1,"Name":"\u003cstring>"},"Amount":123,"TaxAmount":123,"BillableStatus":{"Id":1,"Name":"\u003cstring>"}}]}]},"DataContext":null,"Notifications":[{"Code":"070101","Message":"\u003cstring>","PropertyName":"\u003cstring>","ActionHint":"\u003cstring>","DocUrl":"\u003cstring>"}]}}},"exampleType":"generated"},"application/json":{"schema":{"type":"object","properties":{"StatusCode":{"enum":[100,101,102,103,200,201,202,203,204,205,206,207,208,226,300,301,302,303,304,305,306,307,308,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,421,422,423,424,426,428,429,431,451,500,501,502,503,504,505,506,507,508,510,511],"type":"integer","format":"int32","uniqueKey":"StatusCode","typeLabel":"enum\u003cinteger>"},"IsSuccess":{"type":"boolean","uniqueKey":"IsSuccess","typeLabel":"boolean"},"Data":{"type":"object","properties":{"Id":{"type":"integer","description":"Identifier of the contract.","format":"int64","example":4021,"uniqueKey":"Data.Id","typeLabel":"integer\u003cint64>"},"Name":{"type":"string","description":"Name of the contract.","example":"All Labor Terms Example","uniqueKey":"Data.Name","typeLabel":"string"},"Status":{"type":"object","properties":{"Id":{"type":"integer","description":"Numeric identifier of the coded value (e.g. status, priority, type, or source id).","format":"int64","example":1,"uniqueKey":"Data.Status.Id","typeLabel":"integer\u003cint64>"},"Name":{"type":"string","description":"Display name of the coded value.","uniqueKey":"Data.Status.Name","typeLabel":"string"}},"additionalProperties":false,"description":"A coded value, such as a status, priority, type or source, as an id and a display name.","uniqueKey":"Data.Status","typeLabel":"object"},"Client":{"type":"object","properties":{"Id":{"type":"integer","description":"Numeric identifier of the coded value (e.g. status, priority, type, or source id).","format":"int64","example":1,"uniqueKey":"Data.Client.Id","typeLabel":"integer\u003cint64>"},"Name":{"type":"string","description":"Display name of the coded value.","uniqueKey":"Data.Client.Name","typeLabel":"string"}},"additionalProperties":false,"description":"A coded value, such as a status, priority, type or source, as an id and a display name.","uniqueKey":"Data.Client","typeLabel":"object"},"LocationIds":{"type":"array","items":{"type":"integer","format":"int64","uniqueKey":"Data.LocationIds.items.[INDEX]","typeLabel":"integer\u003cint64>"},"description":"The client locations the contract is scoped to, as location ids. Empty\r\nwhen the contract covers every one of the client's locations (see\r\n`IsForAllLocations`) as well as when a location-scoped contract's rows have all\r\nbeen removed; never null.","uniqueKey":"Data.LocationIds","typeLabel":"integer\u003cint64>[]"},"IsForAllLocations":{"type":"boolean","description":"Whether the contract covers every one of the client's locations rather than the specific\r\nones named in `LocationIds`. When true, `LocationIds` is empty by\r\ndefinition.","uniqueKey":"Data.IsForAllLocations","typeLabel":"boolean"},"CreatedOn":{"oneOf":[{"type":"string","description":"When the contract was created, in UTC.","format":"date-time","uniqueKey":"Data.CreatedOn.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","description":"When the contract was created, in UTC.","format":"date-time","uniqueKey":"Data.CreatedOn.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.CreatedOn","typeLabel":"string\u003cdate-time> | null"},"UpdatedOn":{"oneOf":[{"type":"string","description":"When the contract was last changed, in UTC. Null when it has never been changed.","format":"date-time","uniqueKey":"Data.UpdatedOn.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","description":"When the contract was last changed, in UTC. Null when it has never been changed.","format":"date-time","uniqueKey":"Data.UpdatedOn.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.UpdatedOn","typeLabel":"string\u003cdate-time> | null"},"Reference":{"oneOf":[{"type":"string","description":"The contract's invoice reference, free text. Null when it is not set.","example":"MSA-2025-014","uniqueKey":"Data.Reference.oneOf.0","typeLabel":"string"},{"type":"null","description":"The contract's invoice reference, free text. Null when it is not set.","example":"MSA-2025-014","uniqueKey":"Data.Reference.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.Reference","typeLabel":"string | null"},"StartDate":{"type":"string","description":"Date the contract's coverage starts, a calendar date.","format":"date","uniqueKey":"Data.StartDate","typeLabel":"string\u003cdate>"},"EndDate":{"oneOf":[{"type":"string","description":"Date the contract's coverage ends, a calendar date, or null when it is open-ended.","format":"date","uniqueKey":"Data.EndDate.oneOf.0","typeLabel":"string\u003cdate>"},{"type":"null","description":"Date the contract's coverage ends, a calendar date, or null when it is open-ended.","format":"date","uniqueKey":"Data.EndDate.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.EndDate","typeLabel":"string\u003cdate> | null"},"RepeatPeriod":{"type":"object","properties":{"Id":{"type":"integer","description":"Numeric identifier of the coded value (e.g. status, priority, type, or source id).","format":"int64","example":1,"uniqueKey":"Data.RepeatPeriod.Id","typeLabel":"integer\u003cint64>"},"Name":{"type":"string","description":"Display name of the coded value.","uniqueKey":"Data.RepeatPeriod.Name","typeLabel":"string"}},"additionalProperties":false,"description":"A coded value, such as a status, priority, type or source, as an id and a display name.","uniqueKey":"Data.RepeatPeriod","typeLabel":"object"},"DaysBeforeInvoiceCreation":{"oneOf":[{"type":"integer","description":"How many days before the billing period ends the invoice is generated.","format":"int32","uniqueKey":"Data.DaysBeforeInvoiceCreation.oneOf.0","typeLabel":"integer\u003cint32>"},{"type":"null","description":"How many days before the billing period ends the invoice is generated.","format":"int32","uniqueKey":"Data.DaysBeforeInvoiceCreation.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.DaysBeforeInvoiceCreation","typeLabel":"integer\u003cint32> | null"},"DaysUntilDue":{"type":"integer","description":"How many days the client has to pay once invoiced. Renamed from `InvoiceDue` (ENG-7288).","format":"int32","example":30,"uniqueKey":"Data.DaysUntilDue","typeLabel":"integer\u003cint32>"},"ProrateType":{"type":"object","properties":{"Id":{"type":"integer","description":"Numeric identifier of the coded value (e.g. status, priority, type, or source id).","format":"int64","example":1,"uniqueKey":"Data.ProrateType.Id","typeLabel":"integer\u003cint64>"},"Name":{"type":"string","description":"Display name of the coded value.","uniqueKey":"Data.ProrateType.Name","typeLabel":"string"}},"additionalProperties":false,"description":"A coded value, such as a status, priority, type or source, as an id and a display name.","uniqueKey":"Data.ProrateType","typeLabel":"object"},"AutoInvoiceTicketProducts":{"type":"boolean","description":"Whether approved ticket products for this client are swept into the contract's next\r\nrecurring invoice. Only ever true on a contract that covers all the client's locations.","uniqueKey":"Data.AutoInvoiceTicketProducts","typeLabel":"boolean"},"InvoiceTemplateId":{"oneOf":[{"type":"integer","description":"Invoice template invoices raised from this contract use. Null means the service provider's default.","format":"int64","uniqueKey":"Data.InvoiceTemplateId.oneOf.0","typeLabel":"integer\u003cint64>"},{"type":"null","description":"Invoice template invoices raised from this contract use. Null means the service provider's default.","format":"int64","uniqueKey":"Data.InvoiceTemplateId.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.InvoiceTemplateId","typeLabel":"integer\u003cint64> | null"},"InvoiceEmailTemplateId":{"oneOf":[{"type":"integer","description":"Email template invoices raised from this contract are sent with. Null means the service provider's default.","format":"int64","uniqueKey":"Data.InvoiceEmailTemplateId.oneOf.0","typeLabel":"integer\u003cint64>"},{"type":"null","description":"Email template invoices raised from this contract are sent with. Null means the service provider's default.","format":"int64","uniqueKey":"Data.InvoiceEmailTemplateId.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.InvoiceEmailTemplateId","typeLabel":"integer\u003cint64> | null"},"BrandingThemeId":{"oneOf":[{"type":"string","description":"Accounting-system branding theme invoices raised from this contract use. Null means the default.","format":"uuid","uniqueKey":"Data.BrandingThemeId.oneOf.0","typeLabel":"string\u003cuuid>"},{"type":"null","description":"Accounting-system branding theme invoices raised from this contract use. Null means the default.","format":"uuid","uniqueKey":"Data.BrandingThemeId.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.BrandingThemeId","typeLabel":"string\u003cuuid> | null"},"AutoApproveAndSend":{"oneOf":[{"type":"boolean","description":"Whether an invoice raised from this contract is approved and sent automatically.","uniqueKey":"Data.AutoApproveAndSend.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"Whether an invoice raised from this contract is approved and sent automatically.","uniqueKey":"Data.AutoApproveAndSend.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.AutoApproveAndSend","typeLabel":"boolean | null"},"Contacts":{"type":"array","items":{"type":"object","properties":{"Id":{"type":"integer","description":"Numeric identifier of the coded value (e.g. status, priority, type, or source id).","format":"int64","example":1,"uniqueKey":"Data.Contacts.items.[INDEX].Id","typeLabel":"integer\u003cint64>"},"Name":{"type":"string","description":"Display name of the coded value.","uniqueKey":"Data.Contacts.items.[INDEX].Name","typeLabel":"string"}},"additionalProperties":false,"description":"A coded value, such as a status, priority, type or source, as an id and a display name.","uniqueKey":"Data.Contacts.items.[INDEX]","typeLabel":"object"},"description":"The contacts who can auto-approve invoices on this contract. Empty when none are set.","uniqueKey":"Data.Contacts","typeLabel":"object[]"},"RecurringAmount":{"type":"number","description":"Total recurring amount the contract bills each period, before tax.","format":"double","example":6870,"uniqueKey":"Data.RecurringAmount","typeLabel":"number\u003cdouble>"},"RecurringCost":{"type":"number","description":"Total recurring cost of the contract's recurring products each period.","format":"double","example":2981.36,"uniqueKey":"Data.RecurringCost","typeLabel":"number\u003cdouble>"},"ServiceLines":{"type":"array","items":{"type":"object","properties":{"Id":{"type":"integer","description":"Identifier of the service line. The same value a time entry's ServiceLineId carries.","format":"int64","example":88214,"uniqueKey":"Data.ServiceLines.items.[INDEX].Id","typeLabel":"integer\u003cint64>"},"Name":{"type":"string","description":"Name of the service line.","uniqueKey":"Data.ServiceLines.items.[INDEX].Name","typeLabel":"string"},"CreatedOn":{"oneOf":[{"type":"string","description":"When the service line was created, in UTC.","format":"date-time","uniqueKey":"Data.ServiceLines.items.[INDEX].CreatedOn.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","description":"When the service line was created, in UTC.","format":"date-time","uniqueKey":"Data.ServiceLines.items.[INDEX].CreatedOn.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.ServiceLines.items.[INDEX].CreatedOn","typeLabel":"string\u003cdate-time> | null"},"UpdatedOn":{"oneOf":[{"type":"string","description":"When the service line was last changed, in UTC. Null when it has never been changed.","format":"date-time","uniqueKey":"Data.ServiceLines.items.[INDEX].UpdatedOn.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","description":"When the service line was last changed, in UTC. Null when it has never been changed.","format":"date-time","uniqueKey":"Data.ServiceLines.items.[INDEX].UpdatedOn.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.ServiceLines.items.[INDEX].UpdatedOn","typeLabel":"string\u003cdate-time> | null"},"LaborTerms":{"type":"object","properties":{"Id":{"type":"integer","description":"Numeric identifier of the coded value (e.g. status, priority, type, or source id).","format":"int64","example":1,"uniqueKey":"Data.ServiceLines.items.[INDEX].LaborTerms.Id","typeLabel":"integer\u003cint64>"},"Name":{"type":"string","description":"Display name of the coded value.","uniqueKey":"Data.ServiceLines.items.[INDEX].LaborTerms.Name","typeLabel":"string"}},"additionalProperties":false,"description":"A coded value, such as a status, priority, type or source, as an id and a display name.","uniqueKey":"Data.ServiceLines.items.[INDEX].LaborTerms","typeLabel":"object"},"WorkTypes":{"type":"array","items":{"type":"object","properties":{"Id":{"type":"integer","description":"Numeric identifier of the coded value (e.g. status, priority, type, or source id).","format":"int64","example":1,"uniqueKey":"Data.ServiceLines.items.[INDEX].WorkTypes.items.[INDEX].Id","typeLabel":"integer\u003cint64>"},"Name":{"type":"string","description":"Display name of the coded value.","uniqueKey":"Data.ServiceLines.items.[INDEX].WorkTypes.items.[INDEX].Name","typeLabel":"string"}},"additionalProperties":false,"description":"A coded value, such as a status, priority, type or source, as an id and a display name.","uniqueKey":"Data.ServiceLines.items.[INDEX].WorkTypes.items.[INDEX]","typeLabel":"object"},"description":"The work types this line applies to. Only recorded for an Unlimited Hours line; empty for\r\nevery other `LaborTerms` today, since the other labor terms carry no work-type\r\nselection of their own in storage.","uniqueKey":"Data.ServiceLines.items.[INDEX].WorkTypes","typeLabel":"object[]"},"WorkRoles":{"type":"array","items":{"type":"object","properties":{"Id":{"type":"integer","description":"Numeric identifier of the coded value (e.g. status, priority, type, or source id).","format":"int64","example":1,"uniqueKey":"Data.ServiceLines.items.[INDEX].WorkRoles.items.[INDEX].Id","typeLabel":"integer\u003cint64>"},"Name":{"type":"string","description":"Display name of the coded value.","uniqueKey":"Data.ServiceLines.items.[INDEX].WorkRoles.items.[INDEX].Name","typeLabel":"string"}},"additionalProperties":false,"description":"A coded value, such as a status, priority, type or source, as an id and a display name.","uniqueKey":"Data.ServiceLines.items.[INDEX].WorkRoles.items.[INDEX]","typeLabel":"object"},"description":"Same coverage as `WorkTypes`, for billing roles.","uniqueKey":"Data.ServiceLines.items.[INDEX].WorkRoles","typeLabel":"object[]"},"AutoApproveTime":{"type":"boolean","description":"Whether time logged against this line is approved automatically. False on a No Labor Terms line.","uniqueKey":"Data.ServiceLines.items.[INDEX].AutoApproveTime","typeLabel":"boolean"},"AutoInvoiceTime":{"type":"boolean","description":"The app's \"Auto Invoice Time\": approved time waiting on this line is swept into the\r\ncontract's recurring invoice. False on a No Labor Terms line.","uniqueKey":"Data.ServiceLines.items.[INDEX].AutoInvoiceTime","typeLabel":"boolean"},"IncludedTimeGoesTo":{"type":"object","properties":{"Id":{"type":"integer","description":"Numeric identifier of the coded value (e.g. status, priority, type, or source id).","format":"int64","example":1,"uniqueKey":"Data.ServiceLines.items.[INDEX].IncludedTimeGoesTo.Id","typeLabel":"integer\u003cint64>"},"Name":{"type":"string","description":"Display name of the coded value.","uniqueKey":"Data.ServiceLines.items.[INDEX].IncludedTimeGoesTo.Name","typeLabel":"string"}},"additionalProperties":false,"description":"A coded value, such as a status, priority, type or source, as an id and a display name.","uniqueKey":"Data.ServiceLines.items.[INDEX].IncludedTimeGoesTo","typeLabel":"object"},"UnlimitedHoursDetails":{"type":"object","additionalProperties":false,"description":"Nothing is specific to an Unlimited Hours line today. `AutoApprove` moved to the service\r\nline as `AutoApproveTime` (ENG-7288).","uniqueKey":"Data.ServiceLines.items.[INDEX].UnlimitedHoursDetails","typeLabel":"object"},"PerHourDetails":{"type":"object","properties":{"RateType":{"type":"object","properties":{"Id":{"type":"integer","description":"Numeric identifier of the coded value (e.g. status, priority, type, or source id).","format":"int64","example":1,"uniqueKey":"Data.ServiceLines.items.[INDEX].PerHourDetails.RateType.Id","typeLabel":"integer\u003cint64>"},"Name":{"type":"string","description":"Display name of the coded value.","uniqueKey":"Data.ServiceLines.items.[INDEX].PerHourDetails.RateType.Name","typeLabel":"string"}},"additionalProperties":false,"description":"A coded value, such as a status, priority, type or source, as an id and a display name.","uniqueKey":"Data.ServiceLines.items.[INDEX].PerHourDetails.RateType","typeLabel":"object"},"HourlyRate":{"oneOf":[{"type":"number","description":"The flat rate charged per hour. Set only when `RateType` is Fixed; null otherwise.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].PerHourDetails.HourlyRate.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"The flat rate charged per hour. Set only when `RateType` is Fixed; null otherwise.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].PerHourDetails.HourlyRate.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.ServiceLines.items.[INDEX].PerHourDetails.HourlyRate","typeLabel":"number\u003cdouble> | null"},"CustomRates":{"type":"object","properties":{"WorkRoles":{"type":"array","items":{"type":"object","properties":{"WorkRoleId":{"type":"integer","description":"The billing role.","format":"int64","uniqueKey":"Data.ServiceLines.items.[INDEX].PerHourDetails.CustomRates.WorkRoles.items.[INDEX].WorkRoleId","typeLabel":"integer\u003cint64>"},"HourlyRate":{"type":"number","description":"Rate charged per hour for this role on this line.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].PerHourDetails.CustomRates.WorkRoles.items.[INDEX].HourlyRate","typeLabel":"number\u003cdouble>"},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code the role's time is posted to. Null when not set.","uniqueKey":"Data.ServiceLines.items.[INDEX].PerHourDetails.CustomRates.WorkRoles.items.[INDEX].CoaCode.oneOf.0","typeLabel":"string"},{"type":"null","description":"Accounting code the role's time is posted to. Null when not set.","uniqueKey":"Data.ServiceLines.items.[INDEX].PerHourDetails.CustomRates.WorkRoles.items.[INDEX].CoaCode.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.ServiceLines.items.[INDEX].PerHourDetails.CustomRates.WorkRoles.items.[INDEX].CoaCode","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"Data.ServiceLines.items.[INDEX].PerHourDetails.CustomRates.WorkRoles.items.[INDEX]","typeLabel":"object"},"description":"The rate per billing role.","uniqueKey":"Data.ServiceLines.items.[INDEX].PerHourDetails.CustomRates.WorkRoles","typeLabel":"object[]"},"WorkTypes":{"type":"array","items":{"type":"object","properties":{"WorkTypeId":{"type":"integer","description":"The work type.","format":"int64","uniqueKey":"Data.ServiceLines.items.[INDEX].PerHourDetails.CustomRates.WorkTypes.items.[INDEX].WorkTypeId","typeLabel":"integer\u003cint64>"},"HourlyMultiplier":{"type":"number","description":"Multiplier applied to the role's rate for this work type on this line.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].PerHourDetails.CustomRates.WorkTypes.items.[INDEX].HourlyMultiplier","typeLabel":"number\u003cdouble>"},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code the work type's time is posted to. Null when not set.","uniqueKey":"Data.ServiceLines.items.[INDEX].PerHourDetails.CustomRates.WorkTypes.items.[INDEX].CoaCode.oneOf.0","typeLabel":"string"},{"type":"null","description":"Accounting code the work type's time is posted to. Null when not set.","uniqueKey":"Data.ServiceLines.items.[INDEX].PerHourDetails.CustomRates.WorkTypes.items.[INDEX].CoaCode.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.ServiceLines.items.[INDEX].PerHourDetails.CustomRates.WorkTypes.items.[INDEX].CoaCode","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"Data.ServiceLines.items.[INDEX].PerHourDetails.CustomRates.WorkTypes.items.[INDEX]","typeLabel":"object"},"description":"The multiplier per work type.","uniqueKey":"Data.ServiceLines.items.[INDEX].PerHourDetails.CustomRates.WorkTypes","typeLabel":"object[]"}},"additionalProperties":false,"description":"The Custom labor rates grid of a Per Hour or Limited Hours line: one row per billing role and per work type.","uniqueKey":"Data.ServiceLines.items.[INDEX].PerHourDetails.CustomRates","typeLabel":"object"}},"additionalProperties":false,"uniqueKey":"Data.ServiceLines.items.[INDEX].PerHourDetails","typeLabel":"object"},"LimitedHoursDetails":{"type":"object","properties":{"ShowRemainingHoursInClientPortal":{"type":"boolean","description":"Whether the client portal shows the client the hours left in the allocation.","uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.ShowRemainingHoursInClientPortal","typeLabel":"boolean"},"AllocatedHours":{"oneOf":[{"type":"number","description":"Hours included each billing period.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.AllocatedHours.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"Hours included each billing period.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.AllocatedHours.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.AllocatedHours","typeLabel":"number\u003cdouble> | null"},"RateType":{"type":"object","properties":{"Id":{"type":"integer","description":"Numeric identifier of the coded value (e.g. status, priority, type, or source id).","format":"int64","example":1,"uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.RateType.Id","typeLabel":"integer\u003cint64>"},"Name":{"type":"string","description":"Display name of the coded value.","uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.RateType.Name","typeLabel":"string"}},"additionalProperties":false,"description":"A coded value, such as a status, priority, type or source, as an id and a display name.","uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.RateType","typeLabel":"object"},"HourlyRate":{"oneOf":[{"type":"number","description":"The flat rate charged per hour. Set only when `RateType` is Fixed; null otherwise.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.HourlyRate.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"The flat rate charged per hour. Set only when `RateType` is Fixed; null otherwise.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.HourlyRate.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.HourlyRate","typeLabel":"number\u003cdouble> | null"},"CustomRates":{"type":"object","properties":{"WorkRoles":{"type":"array","items":{"type":"object","properties":{"WorkRoleId":{"type":"integer","description":"The billing role.","format":"int64","uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles.items.[INDEX].WorkRoleId","typeLabel":"integer\u003cint64>"},"HourlyRate":{"type":"number","description":"Rate charged per hour for this role on this line.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles.items.[INDEX].HourlyRate","typeLabel":"number\u003cdouble>"},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code the role's time is posted to. Null when not set.","uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles.items.[INDEX].CoaCode.oneOf.0","typeLabel":"string"},{"type":"null","description":"Accounting code the role's time is posted to. Null when not set.","uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles.items.[INDEX].CoaCode.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles.items.[INDEX].CoaCode","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles.items.[INDEX]","typeLabel":"object"},"description":"The rate per billing role.","uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles","typeLabel":"object[]"},"WorkTypes":{"type":"array","items":{"type":"object","properties":{"WorkTypeId":{"type":"integer","description":"The work type.","format":"int64","uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes.items.[INDEX].WorkTypeId","typeLabel":"integer\u003cint64>"},"HourlyMultiplier":{"type":"number","description":"Multiplier applied to the role's rate for this work type on this line.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes.items.[INDEX].HourlyMultiplier","typeLabel":"number\u003cdouble>"},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code the work type's time is posted to. Null when not set.","uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes.items.[INDEX].CoaCode.oneOf.0","typeLabel":"string"},{"type":"null","description":"Accounting code the work type's time is posted to. Null when not set.","uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes.items.[INDEX].CoaCode.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes.items.[INDEX].CoaCode","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes.items.[INDEX]","typeLabel":"object"},"description":"The multiplier per work type.","uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes","typeLabel":"object[]"}},"additionalProperties":false,"description":"The Custom labor rates grid of a Per Hour or Limited Hours line: one row per billing role and per work type.","uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.CustomRates","typeLabel":"object"}},"additionalProperties":false,"uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails","typeLabel":"object"},"BlockHoursDetails":{"type":"object","properties":{"ShowRemainingHoursInClientPortal":{"type":"boolean","description":"Whether the client portal shows the client the hours left in the block.","uniqueKey":"Data.ServiceLines.items.[INDEX].BlockHoursDetails.ShowRemainingHoursInClientPortal","typeLabel":"boolean"},"TemplateId":{"type":"integer","description":"The Block Hours Template the block was created from. 0 means Custom: no template applies.","format":"int64","uniqueKey":"Data.ServiceLines.items.[INDEX].BlockHoursDetails.TemplateId","typeLabel":"integer\u003cint64>"},"Balance":{"oneOf":[{"type":"number","description":"The block's total balance, in hours.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].BlockHoursDetails.Balance.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"The block's total balance, in hours.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].BlockHoursDetails.Balance.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.ServiceLines.items.[INDEX].BlockHoursDetails.Balance","typeLabel":"number\u003cdouble> | null"},"WarningThreshold":{"oneOf":[{"type":"number","description":"Percentage of the block left at which a low-balance warning is raised, a whole number from\r\n0 to 90. Earlier documented as hours, which it never was.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].BlockHoursDetails.WarningThreshold.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"Percentage of the block left at which a low-balance warning is raised, a whole number from\r\n0 to 90. Earlier documented as hours, which it never was.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].BlockHoursDetails.WarningThreshold.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.ServiceLines.items.[INDEX].BlockHoursDetails.WarningThreshold","typeLabel":"number\u003cdouble> | null"},"OverrunThreshold":{"oneOf":[{"type":"number","description":"Percentage of the block the client may run past zero before the block counts as overrun, a\r\nwhole number from 0 to 50. Earlier documented as hours, which it never was.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].BlockHoursDetails.OverrunThreshold.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"Percentage of the block the client may run past zero before the block counts as overrun, a\r\nwhole number from 0 to 50. Earlier documented as hours, which it never was.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].BlockHoursDetails.OverrunThreshold.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.ServiceLines.items.[INDEX].BlockHoursDetails.OverrunThreshold","typeLabel":"number\u003cdouble> | null"}},"additionalProperties":false,"uniqueKey":"Data.ServiceLines.items.[INDEX].BlockHoursDetails","typeLabel":"object"},"RecurringAmount":{"type":"number","description":"Recurring amount this service line bills each period, before tax.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].RecurringAmount","typeLabel":"number\u003cdouble>"},"RecurringCost":{"type":"number","description":"Recurring cost of this service line's recurring products each period.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].RecurringCost","typeLabel":"number\u003cdouble>"},"LineItems":{"type":"array","items":{"type":"object","properties":{"Id":{"type":"integer","description":"Identifier of this line.","format":"int64","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].Id","typeLabel":"integer\u003cint64>"},"ItemId":{"oneOf":[{"type":"string","description":"The catalog item this line bills, resolving against `GET /v1/items`. Null for a line\r\nthat does not reference a catalog item.","format":"uuid","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].ItemId.oneOf.0","typeLabel":"string\u003cuuid>"},{"type":"null","description":"The catalog item this line bills, resolving against `GET /v1/items`. Null for a line\r\nthat does not reference a catalog item.","format":"uuid","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].ItemId.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].ItemId","typeLabel":"string\u003cuuid> | null"},"ItemType":{"type":"object","properties":{"Id":{"type":"integer","description":"Numeric identifier of the coded value (e.g. status, priority, type, or source id).","format":"int64","example":1,"uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].ItemType.Id","typeLabel":"integer\u003cint64>"},"Name":{"type":"string","description":"Display name of the coded value.","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].ItemType.Name","typeLabel":"string"}},"additionalProperties":false,"description":"A coded value, such as a status, priority, type or source, as an id and a display name.","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].ItemType","typeLabel":"object"},"Name":{"type":"string","description":"Name of the line as billed.","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].Name","typeLabel":"string"},"Description":{"oneOf":[{"type":"string","description":"Description of the line as billed, if any.","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].Description.oneOf.0","typeLabel":"string"},{"type":"null","description":"Description of the line as billed, if any.","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].Description.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].Description","typeLabel":"string | null"},"Quantity":{"oneOf":[{"type":"number","description":"Quantity billed.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].Quantity.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"Quantity billed.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].Quantity.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].Quantity","typeLabel":"number\u003cdouble> | null"},"UnitCost":{"oneOf":[{"type":"number","description":"Unit cost of the line. Renamed from `Cost` (ENG-7288), the name items and invoice lines use.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].UnitCost.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"Unit cost of the line. Renamed from `Cost` (ENG-7288), the name items and invoice lines use.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].UnitCost.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].UnitCost","typeLabel":"number\u003cdouble> | null"},"UnitPrice":{"type":"number","description":"Unit price charged.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].UnitPrice","typeLabel":"number\u003cdouble>"},"DiscountPercent":{"oneOf":[{"type":"number","description":"Discount percentage applied to this line, 0-100.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].DiscountPercent.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"Discount percentage applied to this line, 0-100.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].DiscountPercent.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].DiscountPercent","typeLabel":"number\u003cdouble> | null"},"StartDate":{"oneOf":[{"type":"string","description":"Date this line's coverage starts, if it is date-scoped. A calendar date.","format":"date","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].StartDate.oneOf.0","typeLabel":"string\u003cdate>"},{"type":"null","description":"Date this line's coverage starts, if it is date-scoped. A calendar date.","format":"date","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].StartDate.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].StartDate","typeLabel":"string\u003cdate> | null"},"EndDate":{"oneOf":[{"type":"string","description":"Date this line's coverage ends, if it is date-scoped. A calendar date.","format":"date","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].EndDate.oneOf.0","typeLabel":"string\u003cdate>"},{"type":"null","description":"Date this line's coverage ends, if it is date-scoped. A calendar date.","format":"date","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].EndDate.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].EndDate","typeLabel":"string\u003cdate> | null"},"Tax":{"type":"object","properties":{"Id":{"type":"integer","description":"Numeric identifier of the coded value (e.g. status, priority, type, or source id).","format":"int64","example":1,"uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].Tax.Id","typeLabel":"integer\u003cint64>"},"Name":{"type":"string","description":"Display name of the coded value.","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].Tax.Name","typeLabel":"string"}},"additionalProperties":false,"description":"A coded value, such as a status, priority, type or source, as an id and a display name.","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].Tax","typeLabel":"object"},"Amount":{"type":"number","description":"Line total after discount, before tax.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].Amount","typeLabel":"number\u003cdouble>"},"TaxAmount":{"oneOf":[{"type":"number","description":"Tax on this line.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].TaxAmount.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"Tax on this line.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].TaxAmount.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].TaxAmount","typeLabel":"number\u003cdouble> | null"},"BillableStatus":{"type":"object","properties":{"Id":{"type":"integer","description":"Numeric identifier of the coded value (e.g. status, priority, type, or source id).","format":"int64","example":1,"uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].BillableStatus.Id","typeLabel":"integer\u003cint64>"},"Name":{"type":"string","description":"Display name of the coded value.","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].BillableStatus.Name","typeLabel":"string"}},"additionalProperties":false,"description":"A coded value, such as a status, priority, type or source, as an id and a display name.","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].BillableStatus","typeLabel":"object"}},"additionalProperties":false,"description":"One product, bundle or labor charge billed on a contract's service line.","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX]","typeLabel":"object"},"description":"The actual products/labor billed on this line. Empty array when nothing is billed on it\r\nyet; never null.","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems","typeLabel":"object[]"}},"additionalProperties":false,"description":"One service line inside a contract, with the products/labor billed on it.","uniqueKey":"Data.ServiceLines.items.[INDEX]","typeLabel":"object"},"description":"The contract's service lines. Empty when the contract has none; never null.","uniqueKey":"Data.ServiceLines","typeLabel":"object[]"}},"additionalProperties":false,"description":"Everything about one contract: the client and locations it covers, its billing schedule, and\r\neach service line with the actual products/labor billed on it.","uniqueKey":"Data","typeLabel":"object"},"DataContext":{"oneOf":[{"type":"object","additionalProperties":false,"example":null,"uniqueKey":"DataContext.oneOf.0","typeLabel":"object"},{"type":"null","additionalProperties":false,"example":null,"uniqueKey":"DataContext.oneOf.1","typeLabel":"null"}],"uniqueKey":"DataContext","typeLabel":"object | null"},"Notifications":{"type":"array","items":{"type":"object","properties":{"Code":{"pattern":"^[0-9]{6}$","type":"string","description":"6-digit MMTTNN error code. See the Public API error-code registry.","example":"070101","uniqueKey":"Notifications.items.[INDEX].Code","typeLabel":"string"},"Message":{"type":"string","uniqueKey":"Notifications.items.[INDEX].Message","typeLabel":"string"},"PropertyName":{"oneOf":[{"type":"string","uniqueKey":"Notifications.items.[INDEX].PropertyName.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"Notifications.items.[INDEX].PropertyName.oneOf.1","typeLabel":"null"}],"uniqueKey":"Notifications.items.[INDEX].PropertyName","typeLabel":"string | null"},"ActionHint":{"oneOf":[{"type":"string","uniqueKey":"Notifications.items.[INDEX].ActionHint.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"Notifications.items.[INDEX].ActionHint.oneOf.1","typeLabel":"null"}],"uniqueKey":"Notifications.items.[INDEX].ActionHint","typeLabel":"string | null"},"DocUrl":{"oneOf":[{"type":"string","uniqueKey":"Notifications.items.[INDEX].DocUrl.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"Notifications.items.[INDEX].DocUrl.oneOf.1","typeLabel":"null"}],"uniqueKey":"Notifications.items.[INDEX].DocUrl","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"Notifications.items.[INDEX]","typeLabel":"object"},"uniqueKey":"Notifications","typeLabel":"object[]"}},"additionalProperties":false,"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"StatusCode":100,"IsSuccess":true,"Data":{"Id":4021,"Name":"All Labor Terms Example","Status":{"Id":1,"Name":"\u003cstring>"},"Client":{"Id":1,"Name":"\u003cstring>"},"LocationIds":[123],"IsForAllLocations":true,"CreatedOn":"2023-11-07T05:31:56Z","UpdatedOn":"2023-11-07T05:31:56Z","Reference":"MSA-2025-014","StartDate":"2023-12-25","EndDate":"2023-12-25","RepeatPeriod":{"Id":1,"Name":"\u003cstring>"},"DaysBeforeInvoiceCreation":123,"DaysUntilDue":30,"ProrateType":{"Id":1,"Name":"\u003cstring>"},"AutoInvoiceTicketProducts":true,"InvoiceTemplateId":123,"InvoiceEmailTemplateId":123,"BrandingThemeId":"3c90c3cc-0d44-4b50-8888-8dd25736052a","AutoApproveAndSend":true,"Contacts":[{"Id":1,"Name":"\u003cstring>"}],"RecurringAmount":6870,"RecurringCost":2981.36,"ServiceLines":[{"Id":88214,"Name":"\u003cstring>","CreatedOn":"2023-11-07T05:31:56Z","UpdatedOn":"2023-11-07T05:31:56Z","LaborTerms":{"Id":1,"Name":"\u003cstring>"},"WorkTypes":[{"Id":1,"Name":"\u003cstring>"}],"WorkRoles":[{"Id":1,"Name":"\u003cstring>"}],"AutoApproveTime":true,"AutoInvoiceTime":true,"IncludedTimeGoesTo":{"Id":1,"Name":"\u003cstring>"},"UnlimitedHoursDetails":{},"PerHourDetails":{"RateType":{"Id":1,"Name":"\u003cstring>"},"HourlyRate":123,"CustomRates":{"WorkRoles":[{"WorkRoleId":123,"HourlyRate":123,"CoaCode":"\u003cstring>"}],"WorkTypes":[{"WorkTypeId":123,"HourlyMultiplier":123,"CoaCode":"\u003cstring>"}]}},"LimitedHoursDetails":{"ShowRemainingHoursInClientPortal":true,"AllocatedHours":123,"RateType":{"Id":1,"Name":"\u003cstring>"},"HourlyRate":123,"CustomRates":{"WorkRoles":[{"WorkRoleId":123,"HourlyRate":123,"CoaCode":"\u003cstring>"}],"WorkTypes":[{"WorkTypeId":123,"HourlyMultiplier":123,"CoaCode":"\u003cstring>"}]}},"BlockHoursDetails":{"ShowRemainingHoursInClientPortal":true,"TemplateId":123,"Balance":123,"WarningThreshold":123,"OverrunThreshold":123},"RecurringAmount":123,"RecurringCost":123,"LineItems":[{"Id":123,"ItemId":"3c90c3cc-0d44-4b50-8888-8dd25736052a","ItemType":{"Id":1,"Name":"\u003cstring>"},"Name":"\u003cstring>","Description":"\u003cstring>","Quantity":123,"UnitCost":123,"UnitPrice":123,"DiscountPercent":123,"StartDate":"2023-12-25","EndDate":"2023-12-25","Tax":{"Id":1,"Name":"\u003cstring>"},"Amount":123,"TaxAmount":123,"BillableStatus":{"Id":1,"Name":"\u003cstring>"}}]}]},"DataContext":null,"Notifications":[{"Code":"070101","Message":"\u003cstring>","PropertyName":"\u003cstring>","ActionHint":"\u003cstring>","DocUrl":"\u003cstring>"}]}}},"exampleType":"generated"},"text/json":{"schema":{"type":"object","properties":{"StatusCode":{"enum":[100,101,102,103,200,201,202,203,204,205,206,207,208,226,300,301,302,303,304,305,306,307,308,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,421,422,423,424,426,428,429,431,451,500,501,502,503,504,505,506,507,508,510,511],"type":"integer","format":"int32","uniqueKey":"StatusCode","typeLabel":"enum\u003cinteger>"},"IsSuccess":{"type":"boolean","uniqueKey":"IsSuccess","typeLabel":"boolean"},"Data":{"type":"object","properties":{"Id":{"type":"integer","description":"Identifier of the contract.","format":"int64","example":4021,"uniqueKey":"Data.Id","typeLabel":"integer\u003cint64>"},"Name":{"type":"string","description":"Name of the contract.","example":"All Labor Terms Example","uniqueKey":"Data.Name","typeLabel":"string"},"Status":{"type":"object","properties":{"Id":{"type":"integer","description":"Numeric identifier of the coded value (e.g. status, priority, type, or source id).","format":"int64","example":1,"uniqueKey":"Data.Status.Id","typeLabel":"integer\u003cint64>"},"Name":{"type":"string","description":"Display name of the coded value.","uniqueKey":"Data.Status.Name","typeLabel":"string"}},"additionalProperties":false,"description":"A coded value, such as a status, priority, type or source, as an id and a display name.","uniqueKey":"Data.Status","typeLabel":"object"},"Client":{"type":"object","properties":{"Id":{"type":"integer","description":"Numeric identifier of the coded value (e.g. status, priority, type, or source id).","format":"int64","example":1,"uniqueKey":"Data.Client.Id","typeLabel":"integer\u003cint64>"},"Name":{"type":"string","description":"Display name of the coded value.","uniqueKey":"Data.Client.Name","typeLabel":"string"}},"additionalProperties":false,"description":"A coded value, such as a status, priority, type or source, as an id and a display name.","uniqueKey":"Data.Client","typeLabel":"object"},"LocationIds":{"type":"array","items":{"type":"integer","format":"int64","uniqueKey":"Data.LocationIds.items.[INDEX]","typeLabel":"integer\u003cint64>"},"description":"The client locations the contract is scoped to, as location ids. Empty\r\nwhen the contract covers every one of the client's locations (see\r\n`IsForAllLocations`) as well as when a location-scoped contract's rows have all\r\nbeen removed; never null.","uniqueKey":"Data.LocationIds","typeLabel":"integer\u003cint64>[]"},"IsForAllLocations":{"type":"boolean","description":"Whether the contract covers every one of the client's locations rather than the specific\r\nones named in `LocationIds`. When true, `LocationIds` is empty by\r\ndefinition.","uniqueKey":"Data.IsForAllLocations","typeLabel":"boolean"},"CreatedOn":{"oneOf":[{"type":"string","description":"When the contract was created, in UTC.","format":"date-time","uniqueKey":"Data.CreatedOn.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","description":"When the contract was created, in UTC.","format":"date-time","uniqueKey":"Data.CreatedOn.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.CreatedOn","typeLabel":"string\u003cdate-time> | null"},"UpdatedOn":{"oneOf":[{"type":"string","description":"When the contract was last changed, in UTC. Null when it has never been changed.","format":"date-time","uniqueKey":"Data.UpdatedOn.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","description":"When the contract was last changed, in UTC. Null when it has never been changed.","format":"date-time","uniqueKey":"Data.UpdatedOn.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.UpdatedOn","typeLabel":"string\u003cdate-time> | null"},"Reference":{"oneOf":[{"type":"string","description":"The contract's invoice reference, free text. Null when it is not set.","example":"MSA-2025-014","uniqueKey":"Data.Reference.oneOf.0","typeLabel":"string"},{"type":"null","description":"The contract's invoice reference, free text. Null when it is not set.","example":"MSA-2025-014","uniqueKey":"Data.Reference.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.Reference","typeLabel":"string | null"},"StartDate":{"type":"string","description":"Date the contract's coverage starts, a calendar date.","format":"date","uniqueKey":"Data.StartDate","typeLabel":"string\u003cdate>"},"EndDate":{"oneOf":[{"type":"string","description":"Date the contract's coverage ends, a calendar date, or null when it is open-ended.","format":"date","uniqueKey":"Data.EndDate.oneOf.0","typeLabel":"string\u003cdate>"},{"type":"null","description":"Date the contract's coverage ends, a calendar date, or null when it is open-ended.","format":"date","uniqueKey":"Data.EndDate.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.EndDate","typeLabel":"string\u003cdate> | null"},"RepeatPeriod":{"type":"object","properties":{"Id":{"type":"integer","description":"Numeric identifier of the coded value (e.g. status, priority, type, or source id).","format":"int64","example":1,"uniqueKey":"Data.RepeatPeriod.Id","typeLabel":"integer\u003cint64>"},"Name":{"type":"string","description":"Display name of the coded value.","uniqueKey":"Data.RepeatPeriod.Name","typeLabel":"string"}},"additionalProperties":false,"description":"A coded value, such as a status, priority, type or source, as an id and a display name.","uniqueKey":"Data.RepeatPeriod","typeLabel":"object"},"DaysBeforeInvoiceCreation":{"oneOf":[{"type":"integer","description":"How many days before the billing period ends the invoice is generated.","format":"int32","uniqueKey":"Data.DaysBeforeInvoiceCreation.oneOf.0","typeLabel":"integer\u003cint32>"},{"type":"null","description":"How many days before the billing period ends the invoice is generated.","format":"int32","uniqueKey":"Data.DaysBeforeInvoiceCreation.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.DaysBeforeInvoiceCreation","typeLabel":"integer\u003cint32> | null"},"DaysUntilDue":{"type":"integer","description":"How many days the client has to pay once invoiced. Renamed from `InvoiceDue` (ENG-7288).","format":"int32","example":30,"uniqueKey":"Data.DaysUntilDue","typeLabel":"integer\u003cint32>"},"ProrateType":{"type":"object","properties":{"Id":{"type":"integer","description":"Numeric identifier of the coded value (e.g. status, priority, type, or source id).","format":"int64","example":1,"uniqueKey":"Data.ProrateType.Id","typeLabel":"integer\u003cint64>"},"Name":{"type":"string","description":"Display name of the coded value.","uniqueKey":"Data.ProrateType.Name","typeLabel":"string"}},"additionalProperties":false,"description":"A coded value, such as a status, priority, type or source, as an id and a display name.","uniqueKey":"Data.ProrateType","typeLabel":"object"},"AutoInvoiceTicketProducts":{"type":"boolean","description":"Whether approved ticket products for this client are swept into the contract's next\r\nrecurring invoice. Only ever true on a contract that covers all the client's locations.","uniqueKey":"Data.AutoInvoiceTicketProducts","typeLabel":"boolean"},"InvoiceTemplateId":{"oneOf":[{"type":"integer","description":"Invoice template invoices raised from this contract use. Null means the service provider's default.","format":"int64","uniqueKey":"Data.InvoiceTemplateId.oneOf.0","typeLabel":"integer\u003cint64>"},{"type":"null","description":"Invoice template invoices raised from this contract use. Null means the service provider's default.","format":"int64","uniqueKey":"Data.InvoiceTemplateId.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.InvoiceTemplateId","typeLabel":"integer\u003cint64> | null"},"InvoiceEmailTemplateId":{"oneOf":[{"type":"integer","description":"Email template invoices raised from this contract are sent with. Null means the service provider's default.","format":"int64","uniqueKey":"Data.InvoiceEmailTemplateId.oneOf.0","typeLabel":"integer\u003cint64>"},{"type":"null","description":"Email template invoices raised from this contract are sent with. Null means the service provider's default.","format":"int64","uniqueKey":"Data.InvoiceEmailTemplateId.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.InvoiceEmailTemplateId","typeLabel":"integer\u003cint64> | null"},"BrandingThemeId":{"oneOf":[{"type":"string","description":"Accounting-system branding theme invoices raised from this contract use. Null means the default.","format":"uuid","uniqueKey":"Data.BrandingThemeId.oneOf.0","typeLabel":"string\u003cuuid>"},{"type":"null","description":"Accounting-system branding theme invoices raised from this contract use. Null means the default.","format":"uuid","uniqueKey":"Data.BrandingThemeId.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.BrandingThemeId","typeLabel":"string\u003cuuid> | null"},"AutoApproveAndSend":{"oneOf":[{"type":"boolean","description":"Whether an invoice raised from this contract is approved and sent automatically.","uniqueKey":"Data.AutoApproveAndSend.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"Whether an invoice raised from this contract is approved and sent automatically.","uniqueKey":"Data.AutoApproveAndSend.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.AutoApproveAndSend","typeLabel":"boolean | null"},"Contacts":{"type":"array","items":{"type":"object","properties":{"Id":{"type":"integer","description":"Numeric identifier of the coded value (e.g. status, priority, type, or source id).","format":"int64","example":1,"uniqueKey":"Data.Contacts.items.[INDEX].Id","typeLabel":"integer\u003cint64>"},"Name":{"type":"string","description":"Display name of the coded value.","uniqueKey":"Data.Contacts.items.[INDEX].Name","typeLabel":"string"}},"additionalProperties":false,"description":"A coded value, such as a status, priority, type or source, as an id and a display name.","uniqueKey":"Data.Contacts.items.[INDEX]","typeLabel":"object"},"description":"The contacts who can auto-approve invoices on this contract. Empty when none are set.","uniqueKey":"Data.Contacts","typeLabel":"object[]"},"RecurringAmount":{"type":"number","description":"Total recurring amount the contract bills each period, before tax.","format":"double","example":6870,"uniqueKey":"Data.RecurringAmount","typeLabel":"number\u003cdouble>"},"RecurringCost":{"type":"number","description":"Total recurring cost of the contract's recurring products each period.","format":"double","example":2981.36,"uniqueKey":"Data.RecurringCost","typeLabel":"number\u003cdouble>"},"ServiceLines":{"type":"array","items":{"type":"object","properties":{"Id":{"type":"integer","description":"Identifier of the service line. The same value a time entry's ServiceLineId carries.","format":"int64","example":88214,"uniqueKey":"Data.ServiceLines.items.[INDEX].Id","typeLabel":"integer\u003cint64>"},"Name":{"type":"string","description":"Name of the service line.","uniqueKey":"Data.ServiceLines.items.[INDEX].Name","typeLabel":"string"},"CreatedOn":{"oneOf":[{"type":"string","description":"When the service line was created, in UTC.","format":"date-time","uniqueKey":"Data.ServiceLines.items.[INDEX].CreatedOn.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","description":"When the service line was created, in UTC.","format":"date-time","uniqueKey":"Data.ServiceLines.items.[INDEX].CreatedOn.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.ServiceLines.items.[INDEX].CreatedOn","typeLabel":"string\u003cdate-time> | null"},"UpdatedOn":{"oneOf":[{"type":"string","description":"When the service line was last changed, in UTC. Null when it has never been changed.","format":"date-time","uniqueKey":"Data.ServiceLines.items.[INDEX].UpdatedOn.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","description":"When the service line was last changed, in UTC. Null when it has never been changed.","format":"date-time","uniqueKey":"Data.ServiceLines.items.[INDEX].UpdatedOn.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.ServiceLines.items.[INDEX].UpdatedOn","typeLabel":"string\u003cdate-time> | null"},"LaborTerms":{"type":"object","properties":{"Id":{"type":"integer","description":"Numeric identifier of the coded value (e.g. status, priority, type, or source id).","format":"int64","example":1,"uniqueKey":"Data.ServiceLines.items.[INDEX].LaborTerms.Id","typeLabel":"integer\u003cint64>"},"Name":{"type":"string","description":"Display name of the coded value.","uniqueKey":"Data.ServiceLines.items.[INDEX].LaborTerms.Name","typeLabel":"string"}},"additionalProperties":false,"description":"A coded value, such as a status, priority, type or source, as an id and a display name.","uniqueKey":"Data.ServiceLines.items.[INDEX].LaborTerms","typeLabel":"object"},"WorkTypes":{"type":"array","items":{"type":"object","properties":{"Id":{"type":"integer","description":"Numeric identifier of the coded value (e.g. status, priority, type, or source id).","format":"int64","example":1,"uniqueKey":"Data.ServiceLines.items.[INDEX].WorkTypes.items.[INDEX].Id","typeLabel":"integer\u003cint64>"},"Name":{"type":"string","description":"Display name of the coded value.","uniqueKey":"Data.ServiceLines.items.[INDEX].WorkTypes.items.[INDEX].Name","typeLabel":"string"}},"additionalProperties":false,"description":"A coded value, such as a status, priority, type or source, as an id and a display name.","uniqueKey":"Data.ServiceLines.items.[INDEX].WorkTypes.items.[INDEX]","typeLabel":"object"},"description":"The work types this line applies to. Only recorded for an Unlimited Hours line; empty for\r\nevery other `LaborTerms` today, since the other labor terms carry no work-type\r\nselection of their own in storage.","uniqueKey":"Data.ServiceLines.items.[INDEX].WorkTypes","typeLabel":"object[]"},"WorkRoles":{"type":"array","items":{"type":"object","properties":{"Id":{"type":"integer","description":"Numeric identifier of the coded value (e.g. status, priority, type, or source id).","format":"int64","example":1,"uniqueKey":"Data.ServiceLines.items.[INDEX].WorkRoles.items.[INDEX].Id","typeLabel":"integer\u003cint64>"},"Name":{"type":"string","description":"Display name of the coded value.","uniqueKey":"Data.ServiceLines.items.[INDEX].WorkRoles.items.[INDEX].Name","typeLabel":"string"}},"additionalProperties":false,"description":"A coded value, such as a status, priority, type or source, as an id and a display name.","uniqueKey":"Data.ServiceLines.items.[INDEX].WorkRoles.items.[INDEX]","typeLabel":"object"},"description":"Same coverage as `WorkTypes`, for billing roles.","uniqueKey":"Data.ServiceLines.items.[INDEX].WorkRoles","typeLabel":"object[]"},"AutoApproveTime":{"type":"boolean","description":"Whether time logged against this line is approved automatically. False on a No Labor Terms line.","uniqueKey":"Data.ServiceLines.items.[INDEX].AutoApproveTime","typeLabel":"boolean"},"AutoInvoiceTime":{"type":"boolean","description":"The app's \"Auto Invoice Time\": approved time waiting on this line is swept into the\r\ncontract's recurring invoice. False on a No Labor Terms line.","uniqueKey":"Data.ServiceLines.items.[INDEX].AutoInvoiceTime","typeLabel":"boolean"},"IncludedTimeGoesTo":{"type":"object","properties":{"Id":{"type":"integer","description":"Numeric identifier of the coded value (e.g. status, priority, type, or source id).","format":"int64","example":1,"uniqueKey":"Data.ServiceLines.items.[INDEX].IncludedTimeGoesTo.Id","typeLabel":"integer\u003cint64>"},"Name":{"type":"string","description":"Display name of the coded value.","uniqueKey":"Data.ServiceLines.items.[INDEX].IncludedTimeGoesTo.Name","typeLabel":"string"}},"additionalProperties":false,"description":"A coded value, such as a status, priority, type or source, as an id and a display name.","uniqueKey":"Data.ServiceLines.items.[INDEX].IncludedTimeGoesTo","typeLabel":"object"},"UnlimitedHoursDetails":{"type":"object","additionalProperties":false,"description":"Nothing is specific to an Unlimited Hours line today. `AutoApprove` moved to the service\r\nline as `AutoApproveTime` (ENG-7288).","uniqueKey":"Data.ServiceLines.items.[INDEX].UnlimitedHoursDetails","typeLabel":"object"},"PerHourDetails":{"type":"object","properties":{"RateType":{"type":"object","properties":{"Id":{"type":"integer","description":"Numeric identifier of the coded value (e.g. status, priority, type, or source id).","format":"int64","example":1,"uniqueKey":"Data.ServiceLines.items.[INDEX].PerHourDetails.RateType.Id","typeLabel":"integer\u003cint64>"},"Name":{"type":"string","description":"Display name of the coded value.","uniqueKey":"Data.ServiceLines.items.[INDEX].PerHourDetails.RateType.Name","typeLabel":"string"}},"additionalProperties":false,"description":"A coded value, such as a status, priority, type or source, as an id and a display name.","uniqueKey":"Data.ServiceLines.items.[INDEX].PerHourDetails.RateType","typeLabel":"object"},"HourlyRate":{"oneOf":[{"type":"number","description":"The flat rate charged per hour. Set only when `RateType` is Fixed; null otherwise.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].PerHourDetails.HourlyRate.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"The flat rate charged per hour. Set only when `RateType` is Fixed; null otherwise.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].PerHourDetails.HourlyRate.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.ServiceLines.items.[INDEX].PerHourDetails.HourlyRate","typeLabel":"number\u003cdouble> | null"},"CustomRates":{"type":"object","properties":{"WorkRoles":{"type":"array","items":{"type":"object","properties":{"WorkRoleId":{"type":"integer","description":"The billing role.","format":"int64","uniqueKey":"Data.ServiceLines.items.[INDEX].PerHourDetails.CustomRates.WorkRoles.items.[INDEX].WorkRoleId","typeLabel":"integer\u003cint64>"},"HourlyRate":{"type":"number","description":"Rate charged per hour for this role on this line.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].PerHourDetails.CustomRates.WorkRoles.items.[INDEX].HourlyRate","typeLabel":"number\u003cdouble>"},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code the role's time is posted to. Null when not set.","uniqueKey":"Data.ServiceLines.items.[INDEX].PerHourDetails.CustomRates.WorkRoles.items.[INDEX].CoaCode.oneOf.0","typeLabel":"string"},{"type":"null","description":"Accounting code the role's time is posted to. Null when not set.","uniqueKey":"Data.ServiceLines.items.[INDEX].PerHourDetails.CustomRates.WorkRoles.items.[INDEX].CoaCode.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.ServiceLines.items.[INDEX].PerHourDetails.CustomRates.WorkRoles.items.[INDEX].CoaCode","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"Data.ServiceLines.items.[INDEX].PerHourDetails.CustomRates.WorkRoles.items.[INDEX]","typeLabel":"object"},"description":"The rate per billing role.","uniqueKey":"Data.ServiceLines.items.[INDEX].PerHourDetails.CustomRates.WorkRoles","typeLabel":"object[]"},"WorkTypes":{"type":"array","items":{"type":"object","properties":{"WorkTypeId":{"type":"integer","description":"The work type.","format":"int64","uniqueKey":"Data.ServiceLines.items.[INDEX].PerHourDetails.CustomRates.WorkTypes.items.[INDEX].WorkTypeId","typeLabel":"integer\u003cint64>"},"HourlyMultiplier":{"type":"number","description":"Multiplier applied to the role's rate for this work type on this line.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].PerHourDetails.CustomRates.WorkTypes.items.[INDEX].HourlyMultiplier","typeLabel":"number\u003cdouble>"},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code the work type's time is posted to. Null when not set.","uniqueKey":"Data.ServiceLines.items.[INDEX].PerHourDetails.CustomRates.WorkTypes.items.[INDEX].CoaCode.oneOf.0","typeLabel":"string"},{"type":"null","description":"Accounting code the work type's time is posted to. Null when not set.","uniqueKey":"Data.ServiceLines.items.[INDEX].PerHourDetails.CustomRates.WorkTypes.items.[INDEX].CoaCode.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.ServiceLines.items.[INDEX].PerHourDetails.CustomRates.WorkTypes.items.[INDEX].CoaCode","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"Data.ServiceLines.items.[INDEX].PerHourDetails.CustomRates.WorkTypes.items.[INDEX]","typeLabel":"object"},"description":"The multiplier per work type.","uniqueKey":"Data.ServiceLines.items.[INDEX].PerHourDetails.CustomRates.WorkTypes","typeLabel":"object[]"}},"additionalProperties":false,"description":"The Custom labor rates grid of a Per Hour or Limited Hours line: one row per billing role and per work type.","uniqueKey":"Data.ServiceLines.items.[INDEX].PerHourDetails.CustomRates","typeLabel":"object"}},"additionalProperties":false,"uniqueKey":"Data.ServiceLines.items.[INDEX].PerHourDetails","typeLabel":"object"},"LimitedHoursDetails":{"type":"object","properties":{"ShowRemainingHoursInClientPortal":{"type":"boolean","description":"Whether the client portal shows the client the hours left in the allocation.","uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.ShowRemainingHoursInClientPortal","typeLabel":"boolean"},"AllocatedHours":{"oneOf":[{"type":"number","description":"Hours included each billing period.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.AllocatedHours.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"Hours included each billing period.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.AllocatedHours.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.AllocatedHours","typeLabel":"number\u003cdouble> | null"},"RateType":{"type":"object","properties":{"Id":{"type":"integer","description":"Numeric identifier of the coded value (e.g. status, priority, type, or source id).","format":"int64","example":1,"uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.RateType.Id","typeLabel":"integer\u003cint64>"},"Name":{"type":"string","description":"Display name of the coded value.","uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.RateType.Name","typeLabel":"string"}},"additionalProperties":false,"description":"A coded value, such as a status, priority, type or source, as an id and a display name.","uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.RateType","typeLabel":"object"},"HourlyRate":{"oneOf":[{"type":"number","description":"The flat rate charged per hour. Set only when `RateType` is Fixed; null otherwise.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.HourlyRate.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"The flat rate charged per hour. Set only when `RateType` is Fixed; null otherwise.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.HourlyRate.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.HourlyRate","typeLabel":"number\u003cdouble> | null"},"CustomRates":{"type":"object","properties":{"WorkRoles":{"type":"array","items":{"type":"object","properties":{"WorkRoleId":{"type":"integer","description":"The billing role.","format":"int64","uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles.items.[INDEX].WorkRoleId","typeLabel":"integer\u003cint64>"},"HourlyRate":{"type":"number","description":"Rate charged per hour for this role on this line.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles.items.[INDEX].HourlyRate","typeLabel":"number\u003cdouble>"},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code the role's time is posted to. Null when not set.","uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles.items.[INDEX].CoaCode.oneOf.0","typeLabel":"string"},{"type":"null","description":"Accounting code the role's time is posted to. Null when not set.","uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles.items.[INDEX].CoaCode.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles.items.[INDEX].CoaCode","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles.items.[INDEX]","typeLabel":"object"},"description":"The rate per billing role.","uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.CustomRates.WorkRoles","typeLabel":"object[]"},"WorkTypes":{"type":"array","items":{"type":"object","properties":{"WorkTypeId":{"type":"integer","description":"The work type.","format":"int64","uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes.items.[INDEX].WorkTypeId","typeLabel":"integer\u003cint64>"},"HourlyMultiplier":{"type":"number","description":"Multiplier applied to the role's rate for this work type on this line.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes.items.[INDEX].HourlyMultiplier","typeLabel":"number\u003cdouble>"},"CoaCode":{"oneOf":[{"type":"string","description":"Accounting code the work type's time is posted to. Null when not set.","uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes.items.[INDEX].CoaCode.oneOf.0","typeLabel":"string"},{"type":"null","description":"Accounting code the work type's time is posted to. Null when not set.","uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes.items.[INDEX].CoaCode.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes.items.[INDEX].CoaCode","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes.items.[INDEX]","typeLabel":"object"},"description":"The multiplier per work type.","uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.CustomRates.WorkTypes","typeLabel":"object[]"}},"additionalProperties":false,"description":"The Custom labor rates grid of a Per Hour or Limited Hours line: one row per billing role and per work type.","uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails.CustomRates","typeLabel":"object"}},"additionalProperties":false,"uniqueKey":"Data.ServiceLines.items.[INDEX].LimitedHoursDetails","typeLabel":"object"},"BlockHoursDetails":{"type":"object","properties":{"ShowRemainingHoursInClientPortal":{"type":"boolean","description":"Whether the client portal shows the client the hours left in the block.","uniqueKey":"Data.ServiceLines.items.[INDEX].BlockHoursDetails.ShowRemainingHoursInClientPortal","typeLabel":"boolean"},"TemplateId":{"type":"integer","description":"The Block Hours Template the block was created from. 0 means Custom: no template applies.","format":"int64","uniqueKey":"Data.ServiceLines.items.[INDEX].BlockHoursDetails.TemplateId","typeLabel":"integer\u003cint64>"},"Balance":{"oneOf":[{"type":"number","description":"The block's total balance, in hours.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].BlockHoursDetails.Balance.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"The block's total balance, in hours.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].BlockHoursDetails.Balance.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.ServiceLines.items.[INDEX].BlockHoursDetails.Balance","typeLabel":"number\u003cdouble> | null"},"WarningThreshold":{"oneOf":[{"type":"number","description":"Percentage of the block left at which a low-balance warning is raised, a whole number from\r\n0 to 90. Earlier documented as hours, which it never was.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].BlockHoursDetails.WarningThreshold.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"Percentage of the block left at which a low-balance warning is raised, a whole number from\r\n0 to 90. Earlier documented as hours, which it never was.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].BlockHoursDetails.WarningThreshold.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.ServiceLines.items.[INDEX].BlockHoursDetails.WarningThreshold","typeLabel":"number\u003cdouble> | null"},"OverrunThreshold":{"oneOf":[{"type":"number","description":"Percentage of the block the client may run past zero before the block counts as overrun, a\r\nwhole number from 0 to 50. Earlier documented as hours, which it never was.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].BlockHoursDetails.OverrunThreshold.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"Percentage of the block the client may run past zero before the block counts as overrun, a\r\nwhole number from 0 to 50. Earlier documented as hours, which it never was.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].BlockHoursDetails.OverrunThreshold.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.ServiceLines.items.[INDEX].BlockHoursDetails.OverrunThreshold","typeLabel":"number\u003cdouble> | null"}},"additionalProperties":false,"uniqueKey":"Data.ServiceLines.items.[INDEX].BlockHoursDetails","typeLabel":"object"},"RecurringAmount":{"type":"number","description":"Recurring amount this service line bills each period, before tax.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].RecurringAmount","typeLabel":"number\u003cdouble>"},"RecurringCost":{"type":"number","description":"Recurring cost of this service line's recurring products each period.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].RecurringCost","typeLabel":"number\u003cdouble>"},"LineItems":{"type":"array","items":{"type":"object","properties":{"Id":{"type":"integer","description":"Identifier of this line.","format":"int64","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].Id","typeLabel":"integer\u003cint64>"},"ItemId":{"oneOf":[{"type":"string","description":"The catalog item this line bills, resolving against `GET /v1/items`. Null for a line\r\nthat does not reference a catalog item.","format":"uuid","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].ItemId.oneOf.0","typeLabel":"string\u003cuuid>"},{"type":"null","description":"The catalog item this line bills, resolving against `GET /v1/items`. Null for a line\r\nthat does not reference a catalog item.","format":"uuid","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].ItemId.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].ItemId","typeLabel":"string\u003cuuid> | null"},"ItemType":{"type":"object","properties":{"Id":{"type":"integer","description":"Numeric identifier of the coded value (e.g. status, priority, type, or source id).","format":"int64","example":1,"uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].ItemType.Id","typeLabel":"integer\u003cint64>"},"Name":{"type":"string","description":"Display name of the coded value.","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].ItemType.Name","typeLabel":"string"}},"additionalProperties":false,"description":"A coded value, such as a status, priority, type or source, as an id and a display name.","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].ItemType","typeLabel":"object"},"Name":{"type":"string","description":"Name of the line as billed.","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].Name","typeLabel":"string"},"Description":{"oneOf":[{"type":"string","description":"Description of the line as billed, if any.","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].Description.oneOf.0","typeLabel":"string"},{"type":"null","description":"Description of the line as billed, if any.","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].Description.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].Description","typeLabel":"string | null"},"Quantity":{"oneOf":[{"type":"number","description":"Quantity billed.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].Quantity.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"Quantity billed.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].Quantity.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].Quantity","typeLabel":"number\u003cdouble> | null"},"UnitCost":{"oneOf":[{"type":"number","description":"Unit cost of the line. Renamed from `Cost` (ENG-7288), the name items and invoice lines use.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].UnitCost.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"Unit cost of the line. Renamed from `Cost` (ENG-7288), the name items and invoice lines use.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].UnitCost.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].UnitCost","typeLabel":"number\u003cdouble> | null"},"UnitPrice":{"type":"number","description":"Unit price charged.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].UnitPrice","typeLabel":"number\u003cdouble>"},"DiscountPercent":{"oneOf":[{"type":"number","description":"Discount percentage applied to this line, 0-100.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].DiscountPercent.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"Discount percentage applied to this line, 0-100.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].DiscountPercent.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].DiscountPercent","typeLabel":"number\u003cdouble> | null"},"StartDate":{"oneOf":[{"type":"string","description":"Date this line's coverage starts, if it is date-scoped. A calendar date.","format":"date","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].StartDate.oneOf.0","typeLabel":"string\u003cdate>"},{"type":"null","description":"Date this line's coverage starts, if it is date-scoped. A calendar date.","format":"date","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].StartDate.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].StartDate","typeLabel":"string\u003cdate> | null"},"EndDate":{"oneOf":[{"type":"string","description":"Date this line's coverage ends, if it is date-scoped. A calendar date.","format":"date","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].EndDate.oneOf.0","typeLabel":"string\u003cdate>"},{"type":"null","description":"Date this line's coverage ends, if it is date-scoped. A calendar date.","format":"date","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].EndDate.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].EndDate","typeLabel":"string\u003cdate> | null"},"Tax":{"type":"object","properties":{"Id":{"type":"integer","description":"Numeric identifier of the coded value (e.g. status, priority, type, or source id).","format":"int64","example":1,"uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].Tax.Id","typeLabel":"integer\u003cint64>"},"Name":{"type":"string","description":"Display name of the coded value.","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].Tax.Name","typeLabel":"string"}},"additionalProperties":false,"description":"A coded value, such as a status, priority, type or source, as an id and a display name.","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].Tax","typeLabel":"object"},"Amount":{"type":"number","description":"Line total after discount, before tax.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].Amount","typeLabel":"number\u003cdouble>"},"TaxAmount":{"oneOf":[{"type":"number","description":"Tax on this line.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].TaxAmount.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","description":"Tax on this line.","format":"double","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].TaxAmount.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].TaxAmount","typeLabel":"number\u003cdouble> | null"},"BillableStatus":{"type":"object","properties":{"Id":{"type":"integer","description":"Numeric identifier of the coded value (e.g. status, priority, type, or source id).","format":"int64","example":1,"uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].BillableStatus.Id","typeLabel":"integer\u003cint64>"},"Name":{"type":"string","description":"Display name of the coded value.","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].BillableStatus.Name","typeLabel":"string"}},"additionalProperties":false,"description":"A coded value, such as a status, priority, type or source, as an id and a display name.","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX].BillableStatus","typeLabel":"object"}},"additionalProperties":false,"description":"One product, bundle or labor charge billed on a contract's service line.","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems.items.[INDEX]","typeLabel":"object"},"description":"The actual products/labor billed on this line. Empty array when nothing is billed on it\r\nyet; never null.","uniqueKey":"Data.ServiceLines.items.[INDEX].LineItems","typeLabel":"object[]"}},"additionalProperties":false,"description":"One service line inside a contract, with the products/labor billed on it.","uniqueKey":"Data.ServiceLines.items.[INDEX]","typeLabel":"object"},"description":"The contract's service lines. Empty when the contract has none; never null.","uniqueKey":"Data.ServiceLines","typeLabel":"object[]"}},"additionalProperties":false,"description":"Everything about one contract: the client and locations it covers, its billing schedule, and\r\neach service line with the actual products/labor billed on it.","uniqueKey":"Data","typeLabel":"object"},"DataContext":{"oneOf":[{"type":"object","additionalProperties":false,"example":null,"uniqueKey":"DataContext.oneOf.0","typeLabel":"object"},{"type":"null","additionalProperties":false,"example":null,"uniqueKey":"DataContext.oneOf.1","typeLabel":"null"}],"uniqueKey":"DataContext","typeLabel":"object | null"},"Notifications":{"type":"array","items":{"type":"object","properties":{"Code":{"pattern":"^[0-9]{6}$","type":"string","description":"6-digit MMTTNN error code. See the Public API error-code registry.","example":"070101","uniqueKey":"Notifications.items.[INDEX].Code","typeLabel":"string"},"Message":{"type":"string","uniqueKey":"Notifications.items.[INDEX].Message","typeLabel":"string"},"PropertyName":{"oneOf":[{"type":"string","uniqueKey":"Notifications.items.[INDEX].PropertyName.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"Notifications.items.[INDEX].PropertyName.oneOf.1","typeLabel":"null"}],"uniqueKey":"Notifications.items.[INDEX].PropertyName","typeLabel":"string | null"},"ActionHint":{"oneOf":[{"type":"string","uniqueKey":"Notifications.items.[INDEX].ActionHint.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"Notifications.items.[INDEX].ActionHint.oneOf.1","typeLabel":"null"}],"uniqueKey":"Notifications.items.[INDEX].ActionHint","typeLabel":"string | null"},"DocUrl":{"oneOf":[{"type":"string","uniqueKey":"Notifications.items.[INDEX].DocUrl.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"Notifications.items.[INDEX].DocUrl.oneOf.1","typeLabel":"null"}],"uniqueKey":"Notifications.items.[INDEX].DocUrl","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"Notifications.items.[INDEX]","typeLabel":"object"},"uniqueKey":"Notifications","typeLabel":"object[]"}},"additionalProperties":false,"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"StatusCode":100,"IsSuccess":true,"Data":{"Id":4021,"Name":"All Labor Terms Example","Status":{"Id":1,"Name":"\u003cstring>"},"Client":{"Id":1,"Name":"\u003cstring>"},"LocationIds":[123],"IsForAllLocations":true,"CreatedOn":"2023-11-07T05:31:56Z","UpdatedOn":"2023-11-07T05:31:56Z","Reference":"MSA-2025-014","StartDate":"2023-12-25","EndDate":"2023-12-25","RepeatPeriod":{"Id":1,"Name":"\u003cstring>"},"DaysBeforeInvoiceCreation":123,"DaysUntilDue":30,"ProrateType":{"Id":1,"Name":"\u003cstring>"},"AutoInvoiceTicketProducts":true,"InvoiceTemplateId":123,"InvoiceEmailTemplateId":123,"BrandingThemeId":"3c90c3cc-0d44-4b50-8888-8dd25736052a","AutoApproveAndSend":true,"Contacts":[{"Id":1,"Name":"\u003cstring>"}],"RecurringAmount":6870,"RecurringCost":2981.36,"ServiceLines":[{"Id":88214,"Name":"\u003cstring>","CreatedOn":"2023-11-07T05:31:56Z","UpdatedOn":"2023-11-07T05:31:56Z","LaborTerms":{"Id":1,"Name":"\u003cstring>"},"WorkTypes":[{"Id":1,"Name":"\u003cstring>"}],"WorkRoles":[{"Id":1,"Name":"\u003cstring>"}],"AutoApproveTime":true,"AutoInvoiceTime":true,"IncludedTimeGoesTo":{"Id":1,"Name":"\u003cstring>"},"UnlimitedHoursDetails":{},"PerHourDetails":{"RateType":{"Id":1,"Name":"\u003cstring>"},"HourlyRate":123,"CustomRates":{"WorkRoles":[{"WorkRoleId":123,"HourlyRate":123,"CoaCode":"\u003cstring>"}],"WorkTypes":[{"WorkTypeId":123,"HourlyMultiplier":123,"CoaCode":"\u003cstring>"}]}},"LimitedHoursDetails":{"ShowRemainingHoursInClientPortal":true,"AllocatedHours":123,"RateType":{"Id":1,"Name":"\u003cstring>"},"HourlyRate":123,"CustomRates":{"WorkRoles":[{"WorkRoleId":123,"HourlyRate":123,"CoaCode":"\u003cstring>"}],"WorkTypes":[{"WorkTypeId":123,"HourlyMultiplier":123,"CoaCode":"\u003cstring>"}]}},"BlockHoursDetails":{"ShowRemainingHoursInClientPortal":true,"TemplateId":123,"Balance":123,"WarningThreshold":123,"OverrunThreshold":123},"RecurringAmount":123,"RecurringCost":123,"LineItems":[{"Id":123,"ItemId":"3c90c3cc-0d44-4b50-8888-8dd25736052a","ItemType":{"Id":1,"Name":"\u003cstring>"},"Name":"\u003cstring>","Description":"\u003cstring>","Quantity":123,"UnitCost":123,"UnitPrice":123,"DiscountPercent":123,"StartDate":"2023-12-25","EndDate":"2023-12-25","Tax":{"Id":1,"Name":"\u003cstring>"},"Amount":123,"TaxAmount":123,"BillableStatus":{"Id":1,"Name":"\u003cstring>"}}]}]},"DataContext":null,"Notifications":[{"Code":"070101","Message":"\u003cstring>","PropertyName":"\u003cstring>","ActionHint":"\u003cstring>","DocUrl":"\u003cstring>"}]}}},"exampleType":"generated"}},"exampleType":"generated"},"599283e6-cb8b-4806-89ca-133ab3519cec":{"description":"Bad Request","content":{"text/plain":{"schema":{"type":"object","properties":{"StatusCode":{"enum":[100,101,102,103,200,201,202,203,204,205,206,207,208,226,300,301,302,303,304,305,306,307,308,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,421,422,423,424,426,428,429,431,451,500,501,502,503,504,505,506,507,508,510,511],"type":"integer","format":"int32","uniqueKey":"StatusCode","typeLabel":"enum\u003cinteger>"},"IsSuccess":{"type":"boolean","uniqueKey":"IsSuccess","typeLabel":"boolean"},"Data":{"oneOf":[{},{"type":"null","uniqueKey":"Data.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data","typeLabel":"null"},"DataContext":{"type":"object","properties":{"TraceId":{"oneOf":[{"type":"string","description":"Request correlation id. Quote this when reporting a problem.","uniqueKey":"DataContext.TraceId.oneOf.0","typeLabel":"string"},{"type":"null","description":"Request correlation id. Quote this when reporting a problem.","uniqueKey":"DataContext.TraceId.oneOf.1","typeLabel":"null"}],"uniqueKey":"DataContext.TraceId","typeLabel":"string | null"}},"additionalProperties":false,"description":"The `DataContext` of an error response: carries the correlation id for the failed\r\nrequest.","uniqueKey":"DataContext","typeLabel":"object"},"Notifications":{"type":"array","items":{"type":"object","properties":{"Code":{"pattern":"^[0-9]{6}$","type":"string","description":"6-digit MMTTNN error code. See the Public API error-code registry.","example":"070101","uniqueKey":"Notifications.items.[INDEX].Code","typeLabel":"string"},"Message":{"type":"string","uniqueKey":"Notifications.items.[INDEX].Message","typeLabel":"string"},"PropertyName":{"oneOf":[{"type":"string","uniqueKey":"Notifications.items.[INDEX].PropertyName.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"Notifications.items.[INDEX].PropertyName.oneOf.1","typeLabel":"null"}],"uniqueKey":"Notifications.items.[INDEX].PropertyName","typeLabel":"string | null"},"ActionHint":{"oneOf":[{"type":"string","uniqueKey":"Notifications.items.[INDEX].ActionHint.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"Notifications.items.[INDEX].ActionHint.oneOf.1","typeLabel":"null"}],"uniqueKey":"Notifications.items.[INDEX].ActionHint","typeLabel":"string | null"},"DocUrl":{"oneOf":[{"type":"string","uniqueKey":"Notifications.items.[INDEX].DocUrl.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"Notifications.items.[INDEX].DocUrl.oneOf.1","typeLabel":"null"}],"uniqueKey":"Notifications.items.[INDEX].DocUrl","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"Notifications.items.[INDEX]","typeLabel":"object"},"uniqueKey":"Notifications","typeLabel":"object[]"}},"additionalProperties":false,"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"StatusCode":100,"IsSuccess":true,"Data":"\u003cunknown>","DataContext":{"TraceId":"\u003cstring>"},"Notifications":[{"Code":"070101","Message":"\u003cstring>","PropertyName":"\u003cstring>","ActionHint":"\u003cstring>","DocUrl":"\u003cstring>"}]}}},"exampleType":"generated"},"application/json":{"schema":{"type":"object","properties":{"StatusCode":{"enum":[100,101,102,103,200,201,202,203,204,205,206,207,208,226,300,301,302,303,304,305,306,307,308,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,421,422,423,424,426,428,429,431,451,500,501,502,503,504,505,506,507,508,510,511],"type":"integer","format":"int32","uniqueKey":"StatusCode","typeLabel":"enum\u003cinteger>"},"IsSuccess":{"type":"boolean","uniqueKey":"IsSuccess","typeLabel":"boolean"},"Data":{"oneOf":[{},{"type":"null","uniqueKey":"Data.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data","typeLabel":"null"},"DataContext":{"type":"object","properties":{"TraceId":{"oneOf":[{"type":"string","description":"Request correlation id. Quote this when reporting a problem.","uniqueKey":"DataContext.TraceId.oneOf.0","typeLabel":"string"},{"type":"null","description":"Request correlation id. Quote this when reporting a problem.","uniqueKey":"DataContext.TraceId.oneOf.1","typeLabel":"null"}],"uniqueKey":"DataContext.TraceId","typeLabel":"string | null"}},"additionalProperties":false,"description":"The `DataContext` of an error response: carries the correlation id for the failed\r\nrequest.","uniqueKey":"DataContext","typeLabel":"object"},"Notifications":{"type":"array","items":{"type":"object","properties":{"Code":{"pattern":"^[0-9]{6}$","type":"string","description":"6-digit MMTTNN error code. See the Public API error-code registry.","example":"070101","uniqueKey":"Notifications.items.[INDEX].Code","typeLabel":"string"},"Message":{"type":"string","uniqueKey":"Notifications.items.[INDEX].Message","typeLabel":"string"},"PropertyName":{"oneOf":[{"type":"string","uniqueKey":"Notifications.items.[INDEX].PropertyName.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"Notifications.items.[INDEX].PropertyName.oneOf.1","typeLabel":"null"}],"uniqueKey":"Notifications.items.[INDEX].PropertyName","typeLabel":"string | null"},"ActionHint":{"oneOf":[{"type":"string","uniqueKey":"Notifications.items.[INDEX].ActionHint.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"Notifications.items.[INDEX].ActionHint.oneOf.1","typeLabel":"null"}],"uniqueKey":"Notifications.items.[INDEX].ActionHint","typeLabel":"string | null"},"DocUrl":{"oneOf":[{"type":"string","uniqueKey":"Notifications.items.[INDEX].DocUrl.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"Notifications.items.[INDEX].DocUrl.oneOf.1","typeLabel":"null"}],"uniqueKey":"Notifications.items.[INDEX].DocUrl","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"Notifications.items.[INDEX]","typeLabel":"object"},"uniqueKey":"Notifications","typeLabel":"object[]"}},"additionalProperties":false,"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"StatusCode":100,"IsSuccess":true,"Data":"\u003cunknown>","DataContext":{"TraceId":"\u003cstring>"},"Notifications":[{"Code":"070101","Message":"\u003cstring>","PropertyName":"\u003cstring>","ActionHint":"\u003cstring>","DocUrl":"\u003cstring>"}]}}},"exampleType":"generated"},"text/json":{"schema":{"type":"object","properties":{"StatusCode":{"enum":[100,101,102,103,200,201,202,203,204,205,206,207,208,226,300,301,302,303,304,305,306,307,308,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,421,422,423,424,426,428,429,431,451,500,501,502,503,504,505,506,507,508,510,511],"type":"integer","format":"int32","uniqueKey":"StatusCode","typeLabel":"enum\u003cinteger>"},"IsSuccess":{"type":"boolean","uniqueKey":"IsSuccess","typeLabel":"boolean"},"Data":{"oneOf":[{},{"type":"null","uniqueKey":"Data.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data","typeLabel":"null"},"DataContext":{"type":"object","properties":{"TraceId":{"oneOf":[{"type":"string","description":"Request correlation id. Quote this when reporting a problem.","uniqueKey":"DataContext.TraceId.oneOf.0","typeLabel":"string"},{"type":"null","description":"Request correlation id. Quote this when reporting a problem.","uniqueKey":"DataContext.TraceId.oneOf.1","typeLabel":"null"}],"uniqueKey":"DataContext.TraceId","typeLabel":"string | null"}},"additionalProperties":false,"description":"The `DataContext` of an error response: carries the correlation id for the failed\r\nrequest.","uniqueKey":"DataContext","typeLabel":"object"},"Notifications":{"type":"array","items":{"type":"object","properties":{"Code":{"pattern":"^[0-9]{6}$","type":"string","description":"6-digit MMTTNN error code. See the Public API error-code registry.","example":"070101","uniqueKey":"Notifications.items.[INDEX].Code","typeLabel":"string"},"Message":{"type":"string","uniqueKey":"Notifications.items.[INDEX].Message","typeLabel":"string"},"PropertyName":{"oneOf":[{"type":"string","uniqueKey":"Notifications.items.[INDEX].PropertyName.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"Notifications.items.[INDEX].PropertyName.oneOf.1","typeLabel":"null"}],"uniqueKey":"Notifications.items.[INDEX].PropertyName","typeLabel":"string | null"},"ActionHint":{"oneOf":[{"type":"string","uniqueKey":"Notifications.items.[INDEX].ActionHint.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"Notifications.items.[INDEX].ActionHint.oneOf.1","typeLabel":"null"}],"uniqueKey":"Notifications.items.[INDEX].ActionHint","typeLabel":"string | null"},"DocUrl":{"oneOf":[{"type":"string","uniqueKey":"Notifications.items.[INDEX].DocUrl.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"Notifications.items.[INDEX].DocUrl.oneOf.1","typeLabel":"null"}],"uniqueKey":"Notifications.items.[INDEX].DocUrl","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"Notifications.items.[INDEX]","typeLabel":"object"},"uniqueKey":"Notifications","typeLabel":"object[]"}},"additionalProperties":false,"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"StatusCode":100,"IsSuccess":true,"Data":"\u003cunknown>","DataContext":{"TraceId":"\u003cstring>"},"Notifications":[{"Code":"070101","Message":"\u003cstring>","PropertyName":"\u003cstring>","ActionHint":"\u003cstring>","DocUrl":"\u003cstring>"}]}}},"exampleType":"generated"}},"exampleType":"generated"},"61f99471-0627-4cf0-9376-fc98cdf4ada3":{"description":"Unauthorized","content":{"text/plain":{"schema":{"type":"object","properties":{"StatusCode":{"enum":[100,101,102,103,200,201,202,203,204,205,206,207,208,226,300,301,302,303,304,305,306,307,308,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,421,422,423,424,426,428,429,431,451,500,501,502,503,504,505,506,507,508,510,511],"type":"integer","format":"int32","uniqueKey":"StatusCode","typeLabel":"enum\u003cinteger>"},"IsSuccess":{"type":"boolean","uniqueKey":"IsSuccess","typeLabel":"boolean"},"Data":{"oneOf":[{},{"type":"null","uniqueKey":"Data.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data","typeLabel":"null"},"DataContext":{"type":"object","properties":{"TraceId":{"oneOf":[{"type":"string","description":"Request correlation id. Quote this when reporting a problem.","uniqueKey":"DataContext.TraceId.oneOf.0","typeLabel":"string"},{"type":"null","description":"Request correlation id. Quote this when reporting a problem.","uniqueKey":"DataContext.TraceId.oneOf.1","typeLabel":"null"}],"uniqueKey":"DataContext.TraceId","typeLabel":"string | null"}},"additionalProperties":false,"description":"The `DataContext` of an error response: carries the correlation id for the failed\r\nrequest.","uniqueKey":"DataContext","typeLabel":"object"},"Notifications":{"type":"array","items":{"type":"object","properties":{"Code":{"pattern":"^[0-9]{6}$","type":"string","description":"6-digit MMTTNN error code. See the Public API error-code registry.","example":"070101","uniqueKey":"Notifications.items.[INDEX].Code","typeLabel":"string"},"Message":{"type":"string","uniqueKey":"Notifications.items.[INDEX].Message","typeLabel":"string"},"PropertyName":{"oneOf":[{"type":"string","uniqueKey":"Notifications.items.[INDEX].PropertyName.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"Notifications.items.[INDEX].PropertyName.oneOf.1","typeLabel":"null"}],"uniqueKey":"Notifications.items.[INDEX].PropertyName","typeLabel":"string | null"},"ActionHint":{"oneOf":[{"type":"string","uniqueKey":"Notifications.items.[INDEX].ActionHint.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"Notifications.items.[INDEX].ActionHint.oneOf.1","typeLabel":"null"}],"uniqueKey":"Notifications.items.[INDEX].ActionHint","typeLabel":"string | null"},"DocUrl":{"oneOf":[{"type":"string","uniqueKey":"Notifications.items.[INDEX].DocUrl.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"Notifications.items.[INDEX].DocUrl.oneOf.1","typeLabel":"null"}],"uniqueKey":"Notifications.items.[INDEX].DocUrl","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"Notifications.items.[INDEX]","typeLabel":"object"},"uniqueKey":"Notifications","typeLabel":"object[]"}},"additionalProperties":false,"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"StatusCode":100,"IsSuccess":true,"Data":"\u003cunknown>","DataContext":{"TraceId":"\u003cstring>"},"Notifications":[{"Code":"070101","Message":"\u003cstring>","PropertyName":"\u003cstring>","ActionHint":"\u003cstring>","DocUrl":"\u003cstring>"}]}}},"exampleType":"generated"},"application/json":{"schema":{"type":"object","properties":{"StatusCode":{"enum":[100,101,102,103,200,201,202,203,204,205,206,207,208,226,300,301,302,303,304,305,306,307,308,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,421,422,423,424,426,428,429,431,451,500,501,502,503,504,505,506,507,508,510,511],"type":"integer","format":"int32","uniqueKey":"StatusCode","typeLabel":"enum\u003cinteger>"},"IsSuccess":{"type":"boolean","uniqueKey":"IsSuccess","typeLabel":"boolean"},"Data":{"oneOf":[{},{"type":"null","uniqueKey":"Data.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data","typeLabel":"null"},"DataContext":{"type":"object","properties":{"TraceId":{"oneOf":[{"type":"string","description":"Request correlation id. Quote this when reporting a problem.","uniqueKey":"DataContext.TraceId.oneOf.0","typeLabel":"string"},{"type":"null","description":"Request correlation id. Quote this when reporting a problem.","uniqueKey":"DataContext.TraceId.oneOf.1","typeLabel":"null"}],"uniqueKey":"DataContext.TraceId","typeLabel":"string | null"}},"additionalProperties":false,"description":"The `DataContext` of an error response: carries the correlation id for the failed\r\nrequest.","uniqueKey":"DataContext","typeLabel":"object"},"Notifications":{"type":"array","items":{"type":"object","properties":{"Code":{"pattern":"^[0-9]{6}$","type":"string","description":"6-digit MMTTNN error code. See the Public API error-code registry.","example":"070101","uniqueKey":"Notifications.items.[INDEX].Code","typeLabel":"string"},"Message":{"type":"string","uniqueKey":"Notifications.items.[INDEX].Message","typeLabel":"string"},"PropertyName":{"oneOf":[{"type":"string","uniqueKey":"Notifications.items.[INDEX].PropertyName.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"Notifications.items.[INDEX].PropertyName.oneOf.1","typeLabel":"null"}],"uniqueKey":"Notifications.items.[INDEX].PropertyName","typeLabel":"string | null"},"ActionHint":{"oneOf":[{"type":"string","uniqueKey":"Notifications.items.[INDEX].ActionHint.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"Notifications.items.[INDEX].ActionHint.oneOf.1","typeLabel":"null"}],"uniqueKey":"Notifications.items.[INDEX].ActionHint","typeLabel":"string | null"},"DocUrl":{"oneOf":[{"type":"string","uniqueKey":"Notifications.items.[INDEX].DocUrl.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"Notifications.items.[INDEX].DocUrl.oneOf.1","typeLabel":"null"}],"uniqueKey":"Notifications.items.[INDEX].DocUrl","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"Notifications.items.[INDEX]","typeLabel":"object"},"uniqueKey":"Notifications","typeLabel":"object[]"}},"additionalProperties":false,"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"StatusCode":100,"IsSuccess":true,"Data":"\u003cunknown>","DataContext":{"TraceId":"\u003cstring>"},"Notifications":[{"Code":"070101","Message":"\u003cstring>","PropertyName":"\u003cstring>","ActionHint":"\u003cstring>","DocUrl":"\u003cstring>"}]}}},"exampleType":"generated"},"text/json":{"schema":{"type":"object","properties":{"StatusCode":{"enum":[100,101,102,103,200,201,202,203,204,205,206,207,208,226,300,301,302,303,304,305,306,307,308,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,421,422,423,424,426,428,429,431,451,500,501,502,503,504,505,506,507,508,510,511],"type":"integer","format":"int32","uniqueKey":"StatusCode","typeLabel":"enum\u003cinteger>"},"IsSuccess":{"type":"boolean","uniqueKey":"IsSuccess","typeLabel":"boolean"},"Data":{"oneOf":[{},{"type":"null","uniqueKey":"Data.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data","typeLabel":"null"},"DataContext":{"type":"object","properties":{"TraceId":{"oneOf":[{"type":"string","description":"Request correlation id. Quote this when reporting a problem.","uniqueKey":"DataContext.TraceId.oneOf.0","typeLabel":"string"},{"type":"null","description":"Request correlation id. Quote this when reporting a problem.","uniqueKey":"DataContext.TraceId.oneOf.1","typeLabel":"null"}],"uniqueKey":"DataContext.TraceId","typeLabel":"string | null"}},"additionalProperties":false,"description":"The `DataContext` of an error response: carries the correlation id for the failed\r\nrequest.","uniqueKey":"DataContext","typeLabel":"object"},"Notifications":{"type":"array","items":{"type":"object","properties":{"Code":{"pattern":"^[0-9]{6}$","type":"string","description":"6-digit MMTTNN error code. See the Public API error-code registry.","example":"070101","uniqueKey":"Notifications.items.[INDEX].Code","typeLabel":"string"},"Message":{"type":"string","uniqueKey":"Notifications.items.[INDEX].Message","typeLabel":"string"},"PropertyName":{"oneOf":[{"type":"string","uniqueKey":"Notifications.items.[INDEX].PropertyName.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"Notifications.items.[INDEX].PropertyName.oneOf.1","typeLabel":"null"}],"uniqueKey":"Notifications.items.[INDEX].PropertyName","typeLabel":"string | null"},"ActionHint":{"oneOf":[{"type":"string","uniqueKey":"Notifications.items.[INDEX].ActionHint.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"Notifications.items.[INDEX].ActionHint.oneOf.1","typeLabel":"null"}],"uniqueKey":"Notifications.items.[INDEX].ActionHint","typeLabel":"string | null"},"DocUrl":{"oneOf":[{"type":"string","uniqueKey":"Notifications.items.[INDEX].DocUrl.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"Notifications.items.[INDEX].DocUrl.oneOf.1","typeLabel":"null"}],"uniqueKey":"Notifications.items.[INDEX].DocUrl","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"Notifications.items.[INDEX]","typeLabel":"object"},"uniqueKey":"Notifications","typeLabel":"object[]"}},"additionalProperties":false,"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"StatusCode":100,"IsSuccess":true,"Data":"\u003cunknown>","DataContext":{"TraceId":"\u003cstring>"},"Notifications":[{"Code":"070101","Message":"\u003cstring>","PropertyName":"\u003cstring>","ActionHint":"\u003cstring>","DocUrl":"\u003cstring>"}]}}},"exampleType":"generated"}},"exampleType":"generated"},"9aa6c055-9049-4fd3-a19e-e0bd0fc957eb":{"description":"Internal Server Error","content":{"text/plain":{"schema":{"type":"object","properties":{"StatusCode":{"enum":[100,101,102,103,200,201,202,203,204,205,206,207,208,226,300,301,302,303,304,305,306,307,308,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,421,422,423,424,426,428,429,431,451,500,501,502,503,504,505,506,507,508,510,511],"type":"integer","format":"int32","uniqueKey":"StatusCode","typeLabel":"enum\u003cinteger>"},"IsSuccess":{"type":"boolean","uniqueKey":"IsSuccess","typeLabel":"boolean"},"Data":{"oneOf":[{},{"type":"null","uniqueKey":"Data.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data","typeLabel":"null"},"DataContext":{"type":"object","properties":{"TraceId":{"oneOf":[{"type":"string","description":"Request correlation id. Quote this when reporting a problem.","uniqueKey":"DataContext.TraceId.oneOf.0","typeLabel":"string"},{"type":"null","description":"Request correlation id. Quote this when reporting a problem.","uniqueKey":"DataContext.TraceId.oneOf.1","typeLabel":"null"}],"uniqueKey":"DataContext.TraceId","typeLabel":"string | null"}},"additionalProperties":false,"description":"The `DataContext` of an error response: carries the correlation id for the failed\r\nrequest.","uniqueKey":"DataContext","typeLabel":"object"},"Notifications":{"type":"array","items":{"type":"object","properties":{"Code":{"pattern":"^[0-9]{6}$","type":"string","description":"6-digit MMTTNN error code. See the Public API error-code registry.","example":"070101","uniqueKey":"Notifications.items.[INDEX].Code","typeLabel":"string"},"Message":{"type":"string","uniqueKey":"Notifications.items.[INDEX].Message","typeLabel":"string"},"PropertyName":{"oneOf":[{"type":"string","uniqueKey":"Notifications.items.[INDEX].PropertyName.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"Notifications.items.[INDEX].PropertyName.oneOf.1","typeLabel":"null"}],"uniqueKey":"Notifications.items.[INDEX].PropertyName","typeLabel":"string | null"},"ActionHint":{"oneOf":[{"type":"string","uniqueKey":"Notifications.items.[INDEX].ActionHint.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"Notifications.items.[INDEX].ActionHint.oneOf.1","typeLabel":"null"}],"uniqueKey":"Notifications.items.[INDEX].ActionHint","typeLabel":"string | null"},"DocUrl":{"oneOf":[{"type":"string","uniqueKey":"Notifications.items.[INDEX].DocUrl.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"Notifications.items.[INDEX].DocUrl.oneOf.1","typeLabel":"null"}],"uniqueKey":"Notifications.items.[INDEX].DocUrl","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"Notifications.items.[INDEX]","typeLabel":"object"},"uniqueKey":"Notifications","typeLabel":"object[]"}},"additionalProperties":false,"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"StatusCode":100,"IsSuccess":true,"Data":"\u003cunknown>","DataContext":{"TraceId":"\u003cstring>"},"Notifications":[{"Code":"070101","Message":"\u003cstring>","PropertyName":"\u003cstring>","ActionHint":"\u003cstring>","DocUrl":"\u003cstring>"}]}}},"exampleType":"generated"},"application/json":{"schema":{"type":"object","properties":{"StatusCode":{"enum":[100,101,102,103,200,201,202,203,204,205,206,207,208,226,300,301,302,303,304,305,306,307,308,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,421,422,423,424,426,428,429,431,451,500,501,502,503,504,505,506,507,508,510,511],"type":"integer","format":"int32","uniqueKey":"StatusCode","typeLabel":"enum\u003cinteger>"},"IsSuccess":{"type":"boolean","uniqueKey":"IsSuccess","typeLabel":"boolean"},"Data":{"oneOf":[{},{"type":"null","uniqueKey":"Data.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data","typeLabel":"null"},"DataContext":{"type":"object","properties":{"TraceId":{"oneOf":[{"type":"string","description":"Request correlation id. Quote this when reporting a problem.","uniqueKey":"DataContext.TraceId.oneOf.0","typeLabel":"string"},{"type":"null","description":"Request correlation id. Quote this when reporting a problem.","uniqueKey":"DataContext.TraceId.oneOf.1","typeLabel":"null"}],"uniqueKey":"DataContext.TraceId","typeLabel":"string | null"}},"additionalProperties":false,"description":"The `DataContext` of an error response: carries the correlation id for the failed\r\nrequest.","uniqueKey":"DataContext","typeLabel":"object"},"Notifications":{"type":"array","items":{"type":"object","properties":{"Code":{"pattern":"^[0-9]{6}$","type":"string","description":"6-digit MMTTNN error code. See the Public API error-code registry.","example":"070101","uniqueKey":"Notifications.items.[INDEX].Code","typeLabel":"string"},"Message":{"type":"string","uniqueKey":"Notifications.items.[INDEX].Message","typeLabel":"string"},"PropertyName":{"oneOf":[{"type":"string","uniqueKey":"Notifications.items.[INDEX].PropertyName.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"Notifications.items.[INDEX].PropertyName.oneOf.1","typeLabel":"null"}],"uniqueKey":"Notifications.items.[INDEX].PropertyName","typeLabel":"string | null"},"ActionHint":{"oneOf":[{"type":"string","uniqueKey":"Notifications.items.[INDEX].ActionHint.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"Notifications.items.[INDEX].ActionHint.oneOf.1","typeLabel":"null"}],"uniqueKey":"Notifications.items.[INDEX].ActionHint","typeLabel":"string | null"},"DocUrl":{"oneOf":[{"type":"string","uniqueKey":"Notifications.items.[INDEX].DocUrl.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"Notifications.items.[INDEX].DocUrl.oneOf.1","typeLabel":"null"}],"uniqueKey":"Notifications.items.[INDEX].DocUrl","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"Notifications.items.[INDEX]","typeLabel":"object"},"uniqueKey":"Notifications","typeLabel":"object[]"}},"additionalProperties":false,"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"StatusCode":100,"IsSuccess":true,"Data":"\u003cunknown>","DataContext":{"TraceId":"\u003cstring>"},"Notifications":[{"Code":"070101","Message":"\u003cstring>","PropertyName":"\u003cstring>","ActionHint":"\u003cstring>","DocUrl":"\u003cstring>"}]}}},"exampleType":"generated"},"text/json":{"schema":{"type":"object","properties":{"StatusCode":{"enum":[100,101,102,103,200,201,202,203,204,205,206,207,208,226,300,301,302,303,304,305,306,307,308,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,421,422,423,424,426,428,429,431,451,500,501,502,503,504,505,506,507,508,510,511],"type":"integer","format":"int32","uniqueKey":"StatusCode","typeLabel":"enum\u003cinteger>"},"IsSuccess":{"type":"boolean","uniqueKey":"IsSuccess","typeLabel":"boolean"},"Data":{"oneOf":[{},{"type":"null","uniqueKey":"Data.oneOf.1","typeLabel":"null"}],"uniqueKey":"Data","typeLabel":"null"},"DataContext":{"type":"object","properties":{"TraceId":{"oneOf":[{"type":"string","description":"Request correlation id. Quote this when reporting a problem.","uniqueKey":"DataContext.TraceId.oneOf.0","typeLabel":"string"},{"type":"null","description":"Request correlation id. Quote this when reporting a problem.","uniqueKey":"DataContext.TraceId.oneOf.1","typeLabel":"null"}],"uniqueKey":"DataContext.TraceId","typeLabel":"string | null"}},"additionalProperties":false,"description":"The `DataContext` of an error response: carries the correlation id for the failed\r\nrequest.","uniqueKey":"DataContext","typeLabel":"object"},"Notifications":{"type":"array","items":{"type":"object","properties":{"Code":{"pattern":"^[0-9]{6}$","type":"string","description":"6-digit MMTTNN error code. See the Public API error-code registry.","example":"070101","uniqueKey":"Notifications.items.[INDEX].Code","typeLabel":"string"},"Message":{"type":"string","uniqueKey":"Notifications.items.[INDEX].Message","typeLabel":"string"},"PropertyName":{"oneOf":[{"type":"string","uniqueKey":"Notifications.items.[INDEX].PropertyName.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"Notifications.items.[INDEX].PropertyName.oneOf.1","typeLabel":"null"}],"uniqueKey":"Notifications.items.[INDEX].PropertyName","typeLabel":"string | null"},"ActionHint":{"oneOf":[{"type":"string","uniqueKey":"Notifications.items.[INDEX].ActionHint.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"Notifications.items.[INDEX].ActionHint.oneOf.1","typeLabel":"null"}],"uniqueKey":"Notifications.items.[INDEX].ActionHint","typeLabel":"string | null"},"DocUrl":{"oneOf":[{"type":"string","uniqueKey":"Notifications.items.[INDEX].DocUrl.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"Notifications.items.[INDEX].DocUrl.oneOf.1","typeLabel":"null"}],"uniqueKey":"Notifications.items.[INDEX].DocUrl","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"Notifications.items.[INDEX]","typeLabel":"object"},"uniqueKey":"Notifications","typeLabel":"object[]"}},"additionalProperties":false,"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"StatusCode":100,"IsSuccess":true,"Data":"\u003cunknown>","DataContext":{"TraceId":"\u003cstring>"},"Notifications":[{"Code":"070101","Message":"\u003cstring>","PropertyName":"\u003cstring>","ActionHint":"\u003cstring>","DocUrl":"\u003cstring>"}]}}},"exampleType":"generated"}},"exampleType":"generated"}},"security":{"7b6acf03-bfa6-4539-9826-c3ecbd3f6d24":{"ApiKeyAuth":{"type":"apiKey","description":"Your Gorelo API key. See [Generate API key](/generate-api-key). If your data is hosted in Australia, click the base URL at the top of this page and select `https://api.aue.gorelo.io`.","name":"X-API-Key","in":"header","scopes":[],"schemeName":"ApiKeyAuth"}}},"servers":{"b46ffe4c-4a54-4e1e-a59b-94a3878c23e4":{"url":"https://api.usw.gorelo.io","description":"US"},"31fc67d7-965e-4c8a-946c-9895ebae16df":{"url":"https://api.aue.gorelo.io","description":"Australia"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"apiKey","description":"Your Gorelo API key. See [Generate API key](/generate-api-key). If your data is hosted in Australia, click the base URL at the top of this page and select `https://api.aue.gorelo.io`.","name":"X-API-Key","in":"header","scopes":[],"schemeName":"ApiKeyAuth"},"schema":{"title":"X-API-Key","type":"string","description":"Your Gorelo API key. See [Generate API key](/generate-api-key). If your data is hosted in Australia, click the base URL at the top of this page and select `https://api.aue.gorelo.io`.","isRequired":true,"typeLabel":"string","deprecated":false},"schemeName":"ApiKeyAuth","name":"X-API-Key"}],"title":"ApiKeyAuth"}]},"originalFileLocation":"api-reference/openapi.json"},"subdomain":"gorelo","siteName":"Gorelo Documentation","title":"Creates a contract with its service lines. - Gorelo Documentation","contextualStarterQuestions":[],"navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{"en":{"href":"/api-reference/billing/creates-a-contract-with-its-service-lines","matchLevel":0},"ar":{"href":"/ar/api-reference/billing/creates-a-contract-with-its-service-lines","matchLevel":1},"pt-BR":{"href":"/pt-br/api-reference/billing/creates-a-contract-with-its-service-lines","matchLevel":1},"fr-CA":{"href":"/fr-ca/api-reference/billing/creates-a-contract-with-its-service-lines","matchLevel":1},"ca":{"href":"/ca/api-reference/billing/creates-a-contract-with-its-service-lines","matchLevel":1},"cn":{"href":"/cn/api-reference/billing/creates-a-contract-with-its-service-lines","matchLevel":1},"zh":{"href":"/zh/api-reference/billing/creates-a-contract-with-its-service-lines","matchLevel":1}}},"lastModified":"2026-10-29T15:07:47.250Z","originalFileLocation":"api-reference/billing/creates-a-contract-with-its-service-lines.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=\"dark\"}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=\"Name, ClientId and at least one service line are required; each line needs Name and LaborTermsId, plus the one details object matching its labor terms (none for No Labor Terms). A setting a labor term can\u0026#x27;t have is a 400 naming it, where the app would silently turn it off. Every id is checked against the service provider, and the client\u0026#x27;s own locations and contacts, before anything is written. Line items need ItemId and Quantity; the rest falls back to the item\u0026#x27;s own values. Amounts, tax and the recurring totals are calculated. A Block Hours line also raises a Draft invoice for the block and opens its hours ledger, as in the app; that invoice is listed by GET /v1/invoices. Returns the contract in the GET /v1/contracts/{contractId} shape.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Gorelo Documentation\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/gorelo/WDrabCfHIb0Y7HhN/_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/gorelo/WDrabCfHIb0Y7HhN/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/gorelo/WDrabCfHIb0Y7HhN/_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/gorelo/WDrabCfHIb0Y7HhN/_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/gorelo/WDrabCfHIb0Y7HhN/_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/gorelo/WDrabCfHIb0Y7HhN/_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/gorelo/WDrabCfHIb0Y7HhN/_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/gorelo/WDrabCfHIb0Y7HhN/_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/gorelo/WDrabCfHIb0Y7HhN/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Creates a contract with its service lines. - Gorelo Documentation\">\u003cmeta data-mint-head property=\"og:description\" content=\"Name, ClientId and at least one service line are required; each line needs Name and LaborTermsId, plus the one details object matching its labor terms (none for No Labor Terms). A setting a labor term can\u0026#x27;t have is a 400 naming it, where the app would silently turn it off. Every id is checked against the service provider, and the client\u0026#x27;s own locations and contacts, before anything is written. Line items need ItemId and Quantity; the rest falls back to the item\u0026#x27;s own values. Amounts, tax and the recurring totals are calculated. A Block Hours line also raises a Draft invoice for the block and opens its hours ledger, as in the app; that invoice is listed by GET /v1/invoices. Returns the contract in the GET /v1/contracts/{contractId} shape.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Gorelo Documentation\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://help.gorelo.io/api-reference/billing/creates-a-contract-with-its-service-lines\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://gorelo.mintlify.app/_mintlify/api/og/v2?division=Billing\u0026amp;title=Creates+a+contract+with+its+service+lines.\u0026amp;description=%0A%0D%0A++%60Name%60%2C+%60ClientId%60+and+at+least+one+service+line+are+required%3B+each+line+needs%0D%0A++++++++++++%60Name%60+and+%60LaborTermsId%60%2C+plus+the+one+details+object+matching\u0026amp;theme=13a01696fc0cf71f5fdb322b\u0026amp;signature=c9e5f568772a3b2150c7427c187a6aae31c9247ffe636f770fba1c3c9115e1b1\">\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=\"Creates a contract with its service lines. - Gorelo Documentation\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Name, ClientId and at least one service line are required; each line needs Name and LaborTermsId, plus the one details object matching its labor terms (none for No Labor Terms). A setting a labor term can\u0026#x27;t have is a 400 naming it, where the app would silently turn it off. Every id is checked against the service provider, and the client\u0026#x27;s own locations and contacts, before anything is written. Line items need ItemId and Quantity; the rest falls back to the item\u0026#x27;s own values. Amounts, tax and the recurring totals are calculated. A Block Hours line also raises a Draft invoice for the block and opens its hours ledger, as in the app; that invoice is listed by GET /v1/invoices. Returns the contract in the GET /v1/contracts/{contractId} shape.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://gorelo.mintlify.app/_mintlify/api/og/v2?division=Billing\u0026amp;title=Creates+a+contract+with+its+service+lines.\u0026amp;description=%0A%0D%0A++%60Name%60%2C+%60ClientId%60+and+at+least+one+service+line+are+required%3B+each+line+needs%0D%0A++++++++++++%60Name%60+and+%60LaborTermsId%60%2C+plus+the+one+details+object+matching\u0026amp;theme=13a01696fc0cf71f5fdb322b\u0026amp;signature=c9e5f568772a3b2150c7427c187a6aae31c9247ffe636f770fba1c3c9115e1b1\">\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/gorelo/WDrabCfHIb0Y7HhN/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Gorelo Documentation\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#1DAF94\">\u003clink data-mint-head rel=\"canonical\" href=\"https://help.gorelo.io/api-reference/billing/creates-a-contract-with-its-service-lines\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/billing/creates-a-contract-with-its-service-lines.md\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"en\" href=\"https://help.gorelo.io/api-reference/billing/creates-a-contract-with-its-service-lines\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"ar\" href=\"https://help.gorelo.io/ar/api-reference/billing/creates-a-contract-with-its-service-lines\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"pt-BR\" href=\"https://help.gorelo.io/pt-br/api-reference/billing/creates-a-contract-with-its-service-lines\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"fr-CA\" href=\"https://help.gorelo.io/fr-ca/api-reference/billing/creates-a-contract-with-its-service-lines\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"ca\" href=\"https://help.gorelo.io/ca/api-reference/billing/creates-a-contract-with-its-service-lines\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"zh\" href=\"https://help.gorelo.io/cn/api-reference/billing/creates-a-contract-with-its-service-lines\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"x-default\" href=\"https://help.gorelo.io/api-reference/billing/creates-a-contract-with-its-service-lines\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://help.gorelo.io/#organization\",\"name\":\"Gorelo Documentation\",\"url\":\"https://help.gorelo.io\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/gorelo/J8h_fLstMj_tYUTJ/logo/logo-light.svg?fit=max\u0026auto=format\u0026n=J8h_fLstMj_tYUTJ\u0026q=85\u0026s=3c12ffa7afbcef131d2c6fb36f00e159\"}},{\"@type\":\"WebSite\",\"@id\":\"https://help.gorelo.io#website\",\"name\":\"Gorelo Documentation\",\"url\":\"https://help.gorelo.io\",\"publisher\":{\"@id\":\"https://help.gorelo.io/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://help.gorelo.io/api-reference/billing/creates-a-contract-with-its-service-lines#webpage\",\"url\":\"https://help.gorelo.io/api-reference/billing/creates-a-contract-with-its-service-lines\",\"name\":\"Creates a contract with its service lines.\",\"description\":\"Name, ClientId and at least one service line are required; each line needs Name and LaborTermsId, plus the one details object matching its labor terms (none for No Labor Terms). A setting a labor term can't have is a 400 naming it, where the app would silently turn it off. Every id is checked against the service provider, and the client's own locations and contacts, before anything is written. Line items need ItemId and Quantity; the rest falls back to the item's own values. Amounts, tax and the recurring totals are calculated. A Block Hours line also raises a Draft invoice for the block and opens its hours ledger, as in the app; that invoice is listed by GET /v1/invoices. Returns the contract in the GET /v1/contracts/{contractId} shape.\",\"dateModified\":\"2026-10-29T15:07:47.250Z\",\"isPartOf\":{\"@id\":\"https://help.gorelo.io#website\"},\"breadcrumb\":{\"@id\":\"https://help.gorelo.io/api-reference/billing/creates-a-contract-with-its-service-lines#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://help.gorelo.io/api-reference/billing/creates-a-contract-with-its-service-lines#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"API reference\",\"item\":\"https://help.gorelo.io/api-reference/alerts/lists-alerts-for-the-authenticated-service-provider\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Billing\",\"item\":\"https://help.gorelo.io/api-reference/billing/downloads-the-rendered-pdf-for-an-invoice\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Creates a contract with its service lines.\",\"item\":\"https://help.gorelo.io/api-reference/billing/creates-a-contract-with-its-service-lines\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://help.gorelo.io/api-reference/billing/creates-a-contract-with-its-service-lines#apireference\",\"headline\":\"Creates a contract with its service lines.\",\"name\":\"Creates a contract with its service lines.\",\"description\":\"Name, ClientId and at least one service line are required; each line needs Name and LaborTermsId, plus the one details object matching its labor terms (none for No Labor Terms). A setting a labor term can't have is a 400 naming it, where the app would silently turn it off. Every id is checked against the service provider, and the client's own locations and contacts, before anything is written. Line items need ItemId and Quantity; the rest falls back to the item's own values. Amounts, tax and the recurring totals are calculated. A Block Hours line also raises a Draft invoice for the block and opens its hours ledger, as in the app; that invoice is listed by GET /v1/invoices. Returns the contract in the GET /v1/contracts/{contractId} shape.\",\"url\":\"https://help.gorelo.io/api-reference/billing/creates-a-contract-with-its-service-lines\",\"mainEntityOfPage\":{\"@id\":\"https://help.gorelo.io/api-reference/billing/creates-a-contract-with-its-service-lines#webpage\"},\"dateModified\":\"2026-10-29T15:07:47.250Z\",\"publisher\":{\"@id\":\"https://help.gorelo.io/#organization\"},\"isPartOf\":{\"@id\":\"https://help.gorelo.io#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Gorelo Documentation\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Gorelo Documentation","nav":{"global":null,"languages":[{"language":"en","default":true,"tabs":[{"tab":"Get Started","icon":"rocket-launch","pages":[{"title":"Get Started","href":"/what-is-gorelo"}]},{"tab":"Service Delivery","icon":"bell","pages":[{"title":"Service Delivery","href":"/sd-overview"}]},{"tab":"Remote Management","icon":"desktop","pages":[{"title":"Remote Management","href":"/remote-management-overview"}]},{"tab":"Billing","icon":"sack-dollar","pages":[{"title":"Billing","href":"/how-billing-works"}]},{"tab":"Integrations","icon":"plug","pages":[{"title":"Integrations","href":"/integrations-overview"}]},{"tab":"API","icon":"satellite-dish","pages":[{"title":"Gorelo API overview","href":"/api-overview"},{"title":"Generate API key","href":"/generate-api-key"},{"title":"Revoke API key","href":"/revoke-api-key"},{"group":"API reference","pages":[{"group":"Alerts","pages":[{"title":"Lists alerts for the authenticated service provider.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/alerts","href":"/api-reference/alerts/lists-alerts-for-the-authenticated-service-provider"},{"title":"Posts an external alert against a client for the service provider.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /v1/alerts","href":"/api-reference/alerts/posts-an-external-alert-against-a-client-for-the-service-provider"},{"title":"Changes the status of several alerts at once.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json patch /v1/alerts","href":"/api-reference/alerts/changes-the-status-of-several-alerts-at-once"},{"title":"Gets a single alert by id.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/alerts/{alertId}","href":"/api-reference/alerts/gets-a-single-alert-by-id"},{"title":"Changes an alert's status: dismisses it, restores it to New, or links it to a ticket.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json patch /v1/alerts/{alertId}","href":"/api-reference/alerts/changes-an-alerts-status:-dismisses-it-restores-it-to-new-or-links-it-to-a-ticket"}]},{"group":"Assets","pages":[{"title":"Lists agent assets","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/assets/agents","href":"/api-reference/assets/lists-agent-assets"},{"title":"Lists custom assets","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/assets/custom","href":"/api-reference/assets/lists-custom-assets"},{"title":"Creates a custom asset.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /v1/assets/custom","href":"/api-reference/assets/creates-a-custom-asset"},{"title":"Gets a single custom asset by id.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/assets/custom/{customAssetId}","href":"/api-reference/assets/gets-a-single-custom-asset-by-id"},{"title":"Deletes a custom asset.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json delete /v1/assets/custom/{customAssetId}","href":"/api-reference/assets/deletes-a-custom-asset"},{"title":"Updates a custom asset. Send only the fields you want to change.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json patch /v1/assets/custom/{customAssetId}","href":"/api-reference/assets/updates-a-custom-asset-send-only-the-fields-you-want-to-change"},{"title":"Gets a single agent (managed device) asset by id.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/assets/agents/{agentAssetId}","href":"/api-reference/assets/gets-a-single-agent-managed-device-asset-by-id"},{"title":"Deletes an agent (managed device) asset.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json delete /v1/assets/agents/{agentAssetId}","href":"/api-reference/assets/deletes-an-agent-managed-device-asset"},{"title":"Updates an agent (managed device) asset. Send only the fields you want to change.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json patch /v1/assets/agents/{agentAssetId}","href":"/api-reference/assets/updates-an-agent-managed-device-asset-send-only-the-fields-you-want-to-change"},{"title":"Lists the patches installed on an agent.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/assets/agents/{agentAssetId}/patches","href":"/api-reference/assets/lists-the-patches-installed-on-an-agent"},{"title":"Lists the Windows updates pending on an agent.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/assets/agents/{agentAssetId}/patches/available","href":"/api-reference/assets/lists-the-windows-updates-pending-on-an-agent"},{"title":"Lists the applications installed on an agent.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/assets/agents/{agentAssetId}/apps","href":"/api-reference/assets/lists-the-applications-installed-on-an-agent"},{"title":"Gets an agent's processors, memory and disks.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/assets/agents/{agentAssetId}/hardware","href":"/api-reference/assets/gets-an-agents-processors-memory-and-disks"},{"title":"Lists the tags on an agent.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/assets/agents/{agentAssetId}/tags","href":"/api-reference/assets/lists-the-tags-on-an-agent"},{"title":"Lists the service provider's scripts using cursor pagination.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/scripts","href":"/api-reference/assets/lists-the-service-providers-scripts-using-cursor-pagination"},{"title":"Gets a script, with its content.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/scripts/{scriptId}","href":"/api-reference/assets/gets-a-script-with-its-content"},{"title":"Lists the asset types.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/assets/types","href":"/api-reference/assets/lists-the-asset-types"},{"title":"Creates an asset type.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /v1/assets/types","href":"/api-reference/assets/creates-an-asset-type"},{"title":"Lists the asset tags.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/assets/tags","href":"/api-reference/assets/lists-the-asset-tags"},{"title":"Gets a single asset tag by id.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/assets/tags/{tagId}","href":"/api-reference/assets/gets-a-single-asset-tag-by-id"},{"title":"Lists the service provider's monitoring policies using cursor pagination.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/assets/policies","href":"/api-reference/assets/lists-the-service-providers-monitoring-policies-using-cursor-pagination"},{"title":"Gets a single monitoring policy by id.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/assets/policies/{policyId}","href":"/api-reference/assets/gets-a-single-monitoring-policy-by-id"},{"title":"Deletes an asset type.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json delete /v1/assets/types/{assetTypeId}","href":"/api-reference/assets/deletes-an-asset-type"},{"title":"Renames an asset type.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json patch /v1/assets/types/{assetTypeId}","href":"/api-reference/assets/renames-an-asset-type"},{"title":"Lists the hardware types a custom asset can be given. \u003cb>Deprecated:\u003c/b> use `GET /v1/assets/types`.","deprecated":true,"version":null,"openapi":"/api-reference/openapi.json get /v1/assets/custom/hardware-types","href":"/api-reference/assets/lists-the-hardware-types-a-custom-asset-can-be-given-\u003cb>deprecated:\u003cb>-use-`get-v1assetstypes`"},{"title":"Lists uptime checks","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/uptime","href":"/api-reference/assets/lists-uptime-checks"},{"title":"Creates an uptime check.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /v1/uptime","href":"/api-reference/assets/creates-an-uptime-check"},{"title":"Gets a single uptime check by id.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/uptime/{uptimeId}","href":"/api-reference/assets/gets-a-single-uptime-check-by-id"},{"title":"Deletes an uptime check.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json delete /v1/uptime/{uptimeId}","href":"/api-reference/assets/deletes-an-uptime-check"},{"title":"Updates an uptime check. Send only the fields you want to change.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json patch /v1/uptime/{uptimeId}","href":"/api-reference/assets/updates-an-uptime-check-send-only-the-fields-you-want-to-change"}]},{"group":"Attachments","pages":[{"title":"Uploads a file and returns a link to it.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /v1/attachments","href":"/api-reference/attachments/uploads-a-file-and-returns-a-link-to-it"}]},{"group":"Billing","pages":[{"title":"Downloads the rendered PDF for an invoice.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/invoices/{invoiceId}/pdf","href":"/api-reference/billing/downloads-the-rendered-pdf-for-an-invoice"},{"title":"Lists billing roles","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/billing-roles","href":"/api-reference/billing/lists-billing-roles"},{"title":"Lists work types","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/work-types","href":"/api-reference/billing/lists-work-types"},{"title":"Lists the tax rates configured for the service provider.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/taxes","href":"/api-reference/billing/lists-the-tax-rates-configured-for-the-service-provider"},{"title":"Lists logged time across every ticket and task, narrowed by any of the filters.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/time-entries","href":"/api-reference/billing/lists-logged-time-across-every-ticket-and-task-narrowed-by-any-of-the-filters"},{"title":"Logs time against a ticket.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /v1/time-entries","href":"/api-reference/billing/logs-time-against-a-ticket"},{"title":"Gets a single time entry by id.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/time-entries/{timeEntryId}","href":"/api-reference/billing/gets-a-single-time-entry-by-id"},{"title":"Deletes a time entry.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json delete /v1/time-entries/{timeEntryId}","href":"/api-reference/billing/deletes-a-time-entry"},{"title":"Partially updates a time entry. Send only the fields you want to change.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json patch /v1/time-entries/{timeEntryId}","href":"/api-reference/billing/partially-updates-a-time-entry-send-only-the-fields-you-want-to-change"},{"title":"Lists the products charged to tickets and to project tasks, narrowed by any of the filters.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/product-charges","href":"/api-reference/billing/lists-the-products-charged-to-tickets-and-to-project-tasks-narrowed-by-any-of-the-filters"},{"title":"Charges a catalog item to a ticket or to a project task.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /v1/product-charges","href":"/api-reference/billing/charges-a-catalog-item-to-a-ticket-or-to-a-project-task"},{"title":"Gets one product charge.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/product-charges/{productChargeId}","href":"/api-reference/billing/gets-one-product-charge"},{"title":"Removes a product charge from its ticket or task.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json delete /v1/product-charges/{productChargeId}","href":"/api-reference/billing/removes-a-product-charge-from-its-ticket-or-task"},{"title":"Partially updates a product charge. Send only the fields you want to change.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json patch /v1/product-charges/{productChargeId}","href":"/api-reference/billing/partially-updates-a-product-charge-send-only-the-fields-you-want-to-change"},{"title":"Lists billing contracts, each with the service lines it is made of.","description":"A contract is the agreement with a client; a service line is one set of labour terms and\r\nproducts inside it. Most contracts have a single service line. A service line's id is the\r\nsame identifier a time entry's `ServiceLineId` carries, so a contract's service lines\r\nare what a time entry can be billed against.\r\n\n\r\nService lines ride inside the contract rather than being fetched per contract, so a page of\r\ncontracts costs a fixed number of queries. Every filter is optional and combining two narrows\r\nto the contracts that satisfy both; the client filter is a comma-separated list and a\r\ncontract matches if its client is any of them. A well-formed value that matches nothing - a\r\nclient id that owns no contracts - is an empty page, not a 404.\r\nTimestamps are UTC; `StartDate` and `EndDate` are stored as dates, so they are\r\nalways midnight.\r\n\n`Status` is derived, because a contract has no stored status: 3 `Archived` when\r\nthe contract has been archived, 2 `Expired` when its end date is behind the service\r\nprovider's own today, and 1 `Active` otherwise. Deleted contracts are not listed at\r\nall. Archived contracts are left out unless `statusIds` names Archived; expired ones\r\nare listed by default, so a caller that wants only live contracts passes\r\n`statusIds=1`.\r\n\n`RecurringAmount` and `RecurringCost` cover the products billed on the contract's\r\nown recurring schedule, excluding one-off lines. Amount is before tax; cost is the unit cost\r\nrecorded against each product line multiplied by its quantity, so the difference between\r\nthem is the periodic margin. A contract's two figures are exactly the sum of its service\r\nlines'.\r\n\n`LaborTerms` says how a service line bills time - Unlimited Hours, Hourly, Block Hours,\r\nNo Labor Terms, or Limited Hours - and `LaborRates` says how an hour is priced for the\r\ntwo that bill hourly, and is null for the rest.\r\n","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/contracts","href":"/api-reference/billing/lists-billing-contracts-each-with-the-service-lines-it-is-made-of"},{"title":"Creates a contract with its service lines.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /v1/contracts","href":"/api-reference/billing/creates-a-contract-with-its-service-lines"},{"title":"Everything about one contract, including each service line's actual products/labor.","description":"Adds the resolved `Client`, the invoice schedule (`DaysBeforeInvoiceCreation`,\r\n`DaysUntilDue`, `AutoApproveAndSend`), `Contacts`, and on each service line one\r\nfilled labor-terms-detail object (`UnlimitedHoursDetails`/`PerHourDetails`/\r\n`LimitedHoursDetails`/`BlockHoursDetails`, matching `LaborTerms`) plus\r\n`LineItems` — the actual products/labor billed on that line, empty when there's\r\nnothing billed yet. A non-existent id, or one belonging to another service provider, is a\r\n404.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/contracts/{contractId}","href":"/api-reference/billing/everything-about-one-contract-including-each-service-lines-actual-productslabor"},{"title":"Deletes a contract.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json delete /v1/contracts/{contractId}","href":"/api-reference/billing/deletes-a-contract"},{"title":"Updates a contract and its service lines.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json patch /v1/contracts/{contractId}","href":"/api-reference/billing/updates-a-contract-and-its-service-lines"},{"title":"Lists the service provider's invoices, filtered and sorted.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/invoices","href":"/api-reference/billing/lists-the-service-providers-invoices-filtered-and-sorted"},{"title":"Raises a manual invoice against a client, with line items.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /v1/invoices","href":"/api-reference/billing/raises-a-manual-invoice-against-a-client-with-line-items"},{"title":"Gets one invoice, with its attachments and line items.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/invoices/{invoiceId}","href":"/api-reference/billing/gets-one-invoice-with-its-attachments-and-line-items"},{"title":"Deletes or voids an invoice, depending on its current status.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json delete /v1/invoices/{invoiceId}","href":"/api-reference/billing/deletes-or-voids-an-invoice-depending-on-its-current-status"},{"title":"Updates an invoice: its header fields, its status (approve only) and its lines.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json patch /v1/invoices/{invoiceId}","href":"/api-reference/billing/updates-an-invoice:-its-header-fields-its-status-approve-only-and-its-lines"},{"title":"Lists the payments received from clients, newest first.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/payments","href":"/api-reference/billing/lists-the-payments-received-from-clients-newest-first"},{"title":"Records a payment received outside Gorelo against an approved invoice.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /v1/payments","href":"/api-reference/billing/records-a-payment-received-outside-gorelo-against-an-approved-invoice"},{"title":"Gets one payment, with the invoices it was applied to.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/payments/{paymentId}","href":"/api-reference/billing/gets-one-payment-with-the-invoices-it-was-applied-to"},{"title":"Deletes a payment that was recorded through the API.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json delete /v1/payments/{paymentId}","href":"/api-reference/billing/deletes-a-payment-that-was-recorded-through-the-api"},{"title":"Lists the service provider's proposals - quotes sent to clients - newest first.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/proposals","href":"/api-reference/billing/lists-the-service-providers-proposals--quotes-sent-to-clients--newest-first"},{"title":"Gets one proposal, with the products and bundles it quotes.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/proposals/{proposalId}","href":"/api-reference/billing/gets-one-proposal-with-the-products-and-bundles-it-quotes"},{"title":"Lists the categories products are organised under, each with its subcategories.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/items/categories","href":"/api-reference/billing/lists-the-categories-products-are-organised-under-each-with-its-subcategories"},{"title":"Lists the service provider's item catalog: products and bundles.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/items","href":"/api-reference/billing/lists-the-service-providers-item-catalog:-products-and-bundles"},{"title":"Creates a product or a bundle in the item catalog.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /v1/items","href":"/api-reference/billing/creates-a-product-or-a-bundle-in-the-item-catalog"},{"title":"A single catalog item — a product or a bundle.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/items/{itemId}","href":"/api-reference/billing/a-single-catalog-item-—-a-product-or-a-bundle"},{"title":"Deletes an item.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json delete /v1/items/{itemId}","href":"/api-reference/billing/deletes-an-item"},{"title":"Partially updates an item. Send only the fields you want to change.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json patch /v1/items/{itemId}","href":"/api-reference/billing/partially-updates-an-item-send-only-the-fields-you-want-to-change"}]},{"group":"Clients","pages":[{"title":"Lists clients","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/clients","href":"/api-reference/clients/lists-clients"},{"title":"Creates a client (and its default location) for the service provider.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /v1/clients","href":"/api-reference/clients/creates-a-client-and-its-default-location-for-the-service-provider"},{"title":"Gets a single client by id.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/clients/{clientId}","href":"/api-reference/clients/gets-a-single-client-by-id"},{"title":"Deletes a client.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json delete /v1/clients/{clientId}","href":"/api-reference/clients/deletes-a-client"},{"title":"Updates an existing client. Only supplied (non-null) fields are changed.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json patch /v1/clients/{clientId}","href":"/api-reference/clients/updates-an-existing-client-only-supplied-non-null-fields-are-changed"},{"title":"Lists the locations for a given client.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/clients/{clientId}/locations","href":"/api-reference/clients/lists-the-locations-for-a-given-client"},{"title":"Adds a location to a client.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /v1/clients/{clientId}/locations","href":"/api-reference/clients/adds-a-location-to-a-client"},{"title":"Gets one location of a client.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/clients/{clientId}/locations/{locationId}","href":"/api-reference/clients/gets-one-location-of-a-client"},{"title":"Deletes a location of a client.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json delete /v1/clients/{clientId}/locations/{locationId}","href":"/api-reference/clients/deletes-a-location-of-a-client"},{"title":"Updates a location of a client. Only the fields sent are changed.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json patch /v1/clients/{clientId}/locations/{locationId}","href":"/api-reference/clients/updates-a-location-of-a-client-only-the-fields-sent-are-changed"},{"title":"Lists the client types a client can be given.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/clients/types","href":"/api-reference/clients/lists-the-client-types-a-client-can-be-given"},{"title":"Lists the custom fields defined for clients.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/clients/custom-fields","href":"/api-reference/clients/lists-the-custom-fields-defined-for-clients"},{"title":"Adds a web domain to a client.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /v1/clients/{clientId}/domains","href":"/api-reference/clients/adds-a-web-domain-to-a-client"},{"title":"Deletes a web domain of a client.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json delete /v1/clients/{clientId}/domains/{domainId}","href":"/api-reference/clients/deletes-a-web-domain-of-a-client"},{"title":"Updates a web domain of a client. Only the fields sent are changed.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json patch /v1/clients/{clientId}/domains/{domainId}","href":"/api-reference/clients/updates-a-web-domain-of-a-client-only-the-fields-sent-are-changed"}]},{"group":"Contacts","pages":[{"title":"Gets a single contact by id.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/contacts/{contactId}","href":"/api-reference/contacts/gets-a-single-contact-by-id"},{"title":"Deletes a contact.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json delete /v1/contacts/{contactId}","href":"/api-reference/contacts/deletes-a-contact"},{"title":"Updates an existing contact.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json patch /v1/contacts/{contactId}","href":"/api-reference/contacts/updates-an-existing-contact"},{"title":"Lists the tags a contact can be given.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/contacts/tags","href":"/api-reference/contacts/lists-the-tags-a-contact-can-be-given"},{"title":"Lists contacts","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/contacts","href":"/api-reference/contacts/lists-contacts"},{"title":"Creates a contact under a client, or a temporary contact when no client is given.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /v1/contacts","href":"/api-reference/contacts/creates-a-contact-under-a-client-or-a-temporary-contact-when-no-client-is-given"}]},{"group":"Deletions","pages":[{"title":"Lists deleted records","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/deletions","href":"/api-reference/deletions/lists-deleted-records"}]},{"group":"Documents","pages":[{"title":"Lists the service provider's documents.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/documents","href":"/api-reference/documents/lists-the-service-providers-documents"},{"title":"Creates a document.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /v1/documents","href":"/api-reference/documents/creates-a-document"},{"title":"Gets a single document.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/documents/{documentId}","href":"/api-reference/documents/gets-a-single-document"},{"title":"Updates a document.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json patch /v1/documents/{documentId}","href":"/api-reference/documents/updates-a-document"},{"title":"Duplicates a document.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /v1/documents/{documentId}/duplicate","href":"/api-reference/documents/duplicates-a-document"},{"title":"Downloads a document as a PDF.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/documents/{documentId}/pdf","href":"/api-reference/documents/downloads-a-document-as-a-pdf"},{"title":"Lists a document's versions, newest first.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/documents/{documentId}/versions","href":"/api-reference/documents/lists-a-documents-versions-newest-first"},{"title":"Gets one version of a document, with its body and attachments.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/documents/{documentId}/versions/{versionId}","href":"/api-reference/documents/gets-one-version-of-a-document-with-its-body-and-attachments"},{"title":"Makes an earlier version the current one.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /v1/documents/{documentId}/versions/{versionId}/restore","href":"/api-reference/documents/makes-an-earlier-version-the-current-one"},{"title":"Lists the records a document is related to.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/documents/{documentId}/related-items","href":"/api-reference/documents/lists-the-records-a-document-is-related-to"},{"title":"Relates a document to other records.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /v1/documents/{documentId}/related-items","href":"/api-reference/documents/relates-a-document-to-other-records"},{"title":"Removes one related item from a document.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json delete /v1/documents/{documentId}/related-items/{relatedItemId}","href":"/api-reference/documents/removes-one-related-item-from-a-document"},{"title":"Lists the structured documents - the account's question templates.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/documents/structured","href":"/api-reference/documents/lists-the-structured-documents--the-accounts-question-templates"},{"title":"Gets a single structured document, with its fields.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/documents/structured/{structuredDocumentId}","href":"/api-reference/documents/gets-a-single-structured-document-with-its-fields"},{"title":"Lists the submissions of a structured document.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/documents/structured/{structuredDocumentId}/submissions","href":"/api-reference/documents/lists-the-submissions-of-a-structured-document"},{"title":"Gets a single submission of a structured document, with its answers and attachments.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/documents/structured/{structuredDocumentId}/submissions/{submissionId}","href":"/api-reference/documents/gets-a-single-submission-of-a-structured-document-with-its-answers-and-attachments"}]},{"group":"Forms","pages":[{"title":"Lists the service provider's forms, most recently updated first.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/forms","href":"/api-reference/forms/lists-the-service-providers-forms-most-recently-updated-first"},{"title":"Lists a form's submitted responses, newest first.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/forms/{formId}/responses","href":"/api-reference/forms/lists-a-forms-submitted-responses-newest-first"},{"title":"Issues a link through which the form can be submitted.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /v1/forms/{formId}/submission-links","href":"/api-reference/forms/issues-a-link-through-which-the-form-can-be-submitted"}]},{"group":"Organization","pages":[{"title":"Lists users","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/organization/users","href":"/api-reference/organization/lists-users"},{"title":"Returns one user (technician), with their role and the groups they are a member of.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/organization/users/{userId}","href":"/api-reference/organization/returns-one-user-technician-with-their-role-and-the-groups-they-are-a-member-of"},{"title":"Lists user roles","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/organization/roles","href":"/api-reference/organization/lists-user-roles"},{"title":"Lists the service provider's API keys using cursor pagination, newest first.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/api-keys","href":"/api-reference/organization/lists-the-service-providers-api-keys-using-cursor-pagination-newest-first"},{"title":"Creates an API key for the authenticated service provider.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /v1/api-keys","href":"/api-reference/organization/creates-an-api-key-for-the-authenticated-service-provider"},{"title":"Revokes an API key.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json delete /v1/api-keys/{apiKeyId}","href":"/api-reference/organization/revokes-an-api-key"},{"title":"Lists the technician groups configured for the service provider.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/organization/groups","href":"/api-reference/organization/lists-the-technician-groups-configured-for-the-service-provider"},{"title":"Returns one technician group, in the same shape as the group list.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/organization/groups/{groupId}","href":"/api-reference/organization/returns-one-technician-group-in-the-same-shape-as-the-group-list"}]},{"group":"Projects","pages":[{"title":"Lists the projects visible to the authenticated service provider, newest activity first.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/projects","href":"/api-reference/projects/lists-the-projects-visible-to-the-authenticated-service-provider-newest-activity-first"},{"title":"Creates a project for the authenticated service provider.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /v1/projects","href":"/api-reference/projects/creates-a-project-for-the-authenticated-service-provider"},{"title":"Gets a single project.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/projects/{projectId}","href":"/api-reference/projects/gets-a-single-project"},{"title":"Deletes a project and every task in it.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json delete /v1/projects/{projectId}","href":"/api-reference/projects/deletes-a-project-and-every-task-in-it"},{"title":"Updates a project. Send only the fields you want to change.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json patch /v1/projects/{projectId}","href":"/api-reference/projects/updates-a-project-send-only-the-fields-you-want-to-change"},{"title":"Lists the project tags configured for the service provider.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/projects/tags","href":"/api-reference/projects/lists-the-project-tags-configured-for-the-service-provider"},{"title":"Lists the project types configured for the service provider.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/projects/types","href":"/api-reference/projects/lists-the-project-types-configured-for-the-service-provider"},{"title":"Lists the project templates configured for the service provider, newest first.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/projects/templates","href":"/api-reference/projects/lists-the-project-templates-configured-for-the-service-provider-newest-first"},{"title":"Lists a project's sections.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/projects/{projectId}/sections","href":"/api-reference/projects/lists-a-projects-sections"},{"title":"Adds a section to a project.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /v1/projects/{projectId}/sections","href":"/api-reference/projects/adds-a-section-to-a-project"},{"title":"Deletes a section and every task in it.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json delete /v1/projects/{projectId}/sections/{sectionId}","href":"/api-reference/projects/deletes-a-section-and-every-task-in-it"},{"title":"Updates a section's title or colour. Send only the fields you want to change.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json patch /v1/projects/{projectId}/sections/{sectionId}","href":"/api-reference/projects/updates-a-sections-title-or-colour-send-only-the-fields-you-want-to-change"},{"title":"Lists a project's tasks.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/projects/{projectId}/tasks","href":"/api-reference/projects/lists-a-projects-tasks"},{"title":"Creates a task on a project's board.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /v1/projects/{projectId}/tasks","href":"/api-reference/projects/creates-a-task-on-a-projects-board"},{"title":"Returns a project's comments, newest first.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/projects/{projectId}/comments","href":"/api-reference/projects/returns-a-projects-comments-newest-first"},{"title":"Posts a comment on a project.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /v1/projects/{projectId}/comments","href":"/api-reference/projects/posts-a-comment-on-a-project"},{"title":"Returns one comment on a project.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/projects/{projectId}/comments/{commentId}","href":"/api-reference/projects/returns-one-comment-on-a-project"},{"title":"Deletes one comment on a project.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json delete /v1/projects/{projectId}/comments/{commentId}","href":"/api-reference/projects/deletes-one-comment-on-a-project"},{"title":"Edits a private comment on a project. Send only the fields you want to change.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json patch /v1/projects/{projectId}/comments/{commentId}","href":"/api-reference/projects/edits-a-private-comment-on-a-project-send-only-the-fields-you-want-to-change"},{"title":"Returns one task in full.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/projects/{projectId}/tasks/{taskId}","href":"/api-reference/projects/returns-one-task-in-full"},{"title":"Deletes a task.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json delete /v1/projects/{projectId}/tasks/{taskId}","href":"/api-reference/projects/deletes-a-task"},{"title":"Updates a task. Send only the fields you want to change.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json patch /v1/projects/{projectId}/tasks/{taskId}","href":"/api-reference/projects/updates-a-task-send-only-the-fields-you-want-to-change"},{"title":"Returns a task's comments, newest first.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/projects/{projectId}/tasks/{taskId}/comments","href":"/api-reference/projects/returns-a-tasks-comments-newest-first"},{"title":"Posts a comment on a task.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /v1/projects/{projectId}/tasks/{taskId}/comments","href":"/api-reference/projects/posts-a-comment-on-a-task"},{"title":"Starts a side conversation on a task.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /v1/projects/{projectId}/tasks/{taskId}/conversations/side-conversation","href":"/api-reference/projects/starts-a-side-conversation-on-a-task"},{"title":"Asks contacts to approve something on a task.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /v1/projects/{projectId}/tasks/{taskId}/conversations/approval","href":"/api-reference/projects/asks-contacts-to-approve-something-on-a-task"},{"title":"Returns one comment on a task.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/projects/{projectId}/tasks/{taskId}/comments/{commentId}","href":"/api-reference/projects/returns-one-comment-on-a-task"},{"title":"Deletes one comment on a task.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json delete /v1/projects/{projectId}/tasks/{taskId}/comments/{commentId}","href":"/api-reference/projects/deletes-one-comment-on-a-task"},{"title":"Edits a private comment on a task. Send only the fields you want to change.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json patch /v1/projects/{projectId}/tasks/{taskId}/comments/{commentId}","href":"/api-reference/projects/edits-a-private-comment-on-a-task-send-only-the-fields-you-want-to-change"},{"title":"Lists the conversations on a task.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/projects/{projectId}/tasks/{taskId}/conversations","href":"/api-reference/projects/lists-the-conversations-on-a-task"},{"title":"Gets one approval on a task, with its approvers.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/projects/{projectId}/tasks/{taskId}/approvals/{approvalId}","href":"/api-reference/projects/gets-one-approval-on-a-task-with-its-approvers"}]},{"group":"Tickets","pages":[{"title":"Lists tickets","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/tickets","href":"/api-reference/tickets/lists-tickets"},{"title":"Creates a ticket for the authenticated service provider.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /v1/tickets","href":"/api-reference/tickets/creates-a-ticket-for-the-authenticated-service-provider"},{"title":"Gets a single ticket.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/tickets/{ticketId}","href":"/api-reference/tickets/gets-a-single-ticket"},{"title":"Deletes a ticket and its time entries.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json delete /v1/tickets/{ticketId}","href":"/api-reference/tickets/deletes-a-ticket-and-its-time-entries"},{"title":"Partially updates a ticket. Send only the fields you want to change.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json patch /v1/tickets/{ticketId}","href":"/api-reference/tickets/partially-updates-a-ticket-send-only-the-fields-you-want-to-change"},{"title":"Gets a ticket comment","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/tickets/{ticketId}/comments/{commentId}","href":"/api-reference/tickets/gets-a-ticket-comment"},{"title":"Deletes a private comment from a ticket.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json delete /v1/tickets/{ticketId}/comments/{commentId}","href":"/api-reference/tickets/deletes-a-private-comment-from-a-ticket"},{"title":"Lists the ticket statuses configured for the service provider.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/tickets/statuses","href":"/api-reference/tickets/lists-the-ticket-statuses-configured-for-the-service-provider"},{"title":"Lists the ticket tags configured for the service provider.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/tickets/tags","href":"/api-reference/tickets/lists-the-ticket-tags-configured-for-the-service-provider"},{"title":"Lists the ticket types configured for the service provider.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/tickets/types","href":"/api-reference/tickets/lists-the-ticket-types-configured-for-the-service-provider"},{"title":"Lists the ticket priorities.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/tickets/priorities","href":"/api-reference/tickets/lists-the-ticket-priorities"},{"title":"Lists the ticket sources.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/tickets/sources","href":"/api-reference/tickets/lists-the-ticket-sources"},{"title":"Lists ticket comments","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/tickets/{ticketId}/comments","href":"/api-reference/tickets/lists-ticket-comments"},{"title":"Adds a comment to a ticket","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /v1/tickets/{ticketId}/comments","href":"/api-reference/tickets/adds-a-comment-to-a-ticket"},{"title":"Lists ticket conversations","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/tickets/{ticketId}/conversations","href":"/api-reference/tickets/lists-ticket-conversations"},{"title":"Gets a ticket approval","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/tickets/{ticketId}/approvals/{approvalId}","href":"/api-reference/tickets/gets-a-ticket-approval"},{"title":"Renames an approval on a ticket.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json patch /v1/tickets/{ticketId}/approvals/{approvalId}","href":"/api-reference/tickets/renames-an-approval-on-a-ticket"},{"title":"Creates an approval on a ticket","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /v1/tickets/{ticketId}/conversations/approval","href":"/api-reference/tickets/creates-an-approval-on-a-ticket"},{"title":"Creates a side conversation on a ticket","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /v1/tickets/{ticketId}/conversations/side-conversation","href":"/api-reference/tickets/creates-a-side-conversation-on-a-ticket"}]}]}]}]},{"language":"ar","pages":[{"title":"ar","href":"/ar/api-reference/billing/creates-a-contract-with-its-service-lines"}]},{"language":"pt-BR","pages":[{"title":"pt-BR","href":"/pt-br/api-reference/billing/creates-a-contract-with-its-service-lines"}]},{"language":"fr-CA","pages":[{"title":"fr-CA","href":"/fr-ca/api-reference/billing/creates-a-contract-with-its-service-lines"}]},{"language":"ca","pages":[{"title":"ca","href":"/ca/api-reference/billing/creates-a-contract-with-its-service-lines"}]},{"language":"cn","pages":[{"title":"cn","href":"/cn/api-reference/billing/creates-a-contract-with-its-service-lines"}]},{"language":"zh","pages":[{"title":"zh","href":"/zh/api-reference/billing/creates-a-contract-with-its-service-lines"}]}]},"title":"Creates a contract with its service lines. - Gorelo Documentation","buildId":"dpl_2xiSHD9XEvLsPGPcfoMtkLTB3dy9","deploymentId":"dpl_2xiSHD9XEvLsPGPcfoMtkLTB3dy9","dynamics":["c2aa737661","b0f84f53ff","a9bb46feb3","2b790eda92"],"chunks":["OpenApiReferenceProvider-DmVyH30O.js","utils-BHQqGGOd.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-CD-E4BIt.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-Bp5Lq9Ds.js","snippetPresets-C4xAVCFP.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","Page-CBCH2P7b.js","ApiExamples-CgXVLxUC.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-BF8I5oUf.js","shallow-Byd0lWnC.js","getApiPlaygroundDisplay-BGOZG1OK.js","CodeSnippet-CpvQL0CY.js","CodeSnippets-B8wkBKXa.js","getPastedJson-Ry3scI3Y.js","icon-D7a9HcdD.js","MethodPill-CJ8pmHhz.js","DuplicateIcon-rh1HJF0t.js","createIcon-DvGznqYs.js","DynamicMarkdown-Cc6AuSHS.js","SectionHeading-B4A0S-ep.js","axios-vUo_bRtp.js","Markdown-Cc16CX65.js","clsx-Cs6nMGht.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-zbf22OZA.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-C_fs-y5n.js"]}