Papa John's API endpoint
Returns one Papa John's **India** menu item with its complete customization tree: every size, and for each size every crust, topping, dipping sauce, drizzle, and base sauce with that option's own price in Indian Rupees. The option group flagged base_price carries the item's base price for that size (the crust group on pizzas) rather than an add-on charge; half_price is the surcharge when the option is applied to one half of a pizza. India market only -- prices are Indian Rupees. Use GET /papajohns/india/menu to discover item ids.
/papajohns/india/menu/itemIndia market only. Prices are Indian Rupees (₹).
Query parameters:
item_id (required) — the item's saleitem_id, from
/papajohns/india/menu.Notable response behavior:
base_price carries the item's base price for
that size (the crust group on pizzas) rather than an add-on charge. Every
other group's price is a surcharge.half_price on a choice is the charge when that option is applied to one
half of a pizza; a group with halves_enabled supports half-and-half
selection.selection_rule and selection_spec come from upstream and describe how
many options may be picked, e.g. Exactly 1, or Between 0,10.item_id returns a 404. Deal ids are not item ids — use
/papajohns/india/deal for those.| Field | Filled in, of 3 checked | Values in the sample |
|---|---|---|
| id | 3 | |
| name | 3 | “Large” and 2 other values |
| default | 3 | true in 1 of 3 |
| rank | 3 | 1 to 3, median 2 |
| option_groups | 3 | median 6 entries |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| item_id | string | Yes | Item id (saleitem_id) from GET /papajohns/india/menu | 71 | |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/papajohns/india/menu/item?item_id=71" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"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
}
],
"category": "Pizzas",
"item": {
"id": "71",
"name": "MARGHERITA",
"kind": "item",
"price": 399,
"discounted": false,
"category_id": "6",
"tags": [
"Veg"
],
"customizable": true,
"upsell": false,
"availability": {},
"sizes": [
{
"id": "3",
"name": "Large",
"default": true,
"rank": 1,
"option_groups": [
{
"id": "1",
"name": "Crust",
"selection_rule": "Exactly",
"selection_spec": "1",
"base_price": true,
"halves_enabled": true,
"choices": [
{
"id": "1",
"name": "Original Crust",
"price": 799,
"half_price": 399.5,
"default": true,
"extra": false,
"removable": 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.indiaMenuItemResponseDoc
| 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.IndiaMenuItemResponse | No | ||||
| data.category | string | No | Pizzas | Category is the section this item was found under. | ||
| data.currency | papajohns.IndiaCurrency | No | IndiaCurrency record, 4 fields: code, country_code, locale, name. Described under Papa John's India Deal API. | |||
| data.fetched_at | string | No | ||||
| data.item | papajohns.IndiaMenuItem | No | ||||
| data.item.availability | object | 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.item.availability.blacked_out_channel_ids | array | No | ||||
| data.item.availability.blacked_out_days | array | No | ||||
| data.item.availability.blacked_out_store_ids | array | No | ||||
| data.item.buy_x | integer | No | ||||
| data.item.category_id | string | No | 6 | |||
| data.item.customizable | boolean | No | true | Customizable reports whether the item exposes a size/crust/topping tree. | ||
| data.item.description | string | No | ||||
| data.item.discounted | boolean | No | false | |||
| data.item.get_y | integer | No | ||||
| data.item.id | string | No | 71 | |||
| data.item.image_url | string | No | ||||
| data.item.kind | string | No | item | Kind is "item" for an a la carte product or "deal" for a combo/offer. | ||
| data.item.name | string | No | MARGHERITA | |||
| data.item.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.item.price_type | string | No | BuyXGetY | PriceType is set on deals only: fixedPrice, BuyXGetY, HalfAndHalf, or variablePrice. | ||
| data.item.rank | integer | No | 1 | |||
| data.item.sizes | array | No | Sizes is populated only when include_options=true. | |||
| data.item.sizes[].default | boolean | No | true | |||
| data.item.sizes[].id | string | No | 3 | |||
| data.item.sizes[].name | string | No | Large | |||
| data.item.sizes[].option_groups | array | No | ||||
| data.item.sizes[].option_groups[].base_price | boolean | No | true | |||
| data.item.sizes[].option_groups[].choices | array | No | ||||
| data.item.sizes[].option_groups[].choices[].default | boolean | No | true | |||
| data.item.sizes[].option_groups[].choices[].extra | boolean | No | false | |||
| data.item.sizes[].option_groups[].choices[].half_price | number | No | 399.5 | |||
| data.item.sizes[].option_groups[].choices[].id | string | No | 1 | |||
| data.item.sizes[].option_groups[].choices[].image_url | string | No | ||||
| data.item.sizes[].option_groups[].choices[].name | string | No | Original Crust | |||
| data.item.sizes[].option_groups[].choices[].price | number | No | 799 | |||
| data.item.sizes[].option_groups[].choices[].removable | boolean | No | false | |||
| data.item.sizes[].option_groups[].choices[].strike_off_price | number | No | ||||
| data.item.sizes[].option_groups[].halves_enabled | boolean | No | true | |||
| data.item.sizes[].option_groups[].id | string | No | 1 | |||
| data.item.sizes[].option_groups[].name | string | No | Crust | |||
| data.item.sizes[].option_groups[].selection_rule | string | No | Exactly | |||
| data.item.sizes[].option_groups[].selection_spec | string | No | 1 | |||
| data.item.sizes[].rank | integer | No | 1 | |||
| data.item.strike_off_price | number | No | 499 | |||
| data.item.sub_category_id | string | No | 4 | |||
| data.item.tags | array | No | Tags are the item's dietary/attribute markers, e.g. Veg, Non Veg, Spicy. | |||
| data.item.upsell | boolean | No | false | |||
| data.market | string | No | india | |||
| data.source_url | string | No | ||||
| data.taxes | array | No | IndiaTax record, 4 fields: inclusive, name, type, value. Described under Papa John's India Menu API. | |||
| 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/india/menu/item?item_id=71" \
-H "x-api-key: $CRAWLORA_API_KEY"