Access your ShopSense "Suggested Orders" report via API
| Field | Value |
|---|---|
| Version | 2 |
| Base URL | https://www.locally.com/api/v2/reports/json/{uuid} |
Overview
The Suggested Orders report provides brands with UPC-level restock recommendations for each of their retail partners. Recommendations are driven by recent sales velocity and current on-hand inventory, surfacing products and sizes that have recently sold our or are at risk of stocking out. Suggested Orders reports can be provided at the retailer account-level or at at the store-level, depending on your preference.
The report is accessed in two steps:
- Fetch the Index — retrieves the list of retailer “splits” available for your report
- Fetch a Split — retrieves the paginated suggested order line items for a specific retailer company or store
Authentication
To access your report, you’ll be provided with an API key that authenticates your access to your report only.
Endpoints
1. Get Report Index
Retrieves the list of retailer splits available for a given report.
GET /reports/json/{uuid} |
|---|
curl --request GET \
--url 'https://www.locally.com/api/v2/reports/json/{{uuid}}' \
--header 'Locally-Api-Token: {{API_TOKEN}}'PATH PARAMETERS
| Parameter | Type | Required | Description |
|---|---|---|---|
| uuid | string | Yes | Unique identifier for the brand's report instance. |
EXAMPLE REQUEST
GET https://www.locally.com/api/v2/reports/json/c2e3265e-c27g-463c-b07c-81q3aq1227d0 |
|---|
EXAMPLE RESPONSE
{
"version": 2,
"status": true,
"properties": {
"uuid": "c8e3465e-c13d-453a-b09c-81h3pb1777d9",
"report_date": "2026-02-18"
},
"content": [
{
"split_name": "919",
"first_page": "https://www.locally.com/api/v2/reports/json/{uuid}/919/0",
"total_pages": 1
},
{
"split_name": "127",
"first_page": "https://www.locally.com/api/v2/reports/json/{uuid}/127/0",
"total_pages": 3
},
...
]
}
RESPONSE FIELDS — TOP LEVEL
| Field | Type | Description |
|---|---|---|
| version | integer | API response version. Currently 2. |
| status | boolean | true if the request was successful. |
| properties | object | Metadata about the report. |
| content | array | List of retailer splits available in this report. |
RESPONSE FIELDS — PROPERTIES OBJECT
| Field | Type | Description |
|---|---|---|
| uuid | string | The report UUID, echoed back from the request. |
| report_date | string | The date this report was generated. Format: YYYY-MM-DD. |
RESPONSE FIELDS — CONTENT ITEMS (SPLITS)
| Field | Type | Description |
|---|---|---|
| split_name | string | Unique identifier for the retailer. By default, this is the Locally store_company_id. For store-level reports, this will be the Locally store_id. Used to construct the split URL. |
| first_page | string | Full URL to the first page of this retailer's suggested orders. |
| total_pages | integer | Total number of pages available for this retailer's split. |
2. Get Retailer Split (Suggested Orders)
Retrieves a paginated list of suggested restock orders for a specific retailer. Can be company or store-level, depending on your report.
GET /reports/json/{uuid}/{split_name}/{page} |
|---|
PATH PARAMETERS
| Parameter | Type | Required | Description |
|---|---|---|---|
| uuid | string | Yes | The report UUID. |
| split_name | string | Yes | The retailer identifier (by default, the Locally store_company_id or store_id), obtained from the Index response. |
| page | integer | Yes | Zero-indexed page number. Start with 0. Increment through total_pages − 1 |
EXAMPLE REQUEST
GET https://www.locally.com/api/v2/reports/json/{uuid}/919/0 |
|---|
EXAMPLE RESPONSE
{
"version": 2,
"status": true,
"properties": {
"uuid": "{uuid}",
"current_page": 0,
"split_id": "shopsense-suggested-orders-{brand-name}-20260218110118-919",
"split_name": "919",
"total_pages": 1,
"total": 75,
"per_page": 100,
"report_date": "2026-02-18"
},
"content": [
{
"retailer_name": "Trailside Depot",
"store_name": "Trailside Depot",
"store_id": "919",
"vendor_id": "13579",
"product_id": "2359528",
"upc": "120076326375",
"product_name": "Wavebound Shorts",
"product_vertical": "Apparel & Accessories",
"product_category": "Outerwear Bottoms",
"season": "Spring 26",
"brand_product_no": "BKD457",
"gender": "Mens",
"color": "Bright Blue",
"size": "L",
"size_2": "",
"stores_carrying_product": "3",
"stores_in_stock": "3",
"total_quantity_on_hand": "5",
"total_expected_28_day_sales": "116",
"total_expected_quantity_28d": "0",
"suggested_order_qty": "111",
"suggested_order_value": "72039",
"msrp_usd": "649",
"msrp_local": "649",
"local_currency": "USD",
"sales_last_7_days": "19",
"sales_last_14_days": "39",
"sales_last_21_days": "81",
"sales_last_28_days": "116",
"sales_last_365_days": "206"
},
…
]
}
RESPONSE FIELDS — TOP LEVEL
| Field | Type | Description |
|---|---|---|
| version | integer | API response version. Currently 2. |
| status | boolean | true if the request was successful. |
| properties | object | Metadata about this split. |
| content | array | List of suggested order line items for this retailer. |
RESPONSE FIELDS — PROPERTIES OBJECT
| Field | Type | Description |
|---|---|---|
| uuid | string | The report UUID. |
| current_page | integer | The page number returned (zero-indexed). |
| split_id | string | Internal identifier for this split. |
| split_name | string | The retailer identifier for this split. |
| total_pages | integer | Total number of pages in this split. |
| total | integer | Total number of suggested order line items across all pages. |
| per_page | integer | Maximum number of items returned per page. |
| report_date | string | The date this report was generated. Format: YYYY-MM-DD. |
Each item in content represents a single suggested restock recommendation at the UPC level (product + color + size combination).
CONTENT ITEMS — PRODUCT IDENTIFICATION
| Field | Type | Description |
|---|---|---|
| retailer_name | string | Display name of the retailer. |
| store_name | string | Display name of individual retail location |
| store_id | string | Locally store identifier for the individual retail location. For store-level reports this matches the split_name. For retailer-level reports (keyed on store_company_id), this identifies the specific store the line item belongs to. |
| vendor_id | string | Brand unique id assigned to the account, scoped per store. For retailer-level reports (store_company_id), each store may have a distinct vendor_id; if there are multiple vendor_id's for a store, the field will list all. |
| product_id | string | Locally product identifier. Multiple UPCs may share the same product_id (e.g. different sizes of the same style). |
| upc | string | Universal Product Code. |
| product_name | string | Display name of the product. |
| product_vertical | string | Broad product category (e.g. "Apparel & Accessories"). |
| product_category | string | Specific product type (e.g. "Outerwear Tops", "Base Layer Bottoms"). |
| season | string | Season this product is associated with (e.g. "Spring 26"). |
| brand_product_no | string | Unique brand product id assigned to this UPC (e.g. a SKU, Part Number, etc.) |
| gender | string | Gender designation. Expected values: "Mens", "Womens", "Unisex". |
| color | string | Color name for this variant |
| size | string | Primary size (e.g. "M", "L", "8", "One Size"). |
| size_2 | string | Secondary size dimension (e.g. footwear width). Empty string if not applicable. |
CONTENT ITEMS — INVENTORY & DISTRIBUTION
| Field | Type | Description |
|---|---|---|
| stores_carrying_product | string | Number of the retailer's store locations that carry this UPC. |
| stores_in_stock | string | Number of the retailer's locations currently showing this UPC as in-stock. |
| total_quantity_on_hand | string | Total units currently on hand across all of the retailer's locations. |
CONTENT ITEMS — SALES VELOCITY
| Field | Type | Description |
|---|---|---|
| sales_last_7_days | string | Units sold in the last 7 days. |
| sales_last_14_days | string | Units sold in the last 14 days. |
| sales_last_21_days | string | Units sold in the last 21 days. |
| sales_last_28_days | string | Units sold in the last 28 days. |
| sales_last_365_days | string | Units sold in the last 365 days. |
CONTENT ITEMS — RECOMMENDATION
| Field | Type | Description |
|---|---|---|
| total_expected_28_day_sales | string | Projected units expected to sell over the next 28 days, based on sales velocity. |
| suggested_order_qty | string | Recommended restock quantity. Calculated as the gap between expected 28-day demand and current on-hand inventory. |
| suggested_order_value | string | Estimated retail value of the suggested order (suggested_order_qty × msrp_usd). May be empty string if MSRP is unavailable. |
CONTENT ITEMS — PRICING
| Field | Type | Description |
|---|---|---|
| msrp_usd | string | Manufacturer's Suggested Retail Price in USD. May be empty string if unavailable. |
| msrp_local | string | MSRP in the retailer's local currency. Returns "-1" if unavailable. |
| local_currency | string | ISO 4217 currency code for the retailer's local currency (e.g. "USD"). |
Report Levels: Retailer-Level vs. Store-Level
Suggested Orders reports are delivered at one of two levels, which determines how splits are keyed and how line items are scoped:
- Retailer-level (default): Splits are keyed on the Locally
store_company_id, so each split represents an entire retail company. Line items are aggregated across the company's locations, and thestore_idfield identifies the individual store a given line item belongs to. Becausevendor_idis scoped per store, a single retailer-level split may contain multiplevendor_idvalues. - Store-level: Splits are keyed on the Locally
store_id, so each split represents a single retail location. Thesplit_namematches thestore_idof every line item in that split.
Pagination
Splits with total_pages > 1 require multiple requests to retrieve all line items. Pages are zero-indexed. To retrieve all pages for a given split:
- Fetch first_page from the Index response.
- Note total_pages from the split's properties.
- Increment the trailing page number in the URL from 0 through
total_pages − 1.
EXAMPLE — SPLIT WITH 3 PAGES
GET /reports/json/{uuid}/{split_name}/0
GET /reports/json/{uuid}/{split_name}/1
GET /reports/json/{uuid}/{split_name}/2
Known Edge Cases & Notes
- Numeric values are returned as strings. All quantity, sales, and price fields use the string type despite containing numeric data. Parse accordingly.
- MSRP may be missing. When unavailable, msrp_usd will be an empty string, msrp_local will be "-1", and suggested_order_value will also be empty.
product_idis Locally's style number and is not a unique SKU key. Multiple records can share a product_id because it represents the style, not the individual size/color. Use upc or your brand_product_no as the unique identifier.vendor_idis scoped per store. In retailer-level reports (keyed on store_company_id), different stores within the same split may have different vendor_id values, and a store may list multiple vendor_id's.

