Papa John's API endpoint
Returns one promotional offer's full composition in one of six international markets: Chile, Costa Rica, Guatemala, Panama, Portugal, and Spain. This is what a promotion banner from GET /papajohns/intl/deals actually contains: the offer's own price, each choice step a customer works through in order (e.g. "pick your family pizza", "pick a side"), and every product eligible at that step with the surcharge picking it adds. It also carries the offer's ingredient rules -- how many extras are free, the minimum and maximum that may be chosen, and which ingredient families are allowed. Offer ids come from the offer_id field on a deal.
/papajohns/intl/offerQuery parameters:
market (required) — one of chile, costa-rica, guatemala, panama, portugal, spain.offer_id (required) — the offer_id field on a deal from
/papajohns/intl/deals.Notable response behavior:
steps are in the order a customer works through them, e.g.
"pick your family pizza" then "pick a side". A step with optional true
may be skipped.surcharge is what picking it adds to the offer price.
A choice that costs nothing extra omits the field rather than reporting a
0.00 charge.product_id (usable with
/papajohns/intl/product) and variant_id,
plus size and crust codes with the market's own labels.free_extras, min_ingredients, max_ingredients, and
ingredient_categories describe the offer's own ingredient rules, which
can differ from the base product's.offer_id returns a 404; an unknown market or a
non-numeric id returns a 400.| Field | In the sample | Value in the sample |
|---|---|---|
| market | Has a value | “spain” |
| id | Has a value | |
| name | Has a value | “Combo Veranito” |
| description | Has a value | “1 Familiar + Entrante + 2 Cocktails. ¿Redi pa'l calorcito?” |
| offer_type | Has a value | “Combo” |
| dispatch_method | Has a value | “both” |
| price | Has a value | 19.98 |
| currency | Has a value | “EUR” |
| start_date | Has a value | 2023-09-19 |
| end_date | Has a value | 2026-09-20 |
| availability | Has a value | 7 entries |
| customizable | Has a value | true |
| promoted | Has a value | true |
| free_extras | Has a value | 2 |
| min_ingredients | Has a value | 1 |
| max_ingredients | Has a value | 10 |
| ingredient_categories | Has a value | 5 entries |
| image_url | Has a value | cdn.new.papajohns.es |
| steps | Has a value | 5 entries |
| 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 | |
| offer_id | string | Yes | Offer id from the offer_id field on GET /papajohns/intl/deals | 660 | |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/papajohns/intl/offer?market=spain&offer_id=660" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"market": "spain",
"id": 660,
"name": "Combo Veranito",
"description": "1 Familiar + Entrante + 2 Cocktails.",
"offer_type": "Combo",
"dispatch_method": "both",
"price": 19.98,
"currency": "EUR",
"start_date": "2023-09-19T01:00:00Z",
"end_date": "2026-09-21T23:45:00Z",
"availability": [
"monday",
"tuesday",
"wednesday",
"thursday",
"friday",
"saturday",
"sunday"
],
"customizable": true,
"promoted": true,
"free_extras": 2,
"min_ingredients": 1,
"max_ingredients": 10,
"ingredient_categories": [
"extra_cheese",
"meat",
"premium",
"shots",
"vegetable"
],
"steps": [
{
"id": 1919,
"name": "❶ Elige tu pizza familiar",
"optional": false,
"choices": [
{
"product_id": 336,
"variant_id": 830,
"name": "Italiana Ranch",
"size": "family",
"crust": "traditional",
"size_label": "Familiar",
"crust_label": "Original",
"surcharge": 1.9
}
],
"choice_count": 12
}
],
"source_url": "https://api.papajohns.es/v1/offers/660",
"fetched_at": "2026-09-06T09:00:00Z"
}
}Request schema
No body schema
Response schema
#/definitions/papajohns.intlOfferResponseDoc
| 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.IntlOfferResponse | No | ||||
| data.availability | array | No | Availability lists the weekdays the offer runs on. | |||
| data.currency | string | No | EUR | |||
| data.customizable | boolean | No | true | |||
| data.description | string | No | ||||
| data.discount | number | No | ||||
| data.dispatch_method | string | No | both | DispatchMethod is the fulfillment this offer applies to, e.g. both. | ||
| data.end_date | string | No | 2026-09-21T23:45:00Z | |||
| data.fetched_at | string | No | ||||
| data.free_extras | integer | No | 2 | FreeExtras is how many extra ingredients are included at no charge, and MinIngredients/MaxIngredients bound how many may be chosen. | ||
| data.id | integer | No | 660 | |||
| data.image_url | string | No | ||||
| data.ingredient_categories | array | No | IngredientCategories lists the ingredient families this offer allows. | |||
| data.market | string | No | spain | |||
| data.max_ingredients | integer | No | 10 | |||
| data.min_ingredients | integer | No | 1 | |||
| data.name | string | No | Combo Veranito | |||
| data.offer_type | string | No | Combo | OfferType is the platform's own classification, e.g. Combo. | ||
| data.price | number | No | 19.98 | |||
| data.promoted | boolean | No | true | |||
| data.source_url | string | No | ||||
| data.start_date | string | No | 2023-09-19T01:00:00Z | |||
| data.steps | array | No | ||||
| data.steps[].choice_count | integer | No | 12 | |||
| data.steps[].choices | array | No | ||||
| data.steps[].choices[].crust | string | No | traditional | |||
| data.steps[].choices[].crust_label | string | No | Original | |||
| data.steps[].choices[].description | string | No | ||||
| data.steps[].choices[].name | string | No | Italiana Ranch | |||
| data.steps[].choices[].product_id | integer | No | 336 | ProductID is the underlying product, usable with GET /papajohns/intl/product. | ||
| data.steps[].choices[].size | string | No | family | |||
| data.steps[].choices[].size_label | string | No | Familiar | SizeLabel and CrustLabel are the market's own display names. | ||
| data.steps[].choices[].surcharge | number | No | 1.9 | Surcharge is what picking this choice adds to the offer price. Absent when the choice costs nothing extra. | ||
| data.steps[].choices[].variant_id | integer | No | 830 | |||
| data.steps[].id | integer | No | 1919 | |||
| data.steps[].name | string | No | ❶ Elige tu pizza familiar | |||
| data.steps[].optional | boolean | No | false | Optional reports whether the step may be skipped. | ||
| 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/offer?market=spain&offer_id=660" \
-H "x-api-key: $CRAWLORA_API_KEY"