Per-store menu and pricing monitoring
Use Papa John's endpoints to turn per-store menu and pricing monitoring into repeatable API requests with documented inputs and JSON responses.
Turn Papa John's public store and menu data into structured JSON across 14 markets — a US/Canada directory browse and coordinate search, full per-store detail with a Google Place ID, that restaurant's own priced menu with per-SKU customization axes and its current promotions, national nutrition-facts and allergen-matrix reference data, a six-market international platform with priced menus, product records, ingredient catalogs and offer compositions, separate priced menus for India, Colombia, Peru and El Salvador, and one more standalone platform shared by Poland and Russia. Credential-free.
Get Papa John's per-restaurant priced menus and deals across the US, Canada, India and 11 more markets, plus store locators and nutrition data as JSON.
Endpoint families
6
Documented params
72
Examples
23
Live catalog snapshot
Active endpoints
23
Methods
GET
Required params
41
Schema refs
23
{
"platform": "Papa John's",
"endpoint": "papajohns-menu",
"method": "GET",
"path": "/papajohns/menu",
"auth": "apiKey"
}Use cases
Get Papa John's per-restaurant priced menus and deals across the US, Canada, India and 11 more markets, plus store locators and nutrition data as JSON.
Use Papa John's endpoints to turn per-store menu and pricing monitoring into repeatable API requests with documented inputs and JSON responses.
Use Papa John's endpoints to turn store locator and footprint mapping into repeatable API requests with documented inputs and JSON responses.
Use Papa John's endpoints to turn delivery/pickup coverage research into repeatable API requests with documented inputs and JSON responses.
Use Papa John's endpoints to turn nutrition and allergen lookup into repeatable API requests with documented inputs and JSON responses.
Use Papa John's endpoints to turn cross-market promotion and deal tracking into repeatable API requests with documented inputs and JSON responses.
Managed execution
Every figure below is read from the live Papa John's endpoint catalog — 23 endpoints, 72 documented request parameters, and 23 published response schemas — the same catalog Docs and Playground run against.
23 documented Papa John's endpoints, grouped into 14 request families — Intl, India and Menu, plus 11 more.
72 request parameters are documented across those Papa John's endpoints, 41 of them required — the full input contract is public before you write any integration code.
23 of the 23 Papa John's endpoints ship a recorded example response, and 23 carry a documented response schema — you can code against the real JSON before the first request.
Papa John's endpoints document their error responses (400, 404, 429 and 503) alongside the success schema, so a block, a rate limit, or a missing record comes back as a typed error rather than silently empty data.
23 hosted MCP tools back the Papa John's endpoints, so an agent can call the same routes with the same parameters and the same JSON contract, with no custom glue.
Coverage map
These cards are generated from the active endpoint catalog, so the landing page reflects the same API surface used by Docs and Playground.
/papajohns/intl/stores
/papajohns/india/menu
/papajohns/menu
/papajohns/allergens
/papajohns/colombia/menu
/papajohns/deals
Featured endpoints
/papajohns/menuReturns a Papa John's US or Canada restaurant's full menu with that restaurant's own prices. Prices are per restaurant, not national -- the same 14-inch pizza can differ by several dollars between two stores -- so pass a store_id from GET /papajohns/store or GET /papajohns/nearby. Omitting it returns the national default menu, flagged as national_default in the response. Each category is returned with its sections and product groups, and every orderable SKU carries its price, calories, serving size, slice count and image. Set include_options to also get each product group's customization axes: every size and crust it is sold in, and every preparation instruction (how much cheese, how well done) with its choices. This is the US and Canada menu -- for India use GET /papajohns/india/menu, and for Chile, Costa Rica, Guatemala, Panama, Portugal or Spain use GET /papajohns/intl/menu.
Response notes
- `national_default` is `true` when no `store_id` was supplied, so a caller can always tell the fallback menu from a real restaurant's prices. - Each category contains sections, each section contains product groups, and each group contains the orderable SKUs with `price`, `calories`, `serving_label`, `slices` and an image. `price_from` on a group is its cheapest priced SKU. - A build-your-own SKU whose price depends entirely on the customer's choices reports `price` `0`; read the group's size and crust options instead. - Sections upstream hides, and groups whose SKUs carry no price, are omitted rather than returned looking free. - `available_topping_ids` are upstream's own numeric topping ids. This upstream publishes no names for them, so they are exposed as ids rather than invented labels; `max_toppings`, `max_same_topping` and `allow_half_toppings` give the rules that go with them. - An unknown `category` or a negative/non-numeric `store_id` returns a `400`; a `store_id` the upstream has no menu for returns a `404`. Example response: ```json {"code":200,"msg":"OK","data":{"store_id":5054,"national_default":false,"categories":[{"id":"pizza","name":"Pizza","sections":[{"id":"most_popular","name":"Most Popular","product_groups":[{"id":"cyo","title":"Create Your Own Pizza","description":"Build your own custom pizza and we'll handcraft it for you.","customizable":"full","price_from":14.99,"max_toppings":7,"max_same_topping":2,"allow_half_toppings":true,"products":[{"sku":"1-1-2-115","name":"10 Inch Original Pepperoni Pizza","title":"Small Original Crust - Pepperoni","size":"Small","price":14.99,"regular_price":14.99,"code":"PR10Q1","size_id":2,"crust_id":1,"calories":210,"serving_label":"/slice, 6 slices","slices":6}]}]}],"product_count":96}],"product_count":206,"source_url":"https://www.papajohns.com/api/trpc/menuCategory.getByStore?input={\"json\":{\"storeId\":5054}}","fetched_at":"2026-09-06T09:00:00Z"}} ```
MCP tool papajohns_menu
/papajohns/nearbyReturns Papa John's stores within a radius of a latitude/longitude, ordered nearest first, with distance, address, phone, hours, timezone, price range, fulfillment services, payment options, and ordering link. The response includes total_in_radius and offset paging. A coordinate with no nearby stores returns an empty list.
MCP tool papajohns_nearby
/papajohns/directoryReturns one level of Papa John's store directory. Omit path for the root country index, then pass a child's path to descend through state, city, and store levels. Each child includes its name, path, URL, store count when available, and whether it is a store leaf. Pass a store child's path to GET /papajohns/store. This is a directory browse; use GET /papajohns/nearby for a coordinate search.
MCP tool papajohns_directory
/papajohns/storeReturns one Papa John's store's published profile: address, phone, coordinates, general and pickup hours, timezone, Google Place id, and ordering link. The path comes from a store child returned by GET /papajohns/directory. Passing a directory path returns 404.
MCP tool papajohns_store
/papajohns/menu/itemReturns one Papa John's US or Canada menu SKU with that restaurant's price for it, together with the full customization axes of the product group it belongs to: every size and crust the product is sold in, and every preparation instruction with its choices and default. The response also names the category and section the item sits under. Pass a store_id so the price is that restaurant's; omitting it returns the national default price. SKUs come from GET /papajohns/menu.
Response notes
- `group` carries every size and crust the product is sold in and every preparation instruction (how much cheese, how well done) with its choices and which one is the default. Unlike [`/papajohns/menu`](papajohns-menu.md), these are always included — that is the point of this endpoint. - `category` and `section` name where the item sits in the menu. - An unknown `sku` returns a `404`. A sku that upstream prices but does not display in any menu group also returns a `404`, with a message saying so — it is not orderable from the menu even though a price exists. Example response: ```json {"code":200,"msg":"OK","data":{"store_id":5054,"national_default":false,"category":"pizza","section":"Most Popular","group":{"id":"cyo","title":"Create Your Own Pizza","customizable":"full","max_toppings":7,"allow_half_toppings":true,"sizes":[{"id":2,"name":"Small","measure":"10\"","default":false},{"id":4,"name":"Large","measure":"14\"","default":true}],"crusts":[{"id":1,"name":"Original Crust","code":"PIZZA_ORIGINAL","sub_type":"Original","default":true}],"instructions":[{"id":2,"name":"CHEESE","description":"How much cheese?","choices":[{"id":6,"name":"Light Cheese","code":"ILC"},{"id":5,"name":"Regular Cheese","default":true}]}],"products":[]},"product":{"sku":"1-1-2-115","name":"10 Inch Original Pepperoni Pizza","size":"Small","price":14.99,"calories":210,"serving_label":"/slice, 6 slices","slices":6},"source_url":"https://www.papajohns.com/api/trpc/product.getByStore?input={\"json\":{\"storeId\":5054}}","fetched_at":"2026-09-06T09:00:00Z"}} ```
MCP tool papajohns_menu_item
/papajohns/dealsReturns 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.
Response notes
- **Pass a `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. - A deal whose price depends on what the customer builds reports `price` `0`. - An invalid `store_id` returns a `400`. Example response: ```json {"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"}} ```
MCP tool papajohns_deals
Related APIs
Marketplaces & Retail
Collect marketplace product signals from Amazon without building brittle storefront scrapers.
Marketplaces & Retail
Build resale, pricing, and marketplace workflows from structured eBay data.
Marketplaces & Retail
Turn public Shop.app product and merchant pages into structured JSON for e-commerce product intelligence, price research, shop monitoring, and marketplace discovery workflows.
How to scrape Papa John's
Crawlora's Papa John's endpoints return normalized public Papa John's data as JSON with one API key — no Papa John's account required. Papa John's runs several independent ordering platforms, and this family follows that split: US/Canada, a shared six-market international platform, standalone platforms for India, Colombia, Peru and El Salvador, and one more standalone platform shared by Poland and Russia. Prices are per restaurant and per market in local currency, so figures from two markets are never comparable.
Call /papajohns/directory with no path for the root country index, then pass a returned child's path to descend through state, city, and store levels. Each child carries name, path, url, is_store, and store_count when published.
Pass a latitude and longitude to /papajohns/nearby for stores within a radius, nearest first, each with distance, address, phone, coordinates, hours, timezone, price range, fulfillment services, payment options, and ordering URL. Page through total_in_radius with offset for a dense area.
Pass the path from a directory entry flagged is_store, or a /papajohns/nearby result's own path, to /papajohns/store for its store ID, name, address, phone, coordinates, general and pickup hours, timezone, and Google Place ID — passing a directory (non-store) path returns a 404.
Pass a category (cheese, crust, desserts, dipping-sauces, drinks, extras, papa-bowls, papadias, pizzas, sandwiches, sauce, sides, toppings, or wings) to /papajohns/nutrition for every published size/crust variant's serving size and full nutrition breakdown. This is national reference data, not priced per-store data.
Call /papajohns/allergens with no parameters for Papa John's complete published item x allergen guide — crusts, sauces, cheeses, meats, veggies, and more — grouped by section, each flagged for peanut, tree nut, egg, milk, wheat, soy, fish, shellfish, and sesame content.
Pass a store_id from /papajohns/store or /papajohns/nearby to /papajohns/menu for that restaurant's own prices — the same 14-inch pizza can differ by several dollars between two stores. Omit store_id for the national default menu, which the response flags with national_default so you always know which you got. Narrow with category, or set include_options for each product group's sizes, crusts, and preparation instructions.
Pass a SKU id to /papajohns/menu/item for that restaurant's price for it plus the full customization axes of the product group it belongs to, and call /papajohns/deals for the promotions that restaurant is currently running.
Chile, Costa Rica, Guatemala, Panama, Portugal and Spain share one platform. Call /papajohns/intl/stores with a market for its restaurants near a coordinate or one restaurant by id, then /papajohns/intl/menu with a market and store_id for that restaurant's priced menu — variants are ordered cheapest first and a product with no priced variant is omitted rather than returned looking free. /papajohns/intl/product returns one product's catalog record (deliberately priceless, since pricing is per restaurant), /papajohns/intl/ingredients the toppings, sauces and cheeses a pizza can be built from, and /papajohns/intl/deals plus /papajohns/intl/offer the promotions and each offer's step-by-step composition.
Call /papajohns/india/menu for every category's items and deals with live prices in Indian Rupees, discount strike-through pricing, dietary tags, and store/channel/day blackout availability. Pass category_id, store_id, channel_id, day, or tag to narrow it, or include_options for the full size/crust/topping tree.
Pass an item id from /papajohns/india/menu to /papajohns/india/menu/item for its full option tree with per-option prices, or a deal id to /papajohns/india/deal for that deal's exact item composition.
Call /papajohns/india/stores for Papa John's India restaurant list — use a returned store_id to filter /papajohns/india/menu's availability for that specific store.
Colombia, Peru and El Salvador each run their own ordering platform, independent of the six-market family and of each other, so each has its own endpoint: /papajohns/colombia/menu prices in Colombian pesos, /papajohns/peru/menu in Peruvian soles, and /papajohns/elsalvador/menu in US dollars. Treat each as its own catalog — none of these figures compare with another market's.
Poland and Russia run a fourth franchise platform of their own, separate from the six-market international family and from Colombia, Peru and El Salvador — /papajohns/poland/menu prices in Polish zloty and /papajohns/russia/menu in Russian roubles. Both catalogs are national despite city-scoped ordering URLs: two cities on the same market return identical products at identical prices. Filter either by category, matching on name or slug — a handful of slugs (pizza, combo, and more) are shared between the two markets even though the display names are in different languages.
FAQ
Call /papajohns/nearby with a coordinate or /papajohns/directory to browse country/state/city/store levels, /papajohns/store for one store's full detail, then /papajohns/menu with that store_id for its own priced menu, /papajohns/menu/item for one SKU, and /papajohns/deals for its promotions — with /papajohns/intl/*, /papajohns/india/*, and the Colombia, Peru, El Salvador, Poland and Russia menus covering the other markets. All return structured JSON with one API key.
Yes, in every covered market, and always per restaurant or per national platform rather than one global price list — the same 14-inch pizza can differ by several dollars between two US stores. /papajohns/menu covers the US and Canada (omit store_id and you get the national default menu instead, flagged national_default in the response), /papajohns/intl/menu covers Chile, Costa Rica, Guatemala, Panama, Portugal and Spain, and India, Colombia, Peru, El Salvador, Poland and Russia each have their own endpoint. Currency differs by market, so never compare figures across them.
Check is_store on the entry — only those paths are valid input to /papajohns/store; a country, state, or city path returns a 404 there instead of a hollow record.
Distance from the search coordinate, plus enough store detail (address, phone, hours, price range, fulfillment services) that a follow-up /papajohns/store call is often unnecessary — its path can still be passed to /papajohns/store for the Google Place ID and pickup-specific hours.
Papa John's runs several independent ordering platforms and the endpoints follow that split exactly. The US and Canada share /papajohns/menu. Chile, Costa Rica, Guatemala, Panama, Portugal and Spain share /papajohns/intl/menu, selected by a market parameter. India, Colombia, Peru and El Salvador each run a standalone platform and so each has its own endpoint. Poland and Russia share one more standalone platform between just the two of them, but each still has its own endpoint (/papajohns/poland/menu, /papajohns/russia/menu) rather than a shared market parameter. Store lookup splits the same way: /papajohns/directory, /papajohns/store and /papajohns/nearby for the US and Canada, /papajohns/intl/stores for the six-market platform, /papajohns/india/stores for India.
Because pricing on that platform is per restaurant, not per product. /papajohns/intl/product is the catalog record — what the product is, not what it costs — and the price lives on /papajohns/intl/menu for a specific store_id, where each variant carries its own figure and price_from on a product is its cheapest variant. A product with no priced variant is omitted from the menu entirely rather than returned looking free.
It covers every item Papa John's itself publishes nutrition data for, grouped into 14 categories (pizzas, wings, sides, and more) — pass one category per call. A nutrient Papa John's doesn't publish for a given variant is omitted rather than reported as a real zero.
Menu prices are pre-tax unless a given tax entry is marked inclusive — /papajohns/india/menu's taxes array carries the franchise tax (e.g. GST) applied on top. A deal whose price is computed rather than fixed reports price as 0; read price_type instead, or call /papajohns/india/deal for that deal's exact composition.