Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
8f97a72
Bulk API limits - ACCS-703
May 12, 2026
390f57e
Merge branch 'main' into ACCS-703
jhadobe Jun 1, 2026
099facf
Merge branch 'main' into ACCS-703
dshevtsov Jun 4, 2026
11df885
Merge branch 'main' into ACCS-703
dshevtsov Jun 15, 2026
6e2cb6e
docs: document catalog price rule REST APIs
kuflower Oct 1, 2026
f320232
docs: clarify catalog rule create and update requirements
kuflower Oct 1, 2026
bee9d3c
docs: simplify catalog price rule guide
kuflower Oct 1, 2026
61f236d
docs: shorten authentication and website scope guidance
kuflower Oct 1, 2026
5fcf438
Merge branch 'main' into ACCS-703
jhadobe Oct 1, 2026
9fff401
docs: apply feedback
kuflower Oct 2, 2026
cb43b47
CCSAAS-5490 initiate upload recaptcha GraphQL
Oct 2, 2026
4a894fc
ACCS-1156 Custom Shipping Discounts
Oct 5, 2026
7b4d974
ACCS-1155 custom price rest
Oct 6, 2026
073ecc9
review
Oct 6, 2026
8ac9298
Merge pull request #564 from AdobeDocs/ACCS-703
jhadobe Oct 6, 2026
42dfbf1
Merge branch 'october-accs-integration' into ACCS-1156-custom-discounts
jhadobe Oct 6, 2026
34d5602
review
Oct 6, 2026
eb13ba6
Merge pull request #624 from AdobeDocs/ACCS-1156-custom-discounts
jhadobe Oct 6, 2026
39170bc
Merge pull request #621 from kuflower/ACCS-1621-catalog-price-rules-doc
jhadobe Oct 6, 2026
818e375
review
Oct 6, 2026
04bf62a
Merge pull request #623 from AdobeDocs/CCSAAS-5490-upload-captcha
jhadobe Oct 6, 2026
640b4d2
Merge branch 'october-accs-integration' into ACCS-1155-custom-price
jhadobe Oct 7, 2026
d9cea5a
review
Oct 7, 2026
4aa2894
Merge pull request #625 from AdobeDocs/ACCS-1155-custom-price
jhadobe Oct 7, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions src/pages/config.md
Original file line number Diff line number Diff line change
Expand Up @@ -156,11 +156,14 @@
- [Multicoupon](/rest/modules/multicoupon/index.md)
- [Sales refunds](/rest/modules/sales/index.md)
- [SaaS integrations](/rest/saas-integrations/index.md)
- [Cart item custom price](/rest/saas-integrations/cart-custom-price/index.md)
- [Catalog price rules](/rest/saas-integrations/catalog-price-rules/index.md)
- [Custom email](/rest/saas-integrations/custom-email/index.md)
- [Gift card accounts](/rest/saas-integrations/gift-card-accounts/index.md)
- [Login as Customer](/rest/saas-integrations/login-as-customer/index.md)
- [Order management](/rest/saas-integrations/order-management/index.md)
- [S3 uploads](/rest/saas-integrations/s3-uploads/index.md)
- [Shipping discounts](/rest/saas-integrations/shipping-discounts/index.md)
- [System configuration](/rest/saas-integrations/system-config/index.md)
- [Introduction](/graphql/index.md)
- [Usage](/graphql/usage/index.md)
Expand Down
4 changes: 4 additions & 0 deletions src/pages/get-started/api-security.md
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,10 @@ By default, any one of these arrays can include up to 20 items, but you can chan

## Input limit for REST endpoints

<Fragment src="../includes/saas-only.md"/>

In Adobe Commerce as a Cloud Service, Bulk API limits are determined by the **Maximum Entities per Bulk Request** setting in the [Store Configuration](https://experienceleague.adobe.com/en/docs/commerce-admin/config/general/bulk-api).

<Fragment src="../includes/paas-only.md"/>

Some REST endpoints can contain a high number of elements, and developers need a way to set the limit for each endpoint. The limit for a specific REST endpoint can be set in the `webapi.xml` configuration file for synchronous requests and `webapi_async.xml` for asynchronous requests.
Expand Down
16 changes: 16 additions & 0 deletions src/pages/graphql/schema/uploads/mutations/initiate-upload.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,22 @@ Use the `upload_url` from the response to PUT the file directly to S3. See [Uplo

After the file is successfully uploaded, use the [`finishUpload` mutation](finish-upload.md) to complete the upload process.

## reCAPTCHA validation

You can call the `initiateUpload` for many reasons, for example to attach an image to a return. To limit automated upload requests, merchants can require Google reCAPTCHA validation on this mutation. This setting is disabled by default. To enable it, set [**Enable for Presigned Upload**](https://experienceleague.adobe.com/en/docs/commerce-admin/config/security/google-recaptcha-storefront) in **Stores** > **Configuration** > **Security** > **Google reCAPTCHA Storefront** > **Storefront**.

When working with guest shoppers, call the `initiateUpload` mutation without a customer token.

When the setting is enabled, each `initiateUpload` request must include a valid reCAPTCHA token in the `X-ReCaptcha` HTTP header:

```text
X-ReCaptcha: <reCAPTCHA-token>
```

If the token is missing or invalid, the request fails and Commerce does not issue a presigned URL. The `finishUpload` mutation does not require a reCAPTCHA token because it can only complete an upload that `initiateUpload` started.

For more information about reCAPTCHA headers, see [Protected mutations](../../../usage/protected-mutations.md).

## Syntax

```graphql
Expand Down
1 change: 1 addition & 0 deletions src/pages/graphql/usage/protected-mutations.md
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ The following table lists the forms and mutations that can be configured to requ
| Enable for Checkout/Placing Order | `setPaymentMethodOnCart`, `setPaymentMethodAndPlaceOrder` |
| Enable for Coupon Codes | `applyCouponToCart` |
| Enable for Resend Confirmation Email | `resendConfirmationEmail` |
| Enable for Presigned Upload | [SaaS only](https://experienceleague.adobe.com/en/docs/commerce/user-guides/product-solutions) `initiateUpload` |

## Related topics

Expand Down
130 changes: 130 additions & 0 deletions src/pages/rest/saas-integrations/cart-custom-price/index.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
---
title: Cart Item Custom Price
description: Learn how to set a custom price on a cart item with the custom_price extension attribute on the add and update cart item REST endpoints.
keywords:
- REST
- Integration
---

<Fragment src="../../../includes/saas-only.md"/>

# Cart item custom price

The cart item custom price capability lets admins and integrations override the catalog price of an item in Adobe Commerce as a Cloud Service by using the `custom_price` extension attribute with the add and update cart item REST endpoints.

These endpoints are designed for:

* Integrations that set prices calculated outside of Commerce
* Admin workflows, such as editing an order, that change the price of a cart line

## Authentication

All requests that include `custom_price` require an admin or integration [bearer token](../../authentication/index.md). Requests that include `custom_price` with a customer token are rejected. Guest cart endpoints are not available in Adobe Commerce as a Cloud Service.

## Limitations

* **Bundle products with dynamic pricing** — Not supported, because the price is calculated from the prices of their child products. Bundle products with fixed pricing are supported.
* **B2B negotiable quotes** — Not supported. Use [`PUT /V1/negotiableQuote/:quoteId`](../../b2b/negotiable-update.md) to set negotiated prices.

## REST API reference

| Method | URL | Description |
|--------|-----|-------------|
| POST | `/V1/carts/:cartId/items` | Add an item to the cart at a custom price |
| PUT | `/V1/carts/:cartId/items/:itemId` | Change the price of an item that is already in the cart |
| GET | `/V1/carts/:cartId/items` | Retrieve cart items, including `custom_price` |
| GET | `/V1/carts/:cartId` | Retrieve the cart, including `custom_price` on each item |

### Field reference

The `custom_price` attribute is part of the `extension_attributes` object of the `cartItem` payload.

| Field | Type | Valid values | Required |
|---|---|---|---|
| `extension_attributes.custom_price` | float | >= 0. A value of `0` adds the item for free. | Optional. When omitted, the item uses the catalog price. |
| `item_id` | int | ID of an existing cart line | Required to change the price of an item that is already in the cart |

### Add an item at a custom price

`POST /V1/carts/:cartId/items` adds a new item to the cart and applies the custom price to each unit.

**Request body:**

```json
{
"cartItem": {
"sku": "t-shirt",
"qty": 1,
"quote_id": 17,
"extension_attributes": {
"custom_price": 15.00
}
}
}
```

**Response (200):**

Returns the cart item with the applied price in `extension_attributes.custom_price`.

### Change the price of an existing cart item

`PUT /V1/carts/:cartId/items/:itemId` changes the price of a cart line. Use `GET /V1/carts/:cartId/items` to find the `item_id` of the line.

<InlineAlert variant="info" slots="text" />

If you add a product that is already in the cart with a `custom_price` but without an `item_id`, the request is rejected and the existing cart line is left unchanged. To add units to an existing line at a new price, send its `item_id` with the new total quantity.

**Request body:**

```json
{
"cartItem": {
"item_id": 8,
"sku": "hat",
"qty": 1,
"quote_id": 17,
"extension_attributes": {
"custom_price": 5.00
}
}
}
```

**Response (200):**

Returns the cart item with the applied price in `extension_attributes.custom_price`.

### Retrieve custom prices

`GET /V1/carts/:cartId/items` and `GET /V1/carts/:cartId` return the `custom_price` for each cart item.

**Response (200):**

Each cart item that has a custom price includes it in the `extension_attributes` object.

```json
{
"item_id": 8,
"sku": "hat",
"qty": 1,
"extension_attributes": {
"custom_price": 5
}
}
```

## Error handling

If a request fails for any reason, the cart is left exactly as it was before the request. A successful response always means that the custom price was applied.

| Condition | Error message |
|---|---|
| The token is not an admin or integration token | `Setting a custom price is not permitted for this account.` |
| The price is negative or not a finite number | `custom_price must be a finite, non-negative number.` |
| The product is a bundle with dynamic pricing | `custom_price is not supported for this product type.` |
| The cart is a B2B negotiable quote | `custom_price is not supported on a negotiable quote. Use the negotiable quote API to set negotiated prices.` |
| The product is already in the cart and no `item_id` is supplied | `This product is already on the cart. To change the price of that line, supply its item_id; ...` |
| The price could not be applied after the item was saved, for example because the product was deleted or disabled during the request | `The item could not be added with the requested custom price.` |

Non-numeric `custom_price` values, such as `"not-a-price"`, are rejected by REST type validation with a `400` response before the price check runs.
Loading
Loading