Creates or renames up to 2,000 locations per call.
Identity resolution:externalId (recorded on first create, so re-runs resolve to the same location) → id. At least one is required. Unmatched rows create a new location.
Placement on create is optional: hierarchyId, levelId, and a parent given as either parentExternalId or parentId (not both). New locations inherit the workspace timezone and get the next location number.
Placement on an existing location is rejected. Supplying a hierarchyId, levelId, or parent that differs from the location’s current placement returns 400 — “Location ”…” cannot be moved or re-parented via the enterprise API (V1 supports create + rename only)”. Omit the placement fields to rename in place. Moving a location between parents (for example a store from one district to another) is planned for a later version; until then, do it in the Xenia UI, or model the changing dimension as a location attribute and update it through Bulk Upsert Attribute Values.
The whole batch runs in one transaction: if any row fails, no locations from that call are created.
Requires the Public API and Location Attributes workspace features plus CAN_MANAGE_LOCATIONS.
One row per input row, with the resolved Xenia id and whether it was newly created.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Xenia Team API","colors":{"primary":"#8e54e9","light":"#e1cfff","dark":"#e1cfff"},"logo":{"light":"https://mintcdn.com/xeniateam/r-j40vtdxuJKg0Zh/logo/logo-light.svg?fit=max\u0026auto=format\u0026n=r-j40vtdxuJKg0Zh\u0026q=85\u0026s=6e8f1d49ac9946b22863d3dd22346adf","dark":"https://mintcdn.com/xeniateam/r-j40vtdxuJKg0Zh/logo/logo-dark.svg?fit=max\u0026auto=format\u0026n=r-j40vtdxuJKg0Zh\u0026q=85\u0026s=d2260d84971fb9ba7fbe9d3334f9769c"},"favicon":"https://mintcdn.com/xeniateam/r-j40vtdxuJKg0Zh/favicon.ico?fit=max\u0026auto=format\u0026n=r-j40vtdxuJKg0Zh\u0026q=85\u0026s=1ec461628add23e7e21efd17a9c2dea9","navbar":{"links":[{"href":"mailto:support@xenia.team","label":"Support"}],"primary":{"type":"button","label":"Dashboard","href":"https://app.xenia.team/"}},"footer":{"socials":{"linkedin":"https://www.linkedin.com/company/xenia-app"}},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"xeniateam","hasAudioNarration":false,"actualSubdomain":"xeniateam","customDomains":["docs.xenia.team"],"gitSource":{"type":"github","owner":"xeniaengineering","repo":"docs","deployBranch":"production","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6af1a9b5ea8a9a7a2693706e","clientVersion":"0.0.4088","searchFilterCounts":[{"language":"default","tag":"API Reference","count":48},{"language":"default","tag":"Reporting","count":12},{"language":"default","tag":"Projects","count":11},{"language":"default","tag":"Guides","count":11},{"language":"default","tag":"Users","count":8},{"language":"default","tag":"Tasks","count":7},{"language":"default","tag":"Enterprise Locations","count":6},{"language":"default","tag":"Workflows","count":6},{"language":"default","tag":"Getting Started","count":3},{"language":"default","tag":"Integrations","count":2}]},"assistantConfig":{},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"comment-mode","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"api-reference/endpoints/enterprise-locations/bulk-upsert-locations","slug":"/api-reference/endpoints/enterprise-locations/bulk-upsert-locations","pageMetadata":{"title":"Bulk Upsert Locations","openapi":"POST /api/v1/mgt/enterprise/workspaces/{workspaceId}/locations/bulk-upsert","description":"Creates or renames up to **2,000** locations per call.\n\n**Identity resolution:** `externalId` (recorded on first create, so re-runs resolve to the same location) → `id`. At least one is required. Unmatched rows create a new location.\n\n**Placement on create** is optional: `hierarchyId`, `levelId`, and a parent given as either `parentExternalId` or `parentId` (not both). New locations inherit the workspace timezone and get the next location number.\n\n**Placement on an existing location is rejected.** Supplying a `hierarchyId`, `levelId`, or parent that differs from the location's current placement returns `400` — *\"Location \"…\" cannot be moved or re-parented via the enterprise API (V1 supports create + rename only)\"*. Omit the placement fields to rename in place. Moving a location between parents (for example a store from one district to another) is planned for a later version; until then, do it in the Xenia UI, or model the changing dimension as a **location attribute** and update it through *Bulk Upsert Attribute Values*.\n\nThe whole batch runs in **one transaction**: if any row fails, no locations from that call are created.\n\nRequires the **Public API** and **Location Attributes** workspace features plus `CAN_MANAGE_LOCATIONS`.","href":"/api-reference/endpoints/enterprise-locations/bulk-upsert-locations"},"description":{"compiledSource":"\"use strict\";\nconst {Fragment: _Fragment, jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n em: \"em\",\n p: \"p\",\n strong: \"strong\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsxs(_components.p, {\n children: [\"Creates or renames up to \", _jsx(_components.strong, {\n children: \"2,000\"\n }), \" locations per call.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Identity resolution:\"\n }), \" \", _jsx(_components.code, {\n children: \"externalId\"\n }), \" (recorded on first create, so re-runs resolve to the same location) → \", _jsx(_components.code, {\n children: \"id\"\n }), \". At least one is required. Unmatched rows create a new location.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Placement on create\"\n }), \" is optional: \", _jsx(_components.code, {\n children: \"hierarchyId\"\n }), \", \", _jsx(_components.code, {\n children: \"levelId\"\n }), \", and a parent given as either \", _jsx(_components.code, {\n children: \"parentExternalId\"\n }), \" or \", _jsx(_components.code, {\n children: \"parentId\"\n }), \" (not both). New locations inherit the workspace timezone and get the next location number.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Placement on an existing location is rejected.\"\n }), \" Supplying a \", _jsx(_components.code, {\n children: \"hierarchyId\"\n }), \", \", _jsx(_components.code, {\n children: \"levelId\"\n }), \", or parent that differs from the location’s current placement returns \", _jsx(_components.code, {\n children: \"400\"\n }), \" — \", _jsx(_components.em, {\n children: \"“Location ”…” cannot be moved or re-parented via the enterprise API (V1 supports create + rename only)”\"\n }), \". Omit the placement fields to rename in place. Moving a location between parents (for example a store from one district to another) is planned for a later version; until then, do it in the Xenia UI, or model the changing dimension as a \", _jsx(_components.strong, {\n children: \"location attribute\"\n }), \" and update it through \", _jsx(_components.em, {\n children: \"Bulk Upsert Attribute Values\"\n }), \".\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"The whole batch runs in \", _jsx(_components.strong, {\n children: \"one transaction\"\n }), \": if any row fails, no locations from that call are created.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Requires the \", _jsx(_components.strong, {\n children: \"Public API\"\n }), \" and \", _jsx(_components.strong, {\n children: \"Location Attributes\"\n }), \" workspace features plus \", _jsx(_components.code, {\n children: \"CAN_MANAGE_LOCATIONS\"\n }), \".\"]\n })]\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Bulk Upsert Locations","openapi":"POST /api/v1/mgt/enterprise/workspaces/{workspaceId}/locations/bulk-upsert","description":"Creates or renames up to **2,000** locations per call.\n\n**Identity resolution:** `externalId` (recorded on first create, so re-runs resolve to the same location) → `id`. At least one is required. Unmatched rows create a new location.\n\n**Placement on create** is optional: `hierarchyId`, `levelId`, and a parent given as either `parentExternalId` or `parentId` (not both). New locations inherit the workspace timezone and get the next location number.\n\n**Placement on an existing location is rejected.** Supplying a `hierarchyId`, `levelId`, or parent that differs from the location's current placement returns `400` — *\"Location \"…\" cannot be moved or re-parented via the enterprise API (V1 supports create + rename only)\"*. Omit the placement fields to rename in place. Moving a location between parents (for example a store from one district to another) is planned for a later version; until then, do it in the Xenia UI, or model the changing dimension as a **location attribute** and update it through *Bulk Upsert Attribute Values*.\n\nThe whole batch runs in **one transaction**: if any row fails, no locations from that call are created.\n\nRequires the **Public API** and **Location Attributes** workspace features plus `CAN_MANAGE_LOCATIONS`.","href":"/api-reference/endpoints/enterprise-locations/bulk-upsert-locations"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"summary":"Bulk Upsert Locations","description":"Creates or renames up to **2,000** locations per call.\n\n**Identity resolution:** `externalId` (recorded on first create, so re-runs resolve to the same location) → `id`. At least one is required. Unmatched rows create a new location.\n\n**Placement on create** is optional: `hierarchyId`, `levelId`, and a parent given as either `parentExternalId` or `parentId` (not both). New locations inherit the workspace timezone and get the next location number.\n\n**Placement on an existing location is rejected.** Supplying a `hierarchyId`, `levelId`, or parent that differs from the location's current placement returns `400` — *\"Location \"…\" cannot be moved or re-parented via the enterprise API (V1 supports create + rename only)\"*. Omit the placement fields to rename in place. Moving a location between parents (for example a store from one district to another) is planned for a later version; until then, do it in the Xenia UI, or model the changing dimension as a **location attribute** and update it through *Bulk Upsert Attribute Values*.\n\nThe whole batch runs in **one transaction**: if any row fails, no locations from that call are created.\n\nRequires the **Public API** and **Location Attributes** workspace features plus `CAN_MANAGE_LOCATIONS`.","tags":["Enterprise Locations"],"parameters":["d64c74f2-4809-4305-96ef-8b8231539d73"],"requestBody":"35ec84a4-77e7-4c2c-8906-e39ae59c0d55","responses":{"200":"119f9d5c-6cac-4bd5-97e4-2087bd542ce1","400":"0117aaac-64e3-43d8-b810-3faa21c20327","401":"ab582339-1bd4-46f5-ba0d-3ec36a3d4432","403":"f05d6aa9-568e-4dcc-9301-aebff813a542","422":"0b676db6-8549-4c6f-aec0-137ff8243e75","500":"8fea16f4-3671-45dc-8e21-6a9ed4ae10ae"},"security":["1a6d2d35-c5b8-4674-b271-25b77331ebe4"],"method":"post","type":"path","servers":["a2152bdd-e89f-4b37-895a-a344354a6474"],"path":"/api/v1/mgt/enterprise/workspaces/{workspaceId}/locations/bulk-upsert","baseUrlOptions":["https://api.xenia.team"],"title":"Bulk Upsert Locations","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"d64c74f2-4809-4305-96ef-8b8231539d73":{"name":"workspaceId","in":"path","required":true,"description":"UUID of the workspace. Must be the workspace your API key is bound to.","schema":{"type":"string","format":"uuid","isRequired":true,"description":"UUID of the workspace. Must be the workspace your API key is bound to.","uniqueKey":"","typeLabel":"string\u003cuuid>"}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"locations":{"type":"array","minItems":1,"maxItems":2000,"items":{"type":"object","properties":{"name":{"type":"string","maxLength":255,"description":"Location name. Renaming an existing location also refreshes its slug.","isRequired":true,"uniqueKey":"locations.items.[INDEX].name","typeLabel":"string"},"externalId":{"type":"string","maxLength":255,"description":"Your own stable key for this location — the recommended handle for idempotent re-runs.","uniqueKey":"locations.items.[INDEX].externalId","typeLabel":"string"},"id":{"type":"string","format":"uuid","description":"Xenia location UUID, if known.","uniqueKey":"locations.items.[INDEX].id","typeLabel":"string\u003cuuid>"},"description":{"type":"string","maxLength":1000,"uniqueKey":"locations.items.[INDEX].description","typeLabel":"string"},"hierarchyId":{"type":"string","format":"uuid","description":"Hierarchy to place a NEW location in. Resolve ids from *Bulk Upsert Hierarchies* or the locations read.","uniqueKey":"locations.items.[INDEX].hierarchyId","typeLabel":"string\u003cuuid>"},"parentExternalId":{"type":"string","maxLength":255,"description":"Parent location addressed by your own key. Mutually exclusive with `parentId`.","uniqueKey":"locations.items.[INDEX].parentExternalId","typeLabel":"string"},"parentId":{"type":"string","format":"uuid","description":"Parent location addressed by Xenia UUID. Mutually exclusive with `parentExternalId`.","uniqueKey":"locations.items.[INDEX].parentId","typeLabel":"string\u003cuuid>"},"levelId":{"type":"string","format":"uuid","description":"Hierarchy level for a NEW location.","uniqueKey":"locations.items.[INDEX].levelId","typeLabel":"string\u003cuuid>"}},"required":["name"],"uniqueKey":"locations.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"locations","typeLabel":"object[]"}},"required":["locations"],"uniqueKey":"","typeLabel":"object"},"example":{"locations":[{"externalId":"DISTRICT-SW-3","name":"Southwest District 3","hierarchyId":"9c2a1b7e-4d3f-4a11-9c88-2f0e5a6b1c34","levelId":"5b6c7d8e-9f01-4a2b-8c3d-4e5f6a7b8c9d"},{"externalId":"STORE-1042","name":"Store 1042 - Rosedale","hierarchyId":"9c2a1b7e-4d3f-4a11-9c88-2f0e5a6b1c34","levelId":"6c7d8e9f-0a12-4b3c-8d4e-5f6a7b8c9d0e","parentExternalId":"DISTRICT-SW-3"}]},"examples":{"Example":{"title":"Example","value":{"locations":[{"externalId":"DISTRICT-SW-3","name":"Southwest District 3","hierarchyId":"9c2a1b7e-4d3f-4a11-9c88-2f0e5a6b1c34","levelId":"5b6c7d8e-9f01-4a2b-8c3d-4e5f6a7b8c9d"},{"externalId":"STORE-1042","name":"Store 1042 - Rosedale","hierarchyId":"9c2a1b7e-4d3f-4a11-9c88-2f0e5a6b1c34","levelId":"6c7d8e9f-0a12-4b3c-8d4e-5f6a7b8c9d0e","parentExternalId":"DISTRICT-SW-3"}]}}},"exampleType":"examples"}},"exampleType":"examples"},"responses":{"119f9d5c-6cac-4bd5-97e4-2087bd542ce1":{"description":"One row per input row, with the resolved Xenia id and whether it was newly created.","content":{"application/json":{"example":{"data":[{"externalId":"DISTRICT-SW-3","id":"2f169333-21f1-4197-8cac-cd0860a83515","name":"Southwest District 3","created":true},{"externalId":"STORE-1042","id":"8099a742-c9bb-40a7-976e-1963a07e77b6","name":"Store 1042 - Rosedale","created":true}],"extra_meta":{"message":"Locations upserted"}},"examples":{"Example":{"title":"Example","value":{"data":[{"externalId":"DISTRICT-SW-3","id":"2f169333-21f1-4197-8cac-cd0860a83515","name":"Southwest District 3","created":true},{"externalId":"STORE-1042","id":"8099a742-c9bb-40a7-976e-1963a07e77b6","name":"Store 1042 - Rosedale","created":true}],"extra_meta":{"message":"Locations upserted"}}}},"exampleType":"examples"}},"exampleType":"examples"},"0117aaac-64e3-43d8-b810-3faa21c20327":{"description":"Bad Request - a row asks to move or re-parent an existing location, or a `parentExternalId` / `parentId` could not be resolved in this workspace. Nothing in the batch is created.","content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}},"ab582339-1bd4-46f5-ba0d-3ec36a3d4432":{"description":"Unauthorized - invalid client credentials, or the `workspaceId` in the path is not the workspace your key is bound to (`Client does not belong to this workspace`).","content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}},"f05d6aa9-568e-4dcc-9301-aebff813a542":{"description":"Forbidden - route not allow-listed for API keys, missing `CAN_MANAGE_LOCATIONS`, or the **Public API** / **Location Attributes** feature is not enabled for the workspace.","content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}},"0b676db6-8549-4c6f-aec0-137ff8243e75":{"description":"Unprocessable Entity - body failed validation (neither `externalId` nor `id`, both `parentExternalId` and `parentId`, missing `name`, more than 2,000 rows).","content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}},"8fea16f4-3671-45dc-8e21-6a9ed4ae10ae":{"description":"Internal Server Error.","content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}}},"security":{"1a6d2d35-c5b8-4674-b271-25b77331ebe4":{"clientKey":{"type":"apiKey","in":"header","name":"x-client-key","scopes":[]},"clientSecret":{"type":"apiKey","in":"header","name":"x-client-secret","scopes":[]}}},"servers":{"a2152bdd-e89f-4b37-895a-a344354a6474":{"url":"https://api.xenia.team"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"apiKey","in":"header","name":"x-client-key","scopes":[]},"schema":{"title":"x-client-key","type":"string","isRequired":true,"typeLabel":"string","deprecated":false},"schemeName":"clientKey","name":"x-client-key"},{"scheme":{"type":"apiKey","in":"header","name":"x-client-secret","scopes":[]},"schema":{"title":"x-client-secret","type":"string","isRequired":true,"typeLabel":"string","deprecated":false},"schemeName":"clientSecret","name":"x-client-secret"}],"title":"clientKey \u0026 clientSecret"}]},"originalFileLocation":"api-reference/openapi/enterprise-locations/bulk_upsert_locations.json"},"subdomain":"xeniateam","siteName":"Xenia Team API","title":"Bulk Upsert Locations - Xenia Team API","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-07-28T12:47:59.947Z","originalFileLocation":"api-reference/endpoints/enterprise-locations/bulk-upsert-locations.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 or renames up to 2,000 locations per call. Identity resolution: externalId (recorded on first create, so re-runs resolve to the same location) → id. At least one is required. Unmatched rows create a new location. Placement on create is optional: hierarchyId, levelId, and a parent given as either parentExternalId or parentId (not both). New locations inherit the workspace timezone and get the next location number. Placement on an existing location is rejected. Supplying a hierarchyId, levelId, or parent that differs from the location\u0026#x27;s current placement returns 400 — \u0026quot;Location \u0026quot;…\u0026quot; cannot be moved or re-parented via the enterprise API (V1 supports create + rename only)\u0026quot;. Omit the placement fields to rename in place. Moving a location between parents (for example a store from one district to another) is planned for a later version; until then, do it in the Xenia UI, or model the changing dimension as a location attribute and update it through Bulk Upsert Attribute Values. The whole batch runs in one transaction: if any row fails, no locations from that call are created. Requires the Public API and Location Attributes workspace features plus CAN_MANAGE_LOCATIONS.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Xenia Team API\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/xeniateam/1-R9L-rMXezXpRg2/_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/xeniateam/1-R9L-rMXezXpRg2/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/xeniateam/1-R9L-rMXezXpRg2/_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/xeniateam/1-R9L-rMXezXpRg2/_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/xeniateam/1-R9L-rMXezXpRg2/_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/xeniateam/1-R9L-rMXezXpRg2/_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/xeniateam/1-R9L-rMXezXpRg2/_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/xeniateam/1-R9L-rMXezXpRg2/_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/xeniateam/1-R9L-rMXezXpRg2/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Bulk Upsert Locations - Xenia Team API\">\u003cmeta data-mint-head property=\"og:description\" content=\"Creates or renames up to 2,000 locations per call. Identity resolution: externalId (recorded on first create, so re-runs resolve to the same location) → id. At least one is required. Unmatched rows create a new location. Placement on create is optional: hierarchyId, levelId, and a parent given as either parentExternalId or parentId (not both). New locations inherit the workspace timezone and get the next location number. Placement on an existing location is rejected. Supplying a hierarchyId, levelId, or parent that differs from the location\u0026#x27;s current placement returns 400 — \u0026quot;Location \u0026quot;…\u0026quot; cannot be moved or re-parented via the enterprise API (V1 supports create + rename only)\u0026quot;. Omit the placement fields to rename in place. Moving a location between parents (for example a store from one district to another) is planned for a later version; until then, do it in the Xenia UI, or model the changing dimension as a location attribute and update it through Bulk Upsert Attribute Values. The whole batch runs in one transaction: if any row fails, no locations from that call are created. Requires the Public API and Location Attributes workspace features plus CAN_MANAGE_LOCATIONS.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Xenia Team API\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.xenia.team/api-reference/endpoints/enterprise-locations/bulk-upsert-locations\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://xeniateam.mintlify.site/_mintlify/api/og/v2?division=Enterprise+Locations\u0026amp;title=Bulk+Upsert+Locations\u0026amp;description=Creates+or+renames+up+to+**2%2C000**+locations+per+call.%0A%0A**Identity+resolution%3A**+%60externalId%60+%28recorded+on+first+create%2C+so+re-runs+resolve+to+the+same+location\u0026amp;theme=10a62aa493e86ee87dcc54c2\u0026amp;signature=dbb98dda9bf8b559eb3ce2e182224d8b4d85a81a5c43ca291ad4990679549eef\">\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=\"Bulk Upsert Locations - Xenia Team API\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Creates or renames up to 2,000 locations per call. Identity resolution: externalId (recorded on first create, so re-runs resolve to the same location) → id. At least one is required. Unmatched rows create a new location. Placement on create is optional: hierarchyId, levelId, and a parent given as either parentExternalId or parentId (not both). New locations inherit the workspace timezone and get the next location number. Placement on an existing location is rejected. Supplying a hierarchyId, levelId, or parent that differs from the location\u0026#x27;s current placement returns 400 — \u0026quot;Location \u0026quot;…\u0026quot; cannot be moved or re-parented via the enterprise API (V1 supports create + rename only)\u0026quot;. Omit the placement fields to rename in place. Moving a location between parents (for example a store from one district to another) is planned for a later version; until then, do it in the Xenia UI, or model the changing dimension as a location attribute and update it through Bulk Upsert Attribute Values. The whole batch runs in one transaction: if any row fails, no locations from that call are created. Requires the Public API and Location Attributes workspace features plus CAN_MANAGE_LOCATIONS.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://xeniateam.mintlify.site/_mintlify/api/og/v2?division=Enterprise+Locations\u0026amp;title=Bulk+Upsert+Locations\u0026amp;description=Creates+or+renames+up+to+**2%2C000**+locations+per+call.%0A%0A**Identity+resolution%3A**+%60externalId%60+%28recorded+on+first+create%2C+so+re-runs+resolve+to+the+same+location\u0026amp;theme=10a62aa493e86ee87dcc54c2\u0026amp;signature=dbb98dda9bf8b559eb3ce2e182224d8b4d85a81a5c43ca291ad4990679549eef\">\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/xeniateam/1-R9L-rMXezXpRg2/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Xenia Team API\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#8e54e9\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.xenia.team/api-reference/endpoints/enterprise-locations/bulk-upsert-locations\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/endpoints/enterprise-locations/bulk-upsert-locations.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.xenia.team/#organization\",\"name\":\"Xenia Team API\",\"url\":\"https://docs.xenia.team\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/xeniateam/r-j40vtdxuJKg0Zh/logo/logo-light.svg?fit=max\u0026auto=format\u0026n=r-j40vtdxuJKg0Zh\u0026q=85\u0026s=6e8f1d49ac9946b22863d3dd22346adf\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.xenia.team#website\",\"name\":\"Xenia Team API\",\"url\":\"https://docs.xenia.team\",\"publisher\":{\"@id\":\"https://docs.xenia.team/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.xenia.team/api-reference/endpoints/enterprise-locations/bulk-upsert-locations#webpage\",\"url\":\"https://docs.xenia.team/api-reference/endpoints/enterprise-locations/bulk-upsert-locations\",\"name\":\"Bulk Upsert Locations\",\"description\":\"Creates or renames up to 2,000 locations per call. Identity resolution: externalId (recorded on first create, so re-runs resolve to the same location) → id. At least one is required. Unmatched rows create a new location. Placement on create is optional: hierarchyId, levelId, and a parent given as either parentExternalId or parentId (not both). New locations inherit the workspace timezone and get the next location number. Placement on an existing location is rejected. Supplying a hierarchyId, levelId, or parent that differs from the location's current placement returns 400 — \\\"Location \\\"…\\\" cannot be moved or re-parented via the enterprise API (V1 supports create + rename only)\\\". Omit the placement fields to rename in place. Moving a location between parents (for example a store from one district to another) is planned for a later version; until then, do it in the Xenia UI, or model the changing dimension as a location attribute and update it through Bulk Upsert Attribute Values. The whole batch runs in one transaction: if any row fails, no locations from that call are created. Requires the Public API and Location Attributes workspace features plus CAN_MANAGE_LOCATIONS.\",\"dateModified\":\"2026-07-28T12:47:59.947Z\",\"isPartOf\":{\"@id\":\"https://docs.xenia.team#website\"},\"breadcrumb\":{\"@id\":\"https://docs.xenia.team/api-reference/endpoints/enterprise-locations/bulk-upsert-locations#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.xenia.team/api-reference/endpoints/enterprise-locations/bulk-upsert-locations#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Enterprise Locations\",\"item\":\"https://docs.xenia.team/api-reference/endpoints/enterprise-locations/bulk-upsert-hierarchy\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Bulk Upsert Locations\",\"item\":\"https://docs.xenia.team/api-reference/endpoints/enterprise-locations/bulk-upsert-locations\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.xenia.team/api-reference/endpoints/enterprise-locations/bulk-upsert-locations#apireference\",\"headline\":\"Bulk Upsert Locations\",\"name\":\"Bulk Upsert Locations\",\"description\":\"Creates or renames up to 2,000 locations per call. Identity resolution: externalId (recorded on first create, so re-runs resolve to the same location) → id. At least one is required. Unmatched rows create a new location. Placement on create is optional: hierarchyId, levelId, and a parent given as either parentExternalId or parentId (not both). New locations inherit the workspace timezone and get the next location number. Placement on an existing location is rejected. Supplying a hierarchyId, levelId, or parent that differs from the location's current placement returns 400 — \\\"Location \\\"…\\\" cannot be moved or re-parented via the enterprise API (V1 supports create + rename only)\\\". Omit the placement fields to rename in place. Moving a location between parents (for example a store from one district to another) is planned for a later version; until then, do it in the Xenia UI, or model the changing dimension as a location attribute and update it through Bulk Upsert Attribute Values. The whole batch runs in one transaction: if any row fails, no locations from that call are created. Requires the Public API and Location Attributes workspace features plus CAN_MANAGE_LOCATIONS.\",\"url\":\"https://docs.xenia.team/api-reference/endpoints/enterprise-locations/bulk-upsert-locations\",\"mainEntityOfPage\":{\"@id\":\"https://docs.xenia.team/api-reference/endpoints/enterprise-locations/bulk-upsert-locations#webpage\"},\"dateModified\":\"2026-07-28T12:47:59.947Z\",\"publisher\":{\"@id\":\"https://docs.xenia.team/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.xenia.team#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Xenia Team API\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Xenia Team API","nav":{"global":null,"tabs":[{"tab":"Guides","pages":[{"title":"Guides","href":"/guides/getting-started"}]},{"tab":"API Reference","groups":[{"group":"Authentication","pages":[{"title":"Client Key Setup","href":"/api-reference/endpoints/authentication"}]},{"group":"Users","pages":[{"title":"Provision Users","openapi":"POST /api/v1/mgt/users/provision","href":"/api-reference/endpoints/users/provision-users"},{"title":"Get Users","openapi":"GET /api/v1/mgt/workspaces/{workspaceId}/users","href":"/api-reference/endpoints/users/get-users"},{"title":"Get User Context","openapi":"GET /api/v1/mgt/user-context","href":"/api-reference/endpoints/users/user-context"},{"title":"Change User Role","openapi":"PATCH /api/v1/mgt/workspaces/{workspaceId}/users/{userId}/role","href":"/api-reference/endpoints/users/change-user-role"},{"title":"Replace User Locations","openapi":"PUT /api/v1/mgt/workspaces/{workspaceId}/users/{userId}/locations","href":"/api-reference/endpoints/users/replace-user-locations"},{"title":"Set User Password","openapi":"PATCH /api/v1/mgt/workspaces/{workspaceId}/set-password","href":"/api-reference/endpoints/users/set-password"},{"title":"Set User Login Pin","openapi":"PUT /api/v1/mgt/set-login-pin","href":"/api-reference/endpoints/users/set-login-pin"},{"title":"Delete User","openapi":"DELETE /api/v1/mgt/workspaces/{workspaceId}/users/{userId}","href":"/api-reference/endpoints/users/delete-user"}]},{"group":"Locations","pages":[{"title":"Get Locations - Sub Locations Hierarchy","openapi":"GET /api/v1/mgt/workspaces/{workspaceId}/locations","href":"/api-reference/endpoints/locations/get-locations"}]},{"group":"Enterprise Locations","pages":[{"title":"Bulk Upsert Hierarchies","openapi":"POST /api/v1/mgt/enterprise/workspaces/{workspaceId}/hierarchy/bulk-upsert","description":"Creates or extends up to **100** hierarchies per call, each with 1–20 levels.\n\n**Identity resolution**, in priority order: `externalId` → `id` → `name`. Unmatched rows are created; the first hierarchy in a workspace becomes its default.\n\n**Level rules** (enforced on create): exactly **one** level must be marked `isSite: true` — the leaf level that real, task-bearing locations live on — and `order` values must be unique within the hierarchy. Orders are stored as you send them.\n\n**On a match**, levels are appended by title: a level whose `title` already exists is left alone, anything new is appended **after** the hierarchy's current last level (the server assigns its `order`, so the `order` you send is ignored), and a level marked `isSite: true` is skipped — a hierarchy keeps the single site level it was created with. Levels are never renamed, reordered, or deleted through this endpoint, so an existing hierarchy's shape is never destructively rewritten.\n\n**No re-parenting.** This endpoint shapes the hierarchy; it does not move locations within it. See *Bulk Upsert Locations* for what placement changes are and are not supported.\n\nRows are processed one at a time rather than as one atomic batch: if a later row fails, earlier rows stay created. Re-running the same payload is safe, because every row is matched before it is created.\n\nRequires the **Public API** and **Location Attributes** workspace features plus `CAN_MANAGE_LOCATIONS`.","href":"/api-reference/endpoints/enterprise-locations/bulk-upsert-hierarchy"},{"title":"Bulk Upsert Locations","openapi":"POST /api/v1/mgt/enterprise/workspaces/{workspaceId}/locations/bulk-upsert","href":"/api-reference/endpoints/enterprise-locations/bulk-upsert-locations"},{"title":"List Locations with External IDs","openapi":"GET /api/v1/mgt/enterprise/workspaces/{workspaceId}/locations","description":"Flat list of the workspace's non-deleted locations. Compared with the general [Locations API](/api-reference/endpoints/locations/get-locations), this response is deliberately narrow — placement columns plus your `externalId`, with no members, assets, or nesting — so it is cheap to poll from a sync job.\n\nRequires the **Public API** and **Location Attributes** workspace features plus `CAN_MANAGE_LOCATIONS`.","href":"/api-reference/endpoints/enterprise-locations/list-locations"},{"title":"Bulk Upsert Location Attributes","openapi":"POST /api/v1/mgt/enterprise/workspaces/{workspaceId}/location-attributes/bulk-upsert","href":"/api-reference/endpoints/enterprise-locations/bulk-upsert-attributes"},{"title":"List Location Attributes","openapi":"GET /api/v1/mgt/enterprise/workspaces/{workspaceId}/location-attributes","href":"/api-reference/endpoints/enterprise-locations/list-attributes"},{"title":"Bulk Upsert Attribute Values","openapi":"POST /api/v1/mgt/enterprise/workspaces/{workspaceId}/location-attribute-values/bulk-upsert","href":"/api-reference/endpoints/enterprise-locations/bulk-upsert-attribute-values"}]},{"group":"Enterprise Sub-Locations","pages":[{"title":"Bulk Upsert Sub-Location Types","openapi":"POST /api/v1/mgt/enterprise/workspaces/{workspaceId}/sub-location-types/bulk-upsert","href":"/api-reference/endpoints/enterprise-sub-locations/bulk-upsert-sub-location-types"},{"title":"List Sub-Location Types","openapi":"GET /api/v1/mgt/enterprise/workspaces/{workspaceId}/sub-location-types","href":"/api-reference/endpoints/enterprise-sub-locations/list-sub-location-types"},{"title":"Bulk Upsert Sub-Locations","openapi":"POST /api/v1/mgt/enterprise/workspaces/{workspaceId}/sub-locations/bulk-upsert","href":"/api-reference/endpoints/enterprise-sub-locations/bulk-upsert-sub-locations"},{"title":"List Sub-Locations","openapi":"GET /api/v1/mgt/enterprise/workspaces/{workspaceId}/sub-locations","href":"/api-reference/endpoints/enterprise-sub-locations/list-sub-locations"},{"title":"Bulk Upsert Sub-Location Attribute Values","openapi":"POST /api/v1/mgt/enterprise/workspaces/{workspaceId}/sub-location-attribute-values/bulk-upsert","href":"/api-reference/endpoints/enterprise-sub-locations/bulk-upsert-sub-location-attribute-values"}]},{"group":"Roles","pages":[{"title":"Get Roles","openapi":"GET /api/v1/mgt/workspaces/{workspaceId}/roles","href":"/api-reference/endpoints/roles/get"}]},{"group":"Teams","pages":[{"title":"List Teams","openapi":"GET /api/v1/mgt/workspaces/{workspaceId}/teams","href":"/api-reference/endpoints/teams/get-teams"}]},{"group":"Tasks","pages":[{"title":"Get Tasks","openapi":"POST /api/v1/ops/workspaces/{workspaceId}/tasks/catalog","href":"/api-reference/endpoints/tasks/get-tasks"},{"title":"Get Task","openapi":"GET /api/v1/ops/workspaces/{workspaceId}/tasks/{taskId}/details","href":"/api-reference/endpoints/tasks/get-task-by-id"},{"title":"Get Task List","openapi":"POST /api/v1/ops/workspaces/{workspaceId}/tasks/list","href":"/api-reference/endpoints/tasks/get-task-list"},{"title":"Create Task","openapi":"POST /api/v1/ops/workspaces/{workspaceId}/tasks","href":"/api-reference/endpoints/tasks/create-task"},{"title":"Edit Task","openapi":"POST /api/v1/ops/workspaces/{workspaceId}/tasks/{taskId}/edit","href":"/api-reference/endpoints/tasks/edit-task"},{"title":"Change Task Status","openapi":"PATCH /api/v1/ops/workspaces/{workspaceId}/tasks/{taskId}/status","href":"/api-reference/endpoints/tasks/set-task-status"},{"title":"Delete Task","openapi":"DELETE /api/v1/ops/workspaces/{workspaceId}/tasks/{taskId}","href":"/api-reference/endpoints/tasks/delete-task"}]},{"group":"Projects","pages":[{"title":"Create Project","href":"/api-reference/endpoints/projects/create-project"},{"title":"List Projects","openapi":"GET /api/v1/ops/workspaces/{workspaceId}/projects","href":"/api-reference/endpoints/projects/list-projects"},{"title":"Search Projects","openapi":"POST /api/v1/ops/workspaces/{workspaceId}/projects","href":"/api-reference/endpoints/projects/search-projects"},{"title":"Get Project","openapi":"GET /api/v1/ops/workspaces/{workspaceId}/projects/{projectId}","href":"/api-reference/endpoints/projects/get-project-by-id"},{"title":"Get Project Active Tasks","openapi":"GET /api/v1/ops/workspaces/{workspaceId}/projects/{projectId}/active/tasks","href":"/api-reference/endpoints/projects/get-project-active-tasks"},{"title":"Get Project Schedule Analytics","openapi":"POST /api/v1/ops/workspaces/{workspaceId}/projects/{projectId}/schedules/analytics","href":"/api-reference/endpoints/projects/project-schedule-analytics"},{"title":"Get Project Task Analytics","openapi":"POST /api/v1/ops/workspaces/{workspaceId}/projects/{projectId}/tasks/analytics","href":"/api-reference/endpoints/projects/project-task-analytics"},{"title":"Edit Project","openapi":"PATCH /api/v1/ops/workspaces/{workspaceId}/projects/{projectId}/edit","href":"/api-reference/endpoints/projects/edit-project"},{"title":"Pause or Resume Project","openapi":"GET /api/v1/ops/workspaces/{workspaceId}/projects/{projectId}/toggle-pause","href":"/api-reference/endpoints/projects/pause-resume-project"},{"title":"End Project","openapi":"PUT /api/v1/ops/workspaces/{workspaceId}/projects/{projectId}/end","href":"/api-reference/endpoints/projects/end-project"},{"title":"Delete Project","openapi":"DELETE /api/v1/ops/workspaces/{workspaceId}/projects/{projectId}","href":"/api-reference/endpoints/projects/delete-project"}]},{"group":"Reporting","pages":[{"title":"Submission Records","openapi":"POST /api/v1/ops/template-submissions","href":"/api-reference/endpoints/reporting/submission-records"},{"title":"Get Submission","openapi":"GET /api/v1/ops/workspaces/{workspaceId}/logs/{logId}","href":"/api-reference/endpoints/reporting/submission-record"},{"title":"Submission Counts by Status","openapi":"POST /api/v1/ops/submissions-count-by-status","href":"/api-reference/endpoints/reporting/submission-counts-by-status"},{"title":"Task Count by Status","openapi":"POST /api/v1/ops/reports/tasks/count-by-status","href":"/api-reference/endpoints/reporting/task-count-by-status"},{"title":"Task Count by Assignees","openapi":"POST /api/v1/ops/reports/tasks/count-by-assignees","href":"/api-reference/endpoints/reporting/task-count-by-assignees"},{"title":"Task Count by Categories","openapi":"POST /api/v1/ops/reports/tasks/count-by-categories","href":"/api-reference/endpoints/reporting/task-count-by-categories"},{"title":"Weekly Completion","openapi":"POST /api/v1/ops/reports/tasks/weekly-completion","href":"/api-reference/endpoints/reporting/weekly-completion"},{"title":"Schedule Completion by Location","openapi":"POST /api/v1/ops/reports/tasks/schedule-completion-by-location","href":"/api-reference/endpoints/reporting/schedule-completion-by-location"},{"title":"On-Time / Late Submission by Location","openapi":"POST /api/v1/ops/reports/tasks/on-time-late-submission-by-location","href":"/api-reference/endpoints/reporting/on-time-late-submission-by-location"},{"title":"Daily Compliance","openapi":"POST /api/v1/ops/reports/tasks/daily-compliance","href":"/api-reference/endpoints/reporting/daily-compliance"},{"title":"List Grid Reports","openapi":"GET /api/v1/mgt/grid-reports","href":"/api-reference/endpoints/reporting/grid-reports-list"},{"title":"Grid Report View Spreadsheet","openapi":"GET /api/v1/mgt/grid-report-views/{viewId}/spreadsheet","href":"/api-reference/endpoints/reporting/grid-report-spreadsheet"}]}]}]},"basePath":"","title":"Bulk Upsert Locations - Xenia Team API","buildId":"dpl_DTau1J5HqS9UTgVSDwGksstFWtPa","deploymentId":"dpl_DTau1J5HqS9UTgVSDwGksstFWtPa","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-5FCzAcfS.js","utils-SLtAG4EZ.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-2DZi8ZMu.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-D7J3nkzE.js","snippetPresets-D0Alv0AH.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","conditional-requirements-CFM0id0Q.js","ApiExamples-BI4qNJ2c.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-BD3uyr8j.js","shallow-D8iEBr5z.js","getApiPlaygroundDisplay-CgNP4lzR.js","CodeSnippet-CX-QHuMs.js","CodeSnippets-VlXE-ZUf.js","Page-D9ithiIZ.js","getPastedJson-DYNQkZ1M.js","icon-CzacdwOi.js","MethodPill-2JVqoYKi.js","DuplicateIcon-_xVXs-U8.js","createIcon-BRHrweLo.js","DynamicMarkdown-mQG_iQiE.js","SectionHeading-DMpJzv8f.js","axios-vUo_bRtp.js","Markdown-5FGIym-8.js","clsx-D-TRO5q5.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-CdrJecqK.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-CHlcWBLM.js"]}