Weist einer E-Mail eine oder mehrere mandantenweite Rollen zu und vergibt optional Mitgliedschaften auf Projekten und/oder Projektregionen. Der API-Schlüssel muss ein reiner Kunden-Schlüssel sein.
Bestehender Benutzer (status: ASSIGNED): Die E-Mail gehört bereits zu einem Benutzer des Mandanten (Vergleich ohne Groß-/Kleinschreibung). Alle angegebenen Rollen werden mandantenweit hinzugefügt; bereits vorhandene Rollen bleiben bestehen. Jede Projektmitgliedschaft verwendet die erste Rolle als projektbezogene Rolle und ersetzt bei Wiederholung diese Rolle. Regionsmitgliedschaften werden angelegt; bestehende Regionszeilen bleiben unverändert. projects und regions dürfen entfallen.
Unbekannte E-Mail (status: INVITED): Es wird mindestens ein Projekt oder eine Region benötigt. Pro Projekt wird eine ausstehende Einladung mit der ersten Rolle gespeichert, pro Region eine Einladung ohne Rolle. Weitere Rollen werden geprüft und in role_ids zurückgegeben. Mandantenweit gespeichert werden sie, sobald die E-Mail zu einem Benutzer gehört. Wiederholen Sie die Anfrage danach, um alle mandantenweiten Rollen zu setzen.
Adressierung: Jeder Projekteintrag enthält genau eines von project_number oder external_id. project_number ist nur je Buchungskreis eindeutig; ist sie im Mandanten mehrfach vergeben, antwortet die API mit HTTP 409 — verwenden Sie dann external_id. Regionen werden über region_number adressiert.
Upsert: Eine Wiederholung aktualisiert die bestehenden Zeilen. Ausgelassene Projekte, Regionen und Rollen bleiben unverändert. Alle Schreibvorgänge einer Anfrage laufen in einer Mutation und werden gemeinsam übernommen oder gemeinsam verworfen.
Leerzeichen an email, Rollentiteln und Kennungen werden entfernt. Rollentitel müssen exakt einer bestehenden Rolle des Mandanten entsprechen.
Assigns tenant-wide roles to an email and optionally grants project and region memberships. Repeating the request updates the existing rows. Assignments left out of the request stay as they are.The API key must be a customer API key.
Role titles must match an existing tenant role exactly. The first role is the project-scoped role on every membership and every project invite.
When the email already belongs to a tenant user, every listed role is added tenant-wide (ASSIGNED). Roles, projects, and regions omitted from the request stay as they are. Sending the request again replaces the project-scoped role with the first role of the new request.
When the email is unknown, projects or regions is required (INVITED). The project invite stores the first role; region invites carry no role. Further roles are validated and returned in role_ids. Send the request again after the user exists to apply every tenant-wide role.
project_number is unique per legal entity. If more than one project in the tenant uses it, the API responds with 409; use external_id.
Each project entry contains exactly one of project_number or external_id. The same project or region must not appear twice, including when two identifiers resolve to the same target.
Titel der mandantenweiten Rollen. Mindestens eine, ohne Duplikate.
Jede Rolle muss im Mandanten existieren. Bei Projekten wird die erste Rolle
als projektbezogene Rolle verwendet.
Optionale Projekte. Jeder Eintrag enthält genau eines von project_number oder external_id.
Dasselbe Projekt darf nicht zweimal vorkommen. Für unbekannte E-Mails ist mindestens
ein Projekt oder eine Region erforderlich.
Optionale Projektregionen, adressiert über region_number. Duplikate werden abgelehnt.
Bestehende Benutzer erhalten die Mitgliedschaft sofort; unbekannte E-Mails eine ausstehende Einladung.
ASSIGNED, wenn die E-Mail bereits zu einem Benutzer des Mandanten gehört.
INVITED, wenn stattdessen ausstehende Projekt- und/oder Regionseinladungen gespeichert wurden.
UUIDs der aufgelösten Projektregionen. Leer, wenn keine Regionen angefragt wurden.
Example:
["55555555-5555-4555-8555-555555555555"]
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"comstruct API Dokumentation","colors":{"primary":"#2F6879","light":"#3A8599","dark":"#1E4A57"},"logo":{"light":"https://mintcdn.com/comstruct/Jpsyju8lznqRSEZJ/logo/light.svg?fit=max\u0026auto=format\u0026n=Jpsyju8lznqRSEZJ\u0026q=85\u0026s=acbbee3c044994a3e7752740782d923f","dark":"https://mintcdn.com/comstruct/Jpsyju8lznqRSEZJ/logo/dark.svg?fit=max\u0026auto=format\u0026n=Jpsyju8lznqRSEZJ\u0026q=85\u0026s=3849d724919d807467f3b58d490d50c0"},"favicon":"https://mintcdn.com/comstruct/CqrhxzMG7_sRCFwK/favicon.png?fit=max\u0026auto=format\u0026n=CqrhxzMG7_sRCFwK\u0026q=85\u0026s=ff5a12229b0e3075a0e33fe7354ddae3","api":{},"navbar":{"links":[{"href":"mailto:support@comstruct.com","label":"Support"}],"primary":{"type":"button","label":"App öffnen","href":"https://app.comstruct.com"}},"footer":{"socials":{"linkedin":"https://linkedin.com/company/comstruct","website":"https://comstruct.com"}},"contextual":{"options":["copy","view","chatgpt","claude","cursor"],"display":"header"},"styling":{"latex":false},"navigation":{"global":{"anchors":[{"anchor":"Support","icon":"envelope","href":"mailto:support@comstruct.com"}]},"languages":[{"language":"de","default":true,"href":""},{"language":"en","href":"en"}]}},"deployment":{"deploymentMetadataValue":{"subdomain":"comstruct","hasAudioNarration":false,"actualSubdomain":"comstruct","customDomains":["developer.comstruct.com"],"gitSource":{"type":"github","owner":"comstruct-engineering","repo":"comstruct-one","deployBranch":"main","contentDirectory":"docs","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ae07c9f83d301a35cf45e92","collectionId":"897c9b73-5f93-4de2-ad4f-7de8f19c85cd","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ae07c9f83d301a35cf45e92"},"entitlements":{},"buildId":"6ae07c9f83d301a35cf45e92","clientVersion":"0.0.3971","searchFilterCounts":[{"language":"de","tag":"API-Referenz","count":69},{"language":"en","tag":"API Reference","count":69},{"language":"de","tag":"Rechnungs-Dimensionen","count":15},{"language":"en","tag":"Invoice dimensions","count":15},{"language":"de","tag":"Lieferungen","count":11},{"language":"en","tag":"Deliveries","count":11},{"language":"de","tag":"Stammdaten","count":10},{"language":"de","tag":"Rechnungen","count":10},{"language":"en","tag":"Master data","count":10},{"language":"en","tag":"Invoices","count":10},{"language":"de","tag":"Projekte","count":9},{"language":"en","tag":"Projects","count":9},{"language":"de","tag":"Erste Schritte","count":5},{"language":"en","tag":"Getting started","count":5},{"language":"de","tag":"Integrationsleitfäden","count":4},{"language":"en","tag":"Integration guides","count":4},{"language":"de","tag":"Lieferanten","count":3},{"language":"de","tag":"Workflows","count":3},{"language":"en","tag":"Suppliers","count":3},{"language":"en","tag":"Workflows","count":3}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"isAtlas":false,"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"en/api-reference/projects-user-assignments","slug":"/en/api-reference/projects-user-assignments","pageMetadata":{"title":"Assign users","openapi":"POST /projects/user-assignments","description":"**Erforderliche Berechtigungen:** `projects:write`, `users:read`, `roles:read`\n\nWeist einer E-Mail eine oder mehrere mandantenweite Rollen zu und vergibt optional Mitgliedschaften auf Projekten und/oder Projektregionen. Der API-Schlüssel muss ein reiner Kunden-Schlüssel sein.\n\n**Bestehender Benutzer** (`status: ASSIGNED`): Die E-Mail gehört bereits zu einem Benutzer des Mandanten (Vergleich ohne Groß-/Kleinschreibung). Alle angegebenen Rollen werden mandantenweit hinzugefügt; bereits vorhandene Rollen bleiben bestehen. Jede Projektmitgliedschaft verwendet die **erste** Rolle als projektbezogene Rolle und ersetzt bei Wiederholung diese Rolle. Regionsmitgliedschaften werden angelegt; bestehende Regionszeilen bleiben unverändert. `projects` und `regions` dürfen entfallen.\n\n**Unbekannte E-Mail** (`status: INVITED`): Es wird mindestens ein Projekt oder eine Region benötigt. Pro Projekt wird eine ausstehende Einladung mit der ersten Rolle gespeichert, pro Region eine Einladung ohne Rolle. Weitere Rollen werden geprüft und in `role_ids` zurückgegeben. Mandantenweit gespeichert werden sie, sobald die E-Mail zu einem Benutzer gehört. Wiederholen Sie die Anfrage danach, um alle mandantenweiten Rollen zu setzen.\n\n**Adressierung:** Jeder Projekteintrag enthält genau eines von `project_number` oder `external_id`. `project_number` ist nur je Buchungskreis eindeutig; ist sie im Mandanten mehrfach vergeben, antwortet die API mit HTTP 409 — verwenden Sie dann `external_id`. Regionen werden über `region_number` adressiert.\n\n**Upsert:** Eine Wiederholung aktualisiert die bestehenden Zeilen. Ausgelassene Projekte, Regionen und Rollen bleiben unverändert. Alle Schreibvorgänge einer Anfrage laufen in einer Mutation und werden gemeinsam übernommen oder gemeinsam verworfen.\n\nLeerzeichen an `email`, Rollentiteln und Kennungen werden entfernt. Rollentitel müssen exakt einer bestehenden Rolle des Mandanten entsprechen.\n","href":"/en/api-reference/projects-user-assignments"},"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: [_jsx(_components.strong, {\n children: \"Erforderliche Berechtigungen:\"\n }), \" \", _jsx(_components.code, {\n children: \"projects:write\"\n }), \", \", _jsx(_components.code, {\n children: \"users:read\"\n }), \", \", _jsx(_components.code, {\n children: \"roles:read\"\n })]\n }), \"\\n\", _jsx(_components.p, {\n children: \"Weist einer E-Mail eine oder mehrere mandantenweite Rollen zu und vergibt optional Mitgliedschaften auf Projekten und/oder Projektregionen. Der API-Schlüssel muss ein reiner Kunden-Schlüssel sein.\"\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Bestehender Benutzer\"\n }), \" (\", _jsx(_components.code, {\n children: \"status: ASSIGNED\"\n }), \"): Die E-Mail gehört bereits zu einem Benutzer des Mandanten (Vergleich ohne Groß-/Kleinschreibung). Alle angegebenen Rollen werden mandantenweit hinzugefügt; bereits vorhandene Rollen bleiben bestehen. Jede Projektmitgliedschaft verwendet die \", _jsx(_components.strong, {\n children: \"erste\"\n }), \" Rolle als projektbezogene Rolle und ersetzt bei Wiederholung diese Rolle. Regionsmitgliedschaften werden angelegt; bestehende Regionszeilen bleiben unverändert. \", _jsx(_components.code, {\n children: \"projects\"\n }), \" und \", _jsx(_components.code, {\n children: \"regions\"\n }), \" dürfen entfallen.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Unbekannte E-Mail\"\n }), \" (\", _jsx(_components.code, {\n children: \"status: INVITED\"\n }), \"): Es wird mindestens ein Projekt oder eine Region benötigt. Pro Projekt wird eine ausstehende Einladung mit der ersten Rolle gespeichert, pro Region eine Einladung ohne Rolle. Weitere Rollen werden geprüft und in \", _jsx(_components.code, {\n children: \"role_ids\"\n }), \" zurückgegeben. Mandantenweit gespeichert werden sie, sobald die E-Mail zu einem Benutzer gehört. Wiederholen Sie die Anfrage danach, um alle mandantenweiten Rollen zu setzen.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Adressierung:\"\n }), \" Jeder Projekteintrag enthält genau eines von \", _jsx(_components.code, {\n children: \"project_number\"\n }), \" oder \", _jsx(_components.code, {\n children: \"external_id\"\n }), \". \", _jsx(_components.code, {\n children: \"project_number\"\n }), \" ist nur je Buchungskreis eindeutig; ist sie im Mandanten mehrfach vergeben, antwortet die API mit HTTP 409 — verwenden Sie dann \", _jsx(_components.code, {\n children: \"external_id\"\n }), \". Regionen werden über \", _jsx(_components.code, {\n children: \"region_number\"\n }), \" adressiert.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Upsert:\"\n }), \" Eine Wiederholung aktualisiert die bestehenden Zeilen. Ausgelassene Projekte, Regionen und Rollen bleiben unverändert. Alle Schreibvorgänge einer Anfrage laufen in einer Mutation und werden gemeinsam übernommen oder gemeinsam verworfen.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Leerzeichen an \", _jsx(_components.code, {\n children: \"email\"\n }), \", Rollentiteln und Kennungen werden entfernt. Rollentitel müssen exakt einer bestehenden Rolle des Mandanten entsprechen.\"]\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,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={code:`code`,li:`li`,p:`p`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{Heading,Table}=_components;if(!Heading)_missingMdxReference(`Heading`,true);if(!Table)_missingMdxReference(`Table`,true);return _jsxs(_Fragment,{children:[_jsx(Heading,{level:`2`,id:`overview`,children:`Overview`}),`\n`,_jsx(_components.p,{children:`Assigns tenant-wide roles to an email and optionally grants project and region memberships. Repeating the request updates the existing rows. Assignments left out of the request stay as they are.`}),`\n`,_jsxs(_components.p,{children:[`The API key must be a `,_jsx(_components.strong,{children:`customer API key`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`permissions`,children:`Permissions`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Scope`}),_jsx(_components.th,{children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`projects:write`})}),_jsx(_components.td,{children:`Create and update projects`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`users:read`})}),_jsx(_components.td,{children:`Read user data`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`roles:read`})}),_jsx(_components.td,{children:`Read role data`})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`behavior`,children:`Behavior`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`Role titles must match an existing tenant role exactly. The `,_jsx(_components.strong,{children:`first`}),` role is the project-scoped role on every membership and every project invite.`]}),`\n`,_jsxs(_components.li,{children:[`When the email already belongs to a tenant user, every listed role is added tenant-wide (`,_jsx(_components.code,{children:`ASSIGNED`}),`). Roles, projects, and regions omitted from the request stay as they are. Sending the request again replaces the project-scoped role with the first role of the new request.`]}),`\n`,_jsxs(_components.li,{children:[`When the email is unknown, `,_jsx(_components.code,{children:`projects`}),` or `,_jsx(_components.code,{children:`regions`}),` is required (`,_jsx(_components.code,{children:`INVITED`}),`). The project invite stores the first role; region invites carry no role. Further roles are validated and returned in `,_jsx(_components.code,{children:`role_ids`}),`. Send the request again after the user exists to apply every tenant-wide role.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`project_number`}),` is unique per legal entity. If more than one project in the tenant uses it, the API responds with `,_jsx(_components.strong,{children:`409`}),`; use `,_jsx(_components.code,{children:`external_id`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`Each project entry contains exactly one of `,_jsx(_components.code,{children:`project_number`}),` or `,_jsx(_components.code,{children:`external_id`}),`. The same project or region must not appear twice, including when two identifiers resolve to the same target.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`response-codes`,children:`Response codes`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Code`}),_jsx(_components.th,{children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`201`})}),_jsx(_components.td,{children:`Assignment or invites stored`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`400`})}),_jsx(_components.td,{children:`Invalid request`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`401`})}),_jsx(_components.td,{children:`Unauthorized`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`403`})}),_jsx(_components.td,{children:`Missing permission or not a customer API key`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`404`})}),_jsx(_components.td,{children:`Project, region, or role not found`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`409`})}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`project_number`}),` is ambiguous in the tenant`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`500`})}),_jsx(_components.td,{children:`Assignment or invites could not be stored`})]})]})]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Assign users","openapi":"POST /projects/user-assignments","description":"**Erforderliche Berechtigungen:** `projects:write`, `users:read`, `roles:read`\n\nWeist einer E-Mail eine oder mehrere mandantenweite Rollen zu und vergibt optional Mitgliedschaften auf Projekten und/oder Projektregionen. Der API-Schlüssel muss ein reiner Kunden-Schlüssel sein.\n\n**Bestehender Benutzer** (`status: ASSIGNED`): Die E-Mail gehört bereits zu einem Benutzer des Mandanten (Vergleich ohne Groß-/Kleinschreibung). Alle angegebenen Rollen werden mandantenweit hinzugefügt; bereits vorhandene Rollen bleiben bestehen. Jede Projektmitgliedschaft verwendet die **erste** Rolle als projektbezogene Rolle und ersetzt bei Wiederholung diese Rolle. Regionsmitgliedschaften werden angelegt; bestehende Regionszeilen bleiben unverändert. `projects` und `regions` dürfen entfallen.\n\n**Unbekannte E-Mail** (`status: INVITED`): Es wird mindestens ein Projekt oder eine Region benötigt. Pro Projekt wird eine ausstehende Einladung mit der ersten Rolle gespeichert, pro Region eine Einladung ohne Rolle. Weitere Rollen werden geprüft und in `role_ids` zurückgegeben. Mandantenweit gespeichert werden sie, sobald die E-Mail zu einem Benutzer gehört. Wiederholen Sie die Anfrage danach, um alle mandantenweiten Rollen zu setzen.\n\n**Adressierung:** Jeder Projekteintrag enthält genau eines von `project_number` oder `external_id`. `project_number` ist nur je Buchungskreis eindeutig; ist sie im Mandanten mehrfach vergeben, antwortet die API mit HTTP 409 — verwenden Sie dann `external_id`. Regionen werden über `region_number` adressiert.\n\n**Upsert:** Eine Wiederholung aktualisiert die bestehenden Zeilen. Ausgelassene Projekte, Regionen und Rollen bleiben unverändert. Alle Schreibvorgänge einer Anfrage laufen in einer Mutation und werden gemeinsam übernommen oder gemeinsam verworfen.\n\nLeerzeichen an `email`, Rollentiteln und Kennungen werden entfernt. Rollentitel müssen exakt einer bestehenden Rolle des Mandanten entsprechen.\n","href":"/en/api-reference/projects-user-assignments"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Overview","slug":"overview","depth":2,"children":[]},{"title":"Permissions","slug":"permissions","depth":2,"children":[]},{"title":"Behavior","slug":"behavior","depth":2,"children":[]},{"title":"Response codes","slug":"response-codes","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"operationId":"assignProjectUser","summary":"Benutzerrollen und Mitgliedschaften zuweisen","description":"**Erforderliche Berechtigungen:** `projects:write`, `users:read`, `roles:read`\n\nWeist einer E-Mail eine oder mehrere mandantenweite Rollen zu und vergibt optional Mitgliedschaften auf Projekten und/oder Projektregionen. Der API-Schlüssel muss ein reiner Kunden-Schlüssel sein.\n\n**Bestehender Benutzer** (`status: ASSIGNED`): Die E-Mail gehört bereits zu einem Benutzer des Mandanten (Vergleich ohne Groß-/Kleinschreibung). Alle angegebenen Rollen werden mandantenweit hinzugefügt; bereits vorhandene Rollen bleiben bestehen. Jede Projektmitgliedschaft verwendet die **erste** Rolle als projektbezogene Rolle und ersetzt bei Wiederholung diese Rolle. Regionsmitgliedschaften werden angelegt; bestehende Regionszeilen bleiben unverändert. `projects` und `regions` dürfen entfallen.\n\n**Unbekannte E-Mail** (`status: INVITED`): Es wird mindestens ein Projekt oder eine Region benötigt. Pro Projekt wird eine ausstehende Einladung mit der ersten Rolle gespeichert, pro Region eine Einladung ohne Rolle. Weitere Rollen werden geprüft und in `role_ids` zurückgegeben. Mandantenweit gespeichert werden sie, sobald die E-Mail zu einem Benutzer gehört. Wiederholen Sie die Anfrage danach, um alle mandantenweiten Rollen zu setzen.\n\n**Adressierung:** Jeder Projekteintrag enthält genau eines von `project_number` oder `external_id`. `project_number` ist nur je Buchungskreis eindeutig; ist sie im Mandanten mehrfach vergeben, antwortet die API mit HTTP 409 — verwenden Sie dann `external_id`. Regionen werden über `region_number` adressiert.\n\n**Upsert:** Eine Wiederholung aktualisiert die bestehenden Zeilen. Ausgelassene Projekte, Regionen und Rollen bleiben unverändert. Alle Schreibvorgänge einer Anfrage laufen in einer Mutation und werden gemeinsam übernommen oder gemeinsam verworfen.\n\nLeerzeichen an `email`, Rollentiteln und Kennungen werden entfernt. Rollentitel müssen exakt einer bestehenden Rolle des Mandanten entsprechen.\n","tags":["Projects"],"security":["396f1e4b-8177-44ff-9cf8-5a9938efad49"],"requestBody":"4385622d-fd50-4ee1-a720-0944288682c3","responses":{"201":"1e7e85c9-d757-493d-aab8-272ecfe69f6c","400":"56a538df-21fa-4e5f-b74b-df25e4833116","401":"ee15989a-ce15-4e17-b120-709ab25361d4","403":"79344ab4-f127-4e8f-9089-50658aff65ee","404":"83976c96-a1a6-42f8-892f-4c838c17da71","409":"66cef1bb-0ba2-4a82-80d3-758b3531e67a","500":"baf0b14c-7b90-4bd7-b3ac-285211ad9214"},"method":"post","type":"path","servers":["91e6503e-dce2-4e57-badc-42232705e766","c41671e9-3515-49e4-a8db-5349c07af4b2"],"path":"/projects/user-assignments","baseUrlOptions":["https://api.comstruct.com/v1","https://api.comstruct.com"],"title":"Benutzerrollen und Mitgliedschaften zuweisen","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["email","roles"],"properties":{"email":{"type":"string","format":"email","description":"E-Mail-Adresse, der die Rollen und Mitgliedschaften zugewiesen werden.","example":"jane.doe@example.com","isRequired":true,"uniqueKey":"email","typeLabel":"string\u003cemail>"},"roles":{"type":"array","minItems":1,"uniqueItems":true,"description":"Titel der mandantenweiten Rollen. Mindestens eine, ohne Duplikate.\nJede Rolle muss im Mandanten existieren. Bei Projekten wird die erste Rolle\nals projektbezogene Rolle verwendet.\n","items":{"type":"string","uniqueKey":"roles.items.[INDEX]","typeLabel":"string"},"example":["MANAGER","CONTROLLER"],"isRequired":true,"uniqueKey":"roles","typeLabel":"string[]"},"projects":{"type":"array","description":"Optionale Projekte. Jeder Eintrag enthält genau eines von `project_number` oder `external_id`.\nDasselbe Projekt darf nicht zweimal vorkommen. Für unbekannte E-Mails ist mindestens\nein Projekt oder eine Region erforderlich.\n","items":{"type":"object","description":"Adressiert genau ein Projekt über `project_number` oder `external_id`.","properties":{"project_number":{"type":"string","description":"Projektnummer, eindeutig je Buchungskreis. Schließt `external_id` aus.\nIst die Nummer im Mandanten mehrfach vergeben, antwortet die API mit HTTP 409.\n","example":"PRJ-0001","uniqueKey":"projects.items.[INDEX].project_number","typeLabel":"string"},"external_id":{"type":"string","description":"Externe Projekt-ID des Quellsystems, eindeutig je Mandant. Schließt `project_number` aus.","example":"ERP-4711","uniqueKey":"projects.items.[INDEX].external_id","typeLabel":"string"}},"uniqueKey":"projects.items.[INDEX]","typeLabel":"object"},"uniqueKey":"projects","typeLabel":"object[]"},"regions":{"type":"array","description":"Optionale Projektregionen, adressiert über `region_number`. Duplikate werden abgelehnt.\nBestehende Benutzer erhalten die Mitgliedschaft sofort; unbekannte E-Mails eine ausstehende Einladung.\n","items":{"type":"object","required":["region_number"],"properties":{"region_number":{"type":"string","description":"Projektregionsnummer, eindeutig je Mandant.","example":"REG-001","isRequired":true,"uniqueKey":"regions.items.[INDEX].region_number","typeLabel":"string"}},"uniqueKey":"regions.items.[INDEX]","typeLabel":"object"},"uniqueKey":"regions","typeLabel":"object[]"}},"uniqueKey":"","typeLabel":"object"},"examples":{"project_by_number":{"title":"project_by_number","value":{"email":"jane.doe@example.com","roles":["MANAGER"],"projects":[{"project_number":"PRJ-0001"}]}},"project_and_region":{"title":"project_and_region","value":{"email":"jane.doe@example.com","roles":["MANAGER","CONTROLLER"],"projects":[{"external_id":"ERP-4711"}],"regions":[{"region_number":"REG-001"}]}},"roles_only":{"title":"roles_only","value":{"email":"jane.doe@example.com","roles":["MANAGER"]}}},"exampleType":"examples"}},"exampleType":"examples"},"responses":{"1e7e85c9-d757-493d-aab8-272ecfe69f6c":{"description":"Zuweisung oder Einladungen gespeichert","content":{"application/json":{"schema":{"type":"object","required":["success","status","email","role_ids","project_ids","region_ids"],"properties":{"success":{"type":"boolean","description":"Ob die Zuweisung gespeichert wurde","example":true,"isRequired":true,"uniqueKey":"success","typeLabel":"boolean"},"status":{"type":"string","enum":["ASSIGNED","INVITED"],"description":"`ASSIGNED`, wenn die E-Mail bereits zu einem Benutzer des Mandanten gehört.\n`INVITED`, wenn stattdessen ausstehende Projekt- und/oder Regionseinladungen gespeichert wurden.\n","example":"ASSIGNED","isRequired":true,"uniqueKey":"status","typeLabel":"enum\u003cstring>"},"email":{"type":"string","format":"email","description":"E-Mail, für die die Zuweisung gespeichert wurde","example":"jane.doe@example.com","isRequired":true,"uniqueKey":"email","typeLabel":"string\u003cemail>"},"role_ids":{"type":"array","description":"UUIDs der aufgelösten mandantenweiten Rollen, in der Reihenfolge der Anfrage","items":{"type":"string","format":"uuid","uniqueKey":"role_ids.items.[INDEX]","typeLabel":"string\u003cuuid>"},"example":["44444444-4444-4444-8444-444444444444"],"isRequired":true,"uniqueKey":"role_ids","typeLabel":"string\u003cuuid>[]"},"project_ids":{"type":"array","description":"UUIDs der aufgelösten Projekte. Leer, wenn nur Rollen und/oder Regionen zugewiesen wurden.","items":{"type":"string","format":"uuid","uniqueKey":"project_ids.items.[INDEX]","typeLabel":"string\u003cuuid>"},"example":["33333333-3333-4333-8333-333333333333"],"isRequired":true,"uniqueKey":"project_ids","typeLabel":"string\u003cuuid>[]"},"region_ids":{"type":"array","description":"UUIDs der aufgelösten Projektregionen. Leer, wenn keine Regionen angefragt wurden.","items":{"type":"string","format":"uuid","uniqueKey":"region_ids.items.[INDEX]","typeLabel":"string\u003cuuid>"},"example":["55555555-5555-4555-8555-555555555555"],"isRequired":true,"uniqueKey":"region_ids","typeLabel":"string\u003cuuid>[]"}},"uniqueKey":"","typeLabel":"object"},"examples":{"assigned":{"title":"assigned","value":{"success":true,"status":"ASSIGNED","email":"jane.doe@example.com","role_ids":["44444444-4444-4444-8444-444444444444"],"project_ids":["33333333-3333-4333-8333-333333333333"],"region_ids":[]}},"invited":{"title":"invited","value":{"success":true,"status":"INVITED","email":"jane.doe@example.com","role_ids":["44444444-4444-4444-8444-444444444444"],"project_ids":["33333333-3333-4333-8333-333333333333"],"region_ids":["55555555-5555-4555-8555-555555555555"]}}},"exampleType":"examples"}},"exampleType":"examples"},"56a538df-21fa-4e5f-b74b-df25e4833116":{"description":"Ungültige E-Mail, leere oder doppelte Rollen, doppelte Projekte oder Regionen,\nein Eintrag mit beiden oder ohne `project_number` und `external_id`, oder\n`projects` und `regions` fehlen für eine E-Mail, die keinem Benutzer gehört.\n","content":{"application/json":{"schema":{"oneOf":[{"type":"object","required":["error"],"example":{"error":"Validation failed","message":"The provided data did not pass validation checks"},"properties":{"error":{"type":"string","description":"Fehlermeldung, die beschreibt, was schiefgelaufen ist","isRequired":true,"uniqueKey":"oneOf.0.error","typeLabel":"string"},"message":{"type":"string","description":"Zusätzliche Fehlerdetails oder benutzerfreundliche Nachricht","uniqueKey":"oneOf.0.message","typeLabel":"string"},"success":{"type":"boolean","description":"Zeigt Fehlschlag an, wenn in Fehlerantworten vorhanden","uniqueKey":"oneOf.0.success","typeLabel":"boolean"}},"uniqueKey":"oneOf.0","typeLabel":"object"},{"type":"object","required":["message"],"example":{"error":"Validation failed","message":"The provided data did not pass validation checks"},"properties":{"message":{"type":"string","description":"Zusätzliche Fehlerdetails oder benutzerfreundliche Nachricht","isRequired":true,"uniqueKey":"oneOf.1.message","typeLabel":"string"},"error":{"type":"string","description":"Fehlermeldung, die beschreibt, was schiefgelaufen ist","uniqueKey":"oneOf.1.error","typeLabel":"string"},"success":{"type":"boolean","description":"Zeigt Fehlschlag an, wenn in Fehlerantworten vorhanden","uniqueKey":"oneOf.1.success","typeLabel":"boolean"}},"uniqueKey":"oneOf.1","typeLabel":"object"},{"type":"object","required":["success"],"example":{"error":"Validation failed","message":"The provided data did not pass validation checks"},"properties":{"success":{"type":"boolean","description":"Zeigt Fehlschlag an, wenn in Fehlerantworten vorhanden","isRequired":true,"uniqueKey":"oneOf.2.success","typeLabel":"boolean"},"error":{"type":"string","description":"Fehlermeldung, die beschreibt, was schiefgelaufen ist","uniqueKey":"oneOf.2.error","typeLabel":"string"},"message":{"type":"string","description":"Zusätzliche Fehlerdetails oder benutzerfreundliche Nachricht","uniqueKey":"oneOf.2.message","typeLabel":"string"}},"uniqueKey":"oneOf.2","typeLabel":"object"}],"uniqueKey":"","typeLabel":"object"},"example":{"message":"Provide exactly one of project_number or external_id","statusCode":400,"success":false},"examples":{"Example":{"title":"Example","value":{"message":"Provide exactly one of project_number or external_id","statusCode":400,"success":false}}},"exampleType":"examples"}},"exampleType":"examples"},"ee15989a-ce15-4e17-b120-709ab25361d4":{"description":"Nicht autorisiert — fehlender oder ungültiger API-Schlüssel","content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}},"79344ab4-f127-4e8f-9089-50658aff65ee":{"description":"Verboten — fehlende Berechtigung oder kein reiner Kunden-API-Schlüssel","content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}},"83976c96-a1a6-42f8-892f-4c838c17da71":{"description":"Projekt, Region oder Rolle existiert im Mandanten nicht","content":{"application/json":{"schema":{"oneOf":[{"type":"object","required":["error"],"example":{"error":"Validation failed","message":"The provided data did not pass validation checks"},"properties":{"error":{"type":"string","description":"Fehlermeldung, die beschreibt, was schiefgelaufen ist","isRequired":true,"uniqueKey":"oneOf.0.error","typeLabel":"string"},"message":{"type":"string","description":"Zusätzliche Fehlerdetails oder benutzerfreundliche Nachricht","uniqueKey":"oneOf.0.message","typeLabel":"string"},"success":{"type":"boolean","description":"Zeigt Fehlschlag an, wenn in Fehlerantworten vorhanden","uniqueKey":"oneOf.0.success","typeLabel":"boolean"}},"uniqueKey":"oneOf.0","typeLabel":"object"},{"type":"object","required":["message"],"example":{"error":"Validation failed","message":"The provided data did not pass validation checks"},"properties":{"message":{"type":"string","description":"Zusätzliche Fehlerdetails oder benutzerfreundliche Nachricht","isRequired":true,"uniqueKey":"oneOf.1.message","typeLabel":"string"},"error":{"type":"string","description":"Fehlermeldung, die beschreibt, was schiefgelaufen ist","uniqueKey":"oneOf.1.error","typeLabel":"string"},"success":{"type":"boolean","description":"Zeigt Fehlschlag an, wenn in Fehlerantworten vorhanden","uniqueKey":"oneOf.1.success","typeLabel":"boolean"}},"uniqueKey":"oneOf.1","typeLabel":"object"},{"type":"object","required":["success"],"example":{"error":"Validation failed","message":"The provided data did not pass validation checks"},"properties":{"success":{"type":"boolean","description":"Zeigt Fehlschlag an, wenn in Fehlerantworten vorhanden","isRequired":true,"uniqueKey":"oneOf.2.success","typeLabel":"boolean"},"error":{"type":"string","description":"Fehlermeldung, die beschreibt, was schiefgelaufen ist","uniqueKey":"oneOf.2.error","typeLabel":"string"},"message":{"type":"string","description":"Zusätzliche Fehlerdetails oder benutzerfreundliche Nachricht","uniqueKey":"oneOf.2.message","typeLabel":"string"}},"uniqueKey":"oneOf.2","typeLabel":"object"}],"uniqueKey":"","typeLabel":"object"},"example":{"message":"Role(s) not found: MANAGER","statusCode":404,"success":false},"examples":{"Example":{"title":"Example","value":{"message":"Role(s) not found: MANAGER","statusCode":404,"success":false}}},"exampleType":"examples"}},"exampleType":"examples"},"66cef1bb-0ba2-4a82-80d3-758b3531e67a":{"description":"Die `project_number` wird von mehr als einem Buchungskreis des Mandanten verwendet\nund ist daher mehrdeutig. Adressieren Sie das Projekt über `external_id`.\n","content":{"application/json":{"schema":{"oneOf":[{"type":"object","required":["error"],"example":{"error":"Validation failed","message":"The provided data did not pass validation checks"},"properties":{"error":{"type":"string","description":"Fehlermeldung, die beschreibt, was schiefgelaufen ist","isRequired":true,"uniqueKey":"oneOf.0.error","typeLabel":"string"},"message":{"type":"string","description":"Zusätzliche Fehlerdetails oder benutzerfreundliche Nachricht","uniqueKey":"oneOf.0.message","typeLabel":"string"},"success":{"type":"boolean","description":"Zeigt Fehlschlag an, wenn in Fehlerantworten vorhanden","uniqueKey":"oneOf.0.success","typeLabel":"boolean"}},"uniqueKey":"oneOf.0","typeLabel":"object"},{"type":"object","required":["message"],"example":{"error":"Validation failed","message":"The provided data did not pass validation checks"},"properties":{"message":{"type":"string","description":"Zusätzliche Fehlerdetails oder benutzerfreundliche Nachricht","isRequired":true,"uniqueKey":"oneOf.1.message","typeLabel":"string"},"error":{"type":"string","description":"Fehlermeldung, die beschreibt, was schiefgelaufen ist","uniqueKey":"oneOf.1.error","typeLabel":"string"},"success":{"type":"boolean","description":"Zeigt Fehlschlag an, wenn in Fehlerantworten vorhanden","uniqueKey":"oneOf.1.success","typeLabel":"boolean"}},"uniqueKey":"oneOf.1","typeLabel":"object"},{"type":"object","required":["success"],"example":{"error":"Validation failed","message":"The provided data did not pass validation checks"},"properties":{"success":{"type":"boolean","description":"Zeigt Fehlschlag an, wenn in Fehlerantworten vorhanden","isRequired":true,"uniqueKey":"oneOf.2.success","typeLabel":"boolean"},"error":{"type":"string","description":"Fehlermeldung, die beschreibt, was schiefgelaufen ist","uniqueKey":"oneOf.2.error","typeLabel":"string"},"message":{"type":"string","description":"Zusätzliche Fehlerdetails oder benutzerfreundliche Nachricht","uniqueKey":"oneOf.2.message","typeLabel":"string"}},"uniqueKey":"oneOf.2","typeLabel":"object"}],"uniqueKey":"","typeLabel":"object"},"example":{"message":"project_number PRJ-0001 is used by 2 projects of this tenant, use external_id instead","statusCode":409,"success":false},"examples":{"Example":{"title":"Example","value":{"message":"project_number PRJ-0001 is used by 2 projects of this tenant, use external_id instead","statusCode":409,"success":false}}},"exampleType":"examples"}},"exampleType":"examples"},"baf0b14c-7b90-4bd7-b3ac-285211ad9214":{"description":"Die Zuweisung oder die Einladungen konnten nicht gespeichert werden","content":{"application/json":{"schema":{"oneOf":[{"type":"object","required":["error"],"example":{"error":"Validation failed","message":"The provided data did not pass validation checks"},"properties":{"error":{"type":"string","description":"Fehlermeldung, die beschreibt, was schiefgelaufen ist","isRequired":true,"uniqueKey":"oneOf.0.error","typeLabel":"string"},"message":{"type":"string","description":"Zusätzliche Fehlerdetails oder benutzerfreundliche Nachricht","uniqueKey":"oneOf.0.message","typeLabel":"string"},"success":{"type":"boolean","description":"Zeigt Fehlschlag an, wenn in Fehlerantworten vorhanden","uniqueKey":"oneOf.0.success","typeLabel":"boolean"}},"uniqueKey":"oneOf.0","typeLabel":"object"},{"type":"object","required":["message"],"example":{"error":"Validation failed","message":"The provided data did not pass validation checks"},"properties":{"message":{"type":"string","description":"Zusätzliche Fehlerdetails oder benutzerfreundliche Nachricht","isRequired":true,"uniqueKey":"oneOf.1.message","typeLabel":"string"},"error":{"type":"string","description":"Fehlermeldung, die beschreibt, was schiefgelaufen ist","uniqueKey":"oneOf.1.error","typeLabel":"string"},"success":{"type":"boolean","description":"Zeigt Fehlschlag an, wenn in Fehlerantworten vorhanden","uniqueKey":"oneOf.1.success","typeLabel":"boolean"}},"uniqueKey":"oneOf.1","typeLabel":"object"},{"type":"object","required":["success"],"example":{"error":"Validation failed","message":"The provided data did not pass validation checks"},"properties":{"success":{"type":"boolean","description":"Zeigt Fehlschlag an, wenn in Fehlerantworten vorhanden","isRequired":true,"uniqueKey":"oneOf.2.success","typeLabel":"boolean"},"error":{"type":"string","description":"Fehlermeldung, die beschreibt, was schiefgelaufen ist","uniqueKey":"oneOf.2.error","typeLabel":"string"},"message":{"type":"string","description":"Zusätzliche Fehlerdetails oder benutzerfreundliche Nachricht","uniqueKey":"oneOf.2.message","typeLabel":"string"}},"uniqueKey":"oneOf.2","typeLabel":"object"}],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"Validation failed","message":"The provided data did not pass validation checks"}}},"exampleType":"generated"}},"exampleType":"generated"}},"security":{"396f1e4b-8177-44ff-9cf8-5a9938efad49":{"ApiKey":{"type":"apiKey","in":"header","name":"X-API-Key","description":"API-Schlüssel zur Authentifizierung. Kontaktieren Sie Ihren Customer Success Manager, um einen API-Schlüssel zu erhalten.\n\nJeder Endpunkt erfordert spezifische Berechtigungen (Scopes); die erforderlichen Scopes werden pro Endpunkt angezeigt.\n","scopes":["projects:write","users:read","roles:read"],"schemeName":"ApiKey"}}},"servers":{"91e6503e-dce2-4e57-badc-42232705e766":{"url":"https://api.comstruct.com/v1","description":"Haupt-API-Endpunkte (erfordert API-Schlüssel-Authentifizierung)","variables":{}},"c41671e9-3515-49e4-a8db-5349c07af4b2":{"url":"https://api.comstruct.com","description":"Basisserver für Kalender- und IDS-Endpunkte (andere Authentifizierung)","variables":{}}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"apiKey","in":"header","name":"X-API-Key","description":"API-Schlüssel zur Authentifizierung. Kontaktieren Sie Ihren Customer Success Manager, um einen API-Schlüssel zu erhalten.\n\nJeder Endpunkt erfordert spezifische Berechtigungen (Scopes); die erforderlichen Scopes werden pro Endpunkt angezeigt.\n","scopes":["projects:write","users:read","roles:read"],"schemeName":"ApiKey"},"schema":{"title":"X-API-Key","type":"string","description":"API-Schlüssel zur Authentifizierung. Kontaktieren Sie Ihren Customer Success Manager, um einen API-Schlüssel zu erhalten.\n\nJeder Endpunkt erfordert spezifische Berechtigungen (Scopes); die erforderlichen Scopes werden pro Endpunkt angezeigt.\n","isRequired":true,"typeLabel":"string","deprecated":false},"schemeName":"ApiKey","name":"X-API-Key"}],"title":"ApiKey"}]},"originalFileLocation":"api-reference/openapi.yaml"},"subdomain":"comstruct","siteName":"comstruct API Dokumentation","title":"Assign users - comstruct API Dokumentation","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{"de":{"href":"/api-reference/projects-user-assignments","matchLevel":1},"en":{"href":"/en/api-reference/projects-user-assignments","matchLevel":0}}},"lastModified":"2026-10-27T09:54:44.813Z","originalFileLocation":"en/api-reference/projects-user-assignments.mdx","locale":"en"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Erforderliche Berechtigungen: projects:write, users:read, roles:read Weist einer E-Mail eine oder mehrere mandantenweite Rollen zu und vergibt optional Mitgliedschaften auf Projekten und/oder Projektregionen. Der API-Schlüssel muss ein reiner Kunden-Schlüssel sein. Bestehender Benutzer (status: ASSIGNED): Die E-Mail gehört bereits zu einem Benutzer des Mandanten (Vergleich ohne Groß-/Kleinschreibung). Alle angegebenen Rollen werden mandantenweit hinzugefügt; bereits vorhandene Rollen bleiben bestehen. Jede Projektmitgliedschaft verwendet die erste Rolle als projektbezogene Rolle und ersetzt bei Wiederholung diese Rolle. Regionsmitgliedschaften werden angelegt; bestehende Regionszeilen bleiben unverändert. projects und regions dürfen entfallen. Unbekannte E-Mail (status: INVITED): Es wird mindestens ein Projekt oder eine Region benötigt. Pro Projekt wird eine ausstehende Einladung mit der ersten Rolle gespeichert, pro Region eine Einladung ohne Rolle. Weitere Rollen werden geprüft und in role_ids zurückgegeben. Mandantenweit gespeichert werden sie, sobald die E-Mail zu einem Benutzer gehört. Wiederholen Sie die Anfrage danach, um alle mandantenweiten Rollen zu setzen. Adressierung: Jeder Projekteintrag enthält genau eines von project_number oder external_id. project_number ist nur je Buchungskreis eindeutig; ist sie im Mandanten mehrfach vergeben, antwortet die API mit HTTP 409 — verwenden Sie dann external_id. Regionen werden über region_number adressiert. Upsert: Eine Wiederholung aktualisiert die bestehenden Zeilen. Ausgelassene Projekte, Regionen und Rollen bleiben unverändert. Alle Schreibvorgänge einer Anfrage laufen in einer Mutation und werden gemeinsam übernommen oder gemeinsam verworfen. Leerzeichen an email, Rollentiteln und Kennungen werden entfernt. Rollentitel müssen exakt einer bestehenden Rolle des Mandanten entsprechen.\">\u003cmeta data-mint-head name=\"application-name\" content=\"comstruct API Dokumentation\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/comstruct/fBUgIQk4CV_VpIlc/_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/comstruct/fBUgIQk4CV_VpIlc/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/comstruct/fBUgIQk4CV_VpIlc/_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/comstruct/fBUgIQk4CV_VpIlc/_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/comstruct/fBUgIQk4CV_VpIlc/_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/comstruct/fBUgIQk4CV_VpIlc/_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/comstruct/fBUgIQk4CV_VpIlc/_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/comstruct/fBUgIQk4CV_VpIlc/_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/comstruct/fBUgIQk4CV_VpIlc/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Assign users - comstruct API Dokumentation\">\u003cmeta data-mint-head property=\"og:description\" content=\"Erforderliche Berechtigungen: projects:write, users:read, roles:read Weist einer E-Mail eine oder mehrere mandantenweite Rollen zu und vergibt optional Mitgliedschaften auf Projekten und/oder Projektregionen. Der API-Schlüssel muss ein reiner Kunden-Schlüssel sein. Bestehender Benutzer (status: ASSIGNED): Die E-Mail gehört bereits zu einem Benutzer des Mandanten (Vergleich ohne Groß-/Kleinschreibung). Alle angegebenen Rollen werden mandantenweit hinzugefügt; bereits vorhandene Rollen bleiben bestehen. Jede Projektmitgliedschaft verwendet die erste Rolle als projektbezogene Rolle und ersetzt bei Wiederholung diese Rolle. Regionsmitgliedschaften werden angelegt; bestehende Regionszeilen bleiben unverändert. projects und regions dürfen entfallen. Unbekannte E-Mail (status: INVITED): Es wird mindestens ein Projekt oder eine Region benötigt. Pro Projekt wird eine ausstehende Einladung mit der ersten Rolle gespeichert, pro Region eine Einladung ohne Rolle. Weitere Rollen werden geprüft und in role_ids zurückgegeben. Mandantenweit gespeichert werden sie, sobald die E-Mail zu einem Benutzer gehört. Wiederholen Sie die Anfrage danach, um alle mandantenweiten Rollen zu setzen. Adressierung: Jeder Projekteintrag enthält genau eines von project_number oder external_id. project_number ist nur je Buchungskreis eindeutig; ist sie im Mandanten mehrfach vergeben, antwortet die API mit HTTP 409 — verwenden Sie dann external_id. Regionen werden über region_number adressiert. Upsert: Eine Wiederholung aktualisiert die bestehenden Zeilen. Ausgelassene Projekte, Regionen und Rollen bleiben unverändert. Alle Schreibvorgänge einer Anfrage laufen in einer Mutation und werden gemeinsam übernommen oder gemeinsam verworfen. Leerzeichen an email, Rollentiteln und Kennungen werden entfernt. Rollentitel müssen exakt einer bestehenden Rolle des Mandanten entsprechen.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"comstruct API Dokumentation\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://developer.comstruct.com/en/api-reference/projects-user-assignments\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://comstruct.mintlify.app/_mintlify/api/og/v2?division=Projects\u0026amp;title=Assign+users\u0026amp;description=**Erforderliche+Berechtigungen%3A**+%60projects%3Awrite%60%2C+%60users%3Aread%60%2C+%60roles%3Aread%60%0A%0AWeist+einer+E-Mail+eine+oder+mehrere+mandantenweite+Rollen+zu+und+vergibt+option\u0026amp;theme=c01e2dad7dfa9b44db77ec96\u0026amp;signature=5beefc39c7fd36eac275b13e144761cb1d493b124e310fc324e29e365283076a\">\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=\"Assign users - comstruct API Dokumentation\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Erforderliche Berechtigungen: projects:write, users:read, roles:read Weist einer E-Mail eine oder mehrere mandantenweite Rollen zu und vergibt optional Mitgliedschaften auf Projekten und/oder Projektregionen. Der API-Schlüssel muss ein reiner Kunden-Schlüssel sein. Bestehender Benutzer (status: ASSIGNED): Die E-Mail gehört bereits zu einem Benutzer des Mandanten (Vergleich ohne Groß-/Kleinschreibung). Alle angegebenen Rollen werden mandantenweit hinzugefügt; bereits vorhandene Rollen bleiben bestehen. Jede Projektmitgliedschaft verwendet die erste Rolle als projektbezogene Rolle und ersetzt bei Wiederholung diese Rolle. Regionsmitgliedschaften werden angelegt; bestehende Regionszeilen bleiben unverändert. projects und regions dürfen entfallen. Unbekannte E-Mail (status: INVITED): Es wird mindestens ein Projekt oder eine Region benötigt. Pro Projekt wird eine ausstehende Einladung mit der ersten Rolle gespeichert, pro Region eine Einladung ohne Rolle. Weitere Rollen werden geprüft und in role_ids zurückgegeben. Mandantenweit gespeichert werden sie, sobald die E-Mail zu einem Benutzer gehört. Wiederholen Sie die Anfrage danach, um alle mandantenweiten Rollen zu setzen. Adressierung: Jeder Projekteintrag enthält genau eines von project_number oder external_id. project_number ist nur je Buchungskreis eindeutig; ist sie im Mandanten mehrfach vergeben, antwortet die API mit HTTP 409 — verwenden Sie dann external_id. Regionen werden über region_number adressiert. Upsert: Eine Wiederholung aktualisiert die bestehenden Zeilen. Ausgelassene Projekte, Regionen und Rollen bleiben unverändert. Alle Schreibvorgänge einer Anfrage laufen in einer Mutation und werden gemeinsam übernommen oder gemeinsam verworfen. Leerzeichen an email, Rollentiteln und Kennungen werden entfernt. Rollentitel müssen exakt einer bestehenden Rolle des Mandanten entsprechen.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://comstruct.mintlify.app/_mintlify/api/og/v2?division=Projects\u0026amp;title=Assign+users\u0026amp;description=**Erforderliche+Berechtigungen%3A**+%60projects%3Awrite%60%2C+%60users%3Aread%60%2C+%60roles%3Aread%60%0A%0AWeist+einer+E-Mail+eine+oder+mehrere+mandantenweite+Rollen+zu+und+vergibt+option\u0026amp;theme=c01e2dad7dfa9b44db77ec96\u0026amp;signature=5beefc39c7fd36eac275b13e144761cb1d493b124e310fc324e29e365283076a\">\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/comstruct/fBUgIQk4CV_VpIlc/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"comstruct API Dokumentation\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#2F6879\">\u003clink data-mint-head rel=\"canonical\" href=\"https://developer.comstruct.com/en/api-reference/projects-user-assignments\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/en/api-reference/projects-user-assignments.md\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"en\" href=\"https://developer.comstruct.com/en/api-reference/projects-user-assignments\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"de\" href=\"https://developer.comstruct.com/api-reference/projects-user-assignments\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"x-default\" href=\"https://developer.comstruct.com/api-reference/projects-user-assignments\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://developer.comstruct.com/#organization\",\"name\":\"comstruct API Dokumentation\",\"url\":\"https://developer.comstruct.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/comstruct/Jpsyju8lznqRSEZJ/logo/light.svg?fit=max\u0026auto=format\u0026n=Jpsyju8lznqRSEZJ\u0026q=85\u0026s=acbbee3c044994a3e7752740782d923f\"}},{\"@type\":\"WebSite\",\"@id\":\"https://developer.comstruct.com#website\",\"name\":\"comstruct API Dokumentation\",\"url\":\"https://developer.comstruct.com\",\"publisher\":{\"@id\":\"https://developer.comstruct.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://developer.comstruct.com/en/api-reference/projects-user-assignments#webpage\",\"url\":\"https://developer.comstruct.com/en/api-reference/projects-user-assignments\",\"name\":\"Assign users\",\"description\":\"Erforderliche Berechtigungen: projects:write, users:read, roles:read Weist einer E-Mail eine oder mehrere mandantenweite Rollen zu und vergibt optional Mitgliedschaften auf Projekten und/oder Projektregionen. Der API-Schlüssel muss ein reiner Kunden-Schlüssel sein. Bestehender Benutzer (status: ASSIGNED): Die E-Mail gehört bereits zu einem Benutzer des Mandanten (Vergleich ohne Groß-/Kleinschreibung). Alle angegebenen Rollen werden mandantenweit hinzugefügt; bereits vorhandene Rollen bleiben bestehen. Jede Projektmitgliedschaft verwendet die erste Rolle als projektbezogene Rolle und ersetzt bei Wiederholung diese Rolle. Regionsmitgliedschaften werden angelegt; bestehende Regionszeilen bleiben unverändert. projects und regions dürfen entfallen. Unbekannte E-Mail (status: INVITED): Es wird mindestens ein Projekt oder eine Region benötigt. Pro Projekt wird eine ausstehende Einladung mit der ersten Rolle gespeichert, pro Region eine Einladung ohne Rolle. Weitere Rollen werden geprüft und in role_ids zurückgegeben. Mandantenweit gespeichert werden sie, sobald die E-Mail zu einem Benutzer gehört. Wiederholen Sie die Anfrage danach, um alle mandantenweiten Rollen zu setzen. Adressierung: Jeder Projekteintrag enthält genau eines von project_number oder external_id. project_number ist nur je Buchungskreis eindeutig; ist sie im Mandanten mehrfach vergeben, antwortet die API mit HTTP 409 — verwenden Sie dann external_id. Regionen werden über region_number adressiert. Upsert: Eine Wiederholung aktualisiert die bestehenden Zeilen. Ausgelassene Projekte, Regionen und Rollen bleiben unverändert. Alle Schreibvorgänge einer Anfrage laufen in einer Mutation und werden gemeinsam übernommen oder gemeinsam verworfen. Leerzeichen an email, Rollentiteln und Kennungen werden entfernt. Rollentitel müssen exakt einer bestehenden Rolle des Mandanten entsprechen.\",\"dateModified\":\"2026-10-27T09:54:44.813Z\",\"isPartOf\":{\"@id\":\"https://developer.comstruct.com#website\"},\"breadcrumb\":{\"@id\":\"https://developer.comstruct.com/en/api-reference/projects-user-assignments#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://developer.comstruct.com/en/api-reference/projects-user-assignments#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Projects\",\"item\":\"https://developer.comstruct.com/en/api-reference/projects\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Assign users\",\"item\":\"https://developer.comstruct.com/en/api-reference/projects-user-assignments\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://developer.comstruct.com/en/api-reference/projects-user-assignments#apireference\",\"headline\":\"Assign users\",\"name\":\"Assign users\",\"description\":\"Erforderliche Berechtigungen: projects:write, users:read, roles:read Weist einer E-Mail eine oder mehrere mandantenweite Rollen zu und vergibt optional Mitgliedschaften auf Projekten und/oder Projektregionen. Der API-Schlüssel muss ein reiner Kunden-Schlüssel sein. Bestehender Benutzer (status: ASSIGNED): Die E-Mail gehört bereits zu einem Benutzer des Mandanten (Vergleich ohne Groß-/Kleinschreibung). Alle angegebenen Rollen werden mandantenweit hinzugefügt; bereits vorhandene Rollen bleiben bestehen. Jede Projektmitgliedschaft verwendet die erste Rolle als projektbezogene Rolle und ersetzt bei Wiederholung diese Rolle. Regionsmitgliedschaften werden angelegt; bestehende Regionszeilen bleiben unverändert. projects und regions dürfen entfallen. Unbekannte E-Mail (status: INVITED): Es wird mindestens ein Projekt oder eine Region benötigt. Pro Projekt wird eine ausstehende Einladung mit der ersten Rolle gespeichert, pro Region eine Einladung ohne Rolle. Weitere Rollen werden geprüft und in role_ids zurückgegeben. Mandantenweit gespeichert werden sie, sobald die E-Mail zu einem Benutzer gehört. Wiederholen Sie die Anfrage danach, um alle mandantenweiten Rollen zu setzen. Adressierung: Jeder Projekteintrag enthält genau eines von project_number oder external_id. project_number ist nur je Buchungskreis eindeutig; ist sie im Mandanten mehrfach vergeben, antwortet die API mit HTTP 409 — verwenden Sie dann external_id. Regionen werden über region_number adressiert. Upsert: Eine Wiederholung aktualisiert die bestehenden Zeilen. Ausgelassene Projekte, Regionen und Rollen bleiben unverändert. Alle Schreibvorgänge einer Anfrage laufen in einer Mutation und werden gemeinsam übernommen oder gemeinsam verworfen. Leerzeichen an email, Rollentiteln und Kennungen werden entfernt. Rollentitel müssen exakt einer bestehenden Rolle des Mandanten entsprechen.\",\"url\":\"https://developer.comstruct.com/en/api-reference/projects-user-assignments\",\"mainEntityOfPage\":{\"@id\":\"https://developer.comstruct.com/en/api-reference/projects-user-assignments#webpage\"},\"dateModified\":\"2026-10-27T09:54:44.813Z\",\"publisher\":{\"@id\":\"https://developer.comstruct.com/#organization\"},\"isPartOf\":{\"@id\":\"https://developer.comstruct.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"comstruct API Dokumentation\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"comstruct API Dokumentation","nav":{"global":{"anchors":[{"anchor":"Support","icon":"envelope","href":"mailto:support@comstruct.com"}]},"languages":[{"language":"de","default":true,"pages":[{"title":"de","href":"/api-reference/projects-user-assignments"}]},{"language":"en","tabs":[{"tab":"Getting started","pages":[{"title":"Getting started","href":"/en"}]},{"tab":"API Reference","groups":[{"group":"Overview","pages":[{"title":"API Reference","href":"/en/api-reference/introduction"}]},{"group":"Projects","pages":[{"title":"List projects","openapi":"GET /projects","href":"/en/api-reference/projects"},{"title":"Create project","openapi":"POST /projects","description":"**Erforderliche Berechtigungen:** `projects:write`, `users:read`, `roles:read`, `tenant_settings:read`\n\nErstellt ein neues Projekt oder aktualisiert ein bestehendes Projekt. Dieser Endpunkt führt eine Upsert-Operation basierend auf dem `external_id`-Feld (falls vorhanden) oder der `project_number` durch.\n\n**Hauptfunktionen:**\n- **Upsert-Logik**: Wenn `external_id` angegeben ist und ein Projekt mit dieser ID existiert, wird es aktualisiert. Andernfalls wird `project_number` für den Abgleich verwendet. Wenn keine Übereinstimmung gefunden wird, wird ein neues Projekt erstellt.\n- **Benutzerverwaltung**: Behandelt automatisch Benutzereinladungen und Rollenzuweisungen für Projektteammitglieder.\n- **Regionszuordnung**: Das `region`-Feld kann verwendet werden, um das Projekt einer Projektregion zuzuordnen.\n- **Buchungskreis-Zuordnung**: Das `legal_entity_number`-Feld kann verwendet werden, um das Projekt einem Buchungskreis zuzuordnen.\n- **Koordinaten**: Optionale `latitude` und `longitude` setzen den geografischen Standort. Weglassen belässt den gespeicherten Wert; `null` löscht ihn.\n- **Validierung**: Alle erforderlichen Felder (`title`, `project_number`) werden vor der Verarbeitung validiert.\n\n**Best Practices:**\n- Geben Sie `external_id` für zuverlässige Upsert-Operationen an\n- Verwenden Sie `region` oder `project_region_id` für die Projektregionszuordnung\n- Verwenden Sie `legal_entity_number` oder `legal_entity_id` für die Buchungskreis-Zuordnung\n- Fügen Sie vollständige Adressinformationen hinzu, wenn verfügbar, für besseres Projektmanagement\n- Übergeben Sie `latitude` und `longitude` gemeinsam, wenn der Standort bekannt ist\n- Stellen Sie sicher, dass Rollennamen in `project_invites` mit bestehenden Rollen in Ihrem Mandanten übereinstimmen\n","href":"/en/api-reference/projects-create"},{"title":"Assign users","openapi":"POST /projects/user-assignments","href":"/en/api-reference/projects-user-assignments"},{"title":"Get project by external ID","openapi":"GET /projects/byExternalId/{external_id}","description":"**Erforderliche Berechtigungen:** `projects:read`\n","href":"/en/api-reference/projects-by-external-id"},{"title":"Get project by number","openapi":"GET /projects/byProjectNumber/{project_number}","href":"/en/api-reference/projects-by-number"},{"title":"Get project components","openapi":"GET /projects/{id}/components","href":"/en/api-reference/projects-components"},{"title":"List project work types","openapi":"GET /projects/{id}/work-types","href":"/en/api-reference/projects-work-types"},{"title":"Import project work types","openapi":"POST /projects/{id}/work-types","href":"/en/api-reference/projects-work-types-upsert"},{"title":"Projects (SAP)","openapi":"POST /projects/sap","href":"/en/api-reference/projects-sap"}]},{"group":"Deliveries","pages":[{"title":"List deliveries","openapi":"GET /deliveries","href":"/en/api-reference/deliveries"},{"title":"Create delivery","openapi":"POST /deliveries","href":"/en/api-reference/deliveries-create"},{"title":"Update delivery","openapi":"PATCH /deliveries/{id}","href":"/en/api-reference/deliveries-patch"},{"title":"Get delivery by ID","openapi":"GET /deliveries/{id}","href":"/en/api-reference/deliveries-by-id"},{"title":"Get delivery components","openapi":"GET /deliveries/{id}/components","href":"/en/api-reference/deliveries-components-get"},{"title":"Replace delivery components","openapi":"PUT /deliveries/{id}/components","href":"/en/api-reference/deliveries-components-put"},{"title":"Get delivery PDF","openapi":"GET /deliveries/{id}/pdf","href":"/en/api-reference/deliveries-pdf"},{"title":"Upload delivery PDF","openapi":"POST /deliveries/pdf","href":"/en/api-reference/deliveries-pdf-upload"},{"title":"OpenTrans delivery","openapi":"POST /deliveries/opentrans","href":"/en/api-reference/deliveries-opentrans"},{"title":"PAHM delivery","openapi":"POST /deliveries/pahm","href":"/en/api-reference/deliveries-pahm"},{"title":"Custom delivery","openapi":"POST /deliveries/custom","href":"/en/api-reference/deliveries-custom"}]},{"group":"Invoices","pages":[{"title":"List invoices","openapi":"GET /invoices","href":"/en/api-reference/invoices"},{"title":"Get invoice by ID","openapi":"GET /invoices/{id}","href":"/en/api-reference/invoices-by-id"},{"title":"Get invoice items","openapi":"GET /invoices/{id}/items","href":"/en/api-reference/invoices-items"},{"title":"Get invoice history","openapi":"GET /invoices/{id}/history","href":"/en/api-reference/invoices-history"},{"title":"Get invoice PDF","openapi":"GET /invoices/{id}/pdf","href":"/en/api-reference/invoices-pdf"},{"title":"Export DATEV XML","openapi":"POST /invoices/public/datev-export","href":"/en/api-reference/invoices-datev-export"},{"title":"Set invoice external status","openapi":"PATCH /invoices/{id}/external-status","href":"/en/api-reference/invoices-external-status"},{"title":"Custom invoice upload","openapi":"POST /invoices/custom","href":"/en/api-reference/invoices-custom"},{"title":"Email invoice","openapi":"POST /invoices/email","href":"/en/api-reference/invoices-email"},{"title":"Invoice callback","openapi":"POST /invoices/callback","href":"/en/api-reference/invoices-callback"}]},{"group":"Invoice dimensions","pages":[{"title":"Invoice dimensions (custom properties)","openapi":"GET /invoice-dimensions","href":"/en/api-reference/invoice-dimensions"},{"title":"Create invoice dimension","openapi":"POST /invoice-dimensions","href":"/en/api-reference/invoice-dimensions-create"},{"title":"Update invoice dimension","openapi":"PATCH /invoice-dimensions/{id}","href":"/en/api-reference/invoice-dimensions-update"},{"title":"Delete invoice dimension","openapi":"DELETE /invoice-dimensions/{id}","href":"/en/api-reference/invoice-dimensions-delete"},{"title":"Get dimension options","openapi":"GET /invoice-dimensions/{dimensionId}/options","href":"/en/api-reference/invoice-dimensions-options-list"},{"title":"Create dimension options","openapi":"POST /invoice-dimensions/{dimensionId}/options","href":"/en/api-reference/invoice-dimensions-options-create"},{"title":"Update dimension option","openapi":"PATCH /invoice-dimensions/options/{id}","href":"/en/api-reference/invoice-dimensions-options-update"},{"title":"Delete dimension option","openapi":"DELETE /invoice-dimensions/options/{id}","href":"/en/api-reference/invoice-dimensions-options-delete"},{"title":"Get invoice dimension assignments","openapi":"GET /invoice-dimensions/assignments/invoice/{invoiceId}","href":"/en/api-reference/invoice-dimensions-assignments-invoice-get"},{"title":"Set header dimension assignments","openapi":"POST /invoice-dimensions/assignments/invoice","href":"/en/api-reference/invoice-dimensions-assignments-invoice-set"},{"title":"Set line-item dimension assignments (bulk)","openapi":"POST /invoice-dimensions/assignments/line-item/bulk","href":"/en/api-reference/invoice-dimensions-assignments-line-item-bulk"},{"title":"Set account dimension assignments (bulk)","openapi":"POST /invoice-dimensions/assignments/account/bulk","href":"/en/api-reference/invoice-dimensions-assignments-account-bulk-set"},{"title":"Patch account dimension assignments (bulk)","openapi":"PATCH /invoice-dimensions/assignments/account/bulk","href":"/en/api-reference/invoice-dimensions-assignments-account-bulk-patch"},{"title":"Set account dimension assignments (single account)","openapi":"POST /invoice-dimensions/assignments/account","href":"/en/api-reference/invoice-dimensions-assignments-account-set"},{"title":"Delete dimension assignment","openapi":"DELETE /invoice-dimensions/assignments/{id}","href":"/en/api-reference/invoice-dimensions-assignments-delete"}]},{"group":"Suppliers","pages":[{"title":"Create or update suppliers","openapi":"POST /suppliers","href":"/en/api-reference/suppliers"},{"title":"Create or update SAP suppliers","openapi":"POST /suppliers/sap","href":"/en/api-reference/suppliers-sap"},{"title":"Assign supplier to company codes","openapi":"PUT /suppliers/{id}/legal-entities","href":"/en/api-reference/suppliers-legal-entities"}]},{"group":"Purchase orders","pages":[{"title":"Create purchase orders","openapi":"POST /purchase-orders","href":"/en/api-reference/purchase-orders"},{"title":"Purchase orders (SAP)","openapi":"POST /purchase-orders/sap","href":"/en/api-reference/purchase-orders-sap"}]},{"group":"Orders (Supplier)","pages":[{"title":"Update supplier order","openapi":"PATCH /supplier-orders/{id}","href":"/en/api-reference/supplier-orders-patch"}]},{"group":"Master data","pages":[{"title":"List accounts","openapi":"GET /accounts","href":"/en/api-reference/accounts"},{"title":"Create or update accounts","openapi":"POST /accounts","href":"/en/api-reference/accounts-create"},{"title":"List payment terms","openapi":"GET /payment-terms","href":"/en/api-reference/payment-terms"},{"title":"Create or update payment terms","openapi":"POST /payment-terms","href":"/en/api-reference/payment-terms-upsert"},{"title":"List tax codes","openapi":"GET /tax-codes","href":"/en/api-reference/tax-codes"},{"title":"Create or update tax code","openapi":"POST /tax-codes","href":"/en/api-reference/tax-codes-upsert"},{"title":"List company codes","openapi":"GET /legal-entities","href":"/en/api-reference/company-codes"},{"title":"Create or update company codes","openapi":"POST /legal-entities","href":"/en/api-reference/company-codes-upsert"},{"title":"List project regions","openapi":"GET /project-regions","href":"/en/api-reference/project-regions"},{"title":"Create or update project region","openapi":"POST /project-regions","href":"/en/api-reference/project-regions-upsert"}]},{"group":"Q-Point Integration","pages":[{"title":"Q-Point","openapi":"POST /qpoint","href":"/en/api-reference/qpoint"},{"title":"Q-Point PDF","openapi":"POST /qpoint/pdf","href":"/en/api-reference/qpoint-pdf"}]},{"group":"Workflows","pages":[{"title":"Trigger workflow","openapi":"POST /workflows/trigger","href":"/en/api-reference/workflows-trigger"},{"title":"Workflow status","openapi":"GET /workflows/status/{external_id}","href":"/en/api-reference/workflows-status"},{"title":"Update workflow status","openapi":"PUT /workflows/status/{external_id}","href":"/en/api-reference/workflows-status-update"}]},{"group":"Calendar","pages":[{"title":"Calendar subscription","openapi":"GET /calendars/subscription","href":"/en/api-reference/calendars"}]},{"group":"IDS Orders","pages":[{"title":"IDS orders","openapi":"POST /ids/{order_id}","href":"/en/api-reference/ids-orders"}]}]}]}]},"title":"Assign users - comstruct API Dokumentation","buildId":"dpl_DFJrtvUi8HS5F9nkooKuDJsuD5BM","deploymentId":"dpl_DFJrtvUi8HS5F9nkooKuDJsuD5BM","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-rfhihCWU.js","utils-BmH1XFxk.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-BcNsxPKB.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-BAES3tkd.js","snippetPresets-DCMQBKLP.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","ApiExamples-D6l_bzE9.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-BOktbnNh.js","shallow-BCs8SgM7.js","getApiPlaygroundDisplay-DEmW5bJB.js","CodeSnippet-CpZOpB9C.js","CodeSnippets-BOBDqibl.js","Page-D5fEM6aW.js","getPastedJson-DH2JBvmr.js","icon-BBJH-kKh.js","MethodPill-D2Sd5NLC.js","DuplicateIcon-CGgfL2qN.js","createIcon-BKudBBzi.js","DynamicMarkdown-85clUA0i.js","SectionHeading-D0JiMgDx.js","axios-vUo_bRtp.js","Markdown-Cfiy0xZO.js","clsx-rL8ZCCw4.js","lib--scc4DXi.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-aeztFa9U.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-BywkCr5C.js"]}