Creates the template as a workflow in the authenticated app, together with the child templates its chart calls that the app does not have yet, in one request and one transaction: a refusal part-way through installs nothing. Answers 201 with the installed workflow and installed, every key this call created, parent first. When the app already has a workflow at the key, it is refused with 409 key_taken unless replace is true: then that workflow, and each child the app already has, gets the template’s current chart the way PUT /workflows/{key} replaces one (the working copy changes; the name, description, published version and version history stay), the answer is 200, and replaced lists those keys. That makes a scripted install safe to repeat, and it is how a workflow takes a newer version of its template: a workflow’s template.status says when there is one. as installs alongside an existing workflow instead, and PUT /workflows/{key} replaces it with a chart of your own. Refused with 422 promotion_required in a production app of an organization whose workflows change only by promotion.
Install the template under this key instead of its own; replace then applies to this key. The child workflows keep their own keys, because the chart names them by those.
true publishes every workflow this call created or replaced, each child before the workflows that call it. A child the app already had as an unpublished draft, and that replace did not replace, makes this fail with 422 unpublished_references. Without it, what is created is a draft, and what is replaced keeps its published version while its working copy changes.
true replaces the chart of a workflow the app already has at the key (or at as), and of each child workflow the template calls that the app already has, with the template's current chart, instead of answering 409 key_taken or leaving the child as it is. The same replacement as PUT /workflows/{key}: earlier versions are kept, and the published version stays live until publish: true publishes the new chart.
Response
replace: true replaced the chart of the workflow the app already had at the key
The keys of every workflow replace: true gave the template's chart, the installed template first when it was replaced. Empty without replace.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"QuBe Sync","colors":{"primary":"#16A34A","light":"#07C983","dark":"#15803D"},"logo":{"light":"https://mintcdn.com/qubesync/gN_APnIajnQKnywV/logo/full-light.png?fit=max\u0026auto=format\u0026n=gN_APnIajnQKnywV\u0026q=85\u0026s=0690db6248367802891c15bad08ae9e9","dark":"https://mintcdn.com/qubesync/gN_APnIajnQKnywV/logo/full-dark.png?fit=max\u0026auto=format\u0026n=gN_APnIajnQKnywV\u0026q=85\u0026s=49fb7c4ae5cb86868e1d029c62580428"},"favicon":{"light":"https://mintcdn.com/qubesync/gN_APnIajnQKnywV/favicon.ico?fit=max\u0026auto=format\u0026n=gN_APnIajnQKnywV\u0026q=85\u0026s=ecfae754138bc13cdcb4d589ad584c71","dark":"https://mintcdn.com/qubesync/gN_APnIajnQKnywV/favicon.ico?fit=max\u0026auto=format\u0026n=gN_APnIajnQKnywV\u0026q=85\u0026s=ecfae754138bc13cdcb4d589ad584c71"},"navbar":{"links":[{"href":"mailto:[email protected]","label":"Support"}],"primary":{"type":"button","label":"Dashboard","href":"https://qubesync.com/app"}},"footer":{"socials":{"github":"https://github.com/qubeintegrations","linkedin":"https://linkedin.com/company/qube-integrations"}},"contextual":{"options":["copy","view","chatgpt","claude"],"display":"header"},"styling":{"latex":false},"navigation":{"global":{"anchors":[{"anchor":"QuBe Sync Slack","icon":"slack","href":"https://qubeintegrations.slack.com"}]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"qubesync","hasAudioNarration":false,"actualSubdomain":"qubesync","customDomains":["docs.qubesync.com"],"gitSource":{"type":"github","owner":"qubeintegrations","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":false,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6aad80a0e000b4e10f39085c","collectionId":"83ff748c-8826-40c7-94e2-9b020f7a143e","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6aad80a0e000b4e10f39085c"},"entitlements":{},"buildId":"6ae8b8241795b614d9d71d8a","clientVersion":"0.0.4044","searchFilterCounts":[{"language":"default","tag":"API Reference","count":332},{"language":"default","tag":"API v2","count":308},{"language":"default","tag":"Workflows","count":30},{"language":"default","tag":"API v1 (legacy)","count":23},{"language":"default","tag":"Guides","count":20},{"language":"default","tag":"Connections","count":19},{"language":"default","tag":"Pre-built Queries","count":12},{"language":"default","tag":"Queued Requests","count":9},{"language":"default","tag":"Build your integration","count":7},{"language":"default","tag":"Data Ext Defs","count":4}]},"assistantConfig":{},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"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":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"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":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":"[data-badge=true]{white-space:nowrap}[data-badge=true] code{background:0 0;border:0;border-radius:0;padding:0}.qube-request{--qr-frame:rgb(243 247 245);--qr-border:rgb(10 15 12 / 0.1);--qr-panel:#fff;--qr-title:rgb(63 67 64);--qr-button:rgb(112 116 114);--qr-button-hover:rgb(63 67 64);--qr-hover:rgb(229 231 235 / 0.5);--qr-focus:rgb(var(--primary));--qr-ink:#1f2328;--qr-method:#0550ae;--qr-muted:#6e7781;--qr-param:#8250df;--qr-key:#116329;--qr-string:#0a3069;--qr-number:#0550ae;--qr-literal:#0550ae;--qr-mono:paperMono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;min-width:0;max-width:100%;margin:1.25rem 0 2rem;padding:2px;border:1px solid var(--qr-border);border-radius:1rem;background:var(--qr-frame)}.dark .qube-request{--qr-frame:rgb(255 255 255 / 0.05);--qr-border:rgb(255 255 255 / 0.1);--qr-panel:rgb(11 12 14);--qr-title:rgb(206 211 208);--qr-button:rgb(159 163 160);--qr-button-hover:rgb(206 211 208);--qr-hover:rgb(55 65 81 / 0.7);--qr-focus:rgb(var(--primary-light));--qr-ink:#d4d4d4;--qr-method:#569cd6;--qr-muted:#808080;--qr-param:#c586c0;--qr-key:#9cdcfe;--qr-string:#ce9178;--qr-number:#b5cea8;--qr-literal:#569cd6}.qube-request-head{display:flex;align-items:center;gap:.5rem;padding:.25rem .625rem .25rem 1rem;font-size:.75rem;font-weight:500;line-height:1.5rem}.qube-request-title{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--qr-title)}.qube-request-copy{display:inline-flex;flex:none;align-items:center;gap:.375rem;height:1.625rem;padding:0 .375rem;border:0;border-radius:.5rem;background:0 0;font:inherit;color:var(--qr-button);cursor:pointer}.qube-request-copy:hover{background:var(--qr-hover);color:var(--qr-button-hover)}.qube-request-copy:focus-visible{outline:1px solid var(--qr-focus);outline-offset:0}.qube-request-code{margin:0;padding:.875rem 1rem;overflow-x:auto;border-radius:14px;background:var(--qr-panel);font-family:var(--qr-mono);font-size:.875rem;line-height:1.5rem;color:var(--qr-ink)}.qube-request-code code{display:block;padding:0;background:0 0;font:inherit;color:inherit;white-space:pre}.qube-request-method{font-weight:600;color:var(--qr-method)}.qube-request-prefix{color:var(--qr-muted)}.qube-request-param{color:var(--qr-param)}.qube-request-key{color:var(--qr-key)}.qube-request-string{color:var(--qr-string)}.qube-request-number{color:var(--qr-number)}.qube-request-literal{color:var(--qr-literal)}.qube-points{margin:.5rem 0 1.5rem}.qube-point{display:flex;gap:1rem;padding:1.125rem 0;border-bottom:1px solid rgb(10 15 12/.1)}.qube-point:last-child{border-bottom:0}.dark .qube-point{border-color:rgb(255 255 255/.1)}.qube-point>svg{flex:none;margin-top:.25rem}.qube-point>div{min-width:0}.qube-point [data-as=p]{display:block;margin:0}.qube-point [data-as=p]+[data-as=p]{margin-top:.125rem}"}],"page":{"pagePath":"api-reference/v2/workflows/install-a-workflow-template","slug":"/api-reference/v2/workflows/install-a-workflow-template","pageMetadata":{"title":"Install a workflow template","description":"Creates the template as a workflow in the authenticated app, together with the child templates its chart calls that the app does not have yet, in one request and one transaction: a refusal part-way through installs nothing. Answers 201 with the installed workflow and `installed`, every key this call created, parent first. When the app already has a workflow at the key, it is refused with 409 `key_taken` unless `replace` is true: then that workflow, and each child the app already has, gets the template's current chart the way `PUT /workflows/{key}` replaces one (the working copy changes; the name, description, published version and version history stay), the answer is 200, and `replaced` lists those keys. That makes a scripted install safe to repeat, and it is how a workflow takes a newer version of its template: a workflow's `template.status` says when there is one. `as` installs alongside an existing workflow instead, and `PUT /workflows/{key}` replaces it with a chart of your own. Refused with 422 `promotion_required` in a production app of an organization whose workflows change only by promotion.","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /workflow-templates/{key}/install","href":"/api-reference/v2/workflows/install-a-workflow-template","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {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(_components.p, {\n children: [\"Creates the template as a workflow in the authenticated app, together with the child templates its chart calls that the app does not have yet, in one request and one transaction: a refusal part-way through installs nothing. Answers 201 with the installed workflow and \", _jsx(_components.code, {\n children: \"installed\"\n }), \", every key this call created, parent first. When the app already has a workflow at the key, it is refused with 409 \", _jsx(_components.code, {\n children: \"key_taken\"\n }), \" unless \", _jsx(_components.code, {\n children: \"replace\"\n }), \" is true: then that workflow, and each child the app already has, gets the template’s current chart the way \", _jsx(_components.code, {\n children: \"PUT /workflows/{key}\"\n }), \" replaces one (the working copy changes; the name, description, published version and version history stay), the answer is 200, and \", _jsx(_components.code, {\n children: \"replaced\"\n }), \" lists those keys. That makes a scripted install safe to repeat, and it is how a workflow takes a newer version of its template: a workflow’s \", _jsx(_components.code, {\n children: \"template.status\"\n }), \" says when there is one. \", _jsx(_components.code, {\n children: \"as\"\n }), \" installs alongside an existing workflow instead, and \", _jsx(_components.code, {\n children: \"PUT /workflows/{key}\"\n }), \" replaces it with a chart of your own. Refused with 422 \", _jsx(_components.code, {\n children: \"promotion_required\"\n }), \" in a production app of an organization whose workflows change only by promotion.\"]\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":"Install a workflow template","description":"Creates the template as a workflow in the authenticated app, together with the child templates its chart calls that the app does not have yet, in one request and one transaction: a refusal part-way through installs nothing. Answers 201 with the installed workflow and `installed`, every key this call created, parent first. When the app already has a workflow at the key, it is refused with 409 `key_taken` unless `replace` is true: then that workflow, and each child the app already has, gets the template's current chart the way `PUT /workflows/{key}` replaces one (the working copy changes; the name, description, published version and version history stay), the answer is 200, and `replaced` lists those keys. That makes a scripted install safe to repeat, and it is how a workflow takes a newer version of its template: a workflow's `template.status` says when there is one. `as` installs alongside an existing workflow instead, and `PUT /workflows/{key}` replaces it with a chart of your own. Refused with 422 `promotion_required` in a production app of an organization whose workflows change only by promotion.","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /workflow-templates/{key}/install","href":"/api-reference/v2/workflows/install-a-workflow-template","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"description":"Creates the template as a workflow in the authenticated app, together with the child templates its chart calls that the app does not have yet, in one request and one transaction: a refusal part-way through installs nothing. Answers 201 with the installed workflow and `installed`, every key this call created, parent first. When the app already has a workflow at the key, it is refused with 409 `key_taken` unless `replace` is true: then that workflow, and each child the app already has, gets the template's current chart the way `PUT /workflows/{key}` replaces one (the working copy changes; the name, description, published version and version history stay), the answer is 200, and `replaced` lists those keys. That makes a scripted install safe to repeat, and it is how a workflow takes a newer version of its template: a workflow's `template.status` says when there is one. `as` installs alongside an existing workflow instead, and `PUT /workflows/{key}` replaces it with a chart of your own. Refused with 422 `promotion_required` in a production app of an organization whose workflows change only by promotion.","parameters":["964e559e-6ec0-444d-87a2-9e45bf96a7a4"],"requestBody":"01e547df-3de2-428c-af70-d3b241c9a3ef","responses":{"200":"c7dff9cb-28d5-4506-893f-404f18480082","201":"d6bf097e-d5ae-4b28-b41e-145ee5c7c520","404":"0260aaca-38a0-4d77-aa4d-483f04cf85f1","409":"782c7018-43de-4af5-9c3e-ede6a229eb86","422":"d96a67dc-7f64-493b-987d-b674975eceac"},"security":["06f1ea46-c540-43c2-8708-d089d2b8b36a"],"summary":"Install a workflow template","tags":["Workflows"],"method":"post","type":"path","servers":["acf84d29-d14b-4dd6-933f-31aa602dd68b","b8836037-80c3-4a92-9378-766448db35bb"],"path":"/workflow-templates/{key}/install","baseUrlOptions":["https://qubesync.com/api/v2","https://dev.qubesync.com/api/v2"],"title":"Install a workflow template","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"964e559e-6ec0-444d-87a2-9e45bf96a7a4":{"description":"The template's key (see GET /workflow-templates)","in":"path","name":"key","required":true,"schema":{"pattern":"^[a-z][a-z0-9_]{0,63}$","type":"string","isRequired":true,"description":"The template's key (see GET /workflow-templates)","uniqueKey":"","typeLabel":"string"}}},"requestBody":{"content":{"application/json":{"schema":{"properties":{"as":{"description":"Install the template under this key instead of its own; `replace` then applies to this key. The child workflows keep their own keys, because the chart names them by those.","pattern":"^[a-z][a-z0-9_]{0,63}$","type":"string","uniqueKey":"as","typeLabel":"string"},"notes":{"description":"A note recorded in the history beside each version `publish: true` creates. Ignored without it.","type":"string","uniqueKey":"notes","typeLabel":"string"},"publish":{"description":"true publishes every workflow this call created or replaced, each child before the workflows that call it. A child the app already had as an unpublished draft, and that `replace` did not replace, makes this fail with 422 `unpublished_references`. Without it, what is created is a draft, and what is replaced keeps its published version while its working copy changes.","type":"boolean","uniqueKey":"publish","typeLabel":"boolean"},"replace":{"default":false,"description":"true replaces the chart of a workflow the app already has at the key (or at `as`), and of each child workflow the template calls that the app already has, with the template's current chart, instead of answering 409 `key_taken` or leaving the child as it is. The same replacement as `PUT /workflows/{key}`: earlier versions are kept, and the published version stays live until `publish: true` publishes the new chart.","type":"boolean","uniqueKey":"replace","typeLabel":"boolean"}},"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"as":"\u003cstring>","notes":"\u003cstring>","publish":true,"replace":false}}},"exampleType":"generated"}},"required":false,"exampleType":"generated"},"responses":{"c7dff9cb-28d5-4506-893f-404f18480082":{"content":{"application/json":{"schema":{"properties":{"data":{"type":"object","properties":{"description":{"oneOf":[{"type":"string","uniqueKey":"data.description.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.description.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.description","typeLabel":"string | null"},"key":{"type":"string","uniqueKey":"data.key","typeLabel":"string"},"links":{"type":"object","uniqueKey":"data.links","typeLabel":"object"},"name":{"type":"string","uniqueKey":"data.name","typeLabel":"string"},"promoted_from":{"oneOf":[{"description":"Set when the published version arrived by promotion from another app of this organization: `app`, `version` and `by` (who moved it).","type":"object","uniqueKey":"data.promoted_from.oneOf.0","typeLabel":"object"},{"description":"Set when the published version arrived by promotion from another app of this organization: `app`, `version` and `by` (who moved it).","type":"null","uniqueKey":"data.promoted_from.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.promoted_from","typeLabel":"object | null"},"published_version":{"oneOf":[{"description":"The version a production connection runs. Null when nothing is published.","type":"integer","uniqueKey":"data.published_version.oneOf.0","typeLabel":"integer"},{"description":"The version a production connection runs. Null when nothing is published.","type":"null","uniqueKey":"data.published_version.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.published_version","typeLabel":"integer | null"},"state":{"enum":["draft","published"],"type":"string","uniqueKey":"data.state","typeLabel":"enum\u003cstring>"},"template":{"oneOf":[{"description":"The shipped template this workflow's chart came from, and whether that template has changed since. Installing a template copies its chart, so a later fix to the template reaches this workflow only when you install it again: `POST /workflow-templates/{key}/install` with `replace: true` (plus `as`, this workflow's key, when it differs from the template's), and `publish: true` to make it live. The workflows a template calls report their own. Null for a workflow whose chart has never been a version of a shipped template, such as one you wrote, or adapted from a template before saving it.","properties":{"key":{"description":"The template's key, as `GET /workflow-templates/{key}` takes it.","type":"string","isRequired":true,"uniqueKey":"data.template.oneOf.0.key","typeLabel":"string"},"status":{"description":"About the working copy, which is what installing again replaces; `working_copy_changed` says whether the published version has caught up. `up_to_date`: the template has not changed since, or this is its current chart. `update_available`: the template has changed and this chart has not, so installing it again loses nothing. `update_available_customized`: the template has changed, and so has this chart since it was installed; installing again discards those edits, so compare it with the template first. `removed`: QuBe Sync no longer ships that template; the workflow keeps working as it is.","enum":["up_to_date","update_available","update_available_customized","removed"],"type":"string","isRequired":true,"uniqueKey":"data.template.oneOf.0.status","typeLabel":"enum\u003cstring>"}},"required":["key","status"],"type":"object","uniqueKey":"data.template.oneOf.0","typeLabel":"object"},{"description":"The shipped template this workflow's chart came from, and whether that template has changed since. Installing a template copies its chart, so a later fix to the template reaches this workflow only when you install it again: `POST /workflow-templates/{key}/install` with `replace: true` (plus `as`, this workflow's key, when it differs from the template's), and `publish: true` to make it live. The workflows a template calls report their own. Null for a workflow whose chart has never been a version of a shipped template, such as one you wrote, or adapted from a template before saving it.","properties":{"key":{"description":"The template's key, as `GET /workflow-templates/{key}` takes it.","type":"string"},"status":{"description":"About the working copy, which is what installing again replaces; `working_copy_changed` says whether the published version has caught up. `up_to_date`: the template has not changed since, or this is its current chart. `update_available`: the template has changed and this chart has not, so installing it again loses nothing. `update_available_customized`: the template has changed, and so has this chart since it was installed; installing again discards those edits, so compare it with the template first. `removed`: QuBe Sync no longer ships that template; the workflow keeps working as it is.","enum":["up_to_date","update_available","update_available_customized","removed"],"type":"string"}},"required":["key","status"],"type":"null","uniqueKey":"data.template.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.template","typeLabel":"object | null"},"updated_at":{"format":"date-time","type":"string","uniqueKey":"data.updated_at","typeLabel":"string\u003cdate-time>"},"working_copy_changed":{"description":"True when the working copy would run differently from the published version. Canvas positions do not count.","type":"boolean","uniqueKey":"data.working_copy_changed","typeLabel":"boolean"},"definition":{"additionalProperties":false,"description":"A workflow is one JSON document: a Harel statechart whose states queue QuickBooks requests, pause for a decision from the calling app, or transform data. Qube.Workflows.Chart.validate/1 is the source of truth; this schema is documentation and a first-pass check. A run takes at most 500 transitions, then fails with fault transition_limit: a paginating loop costs about two per page, so about 250 pages a run.","properties":{"initial":{"pattern":"^[a-z][a-z0-9_]{0,49}$","type":"string","isRequired":true,"uniqueKey":"data.definition.initial","typeLabel":"string"},"states":{"additionalProperties":{"type":"object","required":["type"],"properties":{"type":{"enum":["request","wait","workflow","transform","choice","compound","final","notify","match"],"type":"string","isRequired":true,"uniqueKey":"data.definition.states.additionalProperties.type","typeLabel":"enum\u003cstring>"},"description":{"type":"string","uniqueKey":"data.definition.states.additionalProperties.description","typeLabel":"string"},"entry":{"additionalProperties":{"description":"Any JSON value. Strings may hold \\${...} references; a map may hold the reserved \"\\$from\" key, whose rendered map the rest of the map is deep-merged onto. A map holding \"\\$map\" is a list built from another: {\"\\$map\": \"\\${vars.items}\", \"as\": \"item\", \"template\": ...} renders template once per element, with the element at each.\\\u003cas>, its position at each.index and the length at each.count. With \"key\" (a template per element), it is an object instead: each element's template under the key or keys it renders.\n\n{\"\\$add\": [...]} sums its operands and {\"\\$default\": [...]} is the first that renders to something. {\"\\$merge\": [a, b, ...]} deep-merges each object onto the ones before it, as \"\\$from\" does (objects merge key by key; lists and scalars replace; an operand that renders to nothing is skipped). {\"\\$find\": \"\\${vars.items}\", \"where\": condition} is the first element the condition holds for (at each.\\\u003cas>), or nothing.\n\n{\"\\$refs\": \"\\${input.params}\", \"operation\": \"invoice.create\"} lists an add's references, or with \"list_ids\" puts their ListIDs back. {\"\\$read\": id, \"operation\": an add} reads that record whole. {\"\\$kind_name\": \"\\${input.kind}\"} is a kind, or an operation's, as a person reads it (Customer, Service item, Invoice for invoice.create), for a question's details. No other \\$-prefixed key is allowed.","if":{"type":"object"},"then":{"properties":{"$add":{"description":"The sum of its operands: numbers, or templates that render to numbers; nothing counts as 0.","minItems":1,"type":"array"},"$default":{"description":"The first of its candidates that renders to something other than nothing or an empty string.","minItems":1,"type":"array"},"$find":{"description":"A template that renders to a list. With \"where\" (a condition, required) and \"as\" (default item): the first element for which the condition holds, the element at each.\\\u003cas>, each.index and each.count; nothing when none does. Only \\$find, as and where.","type":"string"},"$from":{"type":"string"},"$kind_name":{"description":"A kind or an operation id, or a template for one (customer, item_service, invoice.create, \\${input.kind}): its name as a person reads it -- Customer, Service item, Sales tax code, Invoice -- or nothing for anything but a non-empty string. For a question's details. Only \\$kind_name.","type":"string"},"$map":{"description":"A template that renders to a list. With \"template\" (required) and \"as\" (default item): the list of the template rendered once per element, the element at each.\\\u003cas>, each.index and each.count. With \"key\" too (a template rendered per element, such as \\${each.ref.paths}, to a string or a list of strings): an object, each element's rendered template under its key or keys. Only \\$map, as, template and key.","type":"string"},"$merge":{"description":"Objects, or templates that render to objects, each deep-merged onto the ones before it: objects merge key by key, lists and scalars replace. An operand that renders to nothing is skipped. Alone in its object.","minItems":1,"type":"array"},"$read":{"description":"A record's id, or a template for it. With \"operation\" (an add's operation id, or a template; required): {\"operation\", \"params\"}, the query that reads the record that add makes, whole, by that id -- for a transaction add its type's query by txn_id with the flag that asks for its lines (include_line_items, or a build assembly's include_component_line_items), for a list add its type's query by list_id. A request state sends it with \"operation\": \"\\${vars.read.operation}\" and \"params\": {\"\\$from\": \"\\${vars.read.params}\"}. Only \\$read and operation.","type":"string"},"$refs":{"description":"An add's params (an object, or a template for one). With \"operation\" (the add's operation id, or a template; required): the distinct references the params make, in the order they first appear -- every *_ref field the operation has, its kind derived from the field's name (customer_ref is customer, ar_account_ref account, item_group_ref item_group), one entry per kind and full name with every path it appears at: {kind, field, full_name, name, parent, list_id, paths}. A kind with no full-name lookup (template) is left out.\n\nWith \"adds\" (a list of {kind, add, fields, accept}, as ensure takes them) and \"rules\" (an object of kind to ensure, create or must_exist; ensure by default), each also has \"rule\", \"ensure\": {kind, add}, the add from adds that makes it, one of its name alone under create, or none, \"pick\", true when there is no add, and \"fields\" and \"accept\" from its entry in adds, for resolve.\n\nWith \"found\" (the response of a for-each over the references: its data and outcomes, one per reference in order), each also has \"outcome\", \"how\" and \"record\" from its element (null for one the loop never reached); with \"made\" too (the response of a for-each over the ones found answered not_found), those take its outcome and record. \"missing\": true keeps the references whose outcome is still not_found.\n\nWith \"list_ids\" instead (one per reference, in that order), it is the params, every reference replaced by {\"list_id\": ...}. Only \\$refs, operation, adds, rules, found, made, missing and list_ids.","type":["string","object"]}},"propertyNames":{"not":{"pattern":"^\\$(?!(from|map|add|default|merge|find|refs|read|kind_name)$)"}}},"uniqueKey":"data.definition.states.additionalProperties.entry.additionalProperties","typeLabel":"any"},"description":"Variable name -> template. Every value is rendered against the same context snapshot, then merged into vars at once.","propertyNames":{"$ref":"#/components/schemas/WorkflowChartIdentifier"},"type":"object","uniqueKey":"data.definition.states.additionalProperties.entry","typeLabel":"object"},"exit":{"additionalProperties":{"description":"Any JSON value. Strings may hold \\${...} references; a map may hold the reserved \"\\$from\" key, whose rendered map the rest of the map is deep-merged onto. A map holding \"\\$map\" is a list built from another: {\"\\$map\": \"\\${vars.items}\", \"as\": \"item\", \"template\": ...} renders template once per element, with the element at each.\\\u003cas>, its position at each.index and the length at each.count. With \"key\" (a template per element), it is an object instead: each element's template under the key or keys it renders.\n\n{\"\\$add\": [...]} sums its operands and {\"\\$default\": [...]} is the first that renders to something. {\"\\$merge\": [a, b, ...]} deep-merges each object onto the ones before it, as \"\\$from\" does (objects merge key by key; lists and scalars replace; an operand that renders to nothing is skipped). {\"\\$find\": \"\\${vars.items}\", \"where\": condition} is the first element the condition holds for (at each.\\\u003cas>), or nothing.\n\n{\"\\$refs\": \"\\${input.params}\", \"operation\": \"invoice.create\"} lists an add's references, or with \"list_ids\" puts their ListIDs back. {\"\\$read\": id, \"operation\": an add} reads that record whole. {\"\\$kind_name\": \"\\${input.kind}\"} is a kind, or an operation's, as a person reads it (Customer, Service item, Invoice for invoice.create), for a question's details. No other \\$-prefixed key is allowed.","if":{"type":"object"},"then":{"properties":{"$add":{"description":"The sum of its operands: numbers, or templates that render to numbers; nothing counts as 0.","minItems":1,"type":"array"},"$default":{"description":"The first of its candidates that renders to something other than nothing or an empty string.","minItems":1,"type":"array"},"$find":{"description":"A template that renders to a list. With \"where\" (a condition, required) and \"as\" (default item): the first element for which the condition holds, the element at each.\\\u003cas>, each.index and each.count; nothing when none does. Only \\$find, as and where.","type":"string"},"$from":{"type":"string"},"$kind_name":{"description":"A kind or an operation id, or a template for one (customer, item_service, invoice.create, \\${input.kind}): its name as a person reads it -- Customer, Service item, Sales tax code, Invoice -- or nothing for anything but a non-empty string. For a question's details. Only \\$kind_name.","type":"string"},"$map":{"description":"A template that renders to a list. With \"template\" (required) and \"as\" (default item): the list of the template rendered once per element, the element at each.\\\u003cas>, each.index and each.count. With \"key\" too (a template rendered per element, such as \\${each.ref.paths}, to a string or a list of strings): an object, each element's rendered template under its key or keys. Only \\$map, as, template and key.","type":"string"},"$merge":{"description":"Objects, or templates that render to objects, each deep-merged onto the ones before it: objects merge key by key, lists and scalars replace. An operand that renders to nothing is skipped. Alone in its object.","minItems":1,"type":"array"},"$read":{"description":"A record's id, or a template for it. With \"operation\" (an add's operation id, or a template; required): {\"operation\", \"params\"}, the query that reads the record that add makes, whole, by that id -- for a transaction add its type's query by txn_id with the flag that asks for its lines (include_line_items, or a build assembly's include_component_line_items), for a list add its type's query by list_id. A request state sends it with \"operation\": \"\\${vars.read.operation}\" and \"params\": {\"\\$from\": \"\\${vars.read.params}\"}. Only \\$read and operation.","type":"string"},"$refs":{"description":"An add's params (an object, or a template for one). With \"operation\" (the add's operation id, or a template; required): the distinct references the params make, in the order they first appear -- every *_ref field the operation has, its kind derived from the field's name (customer_ref is customer, ar_account_ref account, item_group_ref item_group), one entry per kind and full name with every path it appears at: {kind, field, full_name, name, parent, list_id, paths}. A kind with no full-name lookup (template) is left out.\n\nWith \"adds\" (a list of {kind, add, fields, accept}, as ensure takes them) and \"rules\" (an object of kind to ensure, create or must_exist; ensure by default), each also has \"rule\", \"ensure\": {kind, add}, the add from adds that makes it, one of its name alone under create, or none, \"pick\", true when there is no add, and \"fields\" and \"accept\" from its entry in adds, for resolve.\n\nWith \"found\" (the response of a for-each over the references: its data and outcomes, one per reference in order), each also has \"outcome\", \"how\" and \"record\" from its element (null for one the loop never reached); with \"made\" too (the response of a for-each over the ones found answered not_found), those take its outcome and record. \"missing\": true keeps the references whose outcome is still not_found.\n\nWith \"list_ids\" instead (one per reference, in that order), it is the params, every reference replaced by {\"list_id\": ...}. Only \\$refs, operation, adds, rules, found, made, missing and list_ids.","type":["string","object"]}},"propertyNames":{"not":{"pattern":"^\\$(?!(from|map|add|default|merge|find|refs|read|kind_name)$)"}}},"uniqueKey":"data.definition.states.additionalProperties.exit.additionalProperties","typeLabel":"any"},"description":"Variable name -> template. Every value is rendered against the same context snapshot, then merged into vars at once.","propertyNames":{"$ref":"#/components/schemas/WorkflowChartIdentifier"},"type":"object","uniqueKey":"data.definition.states.additionalProperties.exit","typeLabel":"object"},"on":{"additionalProperties":{"items":{"additionalProperties":false,"properties":{"target":{"description":"completed, failed, a sibling key (searched upward), or an absolute dotted path.","type":"string","isRequired":true,"uniqueKey":"data.definition.states.additionalProperties.on.additionalProperties.items.[INDEX].target","typeLabel":"string"},"assign":{"additionalProperties":{"description":"Any JSON value. Strings may hold \\${...} references; a map may hold the reserved \"\\$from\" key, whose rendered map the rest of the map is deep-merged onto. A map holding \"\\$map\" is a list built from another: {\"\\$map\": \"\\${vars.items}\", \"as\": \"item\", \"template\": ...} renders template once per element, with the element at each.\\\u003cas>, its position at each.index and the length at each.count. With \"key\" (a template per element), it is an object instead: each element's template under the key or keys it renders.\n\n{\"\\$add\": [...]} sums its operands and {\"\\$default\": [...]} is the first that renders to something. {\"\\$merge\": [a, b, ...]} deep-merges each object onto the ones before it, as \"\\$from\" does (objects merge key by key; lists and scalars replace; an operand that renders to nothing is skipped). {\"\\$find\": \"\\${vars.items}\", \"where\": condition} is the first element the condition holds for (at each.\\\u003cas>), or nothing.\n\n{\"\\$refs\": \"\\${input.params}\", \"operation\": \"invoice.create\"} lists an add's references, or with \"list_ids\" puts their ListIDs back. {\"\\$read\": id, \"operation\": an add} reads that record whole. {\"\\$kind_name\": \"\\${input.kind}\"} is a kind, or an operation's, as a person reads it (Customer, Service item, Invoice for invoice.create), for a question's details. No other \\$-prefixed key is allowed.","if":{"type":"object"},"then":{"properties":{"$add":{"description":"The sum of its operands: numbers, or templates that render to numbers; nothing counts as 0.","minItems":1,"type":"array"},"$default":{"description":"The first of its candidates that renders to something other than nothing or an empty string.","minItems":1,"type":"array"},"$find":{"description":"A template that renders to a list. With \"where\" (a condition, required) and \"as\" (default item): the first element for which the condition holds, the element at each.\\\u003cas>, each.index and each.count; nothing when none does. Only \\$find, as and where.","type":"string"},"$from":{"type":"string"},"$kind_name":{"description":"A kind or an operation id, or a template for one (customer, item_service, invoice.create, \\${input.kind}): its name as a person reads it -- Customer, Service item, Sales tax code, Invoice -- or nothing for anything but a non-empty string. For a question's details. Only \\$kind_name.","type":"string"},"$map":{"description":"A template that renders to a list. With \"template\" (required) and \"as\" (default item): the list of the template rendered once per element, the element at each.\\\u003cas>, each.index and each.count. With \"key\" too (a template rendered per element, such as \\${each.ref.paths}, to a string or a list of strings): an object, each element's rendered template under its key or keys. Only \\$map, as, template and key.","type":"string"},"$merge":{"description":"Objects, or templates that render to objects, each deep-merged onto the ones before it: objects merge key by key, lists and scalars replace. An operand that renders to nothing is skipped. Alone in its object.","minItems":1,"type":"array"},"$read":{"description":"A record's id, or a template for it. With \"operation\" (an add's operation id, or a template; required): {\"operation\", \"params\"}, the query that reads the record that add makes, whole, by that id -- for a transaction add its type's query by txn_id with the flag that asks for its lines (include_line_items, or a build assembly's include_component_line_items), for a list add its type's query by list_id. A request state sends it with \"operation\": \"\\${vars.read.operation}\" and \"params\": {\"\\$from\": \"\\${vars.read.params}\"}. Only \\$read and operation.","type":"string"},"$refs":{"description":"An add's params (an object, or a template for one). With \"operation\" (the add's operation id, or a template; required): the distinct references the params make, in the order they first appear -- every *_ref field the operation has, its kind derived from the field's name (customer_ref is customer, ar_account_ref account, item_group_ref item_group), one entry per kind and full name with every path it appears at: {kind, field, full_name, name, parent, list_id, paths}. A kind with no full-name lookup (template) is left out.\n\nWith \"adds\" (a list of {kind, add, fields, accept}, as ensure takes them) and \"rules\" (an object of kind to ensure, create or must_exist; ensure by default), each also has \"rule\", \"ensure\": {kind, add}, the add from adds that makes it, one of its name alone under create, or none, \"pick\", true when there is no add, and \"fields\" and \"accept\" from its entry in adds, for resolve.\n\nWith \"found\" (the response of a for-each over the references: its data and outcomes, one per reference in order), each also has \"outcome\", \"how\" and \"record\" from its element (null for one the loop never reached); with \"made\" too (the response of a for-each over the ones found answered not_found), those take its outcome and record. \"missing\": true keeps the references whose outcome is still not_found.\n\nWith \"list_ids\" instead (one per reference, in that order), it is the params, every reference replaced by {\"list_id\": ...}. Only \\$refs, operation, adds, rules, found, made, missing and list_ids.","type":["string","object"]}},"propertyNames":{"not":{"pattern":"^\\$(?!(from|map|add|default|merge|find|refs|read|kind_name)$)"}}},"uniqueKey":"data.definition.states.additionalProperties.on.additionalProperties.items.[INDEX].assign.additionalProperties","typeLabel":"any"},"description":"Variable name -> template. Every value is rendered against the same context snapshot, then merged into vars at once.","propertyNames":{"$ref":"#/components/schemas/WorkflowChartIdentifier"},"type":"object","uniqueKey":"data.definition.states.additionalProperties.on.additionalProperties.items.[INDEX].assign","typeLabel":"object"},"description":{"type":"string","uniqueKey":"data.definition.states.additionalProperties.on.additionalProperties.items.[INDEX].description","typeLabel":"string"},"if":{"oneOf":[{"type":"object","required":["path","op"],"properties":{"op":{"enum":["present","absent","eq","neq","gt","gte","lt","lte","contains","starts_with","in"],"type":"string","isRequired":true,"uniqueKey":"data.definition.states.additionalProperties.on.additionalProperties.items.[INDEX].if.oneOf.0.op","typeLabel":"enum\u003cstring>"},"path":{"minLength":1,"type":"string","isRequired":true,"uniqueKey":"data.definition.states.additionalProperties.on.additionalProperties.items.[INDEX].if.oneOf.0.path","typeLabel":"string"},"value":{"oneOf":[{}],"uniqueKey":"data.definition.states.additionalProperties.on.additionalProperties.items.[INDEX].if.oneOf.0.value","typeLabel":"any"}},"additionalProperties":false,"uniqueKey":"data.definition.states.additionalProperties.on.additionalProperties.items.[INDEX].if.oneOf.0","typeLabel":"object"},{"type":"object","required":["all"],"properties":{"all":{"items":{"$circularRef":"8c06db97-b615-45e2-b599-cbbf2ff785ee"},"minItems":1,"type":"array","isRequired":true,"uniqueKey":"data.definition.states.additionalProperties.on.additionalProperties.items.[INDEX].if.oneOf.1.all","typeLabel":"array"}},"additionalProperties":false,"uniqueKey":"data.definition.states.additionalProperties.on.additionalProperties.items.[INDEX].if.oneOf.1","typeLabel":"object"},{"type":"object","required":["any"],"properties":{"any":{"items":{"$circularRef":"8c06db97-b615-45e2-b599-cbbf2ff785ee"},"minItems":1,"type":"array","isRequired":true,"uniqueKey":"data.definition.states.additionalProperties.on.additionalProperties.items.[INDEX].if.oneOf.2.any","typeLabel":"array"}},"additionalProperties":false,"uniqueKey":"data.definition.states.additionalProperties.on.additionalProperties.items.[INDEX].if.oneOf.2","typeLabel":"object"},{"type":"object","required":["not"],"properties":{"not":{"oneOf":[{"$circularRef":"8c06db97-b615-45e2-b599-cbbf2ff785ee","isRequired":true}],"isRequired":true,"uniqueKey":"data.definition.states.additionalProperties.on.additionalProperties.items.[INDEX].if.oneOf.3.not","typeLabel":"any"}},"additionalProperties":false,"uniqueKey":"data.definition.states.additionalProperties.on.additionalProperties.items.[INDEX].if.oneOf.3","typeLabel":"object"}],"uniqueKey":"data.definition.states.additionalProperties.on.additionalProperties.items.[INDEX].if","typeLabel":"object"}},"required":["target"],"type":"object","uniqueKey":"data.definition.states.additionalProperties.on.additionalProperties.items.[INDEX]","typeLabel":"object"},"minItems":1,"type":"array","uniqueKey":"data.definition.states.additionalProperties.on.additionalProperties","typeLabel":"object[]"},"description":"Event name -> transitions. Request states raise success/error, compounds raise done, wait states raise the chosen option id, notify states raise success/error, match states raise success (response.data is the answer: match is exact, strong, candidates or none; record; candidates; candidates_total; candidates_total_complete; index) or error (its fields refused once rendered: invalid_match; or QuickBooks failing the fallback queries on a connection without a name index).","propertyNames":{"allOf":[{"$ref":"#/components/schemas/WorkflowChartIdentifier"},{"not":{"const":"always"}}]},"type":"object","uniqueKey":"data.definition.states.additionalProperties.on","typeLabel":"object"},"ui":{"description":"Canvas bookkeeping, ignored by the engine. `x`/`y` place the state; `transitions` places the pill drawn for each of its transitions, keyed `\"\u003cevent>|\u003cindex>\"` -- the event and the transition's position within it, which is what identifies a transition. Free-form: anything here is presentation, and a chart with no `ui` at all lays itself out.","properties":{"transitions":{"additionalProperties":{"properties":{"x":{"type":"number","uniqueKey":"data.definition.states.additionalProperties.ui.transitions.additionalProperties.x","typeLabel":"number"},"y":{"type":"number","uniqueKey":"data.definition.states.additionalProperties.ui.transitions.additionalProperties.y","typeLabel":"number"}},"type":"object","uniqueKey":"data.definition.states.additionalProperties.ui.transitions.additionalProperties","typeLabel":"object"},"description":"Pill positions, keyed \"\\\u003cevent>|\\\u003cindex>\".","type":"object","uniqueKey":"data.definition.states.additionalProperties.ui.transitions","typeLabel":"object"},"x":{"type":"number","uniqueKey":"data.definition.states.additionalProperties.ui.x","typeLabel":"number"},"y":{"type":"number","uniqueKey":"data.definition.states.additionalProperties.ui.y","typeLabel":"number"}},"type":"object","uniqueKey":"data.definition.states.additionalProperties.ui","typeLabel":"object"}},"uniqueKey":"data.definition.states.additionalProperties","typeLabel":"object"},"minProperties":1,"propertyNames":{"allOf":[{"$ref":"#/components/schemas/WorkflowChartIdentifier"},{"not":{"$ref":"#/components/schemas/WorkflowChartReservedStateKeys"}}]},"type":"object","isRequired":true,"uniqueKey":"data.definition.states","typeLabel":"object"},"version":{"const":1,"isRequired":true,"uniqueKey":"data.definition.version","typeLabel":"any"},"description":{"type":"string","uniqueKey":"data.definition.description","typeLabel":"string"},"headline":{"description":"One plain sentence saying what happened when the run ends `completed`, the `headline` of its webhook, rendered as a declared outcome's `headline` is. Without one the webhook says \"\\\u003cname> completed.\"","type":"string","uniqueKey":"data.definition.headline","typeLabel":"string"},"input":{"additionalProperties":{"else":{"not":{"required":["operation"]}},"if":{"properties":{"type":{"const":"operation"}},"required":["type"]},"properties":{"type":{"enum":["string","number","boolean","object","array","operation"],"type":"string","isRequired":true,"uniqueKey":"data.definition.input.additionalProperties.type","typeLabel":"enum\u003cstring>"},"body_of":{"$ref":"fe67c917-4f38-48cc-a78a-5939f259a024","description":"On an object input that isn't a list: it is the body of the QuickBooks operation another input names, validated against that operation's params when the run starts, so a field the operation doesn't take is a 422 at the start (input.params: unknown parameter: \"customer_rf\"). {\"operation\": \"\\\u003cinput>\"} when that input holds an operation id (add_transaction's params, named by operation); {\"kind\": \"\\\u003cinput>\", \"action\": \"create\" | \"update\" | \"query\"} when it holds a kind (ensure's add, named by kind: \\\u003ckind>.create). The input it names is a string input, not a list. Inside a schema, body_of goes on a property and names a property beside it. The typed starts the libraries generate (GET /api/v2/workflows/types) read it.","uniqueKey":"data.definition.input.additionalProperties.body_of","typeLabel":"any"},"description":{"type":"string","uniqueKey":"data.definition.input.additionalProperties.description","typeLabel":"string"},"enum":{"description":"On a string input: the values a run may give it, checked when the run starts (add_transaction's operation lists the transaction adds). An object or array input says its values with schema.","items":{"type":"string","uniqueKey":"data.definition.input.additionalProperties.enum.items.[INDEX]","typeLabel":"string"},"minItems":1,"type":"array","uniqueKey":"data.definition.input.additionalProperties.enum","typeLabel":"string[]"},"example":{"description":"An example value, in the input's own JSON type: a string, a number, an object, or for a list the whole list. It is what the usage contract's start body and the dashboard's Run drawer show. An operation input needs none: its example is built from the operation. Nor does a list of objects a workflow state runs through (each: ${input.\u003cname>}): its example is one element of what that workflow takes.","uniqueKey":"data.definition.input.additionalProperties.example","typeLabel":"any"},"list":{"default":false,"description":"A list of what the rest of the declaration describes: with type operation, a list of that operation's bodies. The run input then takes an array, and each element is validated on its own.","type":"boolean","uniqueKey":"data.definition.input.additionalProperties.list","typeLabel":"boolean"},"only":{"items":{"type":"string","uniqueKey":"data.definition.input.additionalProperties.only.items.[INDEX]","typeLabel":"string"},"type":"array","uniqueKey":"data.definition.input.additionalProperties.only","typeLabel":"string[]"},"operation":{"description":"The operation this input is a body for. Left out, the input takes a pair -- {\"operation\": \"customer.query\", \"params\": {...}} -- validated against whichever operation the run names, which a request state sends with \"operation\": \"\\${input.\\\u003cname>.operation}\" and \"params\": {\"\\$from\": \"\\${input.\\\u003cname>.params}\"}.","type":"string","uniqueKey":"data.definition.input.additionalProperties.operation","typeLabel":"string"},"required":{"type":"boolean","uniqueKey":"data.definition.input.additionalProperties.required","typeLabel":"boolean"},"schema":{"additionalProperties":false,"description":"The shape of one value of this input (of each element, for a list), checked when a run starts and against the example: a subset of JSON Schema (type, properties, required, additionalProperties, items, enum, description, body_of). Allowed on an object or array input, or a list input that isn't an operation. Its top-level type defaults to the input's type. The reference picker and lint read its fields, so \\${input.\\\u003cname>.\\\u003cfield>} naming a field it lacks is a warning.","properties":{"additionalProperties":{"oneOf":[{"type":"boolean","description":"false refuses fields that properties doesn't name; true (the default) allows them; a schema allows them when they match it.","uniqueKey":"data.definition.input.additionalProperties.schema.\\additionalProperties.oneOf.0","typeLabel":"boolean"},{"description":"false refuses fields that properties doesn't name; true (the default) allows them; a schema allows them when they match it.","uniqueKey":"data.definition.input.additionalProperties.schema.\\additionalProperties.oneOf.1","typeLabel":"any"}],"uniqueKey":"data.definition.input.additionalProperties.schema.\\additionalProperties","typeLabel":"boolean | any"},"body_of":{"oneOf":[{"type":"object","description":"On an object: it is the body of the QuickBooks operation a sibling field names, validated against that operation's params when the run starts. {\"operation\": \"\\\u003csibling>\"} when the sibling holds an operation id (invoice.create); {\"kind\": \"\\\u003csibling>\", \"action\": \"create\"} when it holds a kind (customer), for the operation \\\u003ckind>.\\\u003caction>.","required":["operation"],"properties":{"operation":{"type":"string","isRequired":true,"uniqueKey":"data.definition.input.additionalProperties.schema.body_of.oneOf.0.operation","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"data.definition.input.additionalProperties.schema.body_of.oneOf.0","typeLabel":"object"},{"type":"object","description":"On an object: it is the body of the QuickBooks operation a sibling field names, validated against that operation's params when the run starts. {\"operation\": \"\\\u003csibling>\"} when the sibling holds an operation id (invoice.create); {\"kind\": \"\\\u003csibling>\", \"action\": \"create\"} when it holds a kind (customer), for the operation \\\u003ckind>.\\\u003caction>.","required":["kind","action"],"properties":{"action":{"enum":["create","update","query"],"type":"string","isRequired":true,"uniqueKey":"data.definition.input.additionalProperties.schema.body_of.oneOf.1.action","typeLabel":"enum\u003cstring>"},"kind":{"type":"string","isRequired":true,"uniqueKey":"data.definition.input.additionalProperties.schema.body_of.oneOf.1.kind","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"data.definition.input.additionalProperties.schema.body_of.oneOf.1","typeLabel":"object"}],"uniqueKey":"data.definition.input.additionalProperties.schema.body_of","typeLabel":"object"},"description":{"description":"What it is, shown in the usage contract's fields table.","type":"string","uniqueKey":"data.definition.input.additionalProperties.schema.description","typeLabel":"string"},"enum":{"description":"The values allowed.","minItems":1,"type":"array","uniqueKey":"data.definition.input.additionalProperties.schema.enum","typeLabel":"array"},"items":{"$circularRef":"a589b71e-b844-4466-8396-3c5e2933d443","description":"Every element of an array.","uniqueKey":"data.definition.input.additionalProperties.schema.\\items","typeLabel":"any"},"properties":{"additionalProperties":{"$circularRef":"a589b71e-b844-4466-8396-3c5e2933d443"},"description":"An object's fields, each a schema.","type":"object","uniqueKey":"data.definition.input.additionalProperties.schema.properties","typeLabel":"object"},"required":{"description":"The fields an object must have.","items":{"type":"string","uniqueKey":"data.definition.input.additionalProperties.schema.required.items.[INDEX]","typeLabel":"string"},"type":"array","uniqueKey":"data.definition.input.additionalProperties.schema.required","typeLabel":"string[]"},"type":{"oneOf":[{"type":"string","description":"string, number, integer, boolean, object, array or null, or a list of them ([\"string\", \"null\"]). At the top it defaults to the input's own type.","enum":["string","number","integer","boolean","object","array","null"],"uniqueKey":"data.definition.input.additionalProperties.schema.type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"array","items":{"enum":["string","number","integer","boolean","object","array","null"],"type":"string","uniqueKey":"data.definition.input.additionalProperties.schema.type.oneOf.1.items.[INDEX]","typeLabel":"enum\u003cstring>"},"description":"string, number, integer, boolean, object, array or null, or a list of them ([\"string\", \"null\"]). At the top it defaults to the input's own type.","minItems":1,"uniqueKey":"data.definition.input.additionalProperties.schema.type.oneOf.1","typeLabel":"enum\u003cstring>[]"}],"uniqueKey":"data.definition.input.additionalProperties.schema.type","typeLabel":"enum\u003cstring> | enum\u003cstring>[]"}},"type":"object","uniqueKey":"data.definition.input.additionalProperties.schema","typeLabel":"object"}},"required":["type"],"then":{"not":{"required":["schema"]}},"type":"object","uniqueKey":"data.definition.input.additionalProperties","typeLabel":"object"},"description":"What a run accepts. Validated at run start and published as a JSON Schema.","propertyNames":{"$ref":"#/components/schemas/WorkflowChartIdentifier"},"type":"object","uniqueKey":"data.definition.input","typeLabel":"object"},"key":{"pattern":"^[a-z][a-z0-9_]{0,63}$","type":"string","uniqueKey":"data.definition.key","typeLabel":"string"},"name":{"type":"string","uniqueKey":"data.definition.name","typeLabel":"string"},"on":{"additionalProperties":{"items":{"additionalProperties":false,"properties":{"target":{"description":"completed, failed, a sibling key (searched upward), or an absolute dotted path.","type":"string","isRequired":true,"uniqueKey":"data.definition.on.additionalProperties.items.[INDEX].target","typeLabel":"string"},"assign":{"additionalProperties":{"description":"Any JSON value. Strings may hold \\${...} references; a map may hold the reserved \"\\$from\" key, whose rendered map the rest of the map is deep-merged onto. A map holding \"\\$map\" is a list built from another: {\"\\$map\": \"\\${vars.items}\", \"as\": \"item\", \"template\": ...} renders template once per element, with the element at each.\\\u003cas>, its position at each.index and the length at each.count. With \"key\" (a template per element), it is an object instead: each element's template under the key or keys it renders.\n\n{\"\\$add\": [...]} sums its operands and {\"\\$default\": [...]} is the first that renders to something. {\"\\$merge\": [a, b, ...]} deep-merges each object onto the ones before it, as \"\\$from\" does (objects merge key by key; lists and scalars replace; an operand that renders to nothing is skipped). {\"\\$find\": \"\\${vars.items}\", \"where\": condition} is the first element the condition holds for (at each.\\\u003cas>), or nothing.\n\n{\"\\$refs\": \"\\${input.params}\", \"operation\": \"invoice.create\"} lists an add's references, or with \"list_ids\" puts their ListIDs back. {\"\\$read\": id, \"operation\": an add} reads that record whole. {\"\\$kind_name\": \"\\${input.kind}\"} is a kind, or an operation's, as a person reads it (Customer, Service item, Invoice for invoice.create), for a question's details. No other \\$-prefixed key is allowed.","if":{"type":"object"},"then":{"properties":{"$add":{"description":"The sum of its operands: numbers, or templates that render to numbers; nothing counts as 0.","minItems":1,"type":"array"},"$default":{"description":"The first of its candidates that renders to something other than nothing or an empty string.","minItems":1,"type":"array"},"$find":{"description":"A template that renders to a list. With \"where\" (a condition, required) and \"as\" (default item): the first element for which the condition holds, the element at each.\\\u003cas>, each.index and each.count; nothing when none does. Only \\$find, as and where.","type":"string"},"$from":{"type":"string"},"$kind_name":{"description":"A kind or an operation id, or a template for one (customer, item_service, invoice.create, \\${input.kind}): its name as a person reads it -- Customer, Service item, Sales tax code, Invoice -- or nothing for anything but a non-empty string. For a question's details. Only \\$kind_name.","type":"string"},"$map":{"description":"A template that renders to a list. With \"template\" (required) and \"as\" (default item): the list of the template rendered once per element, the element at each.\\\u003cas>, each.index and each.count. With \"key\" too (a template rendered per element, such as \\${each.ref.paths}, to a string or a list of strings): an object, each element's rendered template under its key or keys. Only \\$map, as, template and key.","type":"string"},"$merge":{"description":"Objects, or templates that render to objects, each deep-merged onto the ones before it: objects merge key by key, lists and scalars replace. An operand that renders to nothing is skipped. Alone in its object.","minItems":1,"type":"array"},"$read":{"description":"A record's id, or a template for it. With \"operation\" (an add's operation id, or a template; required): {\"operation\", \"params\"}, the query that reads the record that add makes, whole, by that id -- for a transaction add its type's query by txn_id with the flag that asks for its lines (include_line_items, or a build assembly's include_component_line_items), for a list add its type's query by list_id. A request state sends it with \"operation\": \"\\${vars.read.operation}\" and \"params\": {\"\\$from\": \"\\${vars.read.params}\"}. Only \\$read and operation.","type":"string"},"$refs":{"description":"An add's params (an object, or a template for one). With \"operation\" (the add's operation id, or a template; required): the distinct references the params make, in the order they first appear -- every *_ref field the operation has, its kind derived from the field's name (customer_ref is customer, ar_account_ref account, item_group_ref item_group), one entry per kind and full name with every path it appears at: {kind, field, full_name, name, parent, list_id, paths}. A kind with no full-name lookup (template) is left out.\n\nWith \"adds\" (a list of {kind, add, fields, accept}, as ensure takes them) and \"rules\" (an object of kind to ensure, create or must_exist; ensure by default), each also has \"rule\", \"ensure\": {kind, add}, the add from adds that makes it, one of its name alone under create, or none, \"pick\", true when there is no add, and \"fields\" and \"accept\" from its entry in adds, for resolve.\n\nWith \"found\" (the response of a for-each over the references: its data and outcomes, one per reference in order), each also has \"outcome\", \"how\" and \"record\" from its element (null for one the loop never reached); with \"made\" too (the response of a for-each over the ones found answered not_found), those take its outcome and record. \"missing\": true keeps the references whose outcome is still not_found.\n\nWith \"list_ids\" instead (one per reference, in that order), it is the params, every reference replaced by {\"list_id\": ...}. Only \\$refs, operation, adds, rules, found, made, missing and list_ids.","type":["string","object"]}},"propertyNames":{"not":{"pattern":"^\\$(?!(from|map|add|default|merge|find|refs|read|kind_name)$)"}}},"uniqueKey":"data.definition.on.additionalProperties.items.[INDEX].assign.additionalProperties","typeLabel":"any"},"description":"Variable name -> template. Every value is rendered against the same context snapshot, then merged into vars at once.","propertyNames":{"$ref":"#/components/schemas/WorkflowChartIdentifier"},"type":"object","uniqueKey":"data.definition.on.additionalProperties.items.[INDEX].assign","typeLabel":"object"},"description":{"type":"string","uniqueKey":"data.definition.on.additionalProperties.items.[INDEX].description","typeLabel":"string"},"if":{"oneOf":[{"type":"object","required":["path","op"],"properties":{"op":{"enum":["present","absent","eq","neq","gt","gte","lt","lte","contains","starts_with","in"],"type":"string","isRequired":true,"uniqueKey":"data.definition.on.additionalProperties.items.[INDEX].if.oneOf.0.op","typeLabel":"enum\u003cstring>"},"path":{"minLength":1,"type":"string","isRequired":true,"uniqueKey":"data.definition.on.additionalProperties.items.[INDEX].if.oneOf.0.path","typeLabel":"string"},"value":{"oneOf":[{}],"uniqueKey":"data.definition.on.additionalProperties.items.[INDEX].if.oneOf.0.value","typeLabel":"any"}},"additionalProperties":false,"uniqueKey":"data.definition.on.additionalProperties.items.[INDEX].if.oneOf.0","typeLabel":"object"},{"type":"object","required":["all"],"properties":{"all":{"items":{"$circularRef":"8c06db97-b615-45e2-b599-cbbf2ff785ee"},"minItems":1,"type":"array","isRequired":true,"uniqueKey":"data.definition.on.additionalProperties.items.[INDEX].if.oneOf.1.all","typeLabel":"array"}},"additionalProperties":false,"uniqueKey":"data.definition.on.additionalProperties.items.[INDEX].if.oneOf.1","typeLabel":"object"},{"type":"object","required":["any"],"properties":{"any":{"items":{"$circularRef":"8c06db97-b615-45e2-b599-cbbf2ff785ee"},"minItems":1,"type":"array","isRequired":true,"uniqueKey":"data.definition.on.additionalProperties.items.[INDEX].if.oneOf.2.any","typeLabel":"array"}},"additionalProperties":false,"uniqueKey":"data.definition.on.additionalProperties.items.[INDEX].if.oneOf.2","typeLabel":"object"},{"type":"object","required":["not"],"properties":{"not":{"oneOf":[{"$circularRef":"8c06db97-b615-45e2-b599-cbbf2ff785ee","isRequired":true}],"isRequired":true,"uniqueKey":"data.definition.on.additionalProperties.items.[INDEX].if.oneOf.3.not","typeLabel":"any"}},"additionalProperties":false,"uniqueKey":"data.definition.on.additionalProperties.items.[INDEX].if.oneOf.3","typeLabel":"object"}],"uniqueKey":"data.definition.on.additionalProperties.items.[INDEX].if","typeLabel":"object"}},"required":["target"],"type":"object","uniqueKey":"data.definition.on.additionalProperties.items.[INDEX]","typeLabel":"object"},"minItems":1,"type":"array","uniqueKey":"data.definition.on.additionalProperties","typeLabel":"object[]"},"description":"Event name -> transitions. Request states raise success/error, compounds raise done, wait states raise the chosen option id, notify states raise success/error, match states raise success (response.data is the answer: match is exact, strong, candidates or none; record; candidates; candidates_total; candidates_total_complete; index) or error (its fields refused once rendered: invalid_match; or QuickBooks failing the fallback queries on a connection without a name index).","propertyNames":{"allOf":[{"$ref":"#/components/schemas/WorkflowChartIdentifier"},{"not":{"const":"always"}}]},"type":"object","uniqueKey":"data.definition.on","typeLabel":"object"},"outcomes":{"additionalProperties":{"properties":{"description":{"description":"What this ending means, when its key does not say it already. Optional. Shown on the canvas, in the usage contract and in the guide.","type":"string","uniqueKey":"data.definition.outcomes.additionalProperties.description","typeLabel":"string"},"headline":{"description":"One plain sentence saying what happened when the run ends this way, the `headline` of its webhook: a template, rendered with the run's context and `output` (and `error` on a failure), such as \"Created \\${output.record.full_name} in QuickBooks.\" A value it names that is missing, or a template that does not render, gives the engine's own sentence instead. For people: an app never parses it.","type":"string","uniqueKey":"data.definition.outcomes.additionalProperties.headline","typeLabel":"string"},"kind":{"default":"success","description":"success: the run ends completed with this outcome. failure: the run ends failed with this outcome, and a workflow calling this one receives it as an error with response.outcome set.","enum":["success","failure"],"type":"string","uniqueKey":"data.definition.outcomes.additionalProperties.kind","typeLabel":"enum\u003cstring>"},"output":{"description":"Template rendered when the run ends this way, instead of the chart's own `output`. While it renders, `meta.outcome` holds the outcome key.","uniqueKey":"data.definition.outcomes.additionalProperties.output","typeLabel":"any"}},"type":"object","uniqueKey":"data.definition.outcomes.additionalProperties","typeLabel":"object"},"description":"Extra ways a run can end, beyond completed and failed. Each is a success (the default: the workflow worked as designed and this is how it ended; the run ends `completed` with this `outcome`) or, with `\"kind\": \"failure\"`, a named failure (the run ends `failed` with this `outcome`, and `error` is whatever the transition assigned to `error`, else the description, else `ended with outcome \u003ckey>`). A transition may target a declared outcome from anywhere, and no state at any level may use one of these keys.","propertyNames":{"pattern":"^[a-z][a-z0-9_]{0,49}$"},"type":"object","uniqueKey":"data.definition.outcomes","typeLabel":"object"},"output":{"description":"Template evaluated against the final context when the run reaches `completed` or an outcome with no `output` of its own. Defaults to \\${vars}. While it renders, `meta.outcome` holds the outcome key.","uniqueKey":"data.definition.output","typeLabel":"any"},"ui":{"description":"Canvas bookkeeping for the chart itself, ignored by the engine: one entry per outcome placing its terminal node, and `transitions` placing the pills of the root's own handlers, keyed \"\\\u003cevent>|\\\u003cindex>\".","type":"object","uniqueKey":"data.definition.ui","typeLabel":"object"}},"required":["version","initial","states"],"title":"QuBeSync workflow chart","type":"object","uniqueKey":"data.definition","typeLabel":"QuBeSync workflow chart · object"},"example_input":{"type":"object","uniqueKey":"data.example_input","typeLabel":"object"},"input_schema":{"description":"JSON Schema for this workflow's run input.","type":"object","uniqueKey":"data.input_schema","typeLabel":"object"},"references":{"description":"Keys of the workflows this one calls through a workflow state. Each must exist and be published before this one can run.","items":{"type":"string","uniqueKey":"data.references.items.[INDEX]","typeLabel":"string"},"type":"array","uniqueKey":"data.references","typeLabel":"string[]"}},"uniqueKey":"data","typeLabel":"object"},"installed":{"description":"The keys of every workflow this call created, the installed template first when it was created.","items":{"type":"string","uniqueKey":"installed.items.[INDEX]","typeLabel":"string"},"type":"array","uniqueKey":"installed","typeLabel":"string[]"},"replaced":{"description":"The keys of every workflow `replace: true` gave the template's chart, the installed template first when it was replaced. Empty without `replace`.","items":{"type":"string","uniqueKey":"replaced.items.[INDEX]","typeLabel":"string"},"type":"array","uniqueKey":"replaced","typeLabel":"string[]"}},"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"data":{"description":"\u003cstring>","key":"\u003cstring>","links":{},"name":"\u003cstring>","promoted_from":{},"published_version":123,"state":"draft","template":{"key":"\u003cstring>","status":"up_to_date"},"updated_at":"2023-11-07T05:31:56Z","working_copy_changed":true,"definition":{"initial":"\u003cstring>","states":{},"version":1,"description":"\u003cstring>","headline":"\u003cstring>","input":{},"key":"\u003cstring>","name":"\u003cstring>","on":{},"outcomes":{},"output":"\u003cunknown>","ui":{}},"example_input":{},"input_schema":{},"references":["\u003cstring>"]},"installed":["\u003cstring>"],"replaced":["\u003cstring>"]}}},"exampleType":"generated"}},"description":"`replace: true` replaced the chart of the workflow the app already had at the key","exampleType":"generated"},"d6bf097e-d5ae-4b28-b41e-145ee5c7c520":{"content":{"application/json":{"schema":{"properties":{"data":{"type":"object","properties":{"description":{"oneOf":[{"type":"string","uniqueKey":"data.description.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.description.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.description","typeLabel":"string | null"},"key":{"type":"string","uniqueKey":"data.key","typeLabel":"string"},"links":{"type":"object","uniqueKey":"data.links","typeLabel":"object"},"name":{"type":"string","uniqueKey":"data.name","typeLabel":"string"},"promoted_from":{"oneOf":[{"description":"Set when the published version arrived by promotion from another app of this organization: `app`, `version` and `by` (who moved it).","type":"object","uniqueKey":"data.promoted_from.oneOf.0","typeLabel":"object"},{"description":"Set when the published version arrived by promotion from another app of this organization: `app`, `version` and `by` (who moved it).","type":"null","uniqueKey":"data.promoted_from.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.promoted_from","typeLabel":"object | null"},"published_version":{"oneOf":[{"description":"The version a production connection runs. Null when nothing is published.","type":"integer","uniqueKey":"data.published_version.oneOf.0","typeLabel":"integer"},{"description":"The version a production connection runs. Null when nothing is published.","type":"null","uniqueKey":"data.published_version.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.published_version","typeLabel":"integer | null"},"state":{"enum":["draft","published"],"type":"string","uniqueKey":"data.state","typeLabel":"enum\u003cstring>"},"template":{"oneOf":[{"description":"The shipped template this workflow's chart came from, and whether that template has changed since. Installing a template copies its chart, so a later fix to the template reaches this workflow only when you install it again: `POST /workflow-templates/{key}/install` with `replace: true` (plus `as`, this workflow's key, when it differs from the template's), and `publish: true` to make it live. The workflows a template calls report their own. Null for a workflow whose chart has never been a version of a shipped template, such as one you wrote, or adapted from a template before saving it.","properties":{"key":{"description":"The template's key, as `GET /workflow-templates/{key}` takes it.","type":"string","isRequired":true,"uniqueKey":"data.template.oneOf.0.key","typeLabel":"string"},"status":{"description":"About the working copy, which is what installing again replaces; `working_copy_changed` says whether the published version has caught up. `up_to_date`: the template has not changed since, or this is its current chart. `update_available`: the template has changed and this chart has not, so installing it again loses nothing. `update_available_customized`: the template has changed, and so has this chart since it was installed; installing again discards those edits, so compare it with the template first. `removed`: QuBe Sync no longer ships that template; the workflow keeps working as it is.","enum":["up_to_date","update_available","update_available_customized","removed"],"type":"string","isRequired":true,"uniqueKey":"data.template.oneOf.0.status","typeLabel":"enum\u003cstring>"}},"required":["key","status"],"type":"object","uniqueKey":"data.template.oneOf.0","typeLabel":"object"},{"description":"The shipped template this workflow's chart came from, and whether that template has changed since. Installing a template copies its chart, so a later fix to the template reaches this workflow only when you install it again: `POST /workflow-templates/{key}/install` with `replace: true` (plus `as`, this workflow's key, when it differs from the template's), and `publish: true` to make it live. The workflows a template calls report their own. Null for a workflow whose chart has never been a version of a shipped template, such as one you wrote, or adapted from a template before saving it.","properties":{"key":{"description":"The template's key, as `GET /workflow-templates/{key}` takes it.","type":"string"},"status":{"description":"About the working copy, which is what installing again replaces; `working_copy_changed` says whether the published version has caught up. `up_to_date`: the template has not changed since, or this is its current chart. `update_available`: the template has changed and this chart has not, so installing it again loses nothing. `update_available_customized`: the template has changed, and so has this chart since it was installed; installing again discards those edits, so compare it with the template first. `removed`: QuBe Sync no longer ships that template; the workflow keeps working as it is.","enum":["up_to_date","update_available","update_available_customized","removed"],"type":"string"}},"required":["key","status"],"type":"null","uniqueKey":"data.template.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.template","typeLabel":"object | null"},"updated_at":{"format":"date-time","type":"string","uniqueKey":"data.updated_at","typeLabel":"string\u003cdate-time>"},"working_copy_changed":{"description":"True when the working copy would run differently from the published version. Canvas positions do not count.","type":"boolean","uniqueKey":"data.working_copy_changed","typeLabel":"boolean"},"definition":{"additionalProperties":false,"description":"A workflow is one JSON document: a Harel statechart whose states queue QuickBooks requests, pause for a decision from the calling app, or transform data. Qube.Workflows.Chart.validate/1 is the source of truth; this schema is documentation and a first-pass check. A run takes at most 500 transitions, then fails with fault transition_limit: a paginating loop costs about two per page, so about 250 pages a run.","properties":{"initial":{"pattern":"^[a-z][a-z0-9_]{0,49}$","type":"string","isRequired":true,"uniqueKey":"data.definition.initial","typeLabel":"string"},"states":{"additionalProperties":{"type":"object","required":["type"],"properties":{"type":{"enum":["request","wait","workflow","transform","choice","compound","final","notify","match"],"type":"string","isRequired":true,"uniqueKey":"data.definition.states.additionalProperties.type","typeLabel":"enum\u003cstring>"},"description":{"type":"string","uniqueKey":"data.definition.states.additionalProperties.description","typeLabel":"string"},"entry":{"additionalProperties":{"description":"Any JSON value. Strings may hold \\${...} references; a map may hold the reserved \"\\$from\" key, whose rendered map the rest of the map is deep-merged onto. A map holding \"\\$map\" is a list built from another: {\"\\$map\": \"\\${vars.items}\", \"as\": \"item\", \"template\": ...} renders template once per element, with the element at each.\\\u003cas>, its position at each.index and the length at each.count. With \"key\" (a template per element), it is an object instead: each element's template under the key or keys it renders.\n\n{\"\\$add\": [...]} sums its operands and {\"\\$default\": [...]} is the first that renders to something. {\"\\$merge\": [a, b, ...]} deep-merges each object onto the ones before it, as \"\\$from\" does (objects merge key by key; lists and scalars replace; an operand that renders to nothing is skipped). {\"\\$find\": \"\\${vars.items}\", \"where\": condition} is the first element the condition holds for (at each.\\\u003cas>), or nothing.\n\n{\"\\$refs\": \"\\${input.params}\", \"operation\": \"invoice.create\"} lists an add's references, or with \"list_ids\" puts their ListIDs back. {\"\\$read\": id, \"operation\": an add} reads that record whole. {\"\\$kind_name\": \"\\${input.kind}\"} is a kind, or an operation's, as a person reads it (Customer, Service item, Invoice for invoice.create), for a question's details. No other \\$-prefixed key is allowed.","if":{"type":"object"},"then":{"properties":{"$add":{"description":"The sum of its operands: numbers, or templates that render to numbers; nothing counts as 0.","minItems":1,"type":"array"},"$default":{"description":"The first of its candidates that renders to something other than nothing or an empty string.","minItems":1,"type":"array"},"$find":{"description":"A template that renders to a list. With \"where\" (a condition, required) and \"as\" (default item): the first element for which the condition holds, the element at each.\\\u003cas>, each.index and each.count; nothing when none does. Only \\$find, as and where.","type":"string"},"$from":{"type":"string"},"$kind_name":{"description":"A kind or an operation id, or a template for one (customer, item_service, invoice.create, \\${input.kind}): its name as a person reads it -- Customer, Service item, Sales tax code, Invoice -- or nothing for anything but a non-empty string. For a question's details. Only \\$kind_name.","type":"string"},"$map":{"description":"A template that renders to a list. With \"template\" (required) and \"as\" (default item): the list of the template rendered once per element, the element at each.\\\u003cas>, each.index and each.count. With \"key\" too (a template rendered per element, such as \\${each.ref.paths}, to a string or a list of strings): an object, each element's rendered template under its key or keys. Only \\$map, as, template and key.","type":"string"},"$merge":{"description":"Objects, or templates that render to objects, each deep-merged onto the ones before it: objects merge key by key, lists and scalars replace. An operand that renders to nothing is skipped. Alone in its object.","minItems":1,"type":"array"},"$read":{"description":"A record's id, or a template for it. With \"operation\" (an add's operation id, or a template; required): {\"operation\", \"params\"}, the query that reads the record that add makes, whole, by that id -- for a transaction add its type's query by txn_id with the flag that asks for its lines (include_line_items, or a build assembly's include_component_line_items), for a list add its type's query by list_id. A request state sends it with \"operation\": \"\\${vars.read.operation}\" and \"params\": {\"\\$from\": \"\\${vars.read.params}\"}. Only \\$read and operation.","type":"string"},"$refs":{"description":"An add's params (an object, or a template for one). With \"operation\" (the add's operation id, or a template; required): the distinct references the params make, in the order they first appear -- every *_ref field the operation has, its kind derived from the field's name (customer_ref is customer, ar_account_ref account, item_group_ref item_group), one entry per kind and full name with every path it appears at: {kind, field, full_name, name, parent, list_id, paths}. A kind with no full-name lookup (template) is left out.\n\nWith \"adds\" (a list of {kind, add, fields, accept}, as ensure takes them) and \"rules\" (an object of kind to ensure, create or must_exist; ensure by default), each also has \"rule\", \"ensure\": {kind, add}, the add from adds that makes it, one of its name alone under create, or none, \"pick\", true when there is no add, and \"fields\" and \"accept\" from its entry in adds, for resolve.\n\nWith \"found\" (the response of a for-each over the references: its data and outcomes, one per reference in order), each also has \"outcome\", \"how\" and \"record\" from its element (null for one the loop never reached); with \"made\" too (the response of a for-each over the ones found answered not_found), those take its outcome and record. \"missing\": true keeps the references whose outcome is still not_found.\n\nWith \"list_ids\" instead (one per reference, in that order), it is the params, every reference replaced by {\"list_id\": ...}. Only \\$refs, operation, adds, rules, found, made, missing and list_ids.","type":["string","object"]}},"propertyNames":{"not":{"pattern":"^\\$(?!(from|map|add|default|merge|find|refs|read|kind_name)$)"}}},"uniqueKey":"data.definition.states.additionalProperties.entry.additionalProperties","typeLabel":"any"},"description":"Variable name -> template. Every value is rendered against the same context snapshot, then merged into vars at once.","propertyNames":{"$ref":"#/components/schemas/WorkflowChartIdentifier"},"type":"object","uniqueKey":"data.definition.states.additionalProperties.entry","typeLabel":"object"},"exit":{"additionalProperties":{"description":"Any JSON value. Strings may hold \\${...} references; a map may hold the reserved \"\\$from\" key, whose rendered map the rest of the map is deep-merged onto. A map holding \"\\$map\" is a list built from another: {\"\\$map\": \"\\${vars.items}\", \"as\": \"item\", \"template\": ...} renders template once per element, with the element at each.\\\u003cas>, its position at each.index and the length at each.count. With \"key\" (a template per element), it is an object instead: each element's template under the key or keys it renders.\n\n{\"\\$add\": [...]} sums its operands and {\"\\$default\": [...]} is the first that renders to something. {\"\\$merge\": [a, b, ...]} deep-merges each object onto the ones before it, as \"\\$from\" does (objects merge key by key; lists and scalars replace; an operand that renders to nothing is skipped). {\"\\$find\": \"\\${vars.items}\", \"where\": condition} is the first element the condition holds for (at each.\\\u003cas>), or nothing.\n\n{\"\\$refs\": \"\\${input.params}\", \"operation\": \"invoice.create\"} lists an add's references, or with \"list_ids\" puts their ListIDs back. {\"\\$read\": id, \"operation\": an add} reads that record whole. {\"\\$kind_name\": \"\\${input.kind}\"} is a kind, or an operation's, as a person reads it (Customer, Service item, Invoice for invoice.create), for a question's details. No other \\$-prefixed key is allowed.","if":{"type":"object"},"then":{"properties":{"$add":{"description":"The sum of its operands: numbers, or templates that render to numbers; nothing counts as 0.","minItems":1,"type":"array"},"$default":{"description":"The first of its candidates that renders to something other than nothing or an empty string.","minItems":1,"type":"array"},"$find":{"description":"A template that renders to a list. With \"where\" (a condition, required) and \"as\" (default item): the first element for which the condition holds, the element at each.\\\u003cas>, each.index and each.count; nothing when none does. Only \\$find, as and where.","type":"string"},"$from":{"type":"string"},"$kind_name":{"description":"A kind or an operation id, or a template for one (customer, item_service, invoice.create, \\${input.kind}): its name as a person reads it -- Customer, Service item, Sales tax code, Invoice -- or nothing for anything but a non-empty string. For a question's details. Only \\$kind_name.","type":"string"},"$map":{"description":"A template that renders to a list. With \"template\" (required) and \"as\" (default item): the list of the template rendered once per element, the element at each.\\\u003cas>, each.index and each.count. With \"key\" too (a template rendered per element, such as \\${each.ref.paths}, to a string or a list of strings): an object, each element's rendered template under its key or keys. Only \\$map, as, template and key.","type":"string"},"$merge":{"description":"Objects, or templates that render to objects, each deep-merged onto the ones before it: objects merge key by key, lists and scalars replace. An operand that renders to nothing is skipped. Alone in its object.","minItems":1,"type":"array"},"$read":{"description":"A record's id, or a template for it. With \"operation\" (an add's operation id, or a template; required): {\"operation\", \"params\"}, the query that reads the record that add makes, whole, by that id -- for a transaction add its type's query by txn_id with the flag that asks for its lines (include_line_items, or a build assembly's include_component_line_items), for a list add its type's query by list_id. A request state sends it with \"operation\": \"\\${vars.read.operation}\" and \"params\": {\"\\$from\": \"\\${vars.read.params}\"}. Only \\$read and operation.","type":"string"},"$refs":{"description":"An add's params (an object, or a template for one). With \"operation\" (the add's operation id, or a template; required): the distinct references the params make, in the order they first appear -- every *_ref field the operation has, its kind derived from the field's name (customer_ref is customer, ar_account_ref account, item_group_ref item_group), one entry per kind and full name with every path it appears at: {kind, field, full_name, name, parent, list_id, paths}. A kind with no full-name lookup (template) is left out.\n\nWith \"adds\" (a list of {kind, add, fields, accept}, as ensure takes them) and \"rules\" (an object of kind to ensure, create or must_exist; ensure by default), each also has \"rule\", \"ensure\": {kind, add}, the add from adds that makes it, one of its name alone under create, or none, \"pick\", true when there is no add, and \"fields\" and \"accept\" from its entry in adds, for resolve.\n\nWith \"found\" (the response of a for-each over the references: its data and outcomes, one per reference in order), each also has \"outcome\", \"how\" and \"record\" from its element (null for one the loop never reached); with \"made\" too (the response of a for-each over the ones found answered not_found), those take its outcome and record. \"missing\": true keeps the references whose outcome is still not_found.\n\nWith \"list_ids\" instead (one per reference, in that order), it is the params, every reference replaced by {\"list_id\": ...}. Only \\$refs, operation, adds, rules, found, made, missing and list_ids.","type":["string","object"]}},"propertyNames":{"not":{"pattern":"^\\$(?!(from|map|add|default|merge|find|refs|read|kind_name)$)"}}},"uniqueKey":"data.definition.states.additionalProperties.exit.additionalProperties","typeLabel":"any"},"description":"Variable name -> template. Every value is rendered against the same context snapshot, then merged into vars at once.","propertyNames":{"$ref":"#/components/schemas/WorkflowChartIdentifier"},"type":"object","uniqueKey":"data.definition.states.additionalProperties.exit","typeLabel":"object"},"on":{"additionalProperties":{"items":{"additionalProperties":false,"properties":{"target":{"description":"completed, failed, a sibling key (searched upward), or an absolute dotted path.","type":"string","isRequired":true,"uniqueKey":"data.definition.states.additionalProperties.on.additionalProperties.items.[INDEX].target","typeLabel":"string"},"assign":{"additionalProperties":{"description":"Any JSON value. Strings may hold \\${...} references; a map may hold the reserved \"\\$from\" key, whose rendered map the rest of the map is deep-merged onto. A map holding \"\\$map\" is a list built from another: {\"\\$map\": \"\\${vars.items}\", \"as\": \"item\", \"template\": ...} renders template once per element, with the element at each.\\\u003cas>, its position at each.index and the length at each.count. With \"key\" (a template per element), it is an object instead: each element's template under the key or keys it renders.\n\n{\"\\$add\": [...]} sums its operands and {\"\\$default\": [...]} is the first that renders to something. {\"\\$merge\": [a, b, ...]} deep-merges each object onto the ones before it, as \"\\$from\" does (objects merge key by key; lists and scalars replace; an operand that renders to nothing is skipped). {\"\\$find\": \"\\${vars.items}\", \"where\": condition} is the first element the condition holds for (at each.\\\u003cas>), or nothing.\n\n{\"\\$refs\": \"\\${input.params}\", \"operation\": \"invoice.create\"} lists an add's references, or with \"list_ids\" puts their ListIDs back. {\"\\$read\": id, \"operation\": an add} reads that record whole. {\"\\$kind_name\": \"\\${input.kind}\"} is a kind, or an operation's, as a person reads it (Customer, Service item, Invoice for invoice.create), for a question's details. No other \\$-prefixed key is allowed.","if":{"type":"object"},"then":{"properties":{"$add":{"description":"The sum of its operands: numbers, or templates that render to numbers; nothing counts as 0.","minItems":1,"type":"array"},"$default":{"description":"The first of its candidates that renders to something other than nothing or an empty string.","minItems":1,"type":"array"},"$find":{"description":"A template that renders to a list. With \"where\" (a condition, required) and \"as\" (default item): the first element for which the condition holds, the element at each.\\\u003cas>, each.index and each.count; nothing when none does. Only \\$find, as and where.","type":"string"},"$from":{"type":"string"},"$kind_name":{"description":"A kind or an operation id, or a template for one (customer, item_service, invoice.create, \\${input.kind}): its name as a person reads it -- Customer, Service item, Sales tax code, Invoice -- or nothing for anything but a non-empty string. For a question's details. Only \\$kind_name.","type":"string"},"$map":{"description":"A template that renders to a list. With \"template\" (required) and \"as\" (default item): the list of the template rendered once per element, the element at each.\\\u003cas>, each.index and each.count. With \"key\" too (a template rendered per element, such as \\${each.ref.paths}, to a string or a list of strings): an object, each element's rendered template under its key or keys. Only \\$map, as, template and key.","type":"string"},"$merge":{"description":"Objects, or templates that render to objects, each deep-merged onto the ones before it: objects merge key by key, lists and scalars replace. An operand that renders to nothing is skipped. Alone in its object.","minItems":1,"type":"array"},"$read":{"description":"A record's id, or a template for it. With \"operation\" (an add's operation id, or a template; required): {\"operation\", \"params\"}, the query that reads the record that add makes, whole, by that id -- for a transaction add its type's query by txn_id with the flag that asks for its lines (include_line_items, or a build assembly's include_component_line_items), for a list add its type's query by list_id. A request state sends it with \"operation\": \"\\${vars.read.operation}\" and \"params\": {\"\\$from\": \"\\${vars.read.params}\"}. Only \\$read and operation.","type":"string"},"$refs":{"description":"An add's params (an object, or a template for one). With \"operation\" (the add's operation id, or a template; required): the distinct references the params make, in the order they first appear -- every *_ref field the operation has, its kind derived from the field's name (customer_ref is customer, ar_account_ref account, item_group_ref item_group), one entry per kind and full name with every path it appears at: {kind, field, full_name, name, parent, list_id, paths}. A kind with no full-name lookup (template) is left out.\n\nWith \"adds\" (a list of {kind, add, fields, accept}, as ensure takes them) and \"rules\" (an object of kind to ensure, create or must_exist; ensure by default), each also has \"rule\", \"ensure\": {kind, add}, the add from adds that makes it, one of its name alone under create, or none, \"pick\", true when there is no add, and \"fields\" and \"accept\" from its entry in adds, for resolve.\n\nWith \"found\" (the response of a for-each over the references: its data and outcomes, one per reference in order), each also has \"outcome\", \"how\" and \"record\" from its element (null for one the loop never reached); with \"made\" too (the response of a for-each over the ones found answered not_found), those take its outcome and record. \"missing\": true keeps the references whose outcome is still not_found.\n\nWith \"list_ids\" instead (one per reference, in that order), it is the params, every reference replaced by {\"list_id\": ...}. Only \\$refs, operation, adds, rules, found, made, missing and list_ids.","type":["string","object"]}},"propertyNames":{"not":{"pattern":"^\\$(?!(from|map|add|default|merge|find|refs|read|kind_name)$)"}}},"uniqueKey":"data.definition.states.additionalProperties.on.additionalProperties.items.[INDEX].assign.additionalProperties","typeLabel":"any"},"description":"Variable name -> template. Every value is rendered against the same context snapshot, then merged into vars at once.","propertyNames":{"$ref":"#/components/schemas/WorkflowChartIdentifier"},"type":"object","uniqueKey":"data.definition.states.additionalProperties.on.additionalProperties.items.[INDEX].assign","typeLabel":"object"},"description":{"type":"string","uniqueKey":"data.definition.states.additionalProperties.on.additionalProperties.items.[INDEX].description","typeLabel":"string"},"if":{"oneOf":[{"type":"object","required":["path","op"],"properties":{"op":{"enum":["present","absent","eq","neq","gt","gte","lt","lte","contains","starts_with","in"],"type":"string","isRequired":true,"uniqueKey":"data.definition.states.additionalProperties.on.additionalProperties.items.[INDEX].if.oneOf.0.op","typeLabel":"enum\u003cstring>"},"path":{"minLength":1,"type":"string","isRequired":true,"uniqueKey":"data.definition.states.additionalProperties.on.additionalProperties.items.[INDEX].if.oneOf.0.path","typeLabel":"string"},"value":{"oneOf":[{}],"uniqueKey":"data.definition.states.additionalProperties.on.additionalProperties.items.[INDEX].if.oneOf.0.value","typeLabel":"any"}},"additionalProperties":false,"uniqueKey":"data.definition.states.additionalProperties.on.additionalProperties.items.[INDEX].if.oneOf.0","typeLabel":"object"},{"type":"object","required":["all"],"properties":{"all":{"items":{"$circularRef":"8c06db97-b615-45e2-b599-cbbf2ff785ee"},"minItems":1,"type":"array","isRequired":true,"uniqueKey":"data.definition.states.additionalProperties.on.additionalProperties.items.[INDEX].if.oneOf.1.all","typeLabel":"array"}},"additionalProperties":false,"uniqueKey":"data.definition.states.additionalProperties.on.additionalProperties.items.[INDEX].if.oneOf.1","typeLabel":"object"},{"type":"object","required":["any"],"properties":{"any":{"items":{"$circularRef":"8c06db97-b615-45e2-b599-cbbf2ff785ee"},"minItems":1,"type":"array","isRequired":true,"uniqueKey":"data.definition.states.additionalProperties.on.additionalProperties.items.[INDEX].if.oneOf.2.any","typeLabel":"array"}},"additionalProperties":false,"uniqueKey":"data.definition.states.additionalProperties.on.additionalProperties.items.[INDEX].if.oneOf.2","typeLabel":"object"},{"type":"object","required":["not"],"properties":{"not":{"oneOf":[{"$circularRef":"8c06db97-b615-45e2-b599-cbbf2ff785ee","isRequired":true}],"isRequired":true,"uniqueKey":"data.definition.states.additionalProperties.on.additionalProperties.items.[INDEX].if.oneOf.3.not","typeLabel":"any"}},"additionalProperties":false,"uniqueKey":"data.definition.states.additionalProperties.on.additionalProperties.items.[INDEX].if.oneOf.3","typeLabel":"object"}],"uniqueKey":"data.definition.states.additionalProperties.on.additionalProperties.items.[INDEX].if","typeLabel":"object"}},"required":["target"],"type":"object","uniqueKey":"data.definition.states.additionalProperties.on.additionalProperties.items.[INDEX]","typeLabel":"object"},"minItems":1,"type":"array","uniqueKey":"data.definition.states.additionalProperties.on.additionalProperties","typeLabel":"object[]"},"description":"Event name -> transitions. Request states raise success/error, compounds raise done, wait states raise the chosen option id, notify states raise success/error, match states raise success (response.data is the answer: match is exact, strong, candidates or none; record; candidates; candidates_total; candidates_total_complete; index) or error (its fields refused once rendered: invalid_match; or QuickBooks failing the fallback queries on a connection without a name index).","propertyNames":{"allOf":[{"$ref":"#/components/schemas/WorkflowChartIdentifier"},{"not":{"const":"always"}}]},"type":"object","uniqueKey":"data.definition.states.additionalProperties.on","typeLabel":"object"},"ui":{"description":"Canvas bookkeeping, ignored by the engine. `x`/`y` place the state; `transitions` places the pill drawn for each of its transitions, keyed `\"\u003cevent>|\u003cindex>\"` -- the event and the transition's position within it, which is what identifies a transition. Free-form: anything here is presentation, and a chart with no `ui` at all lays itself out.","properties":{"transitions":{"additionalProperties":{"properties":{"x":{"type":"number","uniqueKey":"data.definition.states.additionalProperties.ui.transitions.additionalProperties.x","typeLabel":"number"},"y":{"type":"number","uniqueKey":"data.definition.states.additionalProperties.ui.transitions.additionalProperties.y","typeLabel":"number"}},"type":"object","uniqueKey":"data.definition.states.additionalProperties.ui.transitions.additionalProperties","typeLabel":"object"},"description":"Pill positions, keyed \"\\\u003cevent>|\\\u003cindex>\".","type":"object","uniqueKey":"data.definition.states.additionalProperties.ui.transitions","typeLabel":"object"},"x":{"type":"number","uniqueKey":"data.definition.states.additionalProperties.ui.x","typeLabel":"number"},"y":{"type":"number","uniqueKey":"data.definition.states.additionalProperties.ui.y","typeLabel":"number"}},"type":"object","uniqueKey":"data.definition.states.additionalProperties.ui","typeLabel":"object"}},"uniqueKey":"data.definition.states.additionalProperties","typeLabel":"object"},"minProperties":1,"propertyNames":{"allOf":[{"$ref":"#/components/schemas/WorkflowChartIdentifier"},{"not":{"$ref":"#/components/schemas/WorkflowChartReservedStateKeys"}}]},"type":"object","isRequired":true,"uniqueKey":"data.definition.states","typeLabel":"object"},"version":{"const":1,"isRequired":true,"uniqueKey":"data.definition.version","typeLabel":"any"},"description":{"type":"string","uniqueKey":"data.definition.description","typeLabel":"string"},"headline":{"description":"One plain sentence saying what happened when the run ends `completed`, the `headline` of its webhook, rendered as a declared outcome's `headline` is. Without one the webhook says \"\\\u003cname> completed.\"","type":"string","uniqueKey":"data.definition.headline","typeLabel":"string"},"input":{"additionalProperties":{"else":{"not":{"required":["operation"]}},"if":{"properties":{"type":{"const":"operation"}},"required":["type"]},"properties":{"type":{"enum":["string","number","boolean","object","array","operation"],"type":"string","isRequired":true,"uniqueKey":"data.definition.input.additionalProperties.type","typeLabel":"enum\u003cstring>"},"body_of":{"$ref":"fe67c917-4f38-48cc-a78a-5939f259a024","description":"On an object input that isn't a list: it is the body of the QuickBooks operation another input names, validated against that operation's params when the run starts, so a field the operation doesn't take is a 422 at the start (input.params: unknown parameter: \"customer_rf\"). {\"operation\": \"\\\u003cinput>\"} when that input holds an operation id (add_transaction's params, named by operation); {\"kind\": \"\\\u003cinput>\", \"action\": \"create\" | \"update\" | \"query\"} when it holds a kind (ensure's add, named by kind: \\\u003ckind>.create). The input it names is a string input, not a list. Inside a schema, body_of goes on a property and names a property beside it. The typed starts the libraries generate (GET /api/v2/workflows/types) read it.","uniqueKey":"data.definition.input.additionalProperties.body_of","typeLabel":"any"},"description":{"type":"string","uniqueKey":"data.definition.input.additionalProperties.description","typeLabel":"string"},"enum":{"description":"On a string input: the values a run may give it, checked when the run starts (add_transaction's operation lists the transaction adds). An object or array input says its values with schema.","items":{"type":"string","uniqueKey":"data.definition.input.additionalProperties.enum.items.[INDEX]","typeLabel":"string"},"minItems":1,"type":"array","uniqueKey":"data.definition.input.additionalProperties.enum","typeLabel":"string[]"},"example":{"description":"An example value, in the input's own JSON type: a string, a number, an object, or for a list the whole list. It is what the usage contract's start body and the dashboard's Run drawer show. An operation input needs none: its example is built from the operation. Nor does a list of objects a workflow state runs through (each: ${input.\u003cname>}): its example is one element of what that workflow takes.","uniqueKey":"data.definition.input.additionalProperties.example","typeLabel":"any"},"list":{"default":false,"description":"A list of what the rest of the declaration describes: with type operation, a list of that operation's bodies. The run input then takes an array, and each element is validated on its own.","type":"boolean","uniqueKey":"data.definition.input.additionalProperties.list","typeLabel":"boolean"},"only":{"items":{"type":"string","uniqueKey":"data.definition.input.additionalProperties.only.items.[INDEX]","typeLabel":"string"},"type":"array","uniqueKey":"data.definition.input.additionalProperties.only","typeLabel":"string[]"},"operation":{"description":"The operation this input is a body for. Left out, the input takes a pair -- {\"operation\": \"customer.query\", \"params\": {...}} -- validated against whichever operation the run names, which a request state sends with \"operation\": \"\\${input.\\\u003cname>.operation}\" and \"params\": {\"\\$from\": \"\\${input.\\\u003cname>.params}\"}.","type":"string","uniqueKey":"data.definition.input.additionalProperties.operation","typeLabel":"string"},"required":{"type":"boolean","uniqueKey":"data.definition.input.additionalProperties.required","typeLabel":"boolean"},"schema":{"additionalProperties":false,"description":"The shape of one value of this input (of each element, for a list), checked when a run starts and against the example: a subset of JSON Schema (type, properties, required, additionalProperties, items, enum, description, body_of). Allowed on an object or array input, or a list input that isn't an operation. Its top-level type defaults to the input's type. The reference picker and lint read its fields, so \\${input.\\\u003cname>.\\\u003cfield>} naming a field it lacks is a warning.","properties":{"additionalProperties":{"oneOf":[{"type":"boolean","description":"false refuses fields that properties doesn't name; true (the default) allows them; a schema allows them when they match it.","uniqueKey":"data.definition.input.additionalProperties.schema.\\additionalProperties.oneOf.0","typeLabel":"boolean"},{"description":"false refuses fields that properties doesn't name; true (the default) allows them; a schema allows them when they match it.","uniqueKey":"data.definition.input.additionalProperties.schema.\\additionalProperties.oneOf.1","typeLabel":"any"}],"uniqueKey":"data.definition.input.additionalProperties.schema.\\additionalProperties","typeLabel":"boolean | any"},"body_of":{"oneOf":[{"type":"object","description":"On an object: it is the body of the QuickBooks operation a sibling field names, validated against that operation's params when the run starts. {\"operation\": \"\\\u003csibling>\"} when the sibling holds an operation id (invoice.create); {\"kind\": \"\\\u003csibling>\", \"action\": \"create\"} when it holds a kind (customer), for the operation \\\u003ckind>.\\\u003caction>.","required":["operation"],"properties":{"operation":{"type":"string","isRequired":true,"uniqueKey":"data.definition.input.additionalProperties.schema.body_of.oneOf.0.operation","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"data.definition.input.additionalProperties.schema.body_of.oneOf.0","typeLabel":"object"},{"type":"object","description":"On an object: it is the body of the QuickBooks operation a sibling field names, validated against that operation's params when the run starts. {\"operation\": \"\\\u003csibling>\"} when the sibling holds an operation id (invoice.create); {\"kind\": \"\\\u003csibling>\", \"action\": \"create\"} when it holds a kind (customer), for the operation \\\u003ckind>.\\\u003caction>.","required":["kind","action"],"properties":{"action":{"enum":["create","update","query"],"type":"string","isRequired":true,"uniqueKey":"data.definition.input.additionalProperties.schema.body_of.oneOf.1.action","typeLabel":"enum\u003cstring>"},"kind":{"type":"string","isRequired":true,"uniqueKey":"data.definition.input.additionalProperties.schema.body_of.oneOf.1.kind","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"data.definition.input.additionalProperties.schema.body_of.oneOf.1","typeLabel":"object"}],"uniqueKey":"data.definition.input.additionalProperties.schema.body_of","typeLabel":"object"},"description":{"description":"What it is, shown in the usage contract's fields table.","type":"string","uniqueKey":"data.definition.input.additionalProperties.schema.description","typeLabel":"string"},"enum":{"description":"The values allowed.","minItems":1,"type":"array","uniqueKey":"data.definition.input.additionalProperties.schema.enum","typeLabel":"array"},"items":{"$circularRef":"a589b71e-b844-4466-8396-3c5e2933d443","description":"Every element of an array.","uniqueKey":"data.definition.input.additionalProperties.schema.\\items","typeLabel":"any"},"properties":{"additionalProperties":{"$circularRef":"a589b71e-b844-4466-8396-3c5e2933d443"},"description":"An object's fields, each a schema.","type":"object","uniqueKey":"data.definition.input.additionalProperties.schema.properties","typeLabel":"object"},"required":{"description":"The fields an object must have.","items":{"type":"string","uniqueKey":"data.definition.input.additionalProperties.schema.required.items.[INDEX]","typeLabel":"string"},"type":"array","uniqueKey":"data.definition.input.additionalProperties.schema.required","typeLabel":"string[]"},"type":{"oneOf":[{"type":"string","description":"string, number, integer, boolean, object, array or null, or a list of them ([\"string\", \"null\"]). At the top it defaults to the input's own type.","enum":["string","number","integer","boolean","object","array","null"],"uniqueKey":"data.definition.input.additionalProperties.schema.type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"array","items":{"enum":["string","number","integer","boolean","object","array","null"],"type":"string","uniqueKey":"data.definition.input.additionalProperties.schema.type.oneOf.1.items.[INDEX]","typeLabel":"enum\u003cstring>"},"description":"string, number, integer, boolean, object, array or null, or a list of them ([\"string\", \"null\"]). At the top it defaults to the input's own type.","minItems":1,"uniqueKey":"data.definition.input.additionalProperties.schema.type.oneOf.1","typeLabel":"enum\u003cstring>[]"}],"uniqueKey":"data.definition.input.additionalProperties.schema.type","typeLabel":"enum\u003cstring> | enum\u003cstring>[]"}},"type":"object","uniqueKey":"data.definition.input.additionalProperties.schema","typeLabel":"object"}},"required":["type"],"then":{"not":{"required":["schema"]}},"type":"object","uniqueKey":"data.definition.input.additionalProperties","typeLabel":"object"},"description":"What a run accepts. Validated at run start and published as a JSON Schema.","propertyNames":{"$ref":"#/components/schemas/WorkflowChartIdentifier"},"type":"object","uniqueKey":"data.definition.input","typeLabel":"object"},"key":{"pattern":"^[a-z][a-z0-9_]{0,63}$","type":"string","uniqueKey":"data.definition.key","typeLabel":"string"},"name":{"type":"string","uniqueKey":"data.definition.name","typeLabel":"string"},"on":{"additionalProperties":{"items":{"additionalProperties":false,"properties":{"target":{"description":"completed, failed, a sibling key (searched upward), or an absolute dotted path.","type":"string","isRequired":true,"uniqueKey":"data.definition.on.additionalProperties.items.[INDEX].target","typeLabel":"string"},"assign":{"additionalProperties":{"description":"Any JSON value. Strings may hold \\${...} references; a map may hold the reserved \"\\$from\" key, whose rendered map the rest of the map is deep-merged onto. A map holding \"\\$map\" is a list built from another: {\"\\$map\": \"\\${vars.items}\", \"as\": \"item\", \"template\": ...} renders template once per element, with the element at each.\\\u003cas>, its position at each.index and the length at each.count. With \"key\" (a template per element), it is an object instead: each element's template under the key or keys it renders.\n\n{\"\\$add\": [...]} sums its operands and {\"\\$default\": [...]} is the first that renders to something. {\"\\$merge\": [a, b, ...]} deep-merges each object onto the ones before it, as \"\\$from\" does (objects merge key by key; lists and scalars replace; an operand that renders to nothing is skipped). {\"\\$find\": \"\\${vars.items}\", \"where\": condition} is the first element the condition holds for (at each.\\\u003cas>), or nothing.\n\n{\"\\$refs\": \"\\${input.params}\", \"operation\": \"invoice.create\"} lists an add's references, or with \"list_ids\" puts their ListIDs back. {\"\\$read\": id, \"operation\": an add} reads that record whole. {\"\\$kind_name\": \"\\${input.kind}\"} is a kind, or an operation's, as a person reads it (Customer, Service item, Invoice for invoice.create), for a question's details. No other \\$-prefixed key is allowed.","if":{"type":"object"},"then":{"properties":{"$add":{"description":"The sum of its operands: numbers, or templates that render to numbers; nothing counts as 0.","minItems":1,"type":"array"},"$default":{"description":"The first of its candidates that renders to something other than nothing or an empty string.","minItems":1,"type":"array"},"$find":{"description":"A template that renders to a list. With \"where\" (a condition, required) and \"as\" (default item): the first element for which the condition holds, the element at each.\\\u003cas>, each.index and each.count; nothing when none does. Only \\$find, as and where.","type":"string"},"$from":{"type":"string"},"$kind_name":{"description":"A kind or an operation id, or a template for one (customer, item_service, invoice.create, \\${input.kind}): its name as a person reads it -- Customer, Service item, Sales tax code, Invoice -- or nothing for anything but a non-empty string. For a question's details. Only \\$kind_name.","type":"string"},"$map":{"description":"A template that renders to a list. With \"template\" (required) and \"as\" (default item): the list of the template rendered once per element, the element at each.\\\u003cas>, each.index and each.count. With \"key\" too (a template rendered per element, such as \\${each.ref.paths}, to a string or a list of strings): an object, each element's rendered template under its key or keys. Only \\$map, as, template and key.","type":"string"},"$merge":{"description":"Objects, or templates that render to objects, each deep-merged onto the ones before it: objects merge key by key, lists and scalars replace. An operand that renders to nothing is skipped. Alone in its object.","minItems":1,"type":"array"},"$read":{"description":"A record's id, or a template for it. With \"operation\" (an add's operation id, or a template; required): {\"operation\", \"params\"}, the query that reads the record that add makes, whole, by that id -- for a transaction add its type's query by txn_id with the flag that asks for its lines (include_line_items, or a build assembly's include_component_line_items), for a list add its type's query by list_id. A request state sends it with \"operation\": \"\\${vars.read.operation}\" and \"params\": {\"\\$from\": \"\\${vars.read.params}\"}. Only \\$read and operation.","type":"string"},"$refs":{"description":"An add's params (an object, or a template for one). With \"operation\" (the add's operation id, or a template; required): the distinct references the params make, in the order they first appear -- every *_ref field the operation has, its kind derived from the field's name (customer_ref is customer, ar_account_ref account, item_group_ref item_group), one entry per kind and full name with every path it appears at: {kind, field, full_name, name, parent, list_id, paths}. A kind with no full-name lookup (template) is left out.\n\nWith \"adds\" (a list of {kind, add, fields, accept}, as ensure takes them) and \"rules\" (an object of kind to ensure, create or must_exist; ensure by default), each also has \"rule\", \"ensure\": {kind, add}, the add from adds that makes it, one of its name alone under create, or none, \"pick\", true when there is no add, and \"fields\" and \"accept\" from its entry in adds, for resolve.\n\nWith \"found\" (the response of a for-each over the references: its data and outcomes, one per reference in order), each also has \"outcome\", \"how\" and \"record\" from its element (null for one the loop never reached); with \"made\" too (the response of a for-each over the ones found answered not_found), those take its outcome and record. \"missing\": true keeps the references whose outcome is still not_found.\n\nWith \"list_ids\" instead (one per reference, in that order), it is the params, every reference replaced by {\"list_id\": ...}. Only \\$refs, operation, adds, rules, found, made, missing and list_ids.","type":["string","object"]}},"propertyNames":{"not":{"pattern":"^\\$(?!(from|map|add|default|merge|find|refs|read|kind_name)$)"}}},"uniqueKey":"data.definition.on.additionalProperties.items.[INDEX].assign.additionalProperties","typeLabel":"any"},"description":"Variable name -> template. Every value is rendered against the same context snapshot, then merged into vars at once.","propertyNames":{"$ref":"#/components/schemas/WorkflowChartIdentifier"},"type":"object","uniqueKey":"data.definition.on.additionalProperties.items.[INDEX].assign","typeLabel":"object"},"description":{"type":"string","uniqueKey":"data.definition.on.additionalProperties.items.[INDEX].description","typeLabel":"string"},"if":{"oneOf":[{"type":"object","required":["path","op"],"properties":{"op":{"enum":["present","absent","eq","neq","gt","gte","lt","lte","contains","starts_with","in"],"type":"string","isRequired":true,"uniqueKey":"data.definition.on.additionalProperties.items.[INDEX].if.oneOf.0.op","typeLabel":"enum\u003cstring>"},"path":{"minLength":1,"type":"string","isRequired":true,"uniqueKey":"data.definition.on.additionalProperties.items.[INDEX].if.oneOf.0.path","typeLabel":"string"},"value":{"oneOf":[{}],"uniqueKey":"data.definition.on.additionalProperties.items.[INDEX].if.oneOf.0.value","typeLabel":"any"}},"additionalProperties":false,"uniqueKey":"data.definition.on.additionalProperties.items.[INDEX].if.oneOf.0","typeLabel":"object"},{"type":"object","required":["all"],"properties":{"all":{"items":{"$circularRef":"8c06db97-b615-45e2-b599-cbbf2ff785ee"},"minItems":1,"type":"array","isRequired":true,"uniqueKey":"data.definition.on.additionalProperties.items.[INDEX].if.oneOf.1.all","typeLabel":"array"}},"additionalProperties":false,"uniqueKey":"data.definition.on.additionalProperties.items.[INDEX].if.oneOf.1","typeLabel":"object"},{"type":"object","required":["any"],"properties":{"any":{"items":{"$circularRef":"8c06db97-b615-45e2-b599-cbbf2ff785ee"},"minItems":1,"type":"array","isRequired":true,"uniqueKey":"data.definition.on.additionalProperties.items.[INDEX].if.oneOf.2.any","typeLabel":"array"}},"additionalProperties":false,"uniqueKey":"data.definition.on.additionalProperties.items.[INDEX].if.oneOf.2","typeLabel":"object"},{"type":"object","required":["not"],"properties":{"not":{"oneOf":[{"$circularRef":"8c06db97-b615-45e2-b599-cbbf2ff785ee","isRequired":true}],"isRequired":true,"uniqueKey":"data.definition.on.additionalProperties.items.[INDEX].if.oneOf.3.not","typeLabel":"any"}},"additionalProperties":false,"uniqueKey":"data.definition.on.additionalProperties.items.[INDEX].if.oneOf.3","typeLabel":"object"}],"uniqueKey":"data.definition.on.additionalProperties.items.[INDEX].if","typeLabel":"object"}},"required":["target"],"type":"object","uniqueKey":"data.definition.on.additionalProperties.items.[INDEX]","typeLabel":"object"},"minItems":1,"type":"array","uniqueKey":"data.definition.on.additionalProperties","typeLabel":"object[]"},"description":"Event name -> transitions. Request states raise success/error, compounds raise done, wait states raise the chosen option id, notify states raise success/error, match states raise success (response.data is the answer: match is exact, strong, candidates or none; record; candidates; candidates_total; candidates_total_complete; index) or error (its fields refused once rendered: invalid_match; or QuickBooks failing the fallback queries on a connection without a name index).","propertyNames":{"allOf":[{"$ref":"#/components/schemas/WorkflowChartIdentifier"},{"not":{"const":"always"}}]},"type":"object","uniqueKey":"data.definition.on","typeLabel":"object"},"outcomes":{"additionalProperties":{"properties":{"description":{"description":"What this ending means, when its key does not say it already. Optional. Shown on the canvas, in the usage contract and in the guide.","type":"string","uniqueKey":"data.definition.outcomes.additionalProperties.description","typeLabel":"string"},"headline":{"description":"One plain sentence saying what happened when the run ends this way, the `headline` of its webhook: a template, rendered with the run's context and `output` (and `error` on a failure), such as \"Created \\${output.record.full_name} in QuickBooks.\" A value it names that is missing, or a template that does not render, gives the engine's own sentence instead. For people: an app never parses it.","type":"string","uniqueKey":"data.definition.outcomes.additionalProperties.headline","typeLabel":"string"},"kind":{"default":"success","description":"success: the run ends completed with this outcome. failure: the run ends failed with this outcome, and a workflow calling this one receives it as an error with response.outcome set.","enum":["success","failure"],"type":"string","uniqueKey":"data.definition.outcomes.additionalProperties.kind","typeLabel":"enum\u003cstring>"},"output":{"description":"Template rendered when the run ends this way, instead of the chart's own `output`. While it renders, `meta.outcome` holds the outcome key.","uniqueKey":"data.definition.outcomes.additionalProperties.output","typeLabel":"any"}},"type":"object","uniqueKey":"data.definition.outcomes.additionalProperties","typeLabel":"object"},"description":"Extra ways a run can end, beyond completed and failed. Each is a success (the default: the workflow worked as designed and this is how it ended; the run ends `completed` with this `outcome`) or, with `\"kind\": \"failure\"`, a named failure (the run ends `failed` with this `outcome`, and `error` is whatever the transition assigned to `error`, else the description, else `ended with outcome \u003ckey>`). A transition may target a declared outcome from anywhere, and no state at any level may use one of these keys.","propertyNames":{"pattern":"^[a-z][a-z0-9_]{0,49}$"},"type":"object","uniqueKey":"data.definition.outcomes","typeLabel":"object"},"output":{"description":"Template evaluated against the final context when the run reaches `completed` or an outcome with no `output` of its own. Defaults to \\${vars}. While it renders, `meta.outcome` holds the outcome key.","uniqueKey":"data.definition.output","typeLabel":"any"},"ui":{"description":"Canvas bookkeeping for the chart itself, ignored by the engine: one entry per outcome placing its terminal node, and `transitions` placing the pills of the root's own handlers, keyed \"\\\u003cevent>|\\\u003cindex>\".","type":"object","uniqueKey":"data.definition.ui","typeLabel":"object"}},"required":["version","initial","states"],"title":"QuBeSync workflow chart","type":"object","uniqueKey":"data.definition","typeLabel":"QuBeSync workflow chart · object"},"example_input":{"type":"object","uniqueKey":"data.example_input","typeLabel":"object"},"input_schema":{"description":"JSON Schema for this workflow's run input.","type":"object","uniqueKey":"data.input_schema","typeLabel":"object"},"references":{"description":"Keys of the workflows this one calls through a workflow state. Each must exist and be published before this one can run.","items":{"type":"string","uniqueKey":"data.references.items.[INDEX]","typeLabel":"string"},"type":"array","uniqueKey":"data.references","typeLabel":"string[]"}},"uniqueKey":"data","typeLabel":"object"},"installed":{"description":"The keys of every workflow this call created, the installed template first when it was created.","items":{"type":"string","uniqueKey":"installed.items.[INDEX]","typeLabel":"string"},"type":"array","uniqueKey":"installed","typeLabel":"string[]"},"replaced":{"description":"The keys of every workflow `replace: true` gave the template's chart, the installed template first when it was replaced. Empty without `replace`.","items":{"type":"string","uniqueKey":"replaced.items.[INDEX]","typeLabel":"string"},"type":"array","uniqueKey":"replaced","typeLabel":"string[]"}},"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"data":{"description":"\u003cstring>","key":"\u003cstring>","links":{},"name":"\u003cstring>","promoted_from":{},"published_version":123,"state":"draft","template":{"key":"\u003cstring>","status":"up_to_date"},"updated_at":"2023-11-07T05:31:56Z","working_copy_changed":true,"definition":{"initial":"\u003cstring>","states":{},"version":1,"description":"\u003cstring>","headline":"\u003cstring>","input":{},"key":"\u003cstring>","name":"\u003cstring>","on":{},"outcomes":{},"output":"\u003cunknown>","ui":{}},"example_input":{},"input_schema":{},"references":["\u003cstring>"]},"installed":["\u003cstring>"],"replaced":["\u003cstring>"]}}},"exampleType":"generated"}},"description":"The template was installed under a key the app did not have","exampleType":"generated"},"0260aaca-38a0-4d77-aa4d-483f04cf85f1":{"content":{"application/json":{"schema":{"description":"What a refused request answers with. The one key is errors, and its shape says what went wrong: a sentence when the endpoint explains the refusal in words (a parameter the operation does not take, a key already taken, a run that has already ended); an object with detail, and a code when there is one, when the request named nothing that exists or may not do what it asked (402, 403, 404, and a CLI session's 401), or an answer to a run's question was refused (the decisions endpoint's 400, 409 and 422, which always carry a code to branch on); an object of fields, each a list of messages, when a record failed validation and nothing was saved; a list of {path, message} problems when a submitted document or input fails validation. A request without a usable API key gets a 401 Basic challenge with the plain-text body Unauthorized, not JSON.","properties":{"errors":{"oneOf":[{"type":"string","title":"A sentence","example":"unknown parameter: \"emial\"","isRequired":true,"uniqueKey":"errors.oneOf.0","typeLabel":"string"},{"type":"object","title":"Detail and code","required":["detail"],"properties":{"detail":{"example":"Not Found","type":"string","isRequired":true,"uniqueKey":"errors.oneOf.1.detail","typeLabel":"string"},"code":{"example":"read_only_session","type":"string","uniqueKey":"errors.oneOf.1.code","typeLabel":"string"}},"isRequired":true,"uniqueKey":"errors.oneOf.1","typeLabel":"Detail and code · object"},{"type":"object","title":"Field by field","example":{"webhook_url":["may not contain a username or password"]},"additionalProperties":{"items":{"type":"string","uniqueKey":"errors.oneOf.2.additionalProperties.items.[INDEX]","typeLabel":"string"},"type":"array","uniqueKey":"errors.oneOf.2.additionalProperties","typeLabel":"string[]"},"isRequired":true,"uniqueKey":"errors.oneOf.2","typeLabel":"Field by field · object"},{"type":"array","items":{"properties":{"message":{"example":"is required","type":"string","isRequired":true,"uniqueKey":"errors.oneOf.3.items.[INDEX].message","typeLabel":"string"},"path":{"example":"input.customer","type":"string","isRequired":true,"uniqueKey":"errors.oneOf.3.items.[INDEX].path","typeLabel":"string"}},"required":["path","message"],"type":"object","uniqueKey":"errors.oneOf.3.items.[INDEX]","typeLabel":"object"},"title":"Located problems","isRequired":true,"uniqueKey":"errors.oneOf.3","typeLabel":"Located problems · object[]"}],"isRequired":true,"uniqueKey":"errors","typeLabel":"string | Detail and code · object | Field by field · object | Located problems · object[]"}},"required":["errors"],"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"errors":"unknown parameter: \"emial\""}}},"exampleType":"generated"}},"description":"No template with that key","exampleType":"generated"},"782c7018-43de-4af5-9c3e-ede6a229eb86":{"description":"The app already has a workflow at that key (`key_taken`) and `replace` was not true","content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}},"d96a67dc-7f64-493b-987d-b674975eceac":{"description":"The organization's promotion-only policy refused it, `replace` was not a boolean, or `publish: true` could not publish what was installed","content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}}},"security":{"06f1ea46-c540-43c2-8708-d089d2b8b36a":{"apiKey":{"description":"Use your app's API key as the username, and leave the password blank","scheme":"basic","type":"http","scopes":[],"schemeName":"apiKey"}}},"servers":{"acf84d29-d14b-4dd6-933f-31aa602dd68b":{"description":"v2 API","url":"https://qubesync.com/api/v2"},"b8836037-80c3-4a92-9378-766448db35bb":{"description":"Local development server","url":"https://dev.qubesync.com/api/v2"}},"schemas":{"8c06db97-b615-45e2-b599-cbbf2ff785ee":{"oneOf":[{"type":"object","required":["path","op"],"properties":{"op":{"enum":["present","absent","eq","neq","gt","gte","lt","lte","contains","starts_with","in"],"type":"string","isRequired":true},"path":{"minLength":1,"type":"string","isRequired":true},"value":{"oneOf":[{}]}},"additionalProperties":false},{"type":"object","required":["all"],"properties":{"all":{"items":{"$circularRef":"8c06db97-b615-45e2-b599-cbbf2ff785ee"},"minItems":1,"type":"array","isRequired":true}},"additionalProperties":false},{"type":"object","required":["any"],"properties":{"any":{"items":{"$circularRef":"8c06db97-b615-45e2-b599-cbbf2ff785ee"},"minItems":1,"type":"array","isRequired":true}},"additionalProperties":false},{"type":"object","required":["not"],"properties":{"not":{"oneOf":[{"isRequired":true}],"isRequired":true}},"additionalProperties":false}]},"a589b71e-b844-4466-8396-3c5e2933d443":{"additionalProperties":false,"description":"A JSON Schema subset describing one value of this input: type, properties, required, additionalProperties, items, enum, description, body_of.","properties":{"additionalProperties":{"oneOf":[{"type":"boolean","description":"false refuses fields that properties doesn't name; true (the default) allows them; a schema allows them when they match it."},{"description":"false refuses fields that properties doesn't name; true (the default) allows them; a schema allows them when they match it."}]},"body_of":{"oneOf":[{"type":"object","description":"On an object: it is the body of the QuickBooks operation a sibling field names, validated against that operation's params when the run starts. {\"operation\": \"\\\u003csibling>\"} when the sibling holds an operation id (invoice.create); {\"kind\": \"\\\u003csibling>\", \"action\": \"create\"} when it holds a kind (customer), for the operation \\\u003ckind>.\\\u003caction>.","required":["operation"],"properties":{"operation":{"type":"string","isRequired":true}},"additionalProperties":false},{"type":"object","description":"On an object: it is the body of the QuickBooks operation a sibling field names, validated against that operation's params when the run starts. {\"operation\": \"\\\u003csibling>\"} when the sibling holds an operation id (invoice.create); {\"kind\": \"\\\u003csibling>\", \"action\": \"create\"} when it holds a kind (customer), for the operation \\\u003ckind>.\\\u003caction>.","required":["kind","action"],"properties":{"action":{"enum":["create","update","query"],"type":"string","isRequired":true},"kind":{"type":"string","isRequired":true}},"additionalProperties":false}]},"description":{"description":"What it is, shown in the usage contract's fields table.","type":"string"},"enum":{"description":"The values allowed.","minItems":1,"type":"array"},"items":{"$circularRef":"a589b71e-b844-4466-8396-3c5e2933d443","description":"Every element of an array."},"properties":{"additionalProperties":{"$circularRef":"a589b71e-b844-4466-8396-3c5e2933d443"},"description":"An object's fields, each a schema.","type":"object"},"required":{"description":"The fields an object must have.","items":{"type":"string"},"type":"array"},"type":{"oneOf":[{"type":"string","description":"string, number, integer, boolean, object, array or null, or a list of them ([\"string\", \"null\"]). At the top it defaults to the input's own type.","enum":["string","number","integer","boolean","object","array","null"]},{"type":"array","items":{"enum":["string","number","integer","boolean","object","array","null"],"type":"string"},"description":"string, number, integer, boolean, object, array or null, or a list of them ([\"string\", \"null\"]). At the top it defaults to the input's own type.","minItems":1}]}},"type":"object"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"description":"Use your app's API key as the username, and leave the password blank","scheme":"basic","type":"http","scopes":[],"schemeName":"apiKey"},"schema":{"title":"Basic Auth","type":"object","description":"Use your app's API key as the username, and leave the password blank","isRequired":true,"properties":{"username":{"type":"string","uniqueKey":"username","isRequired":true,"typeLabel":"string","deprecated":false},"password":{"type":"string","uniqueKey":"password","isRequired":true,"typeLabel":"string","deprecated":false}},"additionalProperties":false,"deprecated":false},"schemeName":"apiKey","name":"Authorization"}],"title":"apiKey"}]},"originalFileLocation":"api-reference/v2/openapi.json"},"subdomain":"qubesync","siteName":"QuBe Sync","title":"Install a workflow template - QuBe Sync","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-11-02T16:20:12.698Z","originalFileLocation":"api-reference/v2/workflows/install-a-workflow-template.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Creates the template as a workflow in the authenticated app, together with the child templates its chart calls that the app does not have yet, in one request and one transaction: a refusal part-way through installs nothing. Answers 201 with the installed workflow and installed, every key this call created, parent first. When the app already has a workflow at the key, it is refused with 409 key_taken unless replace is true: then that workflow, and each child the app already has, gets the template\u0026#x27;s current chart the way PUT /workflows/{key} replaces one (the working copy changes; the name, description, published version and version history stay), the answer is 200, and replaced lists those keys. That makes a scripted install safe to repeat, and it is how a workflow takes a newer version of its template: a workflow\u0026#x27;s template.status says when there is one. as installs alongside an existing workflow instead, and PUT /workflows/{key} replaces it with a chart of your own. Refused with 422 promotion_required in a production app of an organization whose workflows change only by promotion.\">\u003cmeta data-mint-head name=\"application-name\" content=\"QuBe Sync\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/qubesync/GrEUn7G8W5QJHTqH/_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/qubesync/GrEUn7G8W5QJHTqH/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/qubesync/GrEUn7G8W5QJHTqH/_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/qubesync/GrEUn7G8W5QJHTqH/_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/qubesync/GrEUn7G8W5QJHTqH/_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/qubesync/GrEUn7G8W5QJHTqH/_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/qubesync/GrEUn7G8W5QJHTqH/_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/qubesync/GrEUn7G8W5QJHTqH/_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/qubesync/GrEUn7G8W5QJHTqH/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Install a workflow template - QuBe Sync\">\u003cmeta data-mint-head property=\"og:description\" content=\"Creates the template as a workflow in the authenticated app, together with the child templates its chart calls that the app does not have yet, in one request and one transaction: a refusal part-way through installs nothing. Answers 201 with the installed workflow and installed, every key this call created, parent first. When the app already has a workflow at the key, it is refused with 409 key_taken unless replace is true: then that workflow, and each child the app already has, gets the template\u0026#x27;s current chart the way PUT /workflows/{key} replaces one (the working copy changes; the name, description, published version and version history stay), the answer is 200, and replaced lists those keys. That makes a scripted install safe to repeat, and it is how a workflow takes a newer version of its template: a workflow\u0026#x27;s template.status says when there is one. as installs alongside an existing workflow instead, and PUT /workflows/{key} replaces it with a chart of your own. Refused with 422 promotion_required in a production app of an organization whose workflows change only by promotion.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"QuBe Sync\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.qubesync.com/api-reference/v2/workflows/install-a-workflow-template\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://qubesync.mintlify.app/_mintlify/api/og/v2?division=Workflows\u0026amp;title=Install+a+workflow+template\u0026amp;description=Creates+the+template+as+a+workflow+in+the+authenticated+app%2C+together+with+the+child+templates+its+chart+calls+that+the+app+does+not+have+yet%2C+in+one+request+an\u0026amp;theme=c2fec557b6516639b3d250f1\u0026amp;signature=30db538ca61a9c86689ae59db7e5fb9c5a8d940e6b8ea753759ce8cf55ae7ed4\">\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=\"Install a workflow template - QuBe Sync\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Creates the template as a workflow in the authenticated app, together with the child templates its chart calls that the app does not have yet, in one request and one transaction: a refusal part-way through installs nothing. Answers 201 with the installed workflow and installed, every key this call created, parent first. When the app already has a workflow at the key, it is refused with 409 key_taken unless replace is true: then that workflow, and each child the app already has, gets the template\u0026#x27;s current chart the way PUT /workflows/{key} replaces one (the working copy changes; the name, description, published version and version history stay), the answer is 200, and replaced lists those keys. That makes a scripted install safe to repeat, and it is how a workflow takes a newer version of its template: a workflow\u0026#x27;s template.status says when there is one. as installs alongside an existing workflow instead, and PUT /workflows/{key} replaces it with a chart of your own. Refused with 422 promotion_required in a production app of an organization whose workflows change only by promotion.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://qubesync.mintlify.app/_mintlify/api/og/v2?division=Workflows\u0026amp;title=Install+a+workflow+template\u0026amp;description=Creates+the+template+as+a+workflow+in+the+authenticated+app%2C+together+with+the+child+templates+its+chart+calls+that+the+app+does+not+have+yet%2C+in+one+request+an\u0026amp;theme=c2fec557b6516639b3d250f1\u0026amp;signature=30db538ca61a9c86689ae59db7e5fb9c5a8d940e6b8ea753759ce8cf55ae7ed4\">\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/qubesync/GrEUn7G8W5QJHTqH/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"QuBe Sync\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#16A34A\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.qubesync.com/api-reference/v2/workflows/install-a-workflow-template\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/v2/workflows/install-a-workflow-template.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.qubesync.com/#organization\",\"name\":\"QuBe Sync\",\"url\":\"https://docs.qubesync.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/qubesync/gN_APnIajnQKnywV/logo/full-light.png?fit=max\u0026auto=format\u0026n=gN_APnIajnQKnywV\u0026q=85\u0026s=0690db6248367802891c15bad08ae9e9\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.qubesync.com#website\",\"name\":\"QuBe Sync\",\"url\":\"https://docs.qubesync.com\",\"publisher\":{\"@id\":\"https://docs.qubesync.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.qubesync.com/api-reference/v2/workflows/install-a-workflow-template#webpage\",\"url\":\"https://docs.qubesync.com/api-reference/v2/workflows/install-a-workflow-template\",\"name\":\"Install a workflow template\",\"description\":\"Creates the template as a workflow in the authenticated app, together with the child templates its chart calls that the app does not have yet, in one request and one transaction: a refusal part-way through installs nothing. Answers 201 with the installed workflow and installed, every key this call created, parent first. When the app already has a workflow at the key, it is refused with 409 key_taken unless replace is true: then that workflow, and each child the app already has, gets the template's current chart the way PUT /workflows/{key} replaces one (the working copy changes; the name, description, published version and version history stay), the answer is 200, and replaced lists those keys. That makes a scripted install safe to repeat, and it is how a workflow takes a newer version of its template: a workflow's template.status says when there is one. as installs alongside an existing workflow instead, and PUT /workflows/{key} replaces it with a chart of your own. Refused with 422 promotion_required in a production app of an organization whose workflows change only by promotion.\",\"dateModified\":\"2026-11-02T16:20:12.698Z\",\"isPartOf\":{\"@id\":\"https://docs.qubesync.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.qubesync.com/api-reference/v2/workflows/install-a-workflow-template#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.qubesync.com/api-reference/v2/workflows/install-a-workflow-template#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"API v2\",\"item\":\"https://docs.qubesync.com/api-reference/v2/connections/list-connections\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Workflows\",\"item\":\"https://docs.qubesync.com/api-reference/v2/workflows/list-workflow-runs-for-a-connection\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Install a workflow template\",\"item\":\"https://docs.qubesync.com/api-reference/v2/workflows/install-a-workflow-template\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.qubesync.com/api-reference/v2/workflows/install-a-workflow-template#apireference\",\"headline\":\"Install a workflow template\",\"name\":\"Install a workflow template\",\"description\":\"Creates the template as a workflow in the authenticated app, together with the child templates its chart calls that the app does not have yet, in one request and one transaction: a refusal part-way through installs nothing. Answers 201 with the installed workflow and installed, every key this call created, parent first. When the app already has a workflow at the key, it is refused with 409 key_taken unless replace is true: then that workflow, and each child the app already has, gets the template's current chart the way PUT /workflows/{key} replaces one (the working copy changes; the name, description, published version and version history stay), the answer is 200, and replaced lists those keys. That makes a scripted install safe to repeat, and it is how a workflow takes a newer version of its template: a workflow's template.status says when there is one. as installs alongside an existing workflow instead, and PUT /workflows/{key} replaces it with a chart of your own. Refused with 422 promotion_required in a production app of an organization whose workflows change only by promotion.\",\"url\":\"https://docs.qubesync.com/api-reference/v2/workflows/install-a-workflow-template\",\"mainEntityOfPage\":{\"@id\":\"https://docs.qubesync.com/api-reference/v2/workflows/install-a-workflow-template#webpage\"},\"dateModified\":\"2026-11-02T16:20:12.698Z\",\"publisher\":{\"@id\":\"https://docs.qubesync.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.qubesync.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"QuBe Sync\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"QuBe Sync","nav":{"global":{"anchors":[{"anchor":"QuBe Sync Slack","icon":"slack","href":"https://qubeintegrations.slack.com"}]},"tabs":[{"tab":"Guides","pages":[{"title":"Guides","href":""}]},{"tab":"API Reference","groups":[{"group":"Overview","pages":[{"title":"API reference","sidebarTitle":"Introduction","icon":"book","href":"/api-reference/introduction"}]},{"group":"API v2","pages":[{"group":"Connections","pages":[{"title":"List connections","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections","href":"/api-reference/v2/connections/list-connections"},{"title":"Create a connection","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections","href":"/api-reference/v2/connections/create-a-connection"},{"title":"Get a connection","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}","href":"/api-reference/v2/connections/get-a-connection"},{"title":"Update a connection","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json put /connections/{connection_id}","href":"/api-reference/v2/connections/update-a-connection"},{"title":"Remove a connection","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json delete /connections/{connection_id}","href":"/api-reference/v2/connections/remove-a-connection"},{"title":"Regenerate the onboarding URL","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/onboarding-url","href":"/api-reference/v2/connections/regenerate-the-onboarding-url"},{"title":"Generate or set a password","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/password","href":"/api-reference/v2/connections/generate-or-set-a-password"},{"title":"Get the QWC file","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/qwc","href":"/api-reference/v2/connections/get-the-qwc-file"},{"title":"Get the simulator's state","deprecated":null,"version":null,"tag":"Beta","openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/simulator","href":"/api-reference/v2/connections/get-the-simulators-state"},{"title":"Set simulator faults","deprecated":null,"version":null,"tag":"Beta","openapi":"/api-reference/v2/openapi.json put /connections/{connection_id}/simulator","href":"/api-reference/v2/connections/set-simulator-faults"},{"title":"Reset the simulator","deprecated":null,"version":null,"tag":"Beta","openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/simulator/reset","href":"/api-reference/v2/connections/reset-the-simulator"},{"title":"Run the simulator now","deprecated":null,"version":null,"tag":"Beta","openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/simulator/sync","href":"/api-reference/v2/connections/run-the-simulator-now"}]},{"group":"Queued Requests","pages":[{"title":"List queued requests","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/queued-requests","href":"/api-reference/v2/queued-requests/list-queued-requests"},{"title":"Queue a qbXML request","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/queued-requests","href":"/api-reference/v2/queued-requests/queue-a-qbxml-request"},{"title":"Get a queued request","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/queued-requests/{id}","href":"/api-reference/v2/queued-requests/get-a-queued-request"},{"title":"Discard a queued request","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/queued-requests/{id}/discard","href":"/api-reference/v2/queued-requests/discard-a-queued-request"},{"title":"List the pages of a multi-page (iterated) response","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/queued-requests/{id}/pages","href":"/api-reference/v2/queued-requests/list-the-pages-of-a-multi-page-iterated-response"}]},{"group":"Matching","pages":[{"title":"Match a name","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/matches","href":"/api-reference/v2/matching/match-a-name"},{"title":"Opt in to matching","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/name-index","href":"/api-reference/v2/matching/opt-in-to-matching"}]},{"group":"Workflows","pages":[{"title":"List workflow runs for a connection","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/workflow-runs","href":"/api-reference/v2/workflows/list-workflow-runs-for-a-connection"},{"title":"Start a workflow run","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/workflow-runs","href":"/api-reference/v2/workflows/start-a-workflow-run"},{"title":"Get a workflow run","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/workflow-runs/{run_id}","href":"/api-reference/v2/workflows/get-a-workflow-run"},{"title":"Delete a finished workflow run","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json delete /connections/{connection_id}/workflow-runs/{run_id}","href":"/api-reference/v2/workflows/delete-a-finished-workflow-run"},{"title":"Cancel a workflow run","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/workflow-runs/{run_id}/cancel","href":"/api-reference/v2/workflows/cancel-a-workflow-run"},{"title":"Answer a run that is awaiting input","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/workflow-runs/{run_id}/decisions","href":"/api-reference/v2/workflows/answer-a-run-that-is-awaiting-input"},{"title":"A workflow run's event log","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/workflow-runs/{run_id}/events","href":"/api-reference/v2/workflows/a-workflow-runs-event-log"},{"title":"Resend a run's latest event","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/workflow-runs/{run_id}/redeliver","href":"/api-reference/v2/workflows/resend-a-runs-latest-event"},{"title":"Search for the record a question's field means","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/workflow-runs/{run_id}/search","href":"/api-reference/v2/workflows/search-for-the-record-a-questions-field-means"},{"title":"List workflow templates","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /workflow-templates","href":"/api-reference/v2/workflows/list-workflow-templates"},{"title":"Get a workflow template","description":"One shipped template, with its chart under `definition`. To install it unmodified, use `POST /workflow-templates/{key}/install`; to install an adapted copy, `PUT /workflows/{key}`.","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /workflow-templates/{key}","href":"/api-reference/v2/workflows/get-a-workflow-template"},{"title":"Install a workflow template","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /workflow-templates/{key}/install","href":"/api-reference/v2/workflows/install-a-workflow-template"},{"title":"How to use a workflow template, before it's installed","description":"The template's usage contract: how to start it, every question it may ask (including those of the templates it calls), and every way it can end. The same shape `GET /workflows/{key}/usage` answers for an installed workflow, built from the template's chart and the charts of the templates it calls, as if `POST /workflow-templates/{key}/install` had installed them together, so you can read what it asks and how it ends before installing anything. `workflow.state` is `template`. It reads nothing of your app: once you've installed or adapted it, `GET /workflows/{key}/usage` describes the workflow your app actually runs.","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /workflow-templates/{key}/usage","href":"/api-reference/v2/workflows/how-to-use-a-workflow-template-before-its-installed"},{"title":"How to use a workflow template, as Markdown","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /workflow-templates/{key}/usage.md","href":"/api-reference/v2/workflows/how-to-use-a-workflow-template-as-markdown"},{"title":"List workflows","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /workflows","href":"/api-reference/v2/workflows/list-workflows"},{"title":"The workflow chart JSON Schema","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /workflows/schema","href":"/api-reference/v2/workflows/the-workflow-chart-json-schema"},{"title":"The workflow chart JSON Schema, unauthenticated","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /workflows/schema.json","href":"/api-reference/v2/workflows/the-workflow-chart-json-schema-unauthenticated"},{"title":"Your workflows' input types","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /workflows/types","href":"/api-reference/v2/workflows/your-workflows-input-types"},{"title":"Validate a chart without saving it","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /workflows/validate","href":"/api-reference/v2/workflows/validate-a-chart-without-saving-it"},{"title":"Get a workflow","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /workflows/{key}","href":"/api-reference/v2/workflows/get-a-workflow"},{"title":"Create or replace a workflow","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json put /workflows/{key}","href":"/api-reference/v2/workflows/create-or-replace-a-workflow"},{"title":"Delete a workflow","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json delete /workflows/{key}","href":"/api-reference/v2/workflows/delete-a-workflow"},{"title":"Publish the working copy","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /workflows/{key}/publish","href":"/api-reference/v2/workflows/publish-the-working-copy"},{"title":"Unpublish a workflow","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /workflows/{key}/unpublish","href":"/api-reference/v2/workflows/unpublish-a-workflow"},{"title":"How to use a workflow","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /workflows/{key}/usage","href":"/api-reference/v2/workflows/how-to-use-a-workflow"},{"title":"How to use a workflow, as Markdown","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /workflows/{key}/usage.md","href":"/api-reference/v2/workflows/how-to-use-a-workflow-as-markdown"},{"title":"A workflow's published versions","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /workflows/{key}/versions","href":"/api-reference/v2/workflows/a-workflows-published-versions"},{"title":"One published version","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /workflows/{key}/versions/{number}","href":"/api-reference/v2/workflows/one-published-version"}]},{"group":"Account Tax Line Infos","pages":[{"title":"List account tax line infos","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/account-tax-line-infos","href":"/api-reference/v2/account-tax-line-infos/list-account-tax-line-infos"}]},{"group":"Accounts","pages":[{"title":"List accounts","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/accounts","href":"/api-reference/v2/accounts/list-accounts"},{"title":"Update account","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json put /connections/{connection_id}/accounts","href":"/api-reference/v2/accounts/update-account"},{"title":"Create account","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/accounts","href":"/api-reference/v2/accounts/create-account"}]},{"group":"Aging Reports","pages":[{"title":"List aging reports","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/aging-reports","href":"/api-reference/v2/aging-reports/list-aging-reports"}]},{"group":"Alerts","pages":[{"title":"List alerts","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/alerts","href":"/api-reference/v2/alerts/list-alerts"},{"title":"Create alert","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/alerts","href":"/api-reference/v2/alerts/create-alert"},{"title":"Delete alert","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json delete /connections/{connection_id}/alerts","href":"/api-reference/v2/alerts/delete-alert"}]},{"group":"Ar Refund Credit Cards","pages":[{"title":"List ar refund credit cards","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/ar-refund-credit-cards","href":"/api-reference/v2/ar-refund-credit-cards/list-ar-refund-credit-cards"},{"title":"Create ar refund credit card","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/ar-refund-credit-cards","href":"/api-reference/v2/ar-refund-credit-cards/create-ar-refund-credit-card"}]},{"group":"Bar Codes","pages":[{"title":"List bar codes","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/bar-codes","href":"/api-reference/v2/bar-codes/list-bar-codes"}]},{"group":"Bill Payment Checks","pages":[{"title":"List bill payment checks","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/bill-payment-checks","href":"/api-reference/v2/bill-payment-checks/list-bill-payment-checks"},{"title":"Update bill payment check","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json put /connections/{connection_id}/bill-payment-checks","href":"/api-reference/v2/bill-payment-checks/update-bill-payment-check"},{"title":"Create bill payment check","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/bill-payment-checks","href":"/api-reference/v2/bill-payment-checks/create-bill-payment-check"}]},{"group":"Bill Payment Credit Cards","pages":[{"title":"List bill payment credit cards","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/bill-payment-credit-cards","href":"/api-reference/v2/bill-payment-credit-cards/list-bill-payment-credit-cards"},{"title":"Create bill payment credit card","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/bill-payment-credit-cards","href":"/api-reference/v2/bill-payment-credit-cards/create-bill-payment-credit-card"}]},{"group":"Bill To Pays","pages":[{"title":"List bill to pays","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/bill-to-pays","href":"/api-reference/v2/bill-to-pays/list-bill-to-pays"}]},{"group":"Billing Rates","pages":[{"title":"List billing rates","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/billing-rates","href":"/api-reference/v2/billing-rates/list-billing-rates"},{"title":"Create billing rate","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/billing-rates","href":"/api-reference/v2/billing-rates/create-billing-rate"}]},{"group":"Bills","pages":[{"title":"List bills","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/bills","href":"/api-reference/v2/bills/list-bills"},{"title":"Update bill","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json put /connections/{connection_id}/bills","href":"/api-reference/v2/bills/update-bill"},{"title":"Create bill","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/bills","href":"/api-reference/v2/bills/create-bill"}]},{"group":"Budget Summary Reports","pages":[{"title":"List budget summary reports","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/budget-summary-reports","href":"/api-reference/v2/budget-summary-reports/list-budget-summary-reports"}]},{"group":"Build Assemblies","pages":[{"title":"List build assemblies","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/build-assemblies","href":"/api-reference/v2/build-assemblies/list-build-assemblies"},{"title":"Update build assembly","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json put /connections/{connection_id}/build-assemblies","href":"/api-reference/v2/build-assemblies/update-build-assembly"},{"title":"Create build assembly","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/build-assemblies","href":"/api-reference/v2/build-assemblies/create-build-assembly"}]},{"group":"Charges","pages":[{"title":"List charges","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/charges","href":"/api-reference/v2/charges/list-charges"},{"title":"Update charge","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json put /connections/{connection_id}/charges","href":"/api-reference/v2/charges/update-charge"},{"title":"Create charge","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/charges","href":"/api-reference/v2/charges/create-charge"}]},{"group":"Checks","pages":[{"title":"List checks","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/checks","href":"/api-reference/v2/checks/list-checks"},{"title":"Update check","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json put /connections/{connection_id}/checks","href":"/api-reference/v2/checks/update-check"},{"title":"Create check","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/checks","href":"/api-reference/v2/checks/create-check"}]},{"group":"Classes","pages":[{"title":"List classes","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/classes","href":"/api-reference/v2/classes/list-classes"},{"title":"Update class","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json put /connections/{connection_id}/classes","href":"/api-reference/v2/classes/update-class"},{"title":"Create class","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/classes","href":"/api-reference/v2/classes/create-class"}]},{"group":"Cleared Statuses","pages":[{"title":"Update cleared status","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json put /connections/{connection_id}/cleared-statuses","href":"/api-reference/v2/cleared-statuses/update-cleared-status"}]},{"group":"Companies","pages":[{"title":"List companies","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/companies","href":"/api-reference/v2/companies/list-companies"}]},{"group":"Company Activities","pages":[{"title":"List company activities","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/company-activities","href":"/api-reference/v2/company-activities/list-company-activities"}]},{"group":"Credit Card Charges","pages":[{"title":"List credit card charges","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/credit-card-charges","href":"/api-reference/v2/credit-card-charges/list-credit-card-charges"},{"title":"Update credit card charge","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json put /connections/{connection_id}/credit-card-charges","href":"/api-reference/v2/credit-card-charges/update-credit-card-charge"},{"title":"Create credit card charge","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/credit-card-charges","href":"/api-reference/v2/credit-card-charges/create-credit-card-charge"}]},{"group":"Credit Card Credits","pages":[{"title":"List credit card credits","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/credit-card-credits","href":"/api-reference/v2/credit-card-credits/list-credit-card-credits"},{"title":"Update credit card credit","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json put /connections/{connection_id}/credit-card-credits","href":"/api-reference/v2/credit-card-credits/update-credit-card-credit"},{"title":"Create credit card credit","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/credit-card-credits","href":"/api-reference/v2/credit-card-credits/create-credit-card-credit"}]},{"group":"Credit Memos","pages":[{"title":"List credit memos","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/credit-memos","href":"/api-reference/v2/credit-memos/list-credit-memos"},{"title":"Update credit memo","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json put /connections/{connection_id}/credit-memos","href":"/api-reference/v2/credit-memos/update-credit-memo"},{"title":"Create credit memo","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/credit-memos","href":"/api-reference/v2/credit-memos/create-credit-memo"}]},{"group":"Currencies","pages":[{"title":"List currencies","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/currencies","href":"/api-reference/v2/currencies/list-currencies"},{"title":"Update currency","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json put /connections/{connection_id}/currencies","href":"/api-reference/v2/currencies/update-currency"},{"title":"Create currency","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/currencies","href":"/api-reference/v2/currencies/create-currency"}]},{"group":"Custom Detail Reports","pages":[{"title":"List custom detail reports","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/custom-detail-reports","href":"/api-reference/v2/custom-detail-reports/list-custom-detail-reports"}]},{"group":"Custom Summary Reports","pages":[{"title":"List custom summary reports","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/custom-summary-reports","href":"/api-reference/v2/custom-summary-reports/list-custom-summary-reports"}]},{"group":"Customer Msgs","pages":[{"title":"List customer msgs","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/customer-msgs","href":"/api-reference/v2/customer-msgs/list-customer-msgs"},{"title":"Create customer msg","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/customer-msgs","href":"/api-reference/v2/customer-msgs/create-customer-msg"}]},{"group":"Customer Types","pages":[{"title":"List customer types","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/customer-types","href":"/api-reference/v2/customer-types/list-customer-types"},{"title":"Create customer type","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/customer-types","href":"/api-reference/v2/customer-types/create-customer-type"}]},{"group":"Customers","pages":[{"title":"List customers","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/customers","href":"/api-reference/v2/customers/list-customers"},{"title":"Update customer","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json put /connections/{connection_id}/customers","href":"/api-reference/v2/customers/update-customer"},{"title":"Create customer","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/customers","href":"/api-reference/v2/customers/create-customer"}]},{"group":"Data Event Recovery Infos","pages":[{"title":"List data event recovery infos","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/data-event-recovery-infos","href":"/api-reference/v2/data-event-recovery-infos/list-data-event-recovery-infos"},{"title":"Delete data event recovery info","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json delete /connections/{connection_id}/data-event-recovery-infos","href":"/api-reference/v2/data-event-recovery-infos/delete-data-event-recovery-info"}]},{"group":"Data Ext Defs","pages":[{"title":"List data ext defs","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/data-ext-defs","href":"/api-reference/v2/data-ext-defs/list-data-ext-defs"},{"title":"Update data ext def","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json put /connections/{connection_id}/data-ext-defs","href":"/api-reference/v2/data-ext-defs/update-data-ext-def"},{"title":"Create data ext def","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/data-ext-defs","href":"/api-reference/v2/data-ext-defs/create-data-ext-def"},{"title":"Delete data ext def","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json delete /connections/{connection_id}/data-ext-defs","href":"/api-reference/v2/data-ext-defs/delete-data-ext-def"}]},{"group":"Data Exts","pages":[{"title":"Update data ext","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json put /connections/{connection_id}/data-exts","href":"/api-reference/v2/data-exts/update-data-ext"},{"title":"Create data ext","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/data-exts","href":"/api-reference/v2/data-exts/create-data-ext"},{"title":"Delete data ext","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json delete /connections/{connection_id}/data-exts","href":"/api-reference/v2/data-exts/delete-data-ext"}]},{"group":"Date Driven Terms","pages":[{"title":"List date driven terms","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/date-driven-terms","href":"/api-reference/v2/date-driven-terms/list-date-driven-terms"},{"title":"Create date driven terms","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/date-driven-terms","href":"/api-reference/v2/date-driven-terms/create-date-driven-terms"}]},{"group":"Deposits","pages":[{"title":"List deposits","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/deposits","href":"/api-reference/v2/deposits/list-deposits"},{"title":"Update deposit","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json put /connections/{connection_id}/deposits","href":"/api-reference/v2/deposits/update-deposit"},{"title":"Create deposit","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/deposits","href":"/api-reference/v2/deposits/create-deposit"}]},{"group":"Employee Defaults","pages":[{"title":"List employee defaults","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/employee-defaults","href":"/api-reference/v2/employee-defaults/list-employee-defaults"},{"title":"Update employee default","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json put /connections/{connection_id}/employee-defaults","href":"/api-reference/v2/employee-defaults/update-employee-default"}]},{"group":"Employees","pages":[{"title":"List employees","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/employees","href":"/api-reference/v2/employees/list-employees"},{"title":"Update employee","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json put /connections/{connection_id}/employees","href":"/api-reference/v2/employees/update-employee"},{"title":"Create employee","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/employees","href":"/api-reference/v2/employees/create-employee"}]},{"group":"Entities","pages":[{"title":"List entities","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/entities","href":"/api-reference/v2/entities/list-entities"}]},{"group":"Estimates","pages":[{"title":"List estimates","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/estimates","href":"/api-reference/v2/estimates/list-estimates"},{"title":"Update estimate","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json put /connections/{connection_id}/estimates","href":"/api-reference/v2/estimates/update-estimate"},{"title":"Create estimate","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/estimates","href":"/api-reference/v2/estimates/create-estimate"}]},{"group":"Form1099 Category Account Mappings","pages":[{"title":"List form1099 category account mappings","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/form1099-category-account-mappings","href":"/api-reference/v2/form1099-category-account-mappings/list-form1099-category-account-mappings"},{"title":"Update form1099 category account mapping","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json put /connections/{connection_id}/form1099-category-account-mappings","href":"/api-reference/v2/form1099-category-account-mappings/update-form1099-category-account-mapping"}]},{"group":"General Detail Reports","pages":[{"title":"List general detail reports","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/general-detail-reports","href":"/api-reference/v2/general-detail-reports/list-general-detail-reports"}]},{"group":"General Summary Reports","pages":[{"title":"List general summary reports","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/general-summary-reports","href":"/api-reference/v2/general-summary-reports/list-general-summary-reports"}]},{"group":"Hosts","pages":[{"title":"List hosts","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/hosts","href":"/api-reference/v2/hosts/list-hosts"}]},{"group":"Inventory Adjustments","pages":[{"title":"List inventory adjustments","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/inventory-adjustments","href":"/api-reference/v2/inventory-adjustments/list-inventory-adjustments"},{"title":"Update inventory adjustment","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json put /connections/{connection_id}/inventory-adjustments","href":"/api-reference/v2/inventory-adjustments/update-inventory-adjustment"},{"title":"Create inventory adjustment","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/inventory-adjustments","href":"/api-reference/v2/inventory-adjustments/create-inventory-adjustment"}]},{"group":"Inventory Sites","pages":[{"title":"List inventory sites","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/inventory-sites","href":"/api-reference/v2/inventory-sites/list-inventory-sites"},{"title":"Update inventory site","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json put /connections/{connection_id}/inventory-sites","href":"/api-reference/v2/inventory-sites/update-inventory-site"},{"title":"Create inventory site","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/inventory-sites","href":"/api-reference/v2/inventory-sites/create-inventory-site"}]},{"group":"Invoices","pages":[{"title":"List invoices","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/invoices","href":"/api-reference/v2/invoices/list-invoices"},{"title":"Update invoice","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json put /connections/{connection_id}/invoices","href":"/api-reference/v2/invoices/update-invoice"},{"title":"Create invoice","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/invoices","href":"/api-reference/v2/invoices/create-invoice"}]},{"group":"Item Assemblies Can Builds","pages":[{"title":"List item assemblies can builds","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/item-assemblies-can-builds","href":"/api-reference/v2/item-assemblies-can-builds/list-item-assemblies-can-builds"}]},{"group":"Item Discounts","pages":[{"title":"List item discounts","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/item-discounts","href":"/api-reference/v2/item-discounts/list-item-discounts"},{"title":"Update item discount","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json put /connections/{connection_id}/item-discounts","href":"/api-reference/v2/item-discounts/update-item-discount"},{"title":"Create item discount","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/item-discounts","href":"/api-reference/v2/item-discounts/create-item-discount"}]},{"group":"Item Fixed Assets","pages":[{"title":"List item fixed assets","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/item-fixed-assets","href":"/api-reference/v2/item-fixed-assets/list-item-fixed-assets"},{"title":"Update item fixed asset","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json put /connections/{connection_id}/item-fixed-assets","href":"/api-reference/v2/item-fixed-assets/update-item-fixed-asset"},{"title":"Create item fixed asset","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/item-fixed-assets","href":"/api-reference/v2/item-fixed-assets/create-item-fixed-asset"}]},{"group":"Item Groups","pages":[{"title":"List item groups","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/item-groups","href":"/api-reference/v2/item-groups/list-item-groups"},{"title":"Update item group","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json put /connections/{connection_id}/item-groups","href":"/api-reference/v2/item-groups/update-item-group"},{"title":"Create item group","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/item-groups","href":"/api-reference/v2/item-groups/create-item-group"}]},{"group":"Item Inventories","pages":[{"title":"List item inventories","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/item-inventories","href":"/api-reference/v2/item-inventories/list-item-inventories"},{"title":"Update item inventory","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json put /connections/{connection_id}/item-inventories","href":"/api-reference/v2/item-inventories/update-item-inventory"},{"title":"Create item inventory","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/item-inventories","href":"/api-reference/v2/item-inventories/create-item-inventory"}]},{"group":"Item Inventory Assemblies","pages":[{"title":"List item inventory assemblies","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/item-inventory-assemblies","href":"/api-reference/v2/item-inventory-assemblies/list-item-inventory-assemblies"},{"title":"Update item inventory assembly","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json put /connections/{connection_id}/item-inventory-assemblies","href":"/api-reference/v2/item-inventory-assemblies/update-item-inventory-assembly"},{"title":"Create item inventory assembly","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/item-inventory-assemblies","href":"/api-reference/v2/item-inventory-assemblies/create-item-inventory-assembly"}]},{"group":"Item Non Inventories","pages":[{"title":"List item non inventories","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/item-non-inventories","href":"/api-reference/v2/item-non-inventories/list-item-non-inventories"},{"title":"Update item non inventory","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json put /connections/{connection_id}/item-non-inventories","href":"/api-reference/v2/item-non-inventories/update-item-non-inventory"},{"title":"Create item non inventory","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/item-non-inventories","href":"/api-reference/v2/item-non-inventories/create-item-non-inventory"}]},{"group":"Item Other Charges","pages":[{"title":"List item other charges","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/item-other-charges","href":"/api-reference/v2/item-other-charges/list-item-other-charges"},{"title":"Update item other charge","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json put /connections/{connection_id}/item-other-charges","href":"/api-reference/v2/item-other-charges/update-item-other-charge"},{"title":"Create item other charge","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/item-other-charges","href":"/api-reference/v2/item-other-charges/create-item-other-charge"}]},{"group":"Item Payments","pages":[{"title":"List item payments","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/item-payments","href":"/api-reference/v2/item-payments/list-item-payments"},{"title":"Update item payment","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json put /connections/{connection_id}/item-payments","href":"/api-reference/v2/item-payments/update-item-payment"},{"title":"Create item payment","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/item-payments","href":"/api-reference/v2/item-payments/create-item-payment"}]},{"group":"Item Receipts","pages":[{"title":"List item receipts","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/item-receipts","href":"/api-reference/v2/item-receipts/list-item-receipts"},{"title":"Update item receipt","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json put /connections/{connection_id}/item-receipts","href":"/api-reference/v2/item-receipts/update-item-receipt"},{"title":"Create item receipt","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/item-receipts","href":"/api-reference/v2/item-receipts/create-item-receipt"}]},{"group":"Item Sales Tax Groups","pages":[{"title":"List item sales tax groups","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/item-sales-tax-groups","href":"/api-reference/v2/item-sales-tax-groups/list-item-sales-tax-groups"},{"title":"Update item sales tax group","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json put /connections/{connection_id}/item-sales-tax-groups","href":"/api-reference/v2/item-sales-tax-groups/update-item-sales-tax-group"},{"title":"Create item sales tax group","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/item-sales-tax-groups","href":"/api-reference/v2/item-sales-tax-groups/create-item-sales-tax-group"}]},{"group":"Item Sales Taxes","pages":[{"title":"List item sales taxes","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/item-sales-taxes","href":"/api-reference/v2/item-sales-taxes/list-item-sales-taxes"},{"title":"Update item sales tax","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json put /connections/{connection_id}/item-sales-taxes","href":"/api-reference/v2/item-sales-taxes/update-item-sales-tax"},{"title":"Create item sales tax","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/item-sales-taxes","href":"/api-reference/v2/item-sales-taxes/create-item-sales-tax"}]},{"group":"Item Services","pages":[{"title":"List item services","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/item-services","href":"/api-reference/v2/item-services/list-item-services"},{"title":"Update item service","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json put /connections/{connection_id}/item-services","href":"/api-reference/v2/item-services/update-item-service"},{"title":"Create item service","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/item-services","href":"/api-reference/v2/item-services/create-item-service"}]},{"group":"Item Sites","pages":[{"title":"List item sites","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/item-sites","href":"/api-reference/v2/item-sites/list-item-sites"}]},{"group":"Item Subtotals","pages":[{"title":"List item subtotals","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/item-subtotals","href":"/api-reference/v2/item-subtotals/list-item-subtotals"},{"title":"Update item subtotal","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json put /connections/{connection_id}/item-subtotals","href":"/api-reference/v2/item-subtotals/update-item-subtotal"},{"title":"Create item subtotal","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/item-subtotals","href":"/api-reference/v2/item-subtotals/create-item-subtotal"}]},{"group":"Items","pages":[{"title":"List items","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/items","href":"/api-reference/v2/items/list-items"}]},{"group":"Job Reports","pages":[{"title":"List job reports","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/job-reports","href":"/api-reference/v2/job-reports/list-job-reports"}]},{"group":"Job Types","pages":[{"title":"List job types","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/job-types","href":"/api-reference/v2/job-types/list-job-types"},{"title":"Create job type","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/job-types","href":"/api-reference/v2/job-types/create-job-type"}]},{"group":"Journal Entries","pages":[{"title":"List journal entries","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/journal-entries","href":"/api-reference/v2/journal-entries/list-journal-entries"},{"title":"Update journal entry","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json put /connections/{connection_id}/journal-entries","href":"/api-reference/v2/journal-entries/update-journal-entry"},{"title":"Create journal entry","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/journal-entries","href":"/api-reference/v2/journal-entries/create-journal-entry"}]},{"group":"Leads","pages":[{"title":"List leads","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/leads","href":"/api-reference/v2/leads/list-leads"},{"title":"Update lead","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json put /connections/{connection_id}/leads","href":"/api-reference/v2/leads/update-lead"},{"title":"Create lead","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/leads","href":"/api-reference/v2/leads/create-lead"}]},{"group":"List Deleteds","pages":[{"title":"List list deleteds","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/list-deleteds","href":"/api-reference/v2/list-deleteds/list-list-deleteds"}]},{"group":"List Displays","pages":[{"title":"Update list display","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json put /connections/{connection_id}/list-displays","href":"/api-reference/v2/list-displays/update-list-display"},{"title":"Create list display","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/list-displays","href":"/api-reference/v2/list-displays/create-list-display"}]},{"group":"List Merge","pages":[{"title":"Execute list merge","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/list-merge","href":"/api-reference/v2/list-merge/execute-list-merge"}]},{"group":"Lists","pages":[{"title":"Delete list","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json delete /connections/{connection_id}/lists","href":"/api-reference/v2/lists/delete-list"}]},{"group":"Other Names","pages":[{"title":"List other names","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/other-names","href":"/api-reference/v2/other-names/list-other-names"},{"title":"Update other name","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json put /connections/{connection_id}/other-names","href":"/api-reference/v2/other-names/update-other-name"},{"title":"Create other name","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/other-names","href":"/api-reference/v2/other-names/create-other-name"}]},{"group":"Paychecks","pages":[{"title":"List paychecks","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/paychecks","href":"/api-reference/v2/paychecks/list-paychecks"}]},{"group":"Payment Methods","pages":[{"title":"List payment methods","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/payment-methods","href":"/api-reference/v2/payment-methods/list-payment-methods"},{"title":"Create payment method","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/payment-methods","href":"/api-reference/v2/payment-methods/create-payment-method"}]},{"group":"Payments","pages":[{"title":"Record payment","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/payments","href":"/api-reference/v2/payments/record-payment"}]},{"group":"Payroll Detail Reports","pages":[{"title":"List payroll detail reports","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/payroll-detail-reports","href":"/api-reference/v2/payroll-detail-reports/list-payroll-detail-reports"}]},{"group":"Payroll Item Additions","pages":[{"title":"Update payroll item addition","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json put /connections/{connection_id}/payroll-item-additions","href":"/api-reference/v2/payroll-item-additions/update-payroll-item-addition"},{"title":"Create payroll item addition","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/payroll-item-additions","href":"/api-reference/v2/payroll-item-additions/create-payroll-item-addition"}]},{"group":"Payroll Item Company Contributions","pages":[{"title":"Update payroll item company contribution","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json put /connections/{connection_id}/payroll-item-company-contributions","href":"/api-reference/v2/payroll-item-company-contributions/update-payroll-item-company-contribution"},{"title":"Create payroll item company contribution","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/payroll-item-company-contributions","href":"/api-reference/v2/payroll-item-company-contributions/create-payroll-item-company-contribution"}]},{"group":"Payroll Item Deductions","pages":[{"title":"Update payroll item deduction","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json put /connections/{connection_id}/payroll-item-deductions","href":"/api-reference/v2/payroll-item-deductions/update-payroll-item-deduction"},{"title":"Create payroll item deduction","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/payroll-item-deductions","href":"/api-reference/v2/payroll-item-deductions/create-payroll-item-deduction"}]},{"group":"Payroll Item Direct Deposits","pages":[{"title":"Update payroll item direct deposit","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json put /connections/{connection_id}/payroll-item-direct-deposits","href":"/api-reference/v2/payroll-item-direct-deposits/update-payroll-item-direct-deposit"},{"title":"Create payroll item direct deposit","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/payroll-item-direct-deposits","href":"/api-reference/v2/payroll-item-direct-deposits/create-payroll-item-direct-deposit"}]},{"group":"Payroll Item Non Wages","pages":[{"title":"List payroll item non wages","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/payroll-item-non-wages","href":"/api-reference/v2/payroll-item-non-wages/list-payroll-item-non-wages"}]},{"group":"Payroll Item Taxes","pages":[{"title":"Update payroll item tax","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json put /connections/{connection_id}/payroll-item-taxes","href":"/api-reference/v2/payroll-item-taxes/update-payroll-item-tax"},{"title":"Create payroll item tax","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/payroll-item-taxes","href":"/api-reference/v2/payroll-item-taxes/create-payroll-item-tax"}]},{"group":"Payroll Item Wages","pages":[{"title":"List payroll item wages","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/payroll-item-wages","href":"/api-reference/v2/payroll-item-wages/list-payroll-item-wages"},{"title":"Update payroll item wage","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json put /connections/{connection_id}/payroll-item-wages","href":"/api-reference/v2/payroll-item-wages/update-payroll-item-wage"},{"title":"Create payroll item wage","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/payroll-item-wages","href":"/api-reference/v2/payroll-item-wages/create-payroll-item-wage"}]},{"group":"Payroll Item Workers Compensations","pages":[{"title":"Update payroll item workers compensation","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json put /connections/{connection_id}/payroll-item-workers-compensations","href":"/api-reference/v2/payroll-item-workers-compensations/update-payroll-item-workers-compensation"},{"title":"Create payroll item workers compensation","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/payroll-item-workers-compensations","href":"/api-reference/v2/payroll-item-workers-compensations/create-payroll-item-workers-compensation"}]},{"group":"Payroll Items","pages":[{"title":"List payroll items","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/payroll-items","href":"/api-reference/v2/payroll-items/list-payroll-items"}]},{"group":"Payroll Last Periods","pages":[{"title":"List payroll last periods","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/payroll-last-periods","href":"/api-reference/v2/payroll-last-periods/list-payroll-last-periods"}]},{"group":"Payroll Liability Adjustments","pages":[{"title":"List payroll liability adjustments","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/payroll-liability-adjustments","href":"/api-reference/v2/payroll-liability-adjustments/list-payroll-liability-adjustments"},{"title":"Create payroll liability adjustment","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/payroll-liability-adjustments","href":"/api-reference/v2/payroll-liability-adjustments/create-payroll-liability-adjustment"}]},{"group":"Payroll Liability Checks","pages":[{"title":"List payroll liability checks","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/payroll-liability-checks","href":"/api-reference/v2/payroll-liability-checks/list-payroll-liability-checks"}]},{"group":"Payroll Prior Payments","pages":[{"title":"List payroll prior payments","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/payroll-prior-payments","href":"/api-reference/v2/payroll-prior-payments/list-payroll-prior-payments"},{"title":"Create payroll prior payment","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/payroll-prior-payments","href":"/api-reference/v2/payroll-prior-payments/create-payroll-prior-payment"}]},{"group":"Payroll Summary Reports","pages":[{"title":"List payroll summary reports","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/payroll-summary-reports","href":"/api-reference/v2/payroll-summary-reports/list-payroll-summary-reports"}]},{"group":"Payroll Year To Date Adjustments","pages":[{"title":"List payroll year to date adjustments","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/payroll-year-to-date-adjustments","href":"/api-reference/v2/payroll-year-to-date-adjustments/list-payroll-year-to-date-adjustments"},{"title":"Create payroll year to date adjustment","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/payroll-year-to-date-adjustments","href":"/api-reference/v2/payroll-year-to-date-adjustments/create-payroll-year-to-date-adjustment"}]},{"group":"Preferences","pages":[{"title":"List preferences","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/preferences","href":"/api-reference/v2/preferences/list-preferences"},{"title":"Update preferences","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json put /connections/{connection_id}/preferences","href":"/api-reference/v2/preferences/update-preferences"}]},{"group":"Price Levels","pages":[{"title":"List price levels","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/price-levels","href":"/api-reference/v2/price-levels/list-price-levels"},{"title":"Update price level","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json put /connections/{connection_id}/price-levels","href":"/api-reference/v2/price-levels/update-price-level"},{"title":"Create price level","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/price-levels","href":"/api-reference/v2/price-levels/create-price-level"}]},{"group":"Purchase Orders","pages":[{"title":"List purchase orders","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/purchase-orders","href":"/api-reference/v2/purchase-orders/list-purchase-orders"},{"title":"Update purchase order","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json put /connections/{connection_id}/purchase-orders","href":"/api-reference/v2/purchase-orders/update-purchase-order"},{"title":"Create purchase order","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/purchase-orders","href":"/api-reference/v2/purchase-orders/create-purchase-order"}]},{"group":"Qb Command Exec","pages":[{"title":"Execute QB command exec","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/qb-command-exec","href":"/api-reference/v2/qb-command-exec/execute-qb-command-exec"}]},{"group":"Receive Payment To Deposits","pages":[{"title":"List receive payment to deposits","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/receive-payment-to-deposits","href":"/api-reference/v2/receive-payment-to-deposits/list-receive-payment-to-deposits"}]},{"group":"Receive Payments","pages":[{"title":"List receive payments","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/receive-payments","href":"/api-reference/v2/receive-payments/list-receive-payments"},{"title":"Update receive payment","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json put /connections/{connection_id}/receive-payments","href":"/api-reference/v2/receive-payments/update-receive-payment"}]},{"group":"Sales Orders","pages":[{"title":"List sales orders","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/sales-orders","href":"/api-reference/v2/sales-orders/list-sales-orders"},{"title":"Update sales order","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json put /connections/{connection_id}/sales-orders","href":"/api-reference/v2/sales-orders/update-sales-order"},{"title":"Create sales order","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/sales-orders","href":"/api-reference/v2/sales-orders/create-sales-order"}]},{"group":"Sales Receipts","pages":[{"title":"List sales receipts","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/sales-receipts","href":"/api-reference/v2/sales-receipts/list-sales-receipts"},{"title":"Update sales receipt","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json put /connections/{connection_id}/sales-receipts","href":"/api-reference/v2/sales-receipts/update-sales-receipt"},{"title":"Create sales receipt","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/sales-receipts","href":"/api-reference/v2/sales-receipts/create-sales-receipt"}]},{"group":"Sales Reps","pages":[{"title":"List sales reps","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/sales-reps","href":"/api-reference/v2/sales-reps/list-sales-reps"},{"title":"Update sales rep","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json put /connections/{connection_id}/sales-reps","href":"/api-reference/v2/sales-reps/update-sales-rep"},{"title":"Create sales rep","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/sales-reps","href":"/api-reference/v2/sales-reps/create-sales-rep"}]},{"group":"Sales Tax Codes","pages":[{"title":"List sales tax codes","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/sales-tax-codes","href":"/api-reference/v2/sales-tax-codes/list-sales-tax-codes"},{"title":"Update sales tax code","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json put /connections/{connection_id}/sales-tax-codes","href":"/api-reference/v2/sales-tax-codes/update-sales-tax-code"},{"title":"Create sales tax code","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/sales-tax-codes","href":"/api-reference/v2/sales-tax-codes/create-sales-tax-code"}]},{"group":"Sales Tax Payables","pages":[{"title":"List sales tax payables","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/sales-tax-payables","href":"/api-reference/v2/sales-tax-payables/list-sales-tax-payables"}]},{"group":"Sales Tax Payment Checks","pages":[{"title":"List sales tax payment checks","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/sales-tax-payment-checks","href":"/api-reference/v2/sales-tax-payment-checks/list-sales-tax-payment-checks"},{"title":"Update sales tax payment check","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json put /connections/{connection_id}/sales-tax-payment-checks","href":"/api-reference/v2/sales-tax-payment-checks/update-sales-tax-payment-check"},{"title":"Create sales tax payment check","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/sales-tax-payment-checks","href":"/api-reference/v2/sales-tax-payment-checks/create-sales-tax-payment-check"}]},{"group":"Sales Tax Return Lines","pages":[{"title":"List sales tax return lines","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/sales-tax-return-lines","href":"/api-reference/v2/sales-tax-return-lines/list-sales-tax-return-lines"}]},{"group":"Sales Tax Returns","pages":[{"title":"List sales tax returns","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/sales-tax-returns","href":"/api-reference/v2/sales-tax-returns/list-sales-tax-returns"}]},{"group":"Ship Methods","pages":[{"title":"List ship methods","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/ship-methods","href":"/api-reference/v2/ship-methods/list-ship-methods"},{"title":"Create ship method","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/ship-methods","href":"/api-reference/v2/ship-methods/create-ship-method"}]},{"group":"Special Accounts","pages":[{"title":"Create special account","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/special-accounts","href":"/api-reference/v2/special-accounts/create-special-account"}]},{"group":"Special Items","pages":[{"title":"Create special item","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/special-items","href":"/api-reference/v2/special-items/create-special-item"}]},{"group":"Standard Terms","pages":[{"title":"List standard terms","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/standard-terms","href":"/api-reference/v2/standard-terms/list-standard-terms"},{"title":"Create standard terms","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/standard-terms","href":"/api-reference/v2/standard-terms/create-standard-terms"}]},{"group":"Templates","pages":[{"title":"List templates","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/templates","href":"/api-reference/v2/templates/list-templates"}]},{"group":"Terms","pages":[{"title":"List terms","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/terms","href":"/api-reference/v2/terms/list-terms"}]},{"group":"Time Reports","pages":[{"title":"List time reports","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/time-reports","href":"/api-reference/v2/time-reports/list-time-reports"}]},{"group":"Time Trackings","pages":[{"title":"List time trackings","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/time-trackings","href":"/api-reference/v2/time-trackings/list-time-trackings"},{"title":"Update time tracking","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json put /connections/{connection_id}/time-trackings","href":"/api-reference/v2/time-trackings/update-time-tracking"},{"title":"Create time tracking","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/time-trackings","href":"/api-reference/v2/time-trackings/create-time-tracking"}]},{"group":"To Dos","pages":[{"title":"List to dos","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/to-dos","href":"/api-reference/v2/to-dos/list-to-dos"},{"title":"Update to do","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json put /connections/{connection_id}/to-dos","href":"/api-reference/v2/to-dos/update-to-do"},{"title":"Create to do","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/to-dos","href":"/api-reference/v2/to-dos/create-to-do"}]},{"group":"Transactions","pages":[{"title":"List transactions","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/transactions","href":"/api-reference/v2/transactions/list-transactions"}]},{"group":"Transfer Inventories","pages":[{"title":"List transfer inventories","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/transfer-inventories","href":"/api-reference/v2/transfer-inventories/list-transfer-inventories"},{"title":"Update transfer inventory","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json put /connections/{connection_id}/transfer-inventories","href":"/api-reference/v2/transfer-inventories/update-transfer-inventory"},{"title":"Create transfer inventory","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/transfer-inventories","href":"/api-reference/v2/transfer-inventories/create-transfer-inventory"}]},{"group":"Transfers","pages":[{"title":"List transfers","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/transfers","href":"/api-reference/v2/transfers/list-transfers"},{"title":"Update transfer","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json put /connections/{connection_id}/transfers","href":"/api-reference/v2/transfers/update-transfer"},{"title":"Create transfer","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/transfers","href":"/api-reference/v2/transfers/create-transfer"}]},{"group":"Txn Deleteds","pages":[{"title":"List txn deleteds","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/txn-deleteds","href":"/api-reference/v2/txn-deleteds/list-txn-deleteds"}]},{"group":"Txn Displays","pages":[{"title":"Update txn display","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json put /connections/{connection_id}/txn-displays","href":"/api-reference/v2/txn-displays/update-txn-display"},{"title":"Create txn display","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/txn-displays","href":"/api-reference/v2/txn-displays/create-txn-display"}]},{"group":"Txn Void","pages":[{"title":"Execute txn void","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/txn-void","href":"/api-reference/v2/txn-void/execute-txn-void"}]},{"group":"Txns","pages":[{"title":"Delete txn","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json delete /connections/{connection_id}/txns","href":"/api-reference/v2/txns/delete-txn"}]},{"group":"Unit Of Measure Sets","pages":[{"title":"List unit of measure sets","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/unit-of-measure-sets","href":"/api-reference/v2/unit-of-measure-sets/list-unit-of-measure-sets"},{"title":"Create unit of measure set","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/unit-of-measure-sets","href":"/api-reference/v2/unit-of-measure-sets/create-unit-of-measure-set"}]},{"group":"Vehicle Mileages","pages":[{"title":"List vehicle mileages","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/vehicle-mileages","href":"/api-reference/v2/vehicle-mileages/list-vehicle-mileages"},{"title":"Create vehicle mileage","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/vehicle-mileages","href":"/api-reference/v2/vehicle-mileages/create-vehicle-mileage"}]},{"group":"Vehicles","pages":[{"title":"List vehicles","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/vehicles","href":"/api-reference/v2/vehicles/list-vehicles"},{"title":"Update vehicle","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json put /connections/{connection_id}/vehicles","href":"/api-reference/v2/vehicles/update-vehicle"},{"title":"Create vehicle","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/vehicles","href":"/api-reference/v2/vehicles/create-vehicle"}]},{"group":"Vendor Credits","pages":[{"title":"List vendor credits","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/vendor-credits","href":"/api-reference/v2/vendor-credits/list-vendor-credits"},{"title":"Update vendor credit","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json put /connections/{connection_id}/vendor-credits","href":"/api-reference/v2/vendor-credits/update-vendor-credit"},{"title":"Create vendor credit","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/vendor-credits","href":"/api-reference/v2/vendor-credits/create-vendor-credit"}]},{"group":"Vendor Types","pages":[{"title":"List vendor types","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/vendor-types","href":"/api-reference/v2/vendor-types/list-vendor-types"},{"title":"Create vendor type","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/vendor-types","href":"/api-reference/v2/vendor-types/create-vendor-type"}]},{"group":"Vendors","pages":[{"title":"List vendors","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/vendors","href":"/api-reference/v2/vendors/list-vendors"},{"title":"Update vendor","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json put /connections/{connection_id}/vendors","href":"/api-reference/v2/vendors/update-vendor"},{"title":"Create vendor","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/vendors","href":"/api-reference/v2/vendors/create-vendor"}]},{"group":"Workers Comp Codes","pages":[{"title":"List workers comp codes","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json get /connections/{connection_id}/workers-comp-codes","href":"/api-reference/v2/workers-comp-codes/list-workers-comp-codes"},{"title":"Update workers comp code","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json put /connections/{connection_id}/workers-comp-codes","href":"/api-reference/v2/workers-comp-codes/update-workers-comp-code"},{"title":"Create workers comp code","deprecated":null,"version":null,"openapi":"/api-reference/v2/openapi.json post /connections/{connection_id}/workers-comp-codes","href":"/api-reference/v2/workers-comp-codes/create-workers-comp-code"}]}]},{"group":"API v1 (legacy)","pages":[{"group":"Connections","pages":[{"title":"List all connections","deprecated":null,"version":null,"openapi":"/api-reference/v1/openapi.json get /connections","href":"/api-reference/v1/connections/list-all-connections"},{"title":"Create a new connection","deprecated":null,"version":null,"openapi":"/api-reference/v1/openapi.json post /connections","href":"/api-reference/v1/connections/create-a-new-connection"},{"title":"Get connection by ID","deprecated":null,"version":null,"openapi":"/api-reference/v1/openapi.json get /connections/{connection_id}","href":"/api-reference/v1/connections/get-connection-by-id"},{"title":"Delete a connection","deprecated":null,"version":null,"openapi":"/api-reference/v1/openapi.json delete /connections/{connection_id}","href":"/api-reference/v1/connections/delete-a-connection"},{"title":"Generate or set password for a connection","deprecated":null,"version":null,"openapi":"/api-reference/v1/openapi.json post /connections/{connection_id}/password","href":"/api-reference/v1/connections/generate-or-set-password-for-a-connection"},{"title":"Get QWC file for a connection","deprecated":null,"version":null,"openapi":"/api-reference/v1/openapi.json get /connections/{connection_id}/qwc","href":"/api-reference/v1/connections/get-qwc-file-for-a-connection"},{"title":"Regenerate onboarding URL for a connection","deprecated":null,"version":null,"openapi":"/api-reference/v1/openapi.json post /connections/{connection_id}/onboarding_url","href":"/api-reference/v1/connections/regenerate-onboarding-url-for-a-connection"}]},{"group":"Queued Requests","pages":[{"title":"List queued requests for a connection","deprecated":null,"version":null,"openapi":"/api-reference/v1/openapi.json get /connections/{connection_id}/queued_requests","href":"/api-reference/v1/queued-requests/list-queued-requests-for-a-connection"},{"title":"Queue a new request","deprecated":null,"version":null,"openapi":"/api-reference/v1/openapi.json post /connections/{connection_id}/queued_requests","href":"/api-reference/v1/queued-requests/queue-a-new-request"},{"title":"Get queued request by ID","deprecated":null,"version":null,"openapi":"/api-reference/v1/openapi.json get /queued_requests/{request_id}","href":"/api-reference/v1/queued-requests/get-queued-request-by-id"},{"title":"Delete a queued request","deprecated":null,"version":null,"openapi":"/api-reference/v1/openapi.json delete /queued_requests/{request_id}","href":"/api-reference/v1/queued-requests/delete-a-queued-request"}]},{"group":"Pre-built Queries","pages":[{"title":"Query Customers","deprecated":null,"version":null,"openapi":"/api-reference/v1/openapi.json get /connections/{connection_id}/customers","href":"/api-reference/v1/pre-built-queries/query-customers"},{"title":"Create Customer","deprecated":null,"version":null,"openapi":"/api-reference/v1/openapi.json post /connections/{connection_id}/customers","href":"/api-reference/v1/pre-built-queries/create-customer"},{"title":"Query Invoices","deprecated":null,"version":null,"openapi":"/api-reference/v1/openapi.json get /connections/{connection_id}/invoices","href":"/api-reference/v1/pre-built-queries/query-invoices"},{"title":"Create Invoice","deprecated":null,"version":null,"openapi":"/api-reference/v1/openapi.json post /connections/{connection_id}/invoices","href":"/api-reference/v1/pre-built-queries/create-invoice"},{"title":"Query Credit Memos","deprecated":null,"version":null,"openapi":"/api-reference/v1/openapi.json get /connections/{connection_id}/credit_memos","href":"/api-reference/v1/pre-built-queries/query-credit-memos"},{"title":"Create Credit Memo","deprecated":null,"version":null,"openapi":"/api-reference/v1/openapi.json post /connections/{connection_id}/credit_memos","href":"/api-reference/v1/pre-built-queries/create-credit-memo"},{"title":"Modify Data Extension","deprecated":null,"version":null,"openapi":"/api-reference/v1/openapi.json post /connections/{connection_id}/data_ext_mods","href":"/api-reference/v1/pre-built-queries/modify-data-extension"},{"title":"Query Vendors","deprecated":null,"version":null,"openapi":"/api-reference/v1/openapi.json get /connections/{connection_id}/vendors","href":"/api-reference/v1/pre-built-queries/query-vendors"},{"title":"Query Sales Orders","deprecated":null,"version":null,"openapi":"/api-reference/v1/openapi.json get /connections/{connection_id}/sales_orders","href":"/api-reference/v1/pre-built-queries/query-sales-orders"},{"title":"Query Items","deprecated":null,"version":null,"openapi":"/api-reference/v1/openapi.json get /connections/{connection_id}/items","href":"/api-reference/v1/pre-built-queries/query-items"},{"title":"Query Sales Tax Items","deprecated":null,"version":null,"openapi":"/api-reference/v1/openapi.json get /connections/{connection_id}/sales_tax_items","href":"/api-reference/v1/pre-built-queries/query-sales-tax-items"},{"title":"Query Sales Tax Codes","deprecated":null,"version":null,"openapi":"/api-reference/v1/openapi.json get /connections/{connection_id}/sales_tax_codes","href":"/api-reference/v1/pre-built-queries/query-sales-tax-codes"}]}]}]}]},"basePath":"","title":"Install a workflow template - QuBe Sync","buildId":"dpl_DeHjVRGfFnhYQwHnfC2pjeXXv8h9","deploymentId":"dpl_DeHjVRGfFnhYQwHnfC2pjeXXv8h9","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-CS552b7R.js","utils-DDTCYAF2.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-De8ttokP.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-DrwRDvAh.js","snippetPresets-DtAN0nWx.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","ApiExamples-D5rWArI6.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-O2i12wsz.js","shallow-DV8xABTt.js","getApiPlaygroundDisplay-DBZ0B5Jx.js","CodeSnippet-BVi0tPUX.js","CodeSnippets-CqASbIwY.js","Page-m07pfKpT.js","getPastedJson-DG9vsMS8.js","icon-CXzRSCr8.js","MethodPill-BdKVtEuX.js","DuplicateIcon-CZlmBrJI.js","createIcon-biFEUKPL.js","DynamicMarkdown-B54_zNBF.js","SectionHeading-DwwHK3Pt.js","axios-vUo_bRtp.js","Markdown-DfhCTwyA.js","clsx-xpJZXxdP.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-BTZUMDnx.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-DqdKa2R4.js"]}