# Business Units and Associates APIs overview

**How to work with the APIs for Business Units and Associates.**

This page describes rules that apply across the Business Units and Associates APIs. For what Business Units, Associates, Associate Roles, Permissions, and Approval Rules are and how they behave, see the [Business Units and Associates overview](/api/business-units-and-associates-overview.md).

## APIs in this topic

| Resource | Purpose | Reference |
| --- | --- | --- |
| Business Units | Companies and Divisions, their Associates, Stores, and addresses. | [Business Units](/api/projects/business-units.md) |
| Business Unit Search | Search Business Units for back-office use. | [Business Unit Search](/api/projects/business-unit-search.md) |
| Associate Roles | Groups of Permissions assigned to Associates. | [Associate Roles](/api/projects/associate-roles.md) |
| Associate endpoints | Access B2B resources as an Associate, with Permission checks. | [Associate Carts](/api/projects/associate-carts.md), [Associate Quotes](/api/projects/associate-quotes.md), [Associate Quote Requests](/api/projects/associate-quote-requests.md), [Associate Orders](/api/projects/associate-orders.md), [Associate Business Units](/api/projects/associate-business-units.md), [Associate Shopping Lists](/api/projects/associate-shopping-lists.md) |
| Approval Rules | Conditions and approver tiers for Order approval. | [Approval Rules](/api/projects/approval-rules.md) |
| Approval Flows | The approval process of one Order. | [Approval Flows](/api/projects/approval-flows.md) |

## Data model

### B2B resources

A [B2B resource](/api/business-units-and-associates-overview.md#b2b-resources) has its `businessUnit` field set.

## Associate Roles and Permissions

Associates can be assigned specific roles through an [AssociateRoleAssignment](/search.md?urn=ctp:api:type:AssociateRoleAssignment), which grants an Associate Role to an Associate within a Business Unit.

[Sellers](/api/business-units-and-associates-overview.md#seller) can make roles assignable by [Buyers](/api/business-units-and-associates-overview.md#buyer) using the `buyerAssignable` property of an [Associate Role](/api/projects/associate-roles.md#associaterole).

### Permission Naming Convention

The naming convention for Permissions represents the action allowed for a given resource type. Most Permission names consist of the action name, either the `My` or `Others` keyword and the resource type (for example, `UpdateMyOrders`, `ViewOthersCarts`). Permissions with the `My` keyword grant access to an Associate's own resources, while `Others` Permissions provide access to resources belonging to other Associates.

### Distinct 'My' and 'Others' Permissions

`Others` Permissions don't imply `My` Permissions. This behavior allows for maximum flexibility in modeling complex B2B use cases. For instance, granting an Associate the `CreateMyCarts` Permission alongside `ViewOthersCarts` and `CreateOrdersFromOthersCarts` Permissions enables a setup where [Buyers](/api/business-units-and-associates-overview.md#buyer) can create carts but require approval from others to place an order.

## Interact with B2B resources

### Through the general endpoints

When accessing resources using the general endpoint, the API has no knowledge of the [Associate](/search.md?urn=ctp:api:type:Associate) behind the API call. Therefore, no Associate Role Permissions are validated. As such, the general endpoints are intended for a [Seller](/api/business-units-and-associates-overview.md#seller) that wants to manage access and permissions without Associate Role enforcement.

Example use case: back office operations, customer support.

### Through the me endpoint

When using the [me endpoints](/api/me-endpoints-overview.md), the API can derive which Associate is behind a given API call using the [password flow token](/api/authorization.md#password-flow). This allows the API to check whether the Associate has the right level of Permissions to perform actions on a given resource. However, the `me` endpoint can only grant access to the Associate's own resources, and not to resources that belong to other Associates.

Example use case: mobile app for [Buyers](/api/business-units-and-associates-overview.md#buyer) to make purchases.

### Through the associate endpoint

The `associate` endpoints require an Associate to be specified as a URL parameter along with a [Business Unit](/api/projects/business-units.md#businessunit). This Business Unit is what the Associate's [Permissions](/api/projects/associate-roles.md#permission) are checked against. These endpoints are designed specifically for [Sellers](/api/business-units-and-associates-overview.md#seller) that want to provide controlled access for their [Buyers](/api/business-units-and-associates-overview.md#buyer) using the Permissions.

> The endpoints do verify the [Permissions](/api/projects/associate-roles.md#permission) according to the URL parameters, but they don't validate the URL parameters against the [scopes](/api/scopes.md). Because of this, these endpoints should only be called from a middleware that's trusted.

Example use case: B2B storefront using trusted middleware.

## Permission evaluation

Permission evaluations and requirements differ based on the endpoint type. The following table provides an overview of the types of Permissions required depending on which method is used to access a resource.

| Endpoint type | Permission evaluation | Additional requirements |
| --- | --- | --- |
| General endpoints | None | If `customerId` and `businessUnit` are both present on the resource, then the Customer must be an Associate of the Business Unit. |
| `me` endpoints for [B2B resources](/api/business-units-and-associates-overview.md#b2b-resources) (for example, My Carts) | `My` [Permissions](/api/projects/associate-roles.md#permission) | If `customerId` and `businessUnit` are both present on the resource, then the Customer must be an Associate of the Business Unit. |
| `me` endpoints for Business Units (My Business Units) | [Business Unit Permissions](/api/projects/associate-roles.md#permission) | The Customer must be an Associate of the Business Unit. |
| `associate` endpoints for [B2B resources](/api/business-units-and-associates-overview.md#b2b-resources) | `My`, `Others` [Permissions](/api/projects/associate-roles.md#permission) | The Associate must be a member of the Business Unit. |
| `associate` endpoints for Business Units | [Business Unit Permissions](/api/projects/associate-roles.md#permission) | The Associate must be a member of the Business Unit. |

### On the me endpoints

The `me` endpoints validate that the acting Associate has sufficient Permissions on a given [B2B resources](/api/business-units-and-associates-overview.md#b2b-resources). In addition, the Associate must be a Customer on the resource and be an Associate of the referenced Business Unit.

> The `me` endpoints do not validate `View` Permissions. Therefore, an Associate can view all resources available on the [me endpoints](/api/me-endpoints-overview.md), regardless of their Permissions.
>
> Removing an Associate from a Business Unit does not revoke their access to the Carts, Orders, Quotes, and Quote Requests associated with it. The Associate must also be explicitly removed from the entity to fully restrict their access.

#### My Business Unit

When interacting with Business Units using the [My Business Unit endpoints](/api/me-endpoints-overview.md#my-business-units), the API performs validations on certain actions to ensure that the [Associate](/search.md?urn=ctp:api:type:Associate) has the correct [Business Unit Permissions](/api/projects/associate-roles.md#permission).

| Permission | Required for |
| :--- | :--- |
| `AddChildUnits` | [Creating and assigning a new child unit to a parent unit](/search.md?urn=ctp:api:endpoint:/{projectKey}/me/business-units:POST). |
| `UpdateAssociates` | [changeAssociate](/api/projects/me-business-units.md#change-associate), [removeAssociate](/api/projects/me-business-units.md#remove-associate) update actions, and [creating an Associate for a BusinessUnit](/search.md?urn=ctp:api:endpoint:/{projectKey}/in-business-unit/key={businessUnitKey}/me/customers:POST). |
| `UpdateParentUnit` | [changeParentUnit](/api/projects/me-business-units.md#change-parent-unit) update action. |
| `UpdateBusinessUnitDetails` | [Update actions](/api/projects/me-business-units.md#update-actions) not related to Associate management, or hierarchical changes (such as [changeParentUnit](/api/projects/me-business-units.md#change-parent-unit)). |

#### My Carts

For B2B Carts, the [My Carts endpoints](/api/projects/me-carts.md) perform validations to ensure that the [Associate](/search.md?urn=ctp:api:type:Associate) has the correct [CartPermissions](/api/projects/associate-roles.md#permission).

| Permission | Required for |
| --- | --- |
| `CreateMyCarts` | [Creating a Cart](/search.md?urn=ctp:api:endpoint:/{projectKey}/me/carts:POST). |
| `UpdateMyCarts` | [Updating a Cart](/search.md?urn=ctp:api:endpoint:/{projectKey}/me/carts/{id}:POST). |
| `DeleteMyCarts` | [Deleting a Cart](/search.md?urn=ctp:api:endpoint:/{projectKey}/me/carts/{id}:DELETE). |

Additionally, the Customer on the Cart must be an [Associate](/search.md?urn=ctp:api:type:Associate) of the referenced [Business Unit](/api/projects/business-units.md#businessunit).

#### My Quotes

For B2B Quotes, the [My Quotes endpoints](/api/projects/me-quotes.md) perform validations to ensure that the [Associate](/search.md?urn=ctp:api:type:Associate) has the correct [QuotePermissions](/api/projects/associate-roles.md#permission).

| Permission | Required for |
| --- | --- |
| `AcceptMyQuotes` | [Accepting a Quote](/api/projects/me-quotes.md#change-my-quote-state). |
| `DeclineMyQuotes` | [Declining a Quote](/api/projects/me-quotes.md#change-my-quote-state). |
| `RenegotiateMyQuotes` | [Renegotiating a Quote](/api/projects/me-quotes.md#request-quote-renegotiation). |

#### My Quote Requests

For B2B Quote Requests, the [My Quote Requests endpoints](/api/projects/me-quote-requests.md) perform validations to ensure that the [Associate](/search.md?urn=ctp:api:type:Associate) has the correct [QuoteRequestPermissions](/api/projects/associate-roles.md#permission).

| Permission | Required for |
| --- | --- |
| `CreateMyQuoteRequestsFromMyCarts` | [Creating a Quote Request](/search.md?urn=ctp:api:endpoint:/{projectKey}/me/quote-requests:POST). |
| `UpdateMyQuoteRequests` | [Updating a Quote Request](/search.md?urn=ctp:api:endpoint:/{projectKey}/me/quote-requests/{id}:POST). |

#### My Orders

For B2B Orders, the [My Orders endpoints](/api/projects/me-orders.md) perform validations to ensure that the [Associate](/search.md?urn=ctp:api:type:Associate) has the correct [OrderPermissions](/api/projects/associate-roles.md#permission).

| Permission | Required for |
| --- | --- |
| `CreateMyOrdersFromMyCarts` | [Creating an Order from a Cart](/search.md?urn=ctp:api:endpoint:/{projectKey}/me/orders:POST) and [Creating an Order in Store from a Cart](/search.md?urn=ctp:api:endpoint:/{projectKey}/in-store/key={storeKey}/me/orders:POST). |
| `CreateMyOrdersFromMyQuotes` | [Creating an Order from a Quote](/search.md?urn=ctp:api:endpoint:/{projectKey}/me/orders/quotes:POST). |

### On the associate endpoints

The `associate` endpoints validate that the acting [Associate](/search.md?urn=ctp:api:type:Associate) has sufficient Permissions on a given resource. In addition, the Associate must have access to the referenced [Business Unit](/api/projects/business-units.md#businessunit). In contrast to the `me` endpoints, the `associate` endpoints can also provide access to resources that do not belong to the Associate directly. For example, the `ViewOthersCarts` Permission allows an Associate to view B2B Carts where the Customer on the Cart is another Associate.

#### Associate Carts

For B2B Carts, the [Associate Carts endpoints](/api/projects/associate-carts.md) perform validations to ensure that the [Associate](/search.md?urn=ctp:api:type:Associate) has the correct [Cart Permissions](/api/projects/associate-roles.md#permission).

| Permission | Required for |
| --- | --- |
| `ViewMyCarts` or `ViewOthersCarts` | [Getting a Cart](/search.md?urn=ctp:api:endpoint:/{projectKey}/as-associate/{associateId}/in-business-unit/key={businessUnitKey}/carts/{id}:GET). |
| `CreateMyCarts` or `CreateOthersCarts` | [Creating a Cart](/search.md?urn=ctp:api:endpoint:/{projectKey}/as-associate/{associateId}/in-business-unit/key={businessUnitKey}/carts:POST). |
| `UpdateMyCarts` or `UpdateOthersCarts` | [Updating a Cart](/search.md?urn=ctp:api:endpoint:/{projectKey}/as-associate/{associateId}/in-business-unit/key={businessUnitKey}/carts/{id}:POST). |
| `DeleteMyCarts` or `DeleteOthersCarts` | [Deleting a Cart](/search.md?urn=ctp:api:endpoint:/{projectKey}/as-associate/{associateId}/in-business-unit/key={businessUnitKey}/carts/{id}:DELETE). |

#### Associate Quotes

For B2B Quotes, the [Associate Quotes endpoints](/api/projects/associate-quotes.md) perform validations to ensure that the [Associate](/search.md?urn=ctp:api:type:Associate) has the correct [Quote Permissions](/api/projects/associate-roles.md#permission).

| Permission | Required for |
| --- | --- |
| `ViewMyQuotes` or `ViewOthersQuotes` | [Getting a Quote](/search.md?urn=ctp:api:endpoint:/{projectKey}/as-associate/{associateId}/in-business-unit/key={businessUnitKey}/quotes/{id}:GET). |
| `AcceptMyQuotes` or `AcceptOthersQuotes` | [Accepting a Quote](/search.md?urn=ctp:api:endpoint:/{projectKey}/as-associate/{associateId}/in-business-unit/key={businessUnitKey}/quotes/{id}:POST). |
| `DeclineMyQuotes` or `DeclineOthersQuotes` | [Declining a Quote](/search.md?urn=ctp:api:endpoint:/{projectKey}/as-associate/{associateId}/in-business-unit/key={businessUnitKey}/quotes/{id}:POST). |
| `RenegotiateMyQuotes` or `RenegotiateOthersQuotes` | [Renegotiate a Quote](/search.md?urn=ctp:api:endpoint:/{projectKey}/as-associate/{associateId}/in-business-unit/key={businessUnitKey}/quotes/{id}:POST). |
| `ReassignMyQuotes` or `ReassignOthersQuotes` | [Reassigning a Quote](/search.md?urn=ctp:api:endpoint:/{projectKey}/as-associate/{associateId}/in-business-unit/key={businessUnitKey}/quotes/{id}:POST). |

#### Associate Quote Requests

For B2B Quote Requests, the [Associate Quote Requests endpoints](/api/projects/associate-quote-requests.md) perform validations to ensure that the [Associate](/search.md?urn=ctp:api:type:Associate) has the correct [Quote Request Permissions](/api/projects/associate-roles.md#permission).

| Permission | Required for |
| --- | --- |
| `ViewMyQuoteRequests` or `ViewOthersQuoteRequests` | [Getting a Quote Request](/search.md?urn=ctp:api:endpoint:/{projectKey}/as-associate/{associateId}/in-business-unit/key={businessUnitKey}/quote-requests/{id}:GET). |
| `CreateMyQuoteRequestsFromMyCarts` or `CreateQuoteRequestsFromOthersCarts` | [Creating a Quote Request](/search.md?urn=ctp:api:endpoint:/{projectKey}/as-associate/{associateId}/in-business-unit/key={businessUnitKey}/quote-requests:POST). |
| `UpdateMyQuoteRequests` or `UpdateOthersQuoteRequests` | [Updating a Quote Request](/search.md?urn=ctp:api:endpoint:/{projectKey}/as-associate/{associateId}/in-business-unit/key={businessUnitKey}/quote-requests/{id}:POST). |

#### Associate Orders

For B2B Orders, the [Associate Orders endpoints](/api/projects/associate-orders.md) perform validations to ensure that the [Associate](/search.md?urn=ctp:api:type:Associate) has the correct [Order Permissions](/api/projects/associate-roles.md#permission).

| Permission | Required for |
| --- | --- |
| `ViewMyOrders` or `ViewOthersOrders` | [Getting an Order](/search.md?urn=ctp:api:endpoint:/{projectKey}/as-associate/{associateId}/in-business-unit/key={businessUnitKey}/orders/{id}:GET). |
| `CreateMyOrders` or `CreateOthersOrders` | [Creating an Order](/search.md?urn=ctp:api:endpoint:/{projectKey}/as-associate/{associateId}/in-business-unit/key={businessUnitKey}/orders:POST). |
| `UpdateMyOrders` or `UpdateOthersOrders` | [Updating an Order](/search.md?urn=ctp:api:endpoint:/{projectKey}/as-associate/{associateId}/in-business-unit/key={businessUnitKey}/orders/{id}:POST). |

#### Associate Business Units

The [Associate Business Unit endpoints](/api/projects/associate-business-units.md) perform validations to ensure that the [Associate](/search.md?urn=ctp:api:type:Associate) has the correct [Business Unit Permissions](/api/projects/associate-roles.md#permission).

| Permission | Required for |
| :--- | :--- |
| `AddChildUnits` | [Creating and assigning a new child unit to a parent unit](/search.md?urn=ctp:api:endpoint:/{projectKey}/as-associate/{associateId}/business-units:POST). |
| `UpdateAssociates` | [addAssociate](/api/projects/business-units.md#add-associate), [setAssociates](/api/projects/business-units.md#set-associates), [changeAssociate](/api/projects/business-units.md#change-associate), and [removeAssociate](/api/projects/business-units.md#remove-associate) update actions. |
| `UpdateParentUnit` | [changeParentUnit](/api/projects/business-units.md#change-parent-unit) update action. |
| `UpdateBusinessUnitDetails` | [Update actions](/api/projects/business-units.md#update-actions) not related to Associate management, or hierarchical changes (such as [changeParentUnit](/api/projects/business-units.md#change-parent-unit)). |

#### Associate Shopping Lists

For B2B Shopping Lists, the [Associate Shopping Lists endpoints](/api/projects/associate-shopping-lists.md) perform validations to ensure that the [Associate](/search.md?urn=ctp:api:type:Associate) has the correct [Shopping List Permissions](/api/projects/associate-roles.md#permission).

| Permission | Required for |
| --- | --- |
| `ViewMyShoppingLists` or `ViewOthersShoppingLists` | [Getting a Shopping List](/search.md?urn=ctp:api:endpoint:/{projectKey}/as-associate/{associateId}/in-business-unit/key={businessUnitKey}/shopping-lists/{id}:GET). |
| `CreateMyShoppingLists` or `CreateOthersShoppingLists` | [Creating a Shopping List](/search.md?urn=ctp:api:endpoint:/{projectKey}/as-associate/{associateId}/in-business-unit/key={businessUnitKey}/shopping-lists:POST). |
| `UpdateMyShoppingLists` or `UpdateOthersShoppingLists` | [Updating a Shopping List](/search.md?urn=ctp:api:endpoint:/{projectKey}/as-associate/{associateId}/in-business-unit/key={businessUnitKey}/shopping-lists/{id}:POST). |
| `DeleteMyShoppingLists` or `DeleteOthersShoppingLists` | [Deleting a Shopping List](/search.md?urn=ctp:api:endpoint:/{projectKey}/as-associate/{associateId}/in-business-unit/key={businessUnitKey}/shopping-lists/{id}:DELETE). |

## Inheritance of Associates and their roles

The inheritance behavior is determined by the `inheritance` property of individual [AssociateRoleAssignments](/api/projects/business-units.md#associateroleassignment) together with the [AssociateMode](/api/projects/business-units.md#businessunitassociatemode) of a Business Unit.

### Conditions for inheritance

When the AssociateMode of a Business Unit is set to `Explicit`, the Business Unit is not allowed to inherit any Associates. In this case, only Associates defined directly on the Business Unit can act on its behalf. With the `ExplicitAndFromParent` AssociateMode, the Business Unit can have both directly assigned Associates and inherited ones from a parent unit.

For a Business Unit to inherit Associates from a parent unit, the following two conditions must be met:

- The AssociateMode of the Business Unit must be set to `ExplicitAndFromParent`, allowing the Business Unit to inherit Associates.
- A parent unit of the Business Unit must have at least one Associate with an inheritable role, meaning that the `inheritance` property of the [AssociateRoleAssignment](/search.md?urn=ctp:api:type:AssociateRoleAssignment) is set to `Enabled`.

The following diagram illustrates how Business Units with `ExplicitAndFromParent` AssociateMode inherit Associates from parents, whilst a Business Unit with `Explicit` AssociateMode does not.

```mermaid
	flowchart TB
	 classDef default fill:#e6f5fe,stroke:#078cdf,stroke-width:1px,color:#000000;
	 classDef note fill:#e6f5fe,stroke:#078cdf,stroke-width:1px,color:#000000,stroke-dasharray: 5 5;
	 subgraph Company
		 direction LR
		 subgraph explicit1[Explicit]
			direction TB
			companyAssociate1(Associate 1)
		 end
	 end
	 subgraph BusinessUnitChildExplicit[Division]
		 direction LR
		 noteExplicit(<i>associateMode: Explicit</i>)
		 subgraph explicit2[Explicit]
			direction TB
			divisionExplicitAssociate2(Associate 2)
			divisionExplicitAssociate4(Associate 4)
		 end
	 end
	 subgraph BusinessUnitChildExplicitAndFromParent[Division]
		 direction LR
		 noteExplicitAndFromParent(<i>associateMode: ExplicitAndFromParent</i>)
		 subgraph inherited3[Inherited]
			direction TB
			divisionExplicitAndFromParentAssociate1(Associate 1)
		 end
		 subgraph explicit3[Explicit]
			direction TB
			divisionExplicitAndFromParentAssociate2(Associate 2)
		 end
	 end
	 subgraph BusinessUnitChildSubDivision[Division]
		 direction LR
		 noteExplicitAndFromParent2(<i>associateMode: ExplicitAndFromParent</i>)
		 subgraph inherited4[Inherited]
			direction TB
			subdivisionExplicitAndFromParentAssociate1(Associate 1)
			subdivisionExplicitAndFromParentAssociate2(Associate 2)
		 end
		 subgraph explicit4[Explicit]
			direction TB
			subdivisionExplicitAndFromParentAssociate3(Associate 3)
		 end
	 end
	 Company --> BusinessUnitChildExplicit
	 Company --> BusinessUnitChildExplicitAndFromParent
	 BusinessUnitChildExplicitAndFromParent --> BusinessUnitChildSubDivision
	 class noteExplicitAndFromParent,noteExplicitAndFromParent2,noteExplicit note
```

### Prevent inheritance

By setting the AssociateMode of a Business Unit to `Explicit`, the inheritance mechanism will be disabled for all Associates of that unit. To prevent the inheritance of a single Associate, disable the inheritance property for all assigned roles of that Associate. This ensures that the Associate is not inherited by any child Business Units. If an Associate is both inherited and explicitly defined in the same Associate Role, the explicitly defined [AssociateRoleAssignment](/search.md?urn=ctp:api:type:AssociateRoleAssignment) determines inheritance.

## Buyer Approval Flows

> The Approval Rules and Approval Flows APIs are designed to be called from a [Buyer portal](/api/business-units-and-associates-overview.md#buyer-portal).

### Approver hierarchy

An Approval Rule is made of at least one tier in the [ApproverHierarchy](/search.md?urn=ctp:api:type:ApproverHierarchy). Each tier must be composed of at least one [ApproverConjunction](/search.md?urn=ctp:api:type:ApproverConjunction) that contains at least one [ApproverDisjunction](/search.md?urn=ctp:api:type:ApproverDisjunction) holding the [RuleApprovers](/api/projects/approval-rules.md#ruleapprover). An ApproverConjunction is a condition with the logical operator AND: all of its ApproverDisjunctions must be met. An ApproverDisjunction is a condition with the logical operator OR: any one of its RuleApprovers can approve. For what the `AND` and `OR` conditions mean in the approval process, see [Business Units and Associates overview](/api/business-units-and-associates-overview.md#configure-approval-rules).

```mermaid
flowchart

 subgraph tier[ApproverHierarchy Tier 1]
	direction TB

	and21[ApproverConjunction]
	or21[ApproverDisjunction]

	or21 --> role21[RuleApprover]

	and21 --> or21
 end
```

## Working with the APIs

### Customer-specific prices &#x20;

When [placing an Order](/search.md?urn=ctp:api:endpoint:/{projectKey}/orders:POST), the [Cart's](/api/projects/carts.md#cart) `customerId` has to reference an [Associate](/search.md?urn=ctp:api:type:Associate) in the Business Unit that represents the customer. To ensure that you apply the correct pricing, reference the customer-specific [Channel](/api/projects/channels.md) in the `distributionChannel` of the Cart's [Line Item Drafts](/api/projects/carts.md#lineitemdraft). Without specifying the Channel, the base price is selected instead of the customer-specific price.

To use [Standalone Prices](/api/projects/standalone-prices.md), set the [ProductPriceMode](/api/projects/products.md#productpricemode) to `Standalone` and [create Prices](/search.md?urn=ctp:api:endpoint:/{projectKey}/standalone-prices:POST) for every Channel.

> Creating a Store and Channel per price band is not recommended for checkout flows that use the [My Carts](/api/projects/me-carts.md) and [My Orders](/api/projects/me-orders.md) APIs. It allows the Customer to select the Channel and, therefore, the pricing option for their Orders. Instead, create one Store for each product restriction and price combination. External [prices](/api/projects/carts.md#lineitempricemode) and [taxes](/api/projects/carts.md#taxmode) are not supported with those APIs.

## Eventual consistency

### Eventual consistency of inherited Associates

The `inheritedAssociates` array of a Business Unit contains the Associates that are inherited. In cases where inheritance applies, this property is automatically populated by a background task. It is updated each time an Associate in a parent Business Unit is added, updated, or removed. However, since this process is subject to [eventual consistency](/api/general-concepts.md#eventual-consistency), changes in inherited roles might have a delayed effect on role evaluations.

## Limits

Business Units can be organized hierarchically up to a maximum of **5** levels, with the top level being a Business Unit of type Company. Each top-level Business Unit can have a maximum of **4000** Divisions, including all direct and indirect children. These are soft limits that can be increased per Project after a performance impact review. See [Limit increase guidance](/api/limit-increase-guidance.md#b2b-hierarchy-and-permission-limits).

With up to five levels per Approval Rule, an Order can pass through a maximum of five sequential approval stages. Each level corresponds to an approval stage, starting from the initial stage at the first level to the final approval at the fifth level.

```mermaid
flowchart
 subgraph tier1[Tier 1]
 end

 subgraph tier2[Tier 2]
 end

 subgraph tier3[Tier 3]
 end

 subgraph tier4[Tier 4]
 end

 subgraph tier5[Tier 5]
 end
 tier1 --> tier2
 tier2 --> tier3
 tier3 --> tier4
 tier4 --> tier5
```

## Related pages

- [Area overview page with navigation](/api.md)
- [Previous page: Overview](/api/business-units-and-associates-overview.md)
- [Next page: Business Units](/api/projects/business-units.md)
- [Search documentation and API specs](/search.md)