diff --git a/package-lock.json b/package-lock.json
index f1d8ff4..2569dce 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
 {
     "name": "@propelauth/node",
-    "version": "2.1.9",
+    "version": "2.1.11",
     "lockfileVersion": 2,
     "requires": true,
     "packages": {
         "": {
             "name": "@propelauth/node",
-            "version": "2.1.9",
+            "version": "2.1.11",
             "license": "MIT",
             "dependencies": {
                 "jose": "^5.2.0"
diff --git a/src/api/org.ts b/src/api/org.ts
index c0f86e6..74ed88c 100644
--- a/src/api/org.ts
+++ b/src/api/org.ts
@@ -150,6 +150,7 @@ export type AddUserToOrgRequest = {
     userId: string
     orgId: string
     role: string
+    additionalRoles?: string[]
 }
 
 export function addUserToOrg(
@@ -161,6 +162,7 @@ export function addUserToOrg(
         user_id: addUserToOrgRequest.userId,
         org_id: addUserToOrgRequest.orgId,
         role: addUserToOrgRequest.role,
+        additional_roles: addUserToOrgRequest.additionalRoles ?? [],
     }
     return httpRequest(authUrl, integrationApiKey, `${ENDPOINT_PATH}/add_user`, "POST", JSON.stringify(request)).then(
         (httpResponse) => {
@@ -183,6 +185,7 @@ export type ChangeUserRoleInOrgRequest = {
     userId: string
     orgId: string
     role: string
+    additionalRoles?: string[]
 }
 
 export function changeUserRoleInOrg(
@@ -194,6 +197,7 @@ export function changeUserRoleInOrg(
         user_id: changeUserRoleInOrgRequest.userId,
         org_id: changeUserRoleInOrgRequest.orgId,
         role: changeUserRoleInOrgRequest.role,
+        additional_roles: changeUserRoleInOrgRequest.additionalRoles ?? [],
     }
     return httpRequest(
         authUrl,
diff --git a/src/api/user.ts b/src/api/user.ts
index 4db0364..c0cc123 100644
--- a/src/api/user.ts
+++ b/src/api/user.ts
@@ -278,6 +278,7 @@ export type InviteUserToOrgRequest = {
     orgId: string
     email: string
     role: string
+    additionalRoles?: string[]
 }
 
 export function inviteUserToOrg(
@@ -289,6 +290,7 @@ export function inviteUserToOrg(
         org_id: inviteUserToOrgRequest.orgId,
         email: inviteUserToOrgRequest.email,
         role: inviteUserToOrgRequest.role,
+        additional_roles: inviteUserToOrgRequest.additionalRoles ?? [],
     }
 
     return httpRequest(authUrl, integrationApiKey, `/api/backend/v1/invite_user`, "POST", JSON.stringify(body)).then(
diff --git a/src/index.ts b/src/index.ts
index 32f8e31..5f1d687 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -1,6 +1,11 @@
 export { AccessToken, CreateAccessTokenRequest } from "./api/accessToken"
 export { CreateMagicLinkRequest, MagicLink } from "./api/magicLink"
-export { OrgQuery, OrgQueryResponse } from "./api/org"
+export { 
+    OrgQuery,
+    OrgQueryResponse,
+    AddUserToOrgRequest,
+    ChangeUserRoleInOrgRequest,
+} from "./api/org"
 export { TokenVerificationMetadata } from "./api/tokenVerificationMetadata"
 export {
     CreateUserRequest,
@@ -49,6 +54,7 @@ export {
     Org,
     OrgIdToOrgMemberInfo,
     OrgMemberInfo,
+    OrgRoleStructure,
     toOrgIdToOrgMemberInfo,
     toUser,
     User,
diff --git a/src/user.ts b/src/user.ts
index 3e99677..8433745 100644
--- a/src/user.ts
+++ b/src/user.ts
@@ -198,15 +198,22 @@ export type UserMetadata = {
     properties?: { [key: string]: unknown }
 }
 
+export enum OrgRoleStructure {
+    SingleRole = "single_role_in_hierarchy",
+    MultiRole = "multi_role",
+}
+
 export class OrgMemberInfo {
     public readonly orgId: string
     public readonly orgName: string
     public readonly orgMetadata: { [key: string]: unknown }
     public readonly urlSafeOrgName: string
+    public readonly orgRoleStructure: OrgRoleStructure 
 
     private readonly userAssignedRole: string
     private readonly userInheritedRolesPlusCurrentRole: string[]
     private readonly userPermissions: string[]
+    private readonly userAssignedAdditionalRoles: string[]
 
     constructor(
         orgId: string,
@@ -215,7 +222,9 @@ export class OrgMemberInfo {
         urlSafeOrgName: string,
         userAssignedRole: string,
         userInheritedRolesPlusCurrentRole: string[],
-        userPermissions: string[]
+        userPermissions: string[],
+        orgRoleStructure?: OrgRoleStructure,
+        userAssignedAdditionalRoles?: string[]
     ) {
         this.orgId = orgId
         this.orgName = orgName
@@ -225,6 +234,8 @@ export class OrgMemberInfo {
         this.userAssignedRole = userAssignedRole
         this.userInheritedRolesPlusCurrentRole = userInheritedRolesPlusCurrentRole
         this.userPermissions = userPermissions
+        this.orgRoleStructure = orgRoleStructure ?? OrgRoleStructure.SingleRole
+        this.userAssignedAdditionalRoles = userAssignedAdditionalRoles ?? []
     }
 
     // getters
@@ -237,16 +248,28 @@ export class OrgMemberInfo {
     }
 
     get inheritedRolesPlusCurrentRole(): string[] {
-        return this.userInheritedRolesPlusCurrentRole
+        if (this.orgRoleStructure === OrgRoleStructure.MultiRole) {
+            return this.userAssignedAdditionalRoles.concat(this.userAssignedRole)
+        } else {
+            return this.userInheritedRolesPlusCurrentRole
+        }
     }
 
     // validation methods
     public isRole(role: string): boolean {
-        return this.userAssignedRole === role
+        if (this.orgRoleStructure === OrgRoleStructure.MultiRole) {
+            return this.userAssignedRole === role || this.userAssignedAdditionalRoles.includes(role)
+        } else {
+            return this.userAssignedRole === role
+        }
     }
 
     public isAtLeastRole(role: string): boolean {
-        return this.userInheritedRolesPlusCurrentRole.includes(role)
+        if (this.orgRoleStructure === OrgRoleStructure.MultiRole) {
+            return this.userAssignedRole === role || this.userAssignedAdditionalRoles.includes(role)
+        } else {
+            return this.userInheritedRolesPlusCurrentRole.includes(role)
+        }
     }
 
     public hasPermission(permission: string): boolean {
@@ -267,7 +290,9 @@ export class OrgMemberInfo {
                 obj.urlSafeOrgName,
                 obj.userAssignedRole,
                 obj.userInheritedRolesPlusCurrentRole,
-                obj.userPermissions
+                obj.userPermissions,
+                obj.orgRoleStructure,
+                obj.userAssignedAdditionalRoles
             )
         } catch (e) {
             console.error(
@@ -295,9 +320,11 @@ export type InternalOrgMemberInfo = {
     org_name: string
     org_metadata: { [key: string]: any }
     url_safe_org_name: string
+    org_role_structure: OrgRoleStructure
     user_role: string
     inherited_user_roles_plus_current_role: string[]
     user_permissions: string[]
+    additional_roles: string[]
 }
 
 // This type is used to represent the user returned from the refresh token.
@@ -368,7 +395,9 @@ export function toOrgIdToOrgMemberInfo(snake_case?: {
                 snakeCaseValue.url_safe_org_name,
                 snakeCaseValue.user_role,
                 snakeCaseValue.inherited_user_roles_plus_current_role,
-                snakeCaseValue.user_permissions
+                snakeCaseValue.user_permissions,
+                snakeCaseValue.org_role_structure,
+                snakeCaseValue.additional_roles
             )
         }
     }
diff --git a/src/utils.ts b/src/utils.ts
index 777ac50..276856b 100644
--- a/src/utils.ts
+++ b/src/utils.ts
@@ -47,7 +47,7 @@ function isOrgMemberInfo(value: any) {
         value.hasOwnProperty("urlSafeOrgName") &&
         value.hasOwnProperty("orgMetadata") &&
         value.hasOwnProperty("userAssignedRole") &&
-        value.hasOwnProperty("userRoles") &&
+        value.hasOwnProperty("userInheritedRoles") &&
         value.hasOwnProperty("userPermissions")
     )
 }
@@ -72,8 +72,10 @@ function processKeys(obj: any): any {
                 value["orgMetadata"],
                 value["urlSafeOrgName"],
                 value["userAssignedRole"],
-                value["userRoles"],
-                value["userPermissions"]
+                value["userInheritedRoles"],
+                value["userPermissions"],
+                value["orgRoleStructure"],
+                value["additionalRoles"]
             )
         }
 
@@ -81,7 +83,7 @@ function processKeys(obj: any): any {
         if (key === "user_role") {
             newKey = "userAssignedRole"
         } else if (key === "inherited_user_roles_plus_current_role") {
-            newKey = "userRoles"
+            newKey = "userInheritedRoles"
         } else {
             newKey = camelCase(key)
         }
diff --git a/test/middleware.ts b/test/middleware.ts
index c810faa..edbd034 100644
--- a/test/middleware.ts
+++ b/test/middleware.ts
@@ -6,7 +6,7 @@ import { initBaseAuth } from "../src"
 import { TokenVerificationMetadata } from "../src/api/tokenVerificationMetadata"
 import { RequiredOrgInfo } from "../src/auth"
 import { ForbiddenException, UnauthorizedException, UnexpectedException } from "../src/exceptions"
-import { InternalOrgMemberInfo, InternalUser, OrgMemberInfo, toUser, User } from "../src/user"
+import { InternalOrgMemberInfo, InternalUser, OrgMemberInfo, OrgRoleStructure, toUser, User } from "../src/user"
 import { parseSnakeCaseToCamelCase } from "../src/utils"
 
 const AUTH_URL = "https://auth.example.com"
@@ -124,6 +124,93 @@ test("validateAccessTokenAndGetUser fails with incorrect issuer", async () => {
     expect(nock.isDone()).toBe(true)
 })
 
+test("toUser converts correctly with multi-role orgs", async () => {
+    const internalUser: InternalUser = {
+        user_id: "cbf064e2-edaa-4d35-b413-a8d857329c12",
+        email: "easteregg@propelauth.com",
+        first_name: "easter",
+        org_id_to_org_member_info: {
+            "99ee1329-e536-4aeb-8e2b-9f56c1b8fe8a": {
+                org_id: "99ee1329-e536-4aeb-8e2b-9f56c1b8fe8a",
+                org_name: "orgA",
+                org_metadata: { orgdata_a: "orgvalue_a" },
+                url_safe_org_name: "orga",
+                org_role_structure: OrgRoleStructure.MultiRole,
+                user_role: "Role A",
+                inherited_user_roles_plus_current_role: ["Role A"],
+                user_permissions: [],
+                additional_roles: ["Role B", "Role C"],
+            },
+            "4ca20d17-5021-4d62-8b3d-148214fa8d6d": {
+                org_id: "4ca20d17-5021-4d62-8b3d-148214fa8d6d",
+                org_name: "orgB",
+                org_metadata: { orgdata_b: "orgvalue_b" },
+                url_safe_org_name: "orgb",
+                org_role_structure: OrgRoleStructure.MultiRole,
+                user_role: "Role B",
+                inherited_user_roles_plus_current_role: ["Role B",],
+                user_permissions: [],
+                additional_roles: [],
+            },
+            "15a31d0c-d284-4e7b-80a2-afb23f939cc3": {
+                org_id: "15a31d0c-d284-4e7b-80a2-afb23f939cc3",
+                org_name: "orgC",
+                org_metadata: { orgdata_c: "orgvalue_c" },
+                url_safe_org_name: "orgc",
+                org_role_structure: OrgRoleStructure.MultiRole,
+                user_role: "Role C",
+                inherited_user_roles_plus_current_role: ["Role C"],
+                user_permissions: [],
+                additional_roles: ["Role A"],
+            },
+        },
+    }
+
+    const user: User = {
+        userId: "cbf064e2-edaa-4d35-b413-a8d857329c12",
+        email: "easteregg@propelauth.com",
+        firstName: "easter",
+        orgIdToOrgMemberInfo: {
+            "99ee1329-e536-4aeb-8e2b-9f56c1b8fe8a": new OrgMemberInfo(
+                "99ee1329-e536-4aeb-8e2b-9f56c1b8fe8a",
+                "orgA",
+                { orgdata_a: "orgvalue_a" },
+                "orga",
+                "Role A",
+                ["Role A"],
+                [],
+                OrgRoleStructure.MultiRole,
+                ["Role B", "Role C"]
+            ),
+            "4ca20d17-5021-4d62-8b3d-148214fa8d6d": new OrgMemberInfo(
+                "4ca20d17-5021-4d62-8b3d-148214fa8d6d",
+                "orgB",
+                { orgdata_b: "orgvalue_b" },
+                "orgb",
+                "Role B",
+                ["Role B"],
+                [],
+                OrgRoleStructure.MultiRole,
+                []
+            ),
+            "15a31d0c-d284-4e7b-80a2-afb23f939cc3": new OrgMemberInfo(
+                "15a31d0c-d284-4e7b-80a2-afb23f939cc3",
+                "orgC",
+                { orgdata_c: "orgvalue_c" },
+                "orgc",
+                "Role C",
+                ["Role C"],
+                [],
+                OrgRoleStructure.MultiRole,
+                ["Role A"]
+            ),
+        },
+        loginMethod: { loginMethod: "unknown" },
+    }
+
+    expect(toUser(internalUser)).toEqual(user)
+})
+
 test("toUser converts correctly with orgs", async () => {
     const internalUser: InternalUser = {
         user_id: "cbf064e2-edaa-4d35-b413-a8d857329c12",
@@ -135,27 +222,33 @@ test("toUser converts correctly with orgs", async () => {
                 org_name: "orgA",
                 org_metadata: { orgdata_a: "orgvalue_a" },
                 url_safe_org_name: "orga",
+                org_role_structure: OrgRoleStructure.SingleRole,
                 user_role: "Owner",
                 inherited_user_roles_plus_current_role: ["Owner", "Admin", "Member"],
                 user_permissions: [],
+                additional_roles: [],
             },
             "4ca20d17-5021-4d62-8b3d-148214fa8d6d": {
                 org_id: "4ca20d17-5021-4d62-8b3d-148214fa8d6d",
                 org_name: "orgB",
                 org_metadata: { orgdata_b: "orgvalue_b" },
                 url_safe_org_name: "orgb",
+                org_role_structure: OrgRoleStructure.SingleRole,
                 user_role: "Admin",
                 inherited_user_roles_plus_current_role: ["Admin", "Member"],
                 user_permissions: [],
+                additional_roles: [],
             },
             "15a31d0c-d284-4e7b-80a2-afb23f939cc3": {
                 org_id: "15a31d0c-d284-4e7b-80a2-afb23f939cc3",
                 org_name: "orgC",
                 org_metadata: { orgdata_c: "orgvalue_c" },
                 url_safe_org_name: "orgc",
+                org_role_structure: OrgRoleStructure.SingleRole,
                 user_role: "Member",
                 inherited_user_roles_plus_current_role: ["Member"],
                 user_permissions: [],
+                additional_roles: [],
             },
         },
     }
@@ -172,6 +265,8 @@ test("toUser converts correctly with orgs", async () => {
                 "orga",
                 "Owner",
                 ["Owner", "Admin", "Member"],
+                [],
+                OrgRoleStructure.SingleRole,
                 []
             ),
             "4ca20d17-5021-4d62-8b3d-148214fa8d6d": new OrgMemberInfo(
@@ -181,6 +276,8 @@ test("toUser converts correctly with orgs", async () => {
                 "orgb",
                 "Admin",
                 ["Admin", "Member"],
+                [],
+                OrgRoleStructure.SingleRole,
                 []
             ),
             "15a31d0c-d284-4e7b-80a2-afb23f939cc3": new OrgMemberInfo(
@@ -190,6 +287,8 @@ test("toUser converts correctly with orgs", async () => {
                 "orgc",
                 "Member",
                 ["Member"],
+                [],
+                OrgRoleStructure.SingleRole,
                 []
             ),
         },
@@ -209,9 +308,11 @@ test("toUser converts correctly with active org", async () => {
             org_name: "orgA",
             org_metadata: { orgdata_a: "orgvalue_a" },
             url_safe_org_name: "orga",
+            org_role_structure: OrgRoleStructure.SingleRole,
             user_role: "Owner",
             inherited_user_roles_plus_current_role: ["Owner", "Admin", "Member"],
             user_permissions: [],
+            additional_roles: [],
         },
     }
 
@@ -227,6 +328,8 @@ test("toUser converts correctly with active org", async () => {
                 "orga",
                 "Owner",
                 ["Owner", "Admin", "Member"],
+                [],
+                OrgRoleStructure.SingleRole,
                 []
             ),
         },
@@ -665,9 +768,11 @@ function randomOrg(): InternalOrgMemberInfo {
         org_name: randomString(),
         org_metadata: { internalData: randomString() },
         url_safe_org_name: urlSafeOrgName,
+        org_role_structure: OrgRoleStructure.SingleRole,
         user_role: "Admin",
         inherited_user_roles_plus_current_role: ["Admin", "Member"],
         user_permissions: ["read", "write"],
+        additional_roles: [],
     }
 }
 
