> This page is for Developer.

> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.bigcommerce.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.bigcommerce.com/_mcp/server.

# Update Quote

PUT https://api-b2b.bigcommerce.com/api/v3/io/rfq/{quote_id}
Content-Type: application/json

Updates an existing quote based on the details provided in the request body.

Before using this endpoint to update a quote, review the following considerations:

* None of the fields in the body are required for a successful response. This means that you can use this endpoint to update a single field or a subset of fields.
* When adding or updating line items, you must include all existing line items that you want to keep in the quote. Omitting existing line items from a quote will remove them from the quote when you send the request.
* If you add products or change discounts, you must also update the `grandTotal` and `subtotal` fields to reflect the new totals.
* You cannot use this endpoint to change the sales rep or Company account assigned to an existing quote.
* To update a quote’s shipping rate, use the [Select a Shipping Rate for a Quote](#select-a-shipping-rate-for-quote) endpoint.

See [Create a Quote](#create-a-quote) for experience- and setting-specific requirements related to adding custom shipping or non-purchasable products to a quote.

## Archiving a quote

You can use this endpoint to archive a quote by including `"status": "archived"` in the request body. Archiving hides the quote from the Buyer Portal and prevents it from being purchased.

* A quote in any status can be archived.

Reference: https://docs.bigcommerce.com/developer/api-reference/rest/b2b/management/quotes/put-rfq-quote-id

## Authentication

- `X-Auth-Token` header (required) — | Header | Argument | Description | |:-------|:---------|:------------| | `X-Auth-Token` | `access_token` | For more about API accounts that generate `access_token`s, see our [Guide to API Accounts](/developer/docs/overview/api-fundamentals/api-accounts). | For example requests and more information about authenticating BigCommerce APIs, see [Authentication and Example Requests](/developer/docs/overview/api-fundamentals/api-accounts#x-auth-token-header-example-requests). For more about BigCommerce OAuth scopes, see our [Guide to API Accounts](/developer/docs/overview/api-fundamentals/api-accounts#oauth-scopes). For a list of API status codes, see [API Status Codes](/developer/api-reference/rest/overview#rest-http-status-codes).
- `X-Store-Hash` header (required) — | Header | Argument | Description | |:-------|:---------|:------------| | `X-Store-Hash` | `store_hash` | The unique store hash associated with a BigCommerce store that has B2B Edition enabled. |

## Request

### Path parameters

- `quote_id` (integer, required) — The internal numeric ID of the sales quote.

### Body (application/json)

This endpoint expects an object.

- `subtotal` (double, optional) — The quoted total after discounts and before shipping and tax. If you are updating the line items or discounts on a quote, you must also update the subtotal to reflect the new pricing.
- `channelId` (integer, optional, default: 1) — The storefront channel ID associated with the quote. This is required if your store has multiple storefront channels. Use `1` for your store’s default storefront channel.
- `quoteTitle` (string, optional) — The external title given to the quote.
- `referenceNumber` (string, optional) — An identifier for the quote that can be supplied by the sales rep or the buyer, such as a Purchase Order number.
- `currency` (RfqQuoteIdPutRequestBodyContentApplicationJsonSchemaCurrency, optional)
- `extraFields` (list of ExtraFieldsItems, optional) — Adds extra field information to the quote. This is required if your store has required quote extra fields. If you include the array in the request, you must include all of its fields.
- `notes` (string, optional) — The quote’s buyer-facing notes. Use the newline character ` ` to separate each line of text.
- `discount` (double, optional) — The total value of discounts applied to the quote.
- `grandTotal` (double, optional) — The quoted total after discounts, shipping, and tax are applied. If you are updating the line items or discounts on a quote, you must also update the grand total to reflect the new pricing.
- `legalTerms` (string, optional) — The quote’s terms and conditions. Use the newline character ` ` to separate each line of text. Omitting this field or leaving it blank does not add your store’s default terms and conditions to the quote. Instead, the quote will not display any terms.
- `displayDiscount` (boolean, optional) — Determines if buyers can see quoted discount values in the Buyer Portal, or if they only see the quoted prices. If left blank, the quote uses the discount display selection in your Quote settings.
- `allowCheckout` (boolean, optional) — Determines whether or not the buyer can take the quote to the checkout page. If left blank, the quote uses the checkout selection in your Quote settings.
- `productList` (list of ProductListItems, optional) — Line item information for the quote. If you add this array to the request, you must include all existing line items that you want to keep in the quote.
- `shippingAddress` (companyAddress, optional)
- `contactInfo` (contactInfo, optional) — Contact information for the buyer on the quote. Display-only metadata; not used to resolve or validate the linked customer or Company record.
- `message` (string, optional) — A message sent to the buyer via the in-quote messaging system.
- `userEmail` (string, optional) — The email address of the quote’s sales rep. Any user email found within the B2B Edition System Users menu is considered a valid value for this field. This field is optional. If left blank, it will default to the store owner's email address as shown in the B2B Edition System Users menu.
- `expiredAt` (string, optional) — The date when the buyer can no longer purchase the quote. Use '%m/%d/%Y' format when entering the expiration date.
- `status` (enum, optional) — Set to `"archived"` to archive the quote.
  - Allowed values: `archived`

## Response

### 200

OK

- `code` (double, optional) — HTTP Response Code
- `data` (quote_PUT_POST, optional)
- `meta` (RfqQuoteIdPutResponsesContentApplicationJsonSchemaMeta, optional)

## Errors

### 404 Not Found Error

Not Found The 404 error occurs when the `quote_id` in the URL does not match an existing quote in the store. This response is currently emitted only on the archive flow (`"status": "archived"`).

- `code` (double, optional) — HTTP Response Code
- `data` (ResponseErrorData, optional)
- `meta` (ResponseErrorMeta, optional)

## Types

### RfqQuoteIdPutRequestBodyContentApplicationJsonSchemaCurrency

- `token` (string, optional) — The currency symbol.
- `location` (enum, optional) — Determines whether the currency symbol is added to the left or the right of quote pricing.
  - Allowed values: `left`, `right`
- `currencyCode` (string, optional) — The three-letter code corresponding to the quote’s currency.
- `decimalToken` (string, optional) — The character used to separate decimal values in quote pricing.
- `decimalPlaces` (integer, optional) — The number of decimal places displayed in quote pricing. You can display a maximum of 4 decimal places.
- `thousandsToken` (string, optional) — The character used to separate the hundredths and thousandths places in quote pricing.
- `currencyExchangeRate` (double, optional) — Overrides the built-in exchange rate between your store’s default currency and the quote’s selected currency. If left blank, the exchange rate defined in your store’s settings is used.

### ExtraFieldsItems

- `fieldName` (string, optional) — The name of the quote extra field.
- `fieldValue` (string, optional) — The value of the quote extra field.

### ProductListItems

- `productId` (integer, optional) — The unique identifier for the base line item.
- `productName` (string, optional) — The name of the line item.
- `variantId` (integer, optional) — The unique identifier for the line item variant.
- `sku` (string, optional) — The line item’s SKU.
- `basePrice` (double, optional) — The line item’s price before any discounts are applied.
- `discount` (double, optional) — The discount percentage applied to the line item.
- `offeredPrice` (double, optional) — The line item’s price after any discounts are applied. You can also use this field to override the base price without specifying a `discount` value.
- `quantity` (integer, optional) — The quantity of the line item.
- `orderQuantityMaximum` (integer, optional) — The maximum number of line item units that can be added to the quote. To set an unlimited order quantity, omit this field or use a value of `0`.
- `orderQuantityMinimum` (integer, optional) — The minimum number of line item units that can be added to the quote. To set a minimum quantity of zero, omit this field or use a value of `0`.
- `imageUrl` (string, optional) — The URL for the line item image on your storefront.
- `options` (list of ProductListItemsOptionsItems, optional) — Variant and modifier option information for the line item. This array is required if the line item has variant options.

### companyAddress

- `address` (string, optional) — The first line of the address.
- `apartment` (string, optional) — The second line of the address.
- `city` (string, optional) — The city on the address.
- `state` (string, optional) — The full name of the state on the address.
- `zipCode` (string, optional) — The postal code on the address.
- `country` (string, optional) — The full name of the country on the address.

### contactInfo

Contact information for the buyer on the quote. Display-only metadata; not used to resolve or validate the linked customer or Company record.

- `name` (string, optional) — The buyer’s full name.
- `email` (string, optional) — The buyer’s email address.
- `companyName` (string, optional) — The name of the Company associated with the quote’s buyer. For B2C customers and guest shoppers, this is the name of their business, if provided.
- `phoneNumber` (string, optional) — The buyer’s phone number.

### quote_PUT_POST

- `quoteId` (integer, optional) — The internal numeric ID of the sales quote.
- `quoteUrl` (string, optional) — The storefront URL for the quote.

### RfqQuoteIdPutResponsesContentApplicationJsonSchemaMeta

- `message` (string, optional)

### ResponseErrorData

- `errMsg` (string, optional)

### ResponseErrorMeta

- `message` (string, optional)

### ProductListItemsOptionsItems

- `optionId` (integer, optional) — The unique identifier for the line item’s variant or modifier option.
- `optionValue` (string, optional) — The unique identifier for the line item’s selected option value.
- `optionLabel` (string, optional) — The name of the line item’s selected option value.
- `optionName` (string, optional) — The name of the line item’s variant or modifier option.

## Examples

**Request**

```json
{}
```

**Response**

```json
{
  "code": 1.1,
  "data": {
    "quoteId": 123456,
    "quoteUrl": "https://mybcstore.com/quote/?id=195&date=1622618606"
  },
  "meta": {
    "message": "string"
  }
}
```

**SDK Code**

```python
import requests

url = "https://api-b2b.bigcommerce.com/api/v3/io/rfq/123456"

payload = {}
headers = {
    "X-Auth-Token": "<apiKey>",
    "Content-Type": "application/json"
}

response = requests.put(url, json=payload, headers=headers)

print(response.json())
```

```javascript
const url = 'https://api-b2b.bigcommerce.com/api/v3/io/rfq/123456';
const options = {
  method: 'PUT',
  headers: {'X-Auth-Token': '<apiKey>', 'Content-Type': 'application/json'},
  body: '{}'
};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io"
)

func main() {

	url := "https://api-b2b.bigcommerce.com/api/v3/io/rfq/123456"

	payload := strings.NewReader("{}")

	req, _ := http.NewRequest("PUT", url, payload)

	req.Header.Add("X-Auth-Token", "<apiKey>")
	req.Header.Add("Content-Type", "application/json")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby
require 'uri'
require 'net/http'

url = URI("https://api-b2b.bigcommerce.com/api/v3/io/rfq/123456")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Put.new(url)
request["X-Auth-Token"] = '<apiKey>'
request["Content-Type"] = 'application/json'
request.body = "{}"

response = http.request(request)
puts response.read_body
```

```java
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.put("https://api-b2b.bigcommerce.com/api/v3/io/rfq/123456")
  .header("X-Auth-Token", "<apiKey>")
  .header("Content-Type", "application/json")
  .body("{}")
  .asString();
```

```php
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('PUT', 'https://api-b2b.bigcommerce.com/api/v3/io/rfq/123456', [
  'body' => '{}',
  'headers' => [
    'Content-Type' => 'application/json',
    'X-Auth-Token' => '<apiKey>',
  ],
]);

echo $response->getBody();
```

```csharp
using RestSharp;

var client = new RestClient("https://api-b2b.bigcommerce.com/api/v3/io/rfq/123456");
var request = new RestRequest(Method.PUT);
request.AddHeader("X-Auth-Token", "<apiKey>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift
import Foundation

let headers = [
  "X-Auth-Token": "<apiKey>",
  "Content-Type": "application/json"
]
let parameters = [] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://api-b2b.bigcommerce.com/api/v3/io/rfq/123456")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "PUT"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```