Papa John's API endpoint
Returns the promotions a Papa John's US or Canada restaurant is currently running. Each offer carries its redemption code, title, description, offer price and — where the deal advertises a saving — the struck-through regular price, plus its artwork and deal-builder link. Pass a store_id from GET /papajohns/store or GET /papajohns/nearby: promotions are store-specific, and the national response is largely placeholders prompting the customer to choose a store, which are omitted here rather than returned as real offers.
/papajohns/dealsQuery parameters:
store_id (optional) — restaurant id from
/papajohns/store or
/papajohns/nearby. Omit for national promotions.Notable response behavior:
store_id. Promotions are store-specific. The national response
is largely locked placeholders prompting the customer to choose a store;
those carry no id or offer code and are omitted here rather than returned as
real offers. national_default reports which mode you got.offer_code is the code the deal is redeemed with, and url is its
deal-builder link.regular_price is the struck-through pre-offer price and is present only
when the deal actually advertises a saving — a deal that does not is not
given a fake one.price 0.store_id returns a 400.| Field | Filled in, of 17 checked | Values in the sample |
|---|---|---|
| id | 17 | |
| offer_code | 17 | |
| title | 17 | “The Works // Medium” and 15 other values |
| description | 17 | “A medium The Works pizza on Original or New York Style crus…” and 16 other values |
| price | 12 | 5 to 20.99, median 8.99 |
| regular_price | 6 | 6.99 to 23.49, median 9.49 |
| tag | 12 | “Featured Deal” and 7 other values |
| image_url | 17 | papajohns.com |
| url | 2 | papajohns.com |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| store_id | string | No | Restaurant id from GET /papajohns/store or GET /papajohns/nearby. Omit for national promotions. | 5054 | |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/papajohns/deals" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"store_id": 5054,
"national_default": false,
"deals": [
{
"id": "66262",
"offer_code": "EDNJX",
"title": "Ultimate Pepperoni Pizza",
"description": "A large original crust pizza loaded with pepperoni, a parmesan-romano blend, and pizza sauce.",
"price": 12.99,
"regular_price": 23.49,
"tag": "Featured Deal",
"image_url": "https://www.papajohns.com/static-assets/a/images/web/hero/2026/p9-2026-ultpepp-deal.jpg",
"url": "https://www.papajohns.com/order/dealbuilder?dealId=66262&offerCode=EDNJX"
}
],
"count": 16,
"source_url": "https://www.papajohns.com/api/trpc/deals.getByStore?input={\"json\":{\"storeId\":5054}}",
"fetched_at": "2026-09-06T09:00:00Z"
}
}Request schema
No body schema
Response schema
#/definitions/papajohns.dealsResponseDoc
| 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 | papajohns.DealsResponse | No | ||||
| data.count | integer | No | 16 | |||
| data.deals | array | No | ||||
| data.deals[].description | string | No | ||||
| data.deals[].id | string | No | 66262 | |||
| data.deals[].image_url | string | No | ||||
| data.deals[].offer_code | string | No | EDNJX | OfferCode is the code the offer is redeemed with. | ||
| data.deals[].price | number | No | 12.99 | Price is the offer price where the deal advertises one. A deal whose price depends on what the customer builds reports 0. | ||
| data.deals[].regular_price | number | No | 23.49 | RegularPrice is the struck-through pre-offer price, present only when the deal actually advertises a saving. | ||
| data.deals[].tag | string | No | Featured Deal | Tag is the merchandising label, e.g. "Featured Deal". | ||
| data.deals[].title | string | No | Ultimate Pepperoni Pizza | |||
| data.deals[].url | string | No | URL is the deal-builder link for this offer. | |||
| data.fetched_at | string | No | ||||
| data.national_default | boolean | No | false | NationalDefault is true when no store was selected. National promotions are frequently placeholders prompting the customer to pick a store, so a caller should prefer passing a store_id. | ||
| data.source_url | string | No | ||||
| data.store_id | integer | No | 5054 | |||
| 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 |
| 404 | Not Found | #/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/papajohns/deals" \
-H "x-api-key: $CRAWLORA_API_KEY"