Creates or updates up to 500 attribute definitions per call.
Identity resolution, in priority order: externalId (your key, recorded on first create so later runs resolve to the same attribute) → id (a Xenia UUID) → name. If nothing matches, the attribute is created.
type is immutable. It is required on every row; sending a type that conflicts with an existing attribute’s type is rejected with 400.
Options are required for single_select and multi_select and forbidden for the other four types. Options are replaced by exactly what you send: include an option’s id to keep it (renaming it that way preserves stored values), omit id to add a new one, and leave one out to remove it. Prefer additive option changes — removing an option through this endpoint can leave per-location values pointing at an option that no longer exists, so re-send values for the affected locations afterwards.
Requires the Public API and Location Attributes workspace features plus CAN_MANAGE_LOCATIONS.
One result row per input row, in request order. created distinguishes an insert from an update.
{"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-attributes","slug":"/api-reference/endpoints/enterprise-locations/bulk-upsert-attributes","pageMetadata":{"title":"Bulk Upsert Location Attributes","openapi":"POST /api/v1/mgt/enterprise/workspaces/{workspaceId}/location-attributes/bulk-upsert","description":"Creates or updates up to **500** attribute definitions per call.\n\n**Identity resolution**, in priority order: `externalId` (your key, recorded on first create so later runs resolve to the same attribute) → `id` (a Xenia UUID) → `name`. If nothing matches, the attribute is created.\n\n**`type` is immutable.** It is required on every row; sending a type that conflicts with an existing attribute's type is rejected with `400`.\n\n**Options** are required for `single_select` and `multi_select` and forbidden for the other four types. Options are replaced by exactly what you send: include an option's `id` to keep it (renaming it that way preserves stored values), omit `id` to add a new one, and leave one out to remove it. Prefer additive option changes — removing an option through this endpoint can leave per-location values pointing at an option that no longer exists, so re-send values for the affected locations afterwards.\n\nRequires the **Public API** and **Location Attributes** workspace features plus `CAN_MANAGE_LOCATIONS`.","href":"/api-reference/endpoints/enterprise-locations/bulk-upsert-attributes"},"description":{"compiledSource":"\"use strict\";\nconst {Fragment: _Fragment, jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n p: \"p\",\n strong: \"strong\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsxs(_components.p, {\n children: [\"Creates or updates up to \", _jsx(_components.strong, {\n children: \"500\"\n }), \" attribute definitions per call.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Identity resolution\"\n }), \", in priority order: \", _jsx(_components.code, {\n children: \"externalId\"\n }), \" (your key, recorded on first create so later runs resolve to the same attribute) → \", _jsx(_components.code, {\n children: \"id\"\n }), \" (a Xenia UUID) → \", _jsx(_components.code, {\n children: \"name\"\n }), \". If nothing matches, the attribute is created.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsxs(_components.strong, {\n children: [_jsx(_components.code, {\n children: \"type\"\n }), \" is immutable.\"]\n }), \" It is required on every row; sending a type that conflicts with an existing attribute’s type is rejected with \", _jsx(_components.code, {\n children: \"400\"\n }), \".\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Options\"\n }), \" are required for \", _jsx(_components.code, {\n children: \"single_select\"\n }), \" and \", _jsx(_components.code, {\n children: \"multi_select\"\n }), \" and forbidden for the other four types. Options are replaced by exactly what you send: include an option’s \", _jsx(_components.code, {\n children: \"id\"\n }), \" to keep it (renaming it that way preserves stored values), omit \", _jsx(_components.code, {\n children: \"id\"\n }), \" to add a new one, and leave one out to remove it. Prefer additive option changes — removing an option through this endpoint can leave per-location values pointing at an option that no longer exists, so re-send values for the affected locations afterwards.\"]\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 Location Attributes","openapi":"POST /api/v1/mgt/enterprise/workspaces/{workspaceId}/location-attributes/bulk-upsert","description":"Creates or updates up to **500** attribute definitions per call.\n\n**Identity resolution**, in priority order: `externalId` (your key, recorded on first create so later runs resolve to the same attribute) → `id` (a Xenia UUID) → `name`. If nothing matches, the attribute is created.\n\n**`type` is immutable.** It is required on every row; sending a type that conflicts with an existing attribute's type is rejected with `400`.\n\n**Options** are required for `single_select` and `multi_select` and forbidden for the other four types. Options are replaced by exactly what you send: include an option's `id` to keep it (renaming it that way preserves stored values), omit `id` to add a new one, and leave one out to remove it. Prefer additive option changes — removing an option through this endpoint can leave per-location values pointing at an option that no longer exists, so re-send values for the affected locations afterwards.\n\nRequires the **Public API** and **Location Attributes** workspace features plus `CAN_MANAGE_LOCATIONS`.","href":"/api-reference/endpoints/enterprise-locations/bulk-upsert-attributes"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"summary":"Bulk Upsert Location Attributes","description":"Creates or updates up to **500** attribute definitions per call.\n\n**Identity resolution**, in priority order: `externalId` (your key, recorded on first create so later runs resolve to the same attribute) → `id` (a Xenia UUID) → `name`. If nothing matches, the attribute is created.\n\n**`type` is immutable.** It is required on every row; sending a type that conflicts with an existing attribute's type is rejected with `400`.\n\n**Options** are required for `single_select` and `multi_select` and forbidden for the other four types. Options are replaced by exactly what you send: include an option's `id` to keep it (renaming it that way preserves stored values), omit `id` to add a new one, and leave one out to remove it. Prefer additive option changes — removing an option through this endpoint can leave per-location values pointing at an option that no longer exists, so re-send values for the affected locations afterwards.\n\nRequires the **Public API** and **Location Attributes** workspace features plus `CAN_MANAGE_LOCATIONS`.","tags":["Enterprise Locations"],"parameters":["36ea4d7d-6766-4e92-9c64-bff1dffcc070"],"requestBody":"9e19bde9-999e-4b87-ac6e-d3e31b7c7a0c","responses":{"200":"508bfd72-ba47-4284-8baa-07055b74083a","400":"acce79a5-fe3e-402d-91b1-291f1b215658","401":"81cf3480-30fe-40cb-a9e3-253d11745443","403":"2db1af6a-7185-4749-95ba-0bcfb59c8f1c","409":"80e5246d-e95a-48f0-a551-c32506f2a75b","422":"16afacfc-28f9-4215-9120-ccfdad88c071","500":"673847b7-5c11-4953-879a-0bdcbfdde103"},"security":["151048bd-660b-4510-ae71-ff0d29700794"],"method":"post","type":"path","servers":["db046780-fc8a-484b-bea3-f24a6d974208"],"path":"/api/v1/mgt/enterprise/workspaces/{workspaceId}/location-attributes/bulk-upsert","baseUrlOptions":["https://api.xenia.team"],"title":"Bulk Upsert Location Attributes","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"36ea4d7d-6766-4e92-9c64-bff1dffcc070":{"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":{"attributes":{"type":"array","minItems":1,"maxItems":500,"description":"Attribute definitions to upsert.","items":{"type":"object","properties":{"name":{"type":"string","maxLength":255,"description":"Display name. Also the fallback match key when no `externalId`/`id` is supplied.","isRequired":true,"uniqueKey":"attributes.items.[INDEX].name","typeLabel":"string"},"type":{"type":"string","enum":["single_select","multi_select","number","boolean","text","date"],"description":"Attribute type. Required, and immutable once the attribute exists.","isRequired":true,"uniqueKey":"attributes.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"externalId":{"type":"string","maxLength":255,"description":"Your own stable key for this attribute. Strongly recommended — it is what makes re-runs idempotent.","uniqueKey":"attributes.items.[INDEX].externalId","typeLabel":"string"},"id":{"type":"string","format":"uuid","description":"Xenia attribute UUID, if you already know it.","uniqueKey":"attributes.items.[INDEX].id","typeLabel":"string\u003cuuid>"},"description":{"type":"string","maxLength":1000,"uniqueKey":"attributes.items.[INDEX].description","typeLabel":"string"},"options":{"type":"array","minItems":1,"description":"Required for `single_select`/`multi_select`, forbidden otherwise.","items":{"type":"object","properties":{"label":{"type":"string","maxLength":255,"isRequired":true,"uniqueKey":"attributes.items.[INDEX].options.items.[INDEX].label","typeLabel":"string"},"color":{"type":"string","maxLength":32,"description":"Hex chip color, e.g. `#7C5CFC`.","isRequired":true,"uniqueKey":"attributes.items.[INDEX].options.items.[INDEX].color","typeLabel":"string"},"id":{"type":"string","format":"uuid","description":"Omit to create a new option; supply to keep (or rename) an existing one.","uniqueKey":"attributes.items.[INDEX].options.items.[INDEX].id","typeLabel":"string\u003cuuid>"}},"required":["label","color"],"uniqueKey":"attributes.items.[INDEX].options.items.[INDEX]","typeLabel":"object"},"uniqueKey":"attributes.items.[INDEX].options","typeLabel":"object[]"}},"required":["name","type"],"uniqueKey":"attributes.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"attributes","typeLabel":"object[]"}},"required":["attributes"],"uniqueKey":"","typeLabel":"object"},"example":{"attributes":[{"externalId":"REGION","name":"Region","description":"Operational region","type":"single_select","options":[{"label":"Southwest","color":"#7C5CFC"},{"label":"Midwest","color":"#22B8CF"}]},{"externalId":"DRIVE_THRU_LANES","name":"Drive Thru Lanes","type":"number"}]},"examples":{"Example":{"title":"Example","value":{"attributes":[{"externalId":"REGION","name":"Region","description":"Operational region","type":"single_select","options":[{"label":"Southwest","color":"#7C5CFC"},{"label":"Midwest","color":"#22B8CF"}]},{"externalId":"DRIVE_THRU_LANES","name":"Drive Thru Lanes","type":"number"}]}}},"exampleType":"examples"}},"exampleType":"examples"},"responses":{"508bfd72-ba47-4284-8baa-07055b74083a":{"description":"One result row per input row, in request order. `created` distinguishes an insert from an update.","content":{"application/json":{"example":{"data":[{"externalId":"REGION","id":"1f6c9e0a-2b7d-4d5e-9a11-8c3f5b6d7e88","name":"Region","created":true},{"externalId":"DRIVE_THRU_LANES","id":"2a7d0f1b-3c8e-4e6f-9b22-9d4a6c7e8f99","name":"Drive Thru Lanes","created":false}],"extra_meta":{"message":"Attributes upserted"}},"examples":{"Example":{"title":"Example","value":{"data":[{"externalId":"REGION","id":"1f6c9e0a-2b7d-4d5e-9a11-8c3f5b6d7e88","name":"Region","created":true},{"externalId":"DRIVE_THRU_LANES","id":"2a7d0f1b-3c8e-4e6f-9b22-9d4a6c7e8f99","name":"Drive Thru Lanes","created":false}],"extra_meta":{"message":"Attributes upserted"}}}},"exampleType":"examples"}},"exampleType":"examples"},"acce79a5-fe3e-402d-91b1-291f1b215658":{"description":"Bad Request - a row conflicts with an existing attribute's immutable `type`, or references an attribute that cannot be resolved.","content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}},"81cf3480-30fe-40cb-a9e3-253d11745443":{"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":""}}}},"2db1af6a-7185-4749-95ba-0bcfb59c8f1c":{"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":""}}}},"80e5246d-e95a-48f0-a551-c32506f2a75b":{"description":"Conflict - a concurrent write to the workspace's attributes won the race. Re-read and retry the call.","content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}},"16afacfc-28f9-4215-9120-ccfdad88c071":{"description":"Unprocessable Entity - body failed validation (missing `name`/`type`, unknown field, `options` on a non-select type, more than 500 rows).","content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}},"673847b7-5c11-4953-879a-0bdcbfdde103":{"description":"Internal Server Error.","content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}}},"security":{"151048bd-660b-4510-ae71-ff0d29700794":{"clientKey":{"type":"apiKey","in":"header","name":"x-client-key","scopes":[]},"clientSecret":{"type":"apiKey","in":"header","name":"x-client-secret","scopes":[]}}},"servers":{"db046780-fc8a-484b-bea3-f24a6d974208":{"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_attributes.json"},"subdomain":"xeniateam","siteName":"Xenia Team API","title":"Bulk Upsert Location Attributes - Xenia Team API","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-07-28T12:47:59.948Z","originalFileLocation":"api-reference/endpoints/enterprise-locations/bulk-upsert-attributes.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 updates up to 500 attribute definitions per call. Identity resolution, in priority order: externalId (your key, recorded on first create so later runs resolve to the same attribute) → id (a Xenia UUID) → name. If nothing matches, the attribute is created. type is immutable. It is required on every row; sending a type that conflicts with an existing attribute\u0026#x27;s type is rejected with 400. Options are required for single_select and multi_select and forbidden for the other four types. Options are replaced by exactly what you send: include an option\u0026#x27;s id to keep it (renaming it that way preserves stored values), omit id to add a new one, and leave one out to remove it. Prefer additive option changes — removing an option through this endpoint can leave per-location values pointing at an option that no longer exists, so re-send values for the affected locations afterwards. 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 Location Attributes - Xenia Team API\">\u003cmeta data-mint-head property=\"og:description\" content=\"Creates or updates up to 500 attribute definitions per call. Identity resolution, in priority order: externalId (your key, recorded on first create so later runs resolve to the same attribute) → id (a Xenia UUID) → name. If nothing matches, the attribute is created. type is immutable. It is required on every row; sending a type that conflicts with an existing attribute\u0026#x27;s type is rejected with 400. Options are required for single_select and multi_select and forbidden for the other four types. Options are replaced by exactly what you send: include an option\u0026#x27;s id to keep it (renaming it that way preserves stored values), omit id to add a new one, and leave one out to remove it. Prefer additive option changes — removing an option through this endpoint can leave per-location values pointing at an option that no longer exists, so re-send values for the affected locations afterwards. 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-attributes\">\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+Location+Attributes\u0026amp;description=Creates+or+updates+up+to+**500**+attribute+definitions+per+call.%0A%0A**Identity+resolution**%2C+in+priority+order%3A+%60externalId%60+%28your+key%2C+recorded+on+first+create+s\u0026amp;theme=10a62aa493e86ee87dcc54c2\u0026amp;signature=00f3831e79cc500ae24b34e7cefe5252e9c62f3d19bcd892d18cec672a877ec9\">\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 Location Attributes - Xenia Team API\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Creates or updates up to 500 attribute definitions per call. Identity resolution, in priority order: externalId (your key, recorded on first create so later runs resolve to the same attribute) → id (a Xenia UUID) → name. If nothing matches, the attribute is created. type is immutable. It is required on every row; sending a type that conflicts with an existing attribute\u0026#x27;s type is rejected with 400. Options are required for single_select and multi_select and forbidden for the other four types. Options are replaced by exactly what you send: include an option\u0026#x27;s id to keep it (renaming it that way preserves stored values), omit id to add a new one, and leave one out to remove it. Prefer additive option changes — removing an option through this endpoint can leave per-location values pointing at an option that no longer exists, so re-send values for the affected locations afterwards. 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+Location+Attributes\u0026amp;description=Creates+or+updates+up+to+**500**+attribute+definitions+per+call.%0A%0A**Identity+resolution**%2C+in+priority+order%3A+%60externalId%60+%28your+key%2C+recorded+on+first+create+s\u0026amp;theme=10a62aa493e86ee87dcc54c2\u0026amp;signature=00f3831e79cc500ae24b34e7cefe5252e9c62f3d19bcd892d18cec672a877ec9\">\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-attributes\">\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-attributes.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-attributes#webpage\",\"url\":\"https://docs.xenia.team/api-reference/endpoints/enterprise-locations/bulk-upsert-attributes\",\"name\":\"Bulk Upsert Location Attributes\",\"description\":\"Creates or updates up to 500 attribute definitions per call. Identity resolution, in priority order: externalId (your key, recorded on first create so later runs resolve to the same attribute) → id (a Xenia UUID) → name. If nothing matches, the attribute is created. type is immutable. It is required on every row; sending a type that conflicts with an existing attribute's type is rejected with 400. Options are required for single_select and multi_select and forbidden for the other four types. Options are replaced by exactly what you send: include an option's id to keep it (renaming it that way preserves stored values), omit id to add a new one, and leave one out to remove it. Prefer additive option changes — removing an option through this endpoint can leave per-location values pointing at an option that no longer exists, so re-send values for the affected locations afterwards. Requires the Public API and Location Attributes workspace features plus CAN_MANAGE_LOCATIONS.\",\"dateModified\":\"2026-07-28T12:47:59.948Z\",\"isPartOf\":{\"@id\":\"https://docs.xenia.team#website\"},\"breadcrumb\":{\"@id\":\"https://docs.xenia.team/api-reference/endpoints/enterprise-locations/bulk-upsert-attributes#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.xenia.team/api-reference/endpoints/enterprise-locations/bulk-upsert-attributes#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 Location Attributes\",\"item\":\"https://docs.xenia.team/api-reference/endpoints/enterprise-locations/bulk-upsert-attributes\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.xenia.team/api-reference/endpoints/enterprise-locations/bulk-upsert-attributes#apireference\",\"headline\":\"Bulk Upsert Location Attributes\",\"name\":\"Bulk Upsert Location Attributes\",\"description\":\"Creates or updates up to 500 attribute definitions per call. Identity resolution, in priority order: externalId (your key, recorded on first create so later runs resolve to the same attribute) → id (a Xenia UUID) → name. If nothing matches, the attribute is created. type is immutable. It is required on every row; sending a type that conflicts with an existing attribute's type is rejected with 400. Options are required for single_select and multi_select and forbidden for the other four types. Options are replaced by exactly what you send: include an option's id to keep it (renaming it that way preserves stored values), omit id to add a new one, and leave one out to remove it. Prefer additive option changes — removing an option through this endpoint can leave per-location values pointing at an option that no longer exists, so re-send values for the affected locations afterwards. 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-attributes\",\"mainEntityOfPage\":{\"@id\":\"https://docs.xenia.team/api-reference/endpoints/enterprise-locations/bulk-upsert-attributes#webpage\"},\"dateModified\":\"2026-07-28T12:47:59.948Z\",\"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","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","description":"Lists the workspace's attribute definitions. Array order **is** the display order used in the Xenia UI. Each item carries a `body` whose `type` is the attribute type; the two select types also carry their `options`. Requires the **Public API** and **Location Attributes** workspace features plus `CAN_MANAGE_LOCATIONS`.","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 Location Attributes - 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"]}