> For the complete documentation index, see [llms.txt](https://docs-shpf.bsscommerce.com/b2b-wholesale-solution/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs-shpf.bsscommerce.com/b2b-wholesale-solution/api-integration/public-apis/public-apis-for-uploading.md).

# 🔗Public APIs for Uploading

When a request is made, the app automatically uploads all **enabled rules** to your **active theme**, keeping your storefront pricing logic up-to-date.

***

## 🔑 Get the Access Key

1. Generate your API Access Key in the app dashboard under **API Integration → Public APIs**.
2. **Security Note:** Your Secret Key is displayed **only once** upon generation for enhanced security. Copy and store it in a secure password manager or server environment variable immediately.
3. Include the key in your request payload or header for authentication.

***

## 🔐 Authentication

All requests require an **Access Key** generated in your app.\
You can include this in the request body or as a Bearer token header:

```http
Authorization: Bearer <accessKey>
```

> ⚠️ **Important:** Each endpoint has a rate limit of **1 request per module per 5 minutes**.\
> Exceeding this limit returns a `429 Too Many Requests` response.

***

### I. 🧾 Upload Custom Pricing Rules

Upload all active **Custom Pricing** rules from your app or system to Shopify.

#### Endpoint

```http
POST https://b2b-solution-public-api.bsscommerce.com/api/v1/rule/upload
```

#### Request Body

| Field       | Type   | Required | Description                                            |
| ----------- | ------ | -------- | ------------------------------------------------------ |
| `domain`    | String | ✅        | Your store’s `myshopify.com` domain                    |
| `accessKey` | String | ✅        | API Access Key generated from the BSS B2B Solution app |

#### Example Request

```bash
curl -X POST "https://b2b-solution-public-api.bsscommerce.com/api/v1/rule/upload" \
  -H "Content-Type: application/json" \
  -d '{
        "domain": "bsscommerce-store.myshopify.com",
        "accessKey": "yt1pRFAU8ARdwQORhz/Ww7vyS+xxxxxxxxxxxxxx"
      }'
```

#### Responses

| Code                    | Meaning             | Notes                                              |
| ----------------------- | ------------------- | -------------------------------------------------- |
| `200 OK`                | Upload successful   | All enabled rules were applied to the active theme |
| `429 Too Many Requests` | Rate limit exceeded | Wait 5 minutes before sending another request      |

***

### II. 📦 Upload Volume Pricing Rules

Upload all active **Quantity-based** or **Volume-based** rules to your store.

#### Endpoint

```http
POST https://b2b-solution-public-api.bsscommerce.com/api/v1/qb/rule/upload
```

#### Request Body

| Field       | Type   | Required | Description                           |
| ----------- | ------ | -------- | ------------------------------------- |
| `domain`    | String | ✅        | Your store’s `myshopify.com` domain   |
| `accessKey` | String | ✅        | API Access Key generated from the app |

#### Example Request

```bash
curl -X POST "https://b2b-solution-public-api.bsscommerce.com/api/v1/qb/rule/upload" \
  -H "Content-Type: application/json" \
  -d '{
        "domain": "bsscommerce-store.myshopify.com",
        "accessKey": "yt1pRFAU8ARdwQORhz/Ww7vyS+xxxxxxxxxxxxxx"
      }'
```

#### Responses

| Code                    | Meaning                     | Notes                              |
| ----------------------- | --------------------------- | ---------------------------------- |
| `200 OK`                | Rules uploaded successfully | Quantity/Amount Breaks were synced |
| `429 Too Many Requests` | Rate limit exceeded         | Wait 5 minutes before retrying     |

***

### III. 💰 Upload Price List Rules

Upload all active **Price List** rules to your Shopify store.

#### Endpoint

```http
POST https://b2b-solution-public-api.bsscommerce.com/api/v1/pl/rule/upload
```

#### Request Body

| Field       | Type   | Required | Description                           |
| ----------- | ------ | -------- | ------------------------------------- |
| `domain`    | String | ✅        | Your store’s `myshopify.com` domain   |
| `accessKey` | String | ✅        | API Access Key generated from the app |

#### Example Request

```bash
curl -X POST "https://b2b-solution-public-api.bsscommerce.com/api/v1/pl/rule/upload" \
  -H "Content-Type: application/json" \
  -d '{
        "domain": "bsscommerce-store.myshopify.com",
        "accessKey": "yt1pRFAU8ARdwQORhz/Ww7vyS+xxxxxxxxxxxxxx"
      }'
```

#### Responses

| Code                    | Meaning                     | Notes                                          |
| ----------------------- | --------------------------- | ---------------------------------------------- |
| `200 OK`                | Rules uploaded successfully | Price List data has been deployed to the theme |
| `429 Too Many Requests` | Rate limit exceeded         | Wait 5 minutes before sending another request  |

***

## 🧠 Data Storage and Capacity Limitations

When uploading rules through these APIs, the data is stored in **Shopify metafields** as JSON.

| Specification           | Details                                                     |
| ----------------------- | ----------------------------------------------------------- |
| **Maximum metafields**  | 10 keys                                                     |
| **Data type**           | JSON                                                        |
| **Max size per key**    | 2,000,000 characters                                        |
| **Total max data size** | \~20,000,000 characters                                     |
| **Exceeding data**      | Any content beyond capacity is safely skipped and reported  |
| **Uploaded content**    | Primarily rule data and minimal setting data                |
| **Active rules only**   | Only enabled rules are uploaded — inactive ones are ignored |

### Partial Upload & Capacity Skip Reporting

If your uploaded rule dataset exceeds Shopify's maximum single metafield capacity, the API avoids total failure by persisting all rules that fit within capacity and returning a structured partial report:

```json
{
  "status": "partial_success",
  "message": "Some rules exceeded metafield capacity and were skipped.",
  "data": {
    "total_rules": 1200,
    "saved_rules": 950,
    "skipped_rules": 250,
    "reason": "SHOPIFY_METAFIELD_CAPACITY_EXCEEDED",
    "skipped_rule_ids": ["rule_951", "rule_952"]
  }
}
```

When this occurs, partition large rule catalogs or prune inactive rules before re-triggering synchronization.

## ✅ Example Automation Flow

1. External system (ERP/CRM) updates B2B rules.
2. System triggers a POST request to the relevant **upload API**.
3. B2B/Wholesale Solution validates data and pushes it to the Shopify metafields.
4. Storefront automatically reflects updated pricing and rule logic.

***

With these **Public Upload APIs**, your development team can fully automate pricing rule synchronization — ensuring your B2B store always delivers accurate, real-time pricing without manual updates.
