7NOW API endpoint
Returns every promotional campaign a store currently advertises -- the headline, body copy, legal terms and artwork behind offers like "$6.99 Pizza" or "2/$5 Gatorade 28oz". This is campaign-level and complements the item-level views: GET /7now/deals answers "which items are discounted and why", while this answers "what is this store advertising, and on what terms". The full legal terms are available nowhere else. Each campaign points somewhere: promo_ids[] feed GET /7now/promotion (or GET /7now/combo when the campaign advertises a bundle), while a category campaign instead carries target_id, a category_id GET /7now/category accepts. store_id comes from GET /7now/stores; lat and lon are accepted but inert (store_id alone selects the store).
/7now/offersQuery 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, offers[], count, source_url, and fetched_at.
Each offer carries offer_id, title, description (shopper-facing copy), name (upstream's internal campaign name, which usually encodes the run dates), legal_terms, button_text, image_url, web_image_url, sort_order, promo_ids[], target_entity, target_id, and target_url.
Notes on the fields:
promo_ids is an array. A campaign usually points at one promotion, but a multi-product campaign genuinely covers several — upstream packs them into one comma-separated string, which is split here so each id is individually usable.target_entity is what the campaign opens: promo_items for a promotion, Category for a department. A campaign with no destination reports none upstream and is omitted here.target_id is set for a non-promotion target — for a Category campaign it is a category_id.| Field | Filled in, of 4 checked | Values in the sample |
|---|---|---|
| offer_id | 4 | |
| title | 3 | “$6.99 Pizza” and 2 other values |
| description | 1 | “Any Whole Pizza $6.99 each” |
| name | 4 | “P4_August_$6.99 Pizza” and 3 other values |
| legal_terms | 4 | median 267 characters |
| image_url | 4 | images.contentstack.io |
| web_image_url | 4 | images.contentstack.io |
| sort_order | 4 | 2 to 9, median 4 |
| promo_ids | 3 | |
| target_entity | 4 | promo_items (3), Category (1) |
| target_url | 4 | “bff://dl/promoItems?onePromoId=6a849a8fa1df2409010c719f” and 3 other values |
| target_id | 1 |
| 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/offers?store_id=39640" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"store_id": "39640",
"offers": [
{
"offer_id": "6a8879a4478334ff62f902d9-sE4Q1s2116PXg7di5yN2tt-7NOW_WEB",
"title": "$6.99 Pizza",
"description": "Any Whole Pizza $6.99 each",
"name": "US_7NOW_$6.99 Pizza_(8/21/26-1/5/2027)",
"legal_terms": "Item must be added to cart for discount to apply. Limit 10 offers per order. While supplies last.",
"image_url": "https://d2l3f85c0g29u8.cloudfront.net/contents/6a8879a4478334ff62f902d9/small.png",
"web_image_url": "https://d2l3f85c0g29u8.cloudfront.net/contents/6a8879a4478334ff62f902d9/large.png",
"sort_order": 2,
"promo_ids": [
"6a849a8fa1df2409010c719f"
],
"target_entity": "promo_items"
}
],
"count": 1,
"source_url": "https://www.7now.com/api/bff/unified-catalog/v1/content/homepage/sections?...§ions=banners",
"fetched_at": "2026-09-06T04:40:00Z"
}
}Request schema
No body schema
Response schema
#/definitions/sevennow.offersResponseDoc
| 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.OffersResponse | No | ||||
| data.count | integer | No | 4 | |||
| data.fetched_at | string | No | ||||
| data.offers | array | No | ||||
| data.offers[].button_text | string | No | ||||
| data.offers[].description | string | No | Any Whole Pizza $6.99 each | |||
| data.offers[].image_url | string | No | ||||
| data.offers[].legal_terms | string | No | ||||
| data.offers[].name | string | No | US_7NOW_$6.99 Pizza_(8/21/26-1/5/2027) | Name is upstream's internal campaign name, e.g. "US_7NOW_$6.99 Pizza_(8/21/26-1/5/2027)". It usually encodes the run dates, which the banner record does not carry as fields. | ||
| data.offers[].offer_id | string | No | 6a8879a4478334ff62f902d9-sE4Q1s2116PXg7di5yN2tt-7NOW_WEB | |||
| data.offers[].promo_ids | array | No | PromoIDs are the promotions this campaign points at. Usually one, but a multi-product campaign (e.g. a brand takeover) genuinely carries several -- upstream packs them into one comma-separated string, which is split here so each id is individually usable. Pass one to GET /7now/promotion for every item it covers, or to GET /7now/combo when the campaign advertises a bundle. | |||
| data.offers[].sort_order | integer | No | 2 | |||
| data.offers[].target_entity | string | No | promo_items | TargetEntity is what tapping the banner opens, e.g. `promo_items` or `Category`. A campaign with no destination reports `none` upstream and is omitted here. | ||
| data.offers[].target_id | string | No | 48395 | TargetID is the entity the banner opens when it is not a promotion -- for a `Category` banner this is a category_id GET /7now/category accepts. | ||
| data.offers[].target_url | string | No | ||||
| data.offers[].title | string | No | $6.99 Pizza | |||
| data.offers[].web_image_url | string | No | ||||
| 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/offers?store_id=39640" \
-H "x-api-key: $CRAWLORA_API_KEY"