Papa John's API endpoint
Returns every topping, sauce, and cheese a pizza can be built with on one menu, in one of six international markets: Chile, Costa Rica, Guatemala, Panama, Portugal, and Spain. Each ingredient reports its family (meat, vegetable, base sauce, and so on), whether it is included on pizzas by default, whether it is charged at the premium rather than the normal rate, and whether it can be applied to just one half. The response also carries what one extra ingredient costs at each size, for both the normal and premium rates. Menu ids come from GET /papajohns/intl/stores.
/papajohns/intl/ingredientsQuery parameters:
market (required) — one of chile, costa-rica, guatemala, panama, portugal, spain.menu_id (required) — a menu_id from a restaurant returned by
/papajohns/intl/stores.category (optional) — return only one ingredient family. One of
base_cheese, base_sauce, extra_cheese, extra_sauce, meat,
not_ingredient, premium, vegetable.Notable response behavior:
base marks an ingredient that is on the pizza by default; premium
marks one charged at the premium rather than the normal rate.available_as_half reports whether it can be applied to just one half of
a pizza.prices is what one extra ingredient costs at each size, for both the
normal and premium rates, keyed by the same size codes
/papajohns/intl/menu uses. sizes maps
those codes to the market's own labels.prices.market or category returns a 400.| Field | Filled in, of 39 checked | Values in the sample |
|---|---|---|
| id | 39 | |
| name | 39 | “Extra queso mozzarella” and 38 other values |
| category | 39 | meat (8), vegetable (8), premium (7) and 5 more |
| description | 39 | “Extra queso 100% mozzarella.” and 38 other values |
| premium | 39 | true in 27 of 39 |
| base | 39 | true in 2 of 39 |
| available_as_half | 39 | true in 39 of 39 |
| image_url | 27 | cdn.new.papajohns.es |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| market | string | Yes | Market. One of: chile, costa-rica, guatemala, panama, portugal, spain Allowed values: chile, costa-rica, guatemala, panama, portugal, spain. | spain | |
| menu_id | string | Yes | Menu id from a restaurant returned by GET /papajohns/intl/stores | 8 | |
| category | string | No | Return only one ingredient category. One of: base_cheese, base_sauce, extra_cheese, extra_sauce, meat, not_ingredient, premium, vegetable Allowed values: base_cheese, base_sauce, extra_cheese, extra_sauce, meat, not_ingredient, premium, vegetable. | meat | |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/papajohns/intl/ingredients?market=spain&menu_id=8&category=base_cheese" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"market": "spain",
"menu_id": 8,
"ingredients": [
{
"id": 25,
"name": "Salsa de Tomate",
"category": "base_sauce",
"description": "Salsa de tomate elaborada con ingredientes naturales…",
"premium": false,
"base": false,
"available_as_half": true
}
],
"count": 39,
"prices": {
"normal": {
"family": 1.29,
"medium": 1.29
},
"premium": {
"family": 1.5,
"medium": 1.5
}
},
"sizes": {
"family": "Familiar",
"medium": "Mediana"
},
"source_url": "https://api.papajohns.es/v1/ingredients?menu_id=8",
"fetched_at": "2026-09-06T09:00:00Z"
}
}Request schema
No body schema
Response schema
#/definitions/papajohns.intlIngredientsResponseDoc
| 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.IntlIngredientsResponse | No | ||||
| data.category | string | No | meat | |||
| data.count | integer | No | 39 | |||
| data.fetched_at | string | No | ||||
| data.ingredients | array | No | ||||
| data.ingredients[].available_as_half | boolean | No | true | AvailableAsHalf reports whether it can be applied to just one half. | ||
| data.ingredients[].base | boolean | No | false | Base marks an ingredient included on the pizza by default. | ||
| data.ingredients[].category | string | No | base_sauce | Category is the ingredient family, e.g. meat or vegetable. | ||
| data.ingredients[].description | string | No | ||||
| data.ingredients[].id | integer | No | 25 | |||
| data.ingredients[].image_url | string | No | ||||
| data.ingredients[].name | string | No | Salsa de Tomate | |||
| data.ingredients[].premium | boolean | No | false | Premium marks an ingredient charged at the premium rate rather than the normal one. | ||
| data.market | string | No | spain | |||
| data.menu_id | integer | No | 8 | |||
| data.prices | object | No | Prices is what adding one extra ingredient costs, keyed by size code. | |||
| data.prices.normal | object | No | ||||
| data.prices.premium | object | No | ||||
| data.sizes | object | No | ||||
| data.source_url | string | No | ||||
| 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/intl/ingredients?market=spain&menu_id=8&category=base_cheese" \
-H "x-api-key: $CRAWLORA_API_KEY"