Papa John's API endpoint
Use Crawlora's Papa John's India Menu API to extract supported public Papa John's data as structured JSON. This page includes request parameters, cURL examples, response schema, error behavior, credit cost, and a Playground link for testing before integration.
/papajohns/india/menuReturns Papa John's **India** menu with live prices in Indian Rupees, from papajohns.in's own ordering backend. This is the India market only -- prices, items, and availability are India-specific and are not comparable to Papa John's US/Canada data (see GET /papajohns/nutrition for US national reference data). Returns every category with its items and deals: list price, strike-through price where a discount is active, dietary tags (Veg, Non Veg, Spicy), images, and the store/channel/day combinations where an item is blacked out. Set include_options=true to also get each item's full size, crust, topping, sauce, and drizzle tree with per-option prices -- this makes the response very large, so prefer GET /papajohns/india/menu/item for one item's options. Pricing is franchise-wide rather than per-store; store_id, channel_id, and day filter item availability, not price, and only take effect when all three are supplied. Developers commonly use this endpoint for data enrichment, monitoring, research dashboards, internal automation, and agent-native workflows that need repeatable structured public web data. Authentication uses the documented Crawlora headers, and usage is metered with the credit cost shown on this page.
Request parameters are generated from the active endpoint catalog. Required values must be sent before Crawlora can call the upstream public web data source.
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| category_id | string | No | Return only this category id | ||
| store_id | string | No | Hide items blacked out at this store id (see GET /papajohns/india/stores). Only applies together with channel_id and day. | ||
| channel_id | string | No | Order channel. One of: 1 (Delivery), 2 (Take Away), 3 (Dine In), 4 (Drive Through Pickup). Only applies together with store_id and day. Allowed values: 1, 2, 3, 4 | ||
| day | string | No | Weekday. One of: 0 (Sunday), 1 (Monday), 2 (Tuesday), 3 (Wednesday), 4 (Thursday), 5 (Friday), 6 (Saturday). Only applies together with store_id and channel_id. Allowed values: 0, 1, 2, 3, 4, 5, 6 | ||
| tag | string | No | Return only items carrying this tag, e.g. Veg, Non Veg, Spicy. Case-insensitive. | ||
| include_options | boolean | No | Include every item's full size/crust/topping option tree with prices. Default false. | ||
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/papajohns/india/menu?channel_id=1&day=0&include_options=true" \ -H "x-api-key: $CRAWLORA_API_KEY"
Send your scraping API key in the x-api-key header. Use the console API Keys page to rotate or select the active key.
Endpoint usage is metered in credits. The plan prices, included credits, limits, and overage rates below match the active backend billing configuration.
| Plan | Price | Included credits | Daily cap | Rate limit | Overage |
|---|---|---|---|---|---|
| Free | $0/mo | 2,000 | 500 daily credits | 5/min | No overage |
| Starter | $9/mo | 20,000 | 5,000 daily credits | 15/min | $0.75/1,000 overage credits when enabled |
| Growth | $29/mo | 100,000 | 25,000 daily credits | 45/min | $0.45/1,000 overage credits when enabled |
| Pro | $79/mo | 400,000 | No daily cap | 120/min | $0.30/1,000 overage credits |
| Business | $199/mo | 1,200,000 | No daily cap | 300/min | $0.20/1,000 overage credits |
| Enterprise | $499/mo | 5,000,000 | No daily cap | 1,000/min | $0.12/1,000 overage credits |
This endpoint is executed through Crawlora's managed scraping infrastructure.
- **Pricing is franchise-wide, not per-store.** `store_id`, `channel_id`, and `day` filter item *availability*, never price. - **The availability filter needs all three of `store_id`, `channel_id`, and `day`.** Upstream blacks an item out only at a specific store × channel × day combination, so a partial selection cannot hide anything. `filters.availability_filter_applied` reports whether the filter actually ran. - Each item's `availability` lists the blackout combinations (`blacked_out_store_ids`, `blacked_out_channel_ids`, `blacked_out_days`). Empty lists mean the item is available everywhere. - Items and deals share one upstream rank space and are returned merged in that order, so a deal can appear between two a la carte items. Filter on `kind` (`item` or `deal`) to separate them. - `include_options=true` makes the response substantially larger (roughly 1MB for the whole catalog versus ~58KB without). Prefer [`/papajohns/india/menu/item`](papajohns-india-menu-item.md) for one item. - A deal (`kind` is `deal`) whose price is computed rather than fixed reports `price` `0` — read `price_type` instead. See [`/papajohns/india/deal`](papajohns-india-deal.md) for a deal's full composition. - `taxes` carries the franchise tax applied on top of menu prices; menu prices are pre-tax unless a tax is marked `inclusive`. - An unknown `channel_id` or `day` returns a `400`. Example response: ```json {"code":200,"msg":"OK","data":{"market":"india","currency":{"code":"₹","name":"Indian Rupee","locale":"en-IN","country_code":"91"},"taxes":[{"name":"GST","type":"percentage","value":5,"inclusive":false}],"tags":["Veg","Non Veg","Spicy"],"categories":[{"id":"6","name":"Pizzas","rank":7,"items":[{"id":"60","name":"CHICKEN PEPPERONI","kind":"item","description":"Smoky chicken pepperoni, melty real mozzarella, and pizza sauce.","price":679,"discounted":false,"category_id":"6","rank":58,"tags":["Spicy","Non Veg"],"image_url":"https://d1t8cetepnp3l.cloudfront.net/pj_webapp/images/Website/chicken-pepperoni4180.png","customizable":true,"upsell":false,"availability":{}}],"subcategories":[{"id":"8","name":"India Special","items":[]}],"item_count":38}],"item_count":114,"filters":{"availability_filter_applied":false},"source_url":"https://papajohns.suntechsolutions.us/api/newmenu?store_id=0&day=6&channel_id=0","fetched_at":"2026-09-05T09:00:00Z"}} ```
Crawlora does not silently return bad data when the upstream page cannot be used.
| Status | Common failure case |
|---|---|
| 400 | Invalid input or missing required parameter |
| 429 | Plan or endpoint rate limit exceeded |
| 500 | Internal execution error |
| 502 | Upstream platform failed, returned unusable HTML, or served a challenge page that could not be resolved |
When possible, Crawlora returns structured error context so your integration can retry, back off, or inspect the request.
| 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 |
{
"code": 200,
"msg": "OK",
"data": {
"market": "india",
"currency": {
"code": "₹",
"name": "Indian Rupee",
"locale": "en-IN",
"country_code": "91"
},
"taxes": [
{
"name": "GST",
"type": "percentage",
"value": 5,
"inclusive": false
}
],
"tags": [
"Veg",
"Non Veg",
"Spicy"
],
"categories": [
{
"id": "6",
"name": "Pizzas",
"rank": 7,
"items": [
{
"id": "60",
"name": "CHICKEN PEPPERONI",
"kind": "item",
"description": "Smoky chicken pepperoni, melty real mozzarella, and pizza sauce.",
"price": 679,
"discounted": false,
"category_id": "6",
"rank": 58,
"tags": [
"Spicy",
"Non Veg"
],
"image_url": "https://d1t8cetepnp3l.cloudfront.net/pj_webapp/images/Website/chicken-pepperoni4180.png",
"customizable": true,
"upsell": false,
"availability": {}
}
],
"subcategories": [
{
"id": "8",
"name": "India Special",
"items": []
}
],
"item_count": 38
}
],
"item_count": 114,
"filters": {
"availability_filter_applied": false
},
"source_url": "https://papajohns.suntechsolutions.us/api/newmenu?store_id=0&day=6&channel_id=0",
"fetched_at": "2026-09-05T09:00:00Z"
}
}Request schema
No body schema
Response schema
#/definitions/papajohns.indiaMenuResponseDoc
| 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.IndiaMenuResponse | No | ||||
| data.categories | array | No | ||||
| data.categories[].description | string | No | ||||
| data.categories[].id | string | No | 6 | |||
| data.categories[].image_url | string | No | ||||
| data.categories[].item_count | integer | No | 29 | |||
| data.categories[].items | array | No | ||||
| data.categories[].items[].availability | unknown | No | Availability lists the store/channel/day combinations where this item is blacked out. The item is unavailable only where all three match; empty lists mean it is available everywhere. | |||
| data.categories[].items[].buy_x | integer | No | ||||
| data.categories[].items[].category_id | string | No | 6 | |||
| data.categories[].items[].customizable | boolean | No | true | Customizable reports whether the item exposes a size/crust/topping tree. | ||
| data.categories[].items[].description | string | No | ||||
| data.categories[].items[].discounted | boolean | No | false | |||
| data.categories[].items[].get_y | integer | No | ||||
| data.categories[].items[].id | string | No | 71 | |||
| data.categories[].items[].image_url | string | No | ||||
| data.categories[].items[].kind | string | No | item | Kind is "item" for an a la carte product or "deal" for a combo/offer. | ||
| data.categories[].items[].name | string | No | MARGHERITA | |||
| data.categories[].items[].price | number | No | 399 | Price is the item's list price in the franchise currency. A deal with a computed price (BuyXGetY, HalfAndHalf, variablePrice) reports 0 here -- read price_type instead. | ||
| data.categories[].items[].price_type | string | No | BuyXGetY | PriceType is set on deals only: fixedPrice, BuyXGetY, HalfAndHalf, or variablePrice. | ||
| data.categories[].items[].rank | integer | No | 1 | |||
| data.categories[].items[].sizes | array | No | Sizes is populated only when include_options=true. | |||
| data.categories[].items[].sizes[].default | boolean | No | true | |||
| data.categories[].items[].sizes[].id | string | No | 3 | |||
| data.categories[].items[].sizes[].name | string | No | Large | |||
| data.categories[].items[].sizes[].option_groups | array | No | ||||
| data.categories[].items[].sizes[].option_groups[].base_price | boolean | No | true | |||
| data.categories[].items[].sizes[].option_groups[].choices | array | No | ||||
| data.categories[].items[].sizes[].option_groups[].choices[].default | boolean | No | true | |||
| data.categories[].items[].sizes[].option_groups[].choices[].extra | boolean | No | false | |||
| data.categories[].items[].sizes[].option_groups[].choices[].half_price | number | No | 399.5 | |||
| data.categories[].items[].sizes[].option_groups[].choices[].id | string | No | 1 | |||
| data.categories[].items[].sizes[].option_groups[].choices[].image_url | string | No | ||||
| data.categories[].items[].sizes[].option_groups[].choices[].name | string | No | Original Crust | |||
| data.categories[].items[].sizes[].option_groups[].choices[].price | number | No | 799 | |||
| data.categories[].items[].sizes[].option_groups[].choices[].removable | boolean | No | false | |||
| data.categories[].items[].sizes[].option_groups[].choices[].strike_off_price | number | No | ||||
| data.categories[].items[].sizes[].option_groups[].halves_enabled | boolean | No | true | |||
| data.categories[].items[].sizes[].option_groups[].id | string | No | 1 | |||
| data.categories[].items[].sizes[].option_groups[].name | string | No | Crust | |||
| data.categories[].items[].sizes[].option_groups[].selection_rule | string | No | Exactly | |||
| data.categories[].items[].sizes[].option_groups[].selection_spec | string | No | 1 | |||
| data.categories[].items[].sizes[].rank | integer | No | 1 | |||
| data.categories[].items[].strike_off_price | number | No | 499 | |||
| data.categories[].items[].sub_category_id | string | No | 4 | |||
| data.categories[].items[].tags | array | No | Tags are the item's dietary/attribute markers, e.g. Veg, Non Veg, Spicy. | |||
| data.categories[].items[].upsell | boolean | No | false | |||
| data.categories[].name | string | No | Pizzas | |||
| data.categories[].rank | integer | No | 7 | |||
| data.categories[].subcategories | array | No | ||||
| data.categories[].subcategories[].id | string | No | 8 | |||
| data.categories[].subcategories[].items | array | No | ||||
| data.categories[].subcategories[].items[].availability | unknown | No | Availability lists the store/channel/day combinations where this item is blacked out. The item is unavailable only where all three match; empty lists mean it is available everywhere. | |||
| data.categories[].subcategories[].items[].buy_x | integer | No | ||||
| data.categories[].subcategories[].items[].category_id | string | No | 6 | |||
| data.categories[].subcategories[].items[].customizable | boolean | No | true | Customizable reports whether the item exposes a size/crust/topping tree. | ||
| data.categories[].subcategories[].items[].description | string | No | ||||
| data.categories[].subcategories[].items[].discounted | boolean | No | false | |||
| data.categories[].subcategories[].items[].get_y | integer | No | ||||
| data.categories[].subcategories[].items[].id | string | No | 71 | |||
| data.categories[].subcategories[].items[].image_url | string | No | ||||
| data.categories[].subcategories[].items[].kind | string | No | item | Kind is "item" for an a la carte product or "deal" for a combo/offer. | ||
| data.categories[].subcategories[].items[].name | string | No | MARGHERITA | |||
| data.categories[].subcategories[].items[].price | number | No | 399 | Price is the item's list price in the franchise currency. A deal with a computed price (BuyXGetY, HalfAndHalf, variablePrice) reports 0 here -- read price_type instead. | ||
| data.categories[].subcategories[].items[].price_type | string | No | BuyXGetY | PriceType is set on deals only: fixedPrice, BuyXGetY, HalfAndHalf, or variablePrice. | ||
| data.categories[].subcategories[].items[].rank | integer | No | 1 | |||
| data.categories[].subcategories[].items[].sizes | array | No | Sizes is populated only when include_options=true. | |||
| data.categories[].subcategories[].items[].sizes[].default | boolean | No | true | |||
| data.categories[].subcategories[].items[].sizes[].id | string | No | 3 | |||
| data.categories[].subcategories[].items[].sizes[].name | string | No | Large | |||
| data.categories[].subcategories[].items[].sizes[].option_groups | array | No | ||||
| data.categories[].subcategories[].items[].sizes[].option_groups[].base_price | boolean | No | true | |||
| data.categories[].subcategories[].items[].sizes[].option_groups[].choices | array | No | ||||
| data.categories[].subcategories[].items[].sizes[].option_groups[].choices[].default | boolean | No | true | |||
| data.categories[].subcategories[].items[].sizes[].option_groups[].choices[].extra | boolean | No | false | |||
| data.categories[].subcategories[].items[].sizes[].option_groups[].choices[].half_price | number | No | 399.5 | |||
| data.categories[].subcategories[].items[].sizes[].option_groups[].choices[].id | string | No | 1 | |||
| data.categories[].subcategories[].items[].sizes[].option_groups[].choices[].image_url | string | No | ||||
| data.categories[].subcategories[].items[].sizes[].option_groups[].choices[].name | string | No | Original Crust | |||
| data.categories[].subcategories[].items[].sizes[].option_groups[].choices[].price | number | No | 799 | |||
| data.categories[].subcategories[].items[].sizes[].option_groups[].choices[].removable | boolean | No | false | |||
| data.categories[].subcategories[].items[].sizes[].option_groups[].choices[].strike_off_price | number | No | ||||
| data.categories[].subcategories[].items[].sizes[].option_groups[].halves_enabled | boolean | No | true | |||
| data.categories[].subcategories[].items[].sizes[].option_groups[].id | string | No | 1 | |||
| data.categories[].subcategories[].items[].sizes[].option_groups[].name | string | No | Crust | |||
| data.categories[].subcategories[].items[].sizes[].option_groups[].selection_rule | string | No | Exactly | |||
| data.categories[].subcategories[].items[].sizes[].option_groups[].selection_spec | string | No | 1 | |||
| data.categories[].subcategories[].items[].sizes[].rank | integer | No | 1 | |||
| data.categories[].subcategories[].items[].strike_off_price | number | No | 499 | |||
| data.categories[].subcategories[].items[].sub_category_id | string | No | 4 | |||
| data.categories[].subcategories[].items[].tags | array | No | Tags are the item's dietary/attribute markers, e.g. Veg, Non Veg, Spicy. | |||
| data.categories[].subcategories[].items[].upsell | boolean | No | false | |||
| data.categories[].subcategories[].name | string | No | India Special | |||
| data.currency | papajohns.IndiaCurrency | No | ||||
| data.currency.code | string | No | ₹ | |||
| data.currency.country_code | string | No | 91 | |||
| data.currency.locale | string | No | en-IN | |||
| data.currency.name | string | No | Indian Rupee | |||
| data.fetched_at | string | No | ||||
| data.filters | papajohns.IndiaMenuFilters | No | ||||
| data.filters.availability_filter_applied | boolean | No | false | AvailabilityFilterApplied is false unless store_id, channel_id, and day were all supplied -- the operator's blackout rules need all three. | ||
| data.filters.category_id | string | No | ||||
| data.filters.channel | string | No | Delivery | |||
| data.filters.channel_id | string | No | ||||
| data.filters.day | string | No | ||||
| data.filters.day_name | string | No | Monday | |||
| data.filters.store_id | string | No | ||||
| data.filters.tag | string | No | ||||
| data.item_count | integer | No | 114 | |||
| data.market | string | No | india | |||
| data.source_url | string | No | ||||
| data.tags | array | No | ||||
| data.taxes | array | No | ||||
| data.taxes[].inclusive | boolean | No | false | |||
| data.taxes[].name | string | No | GST | |||
| data.taxes[].type | string | No | percentage | |||
| data.taxes[].value | number | No | 5 | |||
| msg | unknown | No | Msg is the message that describes the result of the request @example "Request successful" |
Use environment variables for secrets and keep Crawlora API keys server-side.
curl -X GET "https://api.crawlora.net/api/v1/papajohns/india/menu?channel_id=1&day=0&include_options=true" \
-H "x-api-key: $CRAWLORA_API_KEY"Crawlora is designed for responsible structured public web data workflows. Customers are responsible for using Crawlora in compliance with applicable laws, third-party rights, target-platform rules, and Crawlora terms.
Read Crawlora terms