7NOW API endpoint
Enumerates every value GET /7now/category accepts for a store, so callers do not have to pull the full catalog to discover them. 7NOW has two disjoint id spaces behind that one parameter: `departments` are the store's 10 permanent browsable departments (Fresh Food, Drinks, Snacks, Candy, Ice Cream, Beer & Seltzer, Tobacco, Grocery, Household, Personal Care), and `shelves` are the merchandising rows the homepage currently features ("$2 Deals", "What's New", "Only At 7-Eleven", seasonal ones). Both work as category_id. Shelves rotate with promotions and seasons, so re-read them rather than caching ids long-term. store_id comes from GET /7now/stores; lat and lon are accepted but inert (store_id alone selects the store).
/7now/categories7NOW uses one parameter for two disjoint id spaces, and both work as category_id:
departments — the store's permanent browsable departments: Fresh Food, Drinks, Snacks, Candy, Ice Cream, Beer & Seltzer, Tobacco, Grocery, Household, Personal Care.shelves — the merchandising rows the homepage currently features, e.g. $2 Deals, What's New, Only At 7-Eleven, Gold Pass Exclusive Deals, and seasonal ones like Flavors of Fall. These rotate with promotions and seasons, so re-read them rather than caching ids long-term.Query parameters:
store_id (required) — 7NOW store id, from GET /7now/stores, e.g. 39640.lat (optional) — accepted but inert: store_id alone selects the store. Responses are byte-identical with any value or none — measured live against three stores. Forwarded upstream for fidelity with 7now.com's own client. e.g. 40.712775.lon (optional) — accepted but inert, see lat. e.g. -74.005973.Response includes store_id, departments[], shelves[], count (total across both), source_url, and fetched_at.
Each entry in departments[] and shelves[] carries id, name, and kind (one of department, shelf). Shelves additionally carry item_count (how many items the shelf holds upstream) and display_order (its position on the store homepage); departments carry neither — use GET /7now/category's stats.total for a department's item count.
| Field | Filled in, of 14 checked | Values in the sample |
|---|---|---|
| id | 14 | |
| name | 14 | “Hot Bites” and 13 other values |
| kind | 14 | shelf in all 14 |
| item_count | 14 | 3 to 76, median 29 |
| display_order | 14 | 3 to 22, median 14 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| store_id | string | Yes | 7NOW store id, from GET /7now/stores. | 39640 | |
| lat | number | No | Accepted but inert -- store_id alone selects the store; responses are byte-identical with any value or none. Forwarded upstream for fidelity with 7now.com's own client. | 40.712775 | |
| lon | number | No | Accepted but inert -- see lat. | -74.005973 | |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/7now/categories?store_id=39640" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"store_id": "39640",
"departments": [
{
"id": "48423",
"name": "Fresh Food",
"kind": "department"
},
{
"id": "48395",
"name": "Drinks",
"kind": "department"
},
{
"id": "48397",
"name": "Snacks",
"kind": "department"
}
],
"shelves": [
{
"id": "78499",
"name": "$2 Deals",
"kind": "shelf",
"item_count": 25,
"display_order": 13
},
{
"id": "48493",
"name": "What's New",
"kind": "shelf",
"item_count": 31,
"display_order": 18
}
],
"count": 25,
"source_url": "https://www.7now.com/api/bff/unified-catalog/v1/content/homepage?...",
"fetched_at": "2026-09-05T22:10:00Z"
}
}Request schema
No body schema
Response schema
#/definitions/sevennow.categoriesResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | Code is the HTTP status code or a custom code used to indicate the result of the request @example 200 | |||
| data | sevennow.CategoriesResponse | No | ||||
| data.count | integer | No | 25 | |||
| data.departments | array | No | Departments are the store's permanent browsable departments. | |||
| data.departments[].display_order | integer | No | 18 | DisplayOrder is the shelf's position on the store homepage. Only meaningful for shelves. | ||
| data.departments[].id | string | No | 48395 | |||
| data.departments[].item_count | integer | No | 25 | ItemCount is how many items the shelf holds upstream. Only populated for shelves -- departments do not report a count here (use GET /7now/category's stats.total for those). | ||
| data.departments[].kind | string | No | department | Kind is `department` for the store's permanent browsable departments (Drinks, Snacks, Fresh Food, ...) or `shelf` for a merchandising row the homepage is currently featuring ("$2 Deals", "What's New"). Both are valid category_id values; shelves rotate, departments do not. | ||
| data.departments[].name | string | No | Drinks | |||
| data.fetched_at | string | No | ||||
| data.shelves | array | No | Shelves are the merchandising rows the homepage currently features. These rotate with promotions and seasons, so re-read them rather than caching ids long-term. | |||
| data.shelves[].display_order | integer | No | 18 | DisplayOrder is the shelf's position on the store homepage. Only meaningful for shelves. | ||
| data.shelves[].id | string | No | 48395 | |||
| data.shelves[].item_count | integer | No | 25 | ItemCount is how many items the shelf holds upstream. Only populated for shelves -- departments do not report a count here (use GET /7now/category's stats.total for those). | ||
| data.shelves[].kind | string | No | department | Kind is `department` for the store's permanent browsable departments (Drinks, Snacks, Fresh Food, ...) or `shelf` for a merchandising row the homepage is currently featuring ("$2 Deals", "What's New"). Both are valid category_id values; shelves rotate, departments do not. | ||
| data.shelves[].name | string | No | Drinks | |||
| data.source_url | string | No | ||||
| data.store_id | string | No | 39640 | |||
| msg | unknown | No | Msg is the message that describes the result of the request @example "Request successful" |
| Status | Description | Schema |
|---|---|---|
| 400 | Bad Request | #/definitions/app.Response |
| 429 | Too Many Requests | #/definitions/app.Response |
| 503 | Service Unavailable | #/definitions/app.Response |
Use environment variables for secrets and keep Crawlora API keys server-side.
curl -X GET "https://api.crawlora.net/api/v1/7now/categories?store_id=39640" \
-H "x-api-key: $CRAWLORA_API_KEY"