Punchh · OpenAPI Overlay 1.0.0
API Evangelist conversational phrasing for Punchh Api2 API
34 actions
34 updates
phrasing
extends
openapi/punchh-api2-api-openapi.yml
Generated by API Evangelist
Written by API Evangelist tooling for Punchh's API. It is a proposal applied on top of the contract, not a document Punchh publishes.
What the actions change
x-apievangelist-phrasing
Targets 34 · first 16 shown; the file carries all of them
$.info
$.paths['/api2/mobile/redemptions/{redemption_id}'].delete
$.paths['/api2/mobile/redemptions/banked_currency'].post
$.paths['/api2/mobile/redemptions/visits'].post
$.paths['/api2/mobile/redemptions/redeemable'].post
$.paths['/api2/mobile/redemptions/reward'].post
$.paths['/api2/mobile/redemptions/applicable_offers'].get
$.paths['/api2/mobile/discounts/select'].post
$.paths['/api2/mobile/discounts/unselect'].delete
$.paths['/api2/mobile/discounts/active'].get
$.paths['/api2/mobile/single_scan_tokens'].post
$.paths['/api2/mobile/subscriptions'].get
$.paths['/api2/mobile/subscriptions'].post
$.paths['/api2/mobile/user_subscriptions'].get
$.paths['/api2/mobile/redemptions/subscription'].post
$.paths['/api2/mobile/subscriptions/cancel'].put
OpenAPI Overlay
# Generated by API Evangelist (build-phrasing.py). Our phrasing, not observed demand.
overlay: 1.0.0
info:
title: API Evangelist conversational phrasing for Punchh Api2 API
version: 1.0.0
extends: openapi/punchh-api2-api-openapi.yml
actions:
- target: $.info
update:
x-apievangelist-phrasing:
method: generated
generated: '2026-10-01'
generator: build-phrasing.py
label: Generated by API Evangelist
operations: 33
- target: $.paths['/api2/mobile/redemptions/{redemption_id}'].delete
update:
x-apievangelist-phrasing:
intent: Cancel an unprocessed redemption from the app
effect: destructive
questions:
- Can a guest cancel a redemption code in the mobile app before it has been used at the store?
- What happens if I try to cancel a redemption that was already processed?
instructions:
- text: Cancel mobile redemption {redemption_id} so the guest can pick a different reward.
slots:
redemption_id: path.redemption_id
- text: Withdraw the unprocessed redemption {redemption_id} for app client {client}.
slots:
redemption_id: path.redemption_id
client: requestBody.client
method: generated
generated: '2026-10-01'
- target: $.paths['/api2/mobile/redemptions/banked_currency'].post
update:
x-apievangelist-phrasing:
intent: Redeem banked currency for a redemption code
effect: write
questions:
- How can a guest turn part of their banked currency balance into a redemption code?
- Does a banked-currency redemption need a store location, or will it work without one?
instructions:
- text: Create a redemption code worth {banked_currency} of banked currency for the signed-in guest.
slots:
banked_currency: requestBody.banked_currency
- text: Generate a banked currency redemption of {banked_currency} at location {location_id}.
slots:
banked_currency: requestBody.banked_currency
location_id: requestBody.location_id
method: generated
generated: '2026-10-01'
- target: $.paths['/api2/mobile/redemptions/visits'].post
update:
x-apievangelist-phrasing:
intent: Redeem a completed visit card
effect: write
questions:
- In a visit-based loyalty program, how does a guest redeem a completed punch card from the app?
- Can I create a visits redemption using GPS coordinates instead of a location ID?
instructions:
- text: Redeem the guest's unredeemed visit card at location {location_id}.
slots:
location_id: requestBody.location_id
- text: Create a visits-based redemption near latitude {latitude} and longitude {longitude}.
slots:
latitude: requestBody.latitude
longitude: requestBody.longitude
method: generated
generated: '2026-10-01'
- target: $.paths['/api2/mobile/redemptions/redeemable'].post
update:
x-apievangelist-phrasing:
intent: Redeem loyalty points for a redeemable
effect: write
questions:
- How does a guest spend loyalty points on a specific redeemable item from the catalog?
- Which redeemable will a points redemption code be tied to?
instructions:
- text: Spend the guest's points on redeemable {reedemable_id} and give me the redemption code.
slots:
reedemable_id: requestBody.reedemable_id
- text: Create a points redemption for redeemable {reedemable_id} at store {location_id}.
slots:
reedemable_id: requestBody.reedemable_id
location_id: requestBody.location_id
method: generated
generated: '2026-10-01'
- target: $.paths['/api2/mobile/redemptions/reward'].post
update:
x-apievangelist-phrasing:
intent: Redeem a reward a guest was given
effect: write
questions:
- How do I generate a redemption code for a reward the guest received from a campaign?
- Can a gifted reward be redeemed at a particular store location from the app?
instructions:
- text: Create a redemption code for reward {reward_id} in the guest's account.
slots:
reward_id: requestBody.reward_id
- text: Redeem gifted reward {reward_id} at location {location_id}.
slots:
reward_id: requestBody.reward_id
location_id: requestBody.location_id
method: generated
generated: '2026-10-01'
- target: $.paths['/api2/mobile/redemptions/applicable_offers'].get
update:
x-apievangelist-phrasing:
intent: List offers that apply to a cart in the app
effect: read
questions:
- Which offers can a guest apply to the items currently in their mobile order?
- Do the applicable offers depend on the ordering channel and order amount?
instructions:
- text: Show the offers that apply to a {amount} order placed through {channel}.
slots:
amount: requestBody.amount
channel: requestBody.channel
- text: List applicable offers for this cart at store {location_id} on channel {channel}.
slots:
location_id: requestBody.location_id
channel: requestBody.channel
method: generated
generated: '2026-10-01'
- target: $.paths['/api2/mobile/discounts/select'].post
update:
x-apievangelist-phrasing:
intent: Add discounts to the guest's discount basket
effect: write
questions:
- How does the mobile app add a reward to the guest's discount basket?
- What happens if the guest has no active discount basket when selecting a discount?
instructions:
- text: Add these discounts {discount_basket_items_attributes} to the guest's discount basket in the app.
slots:
discount_basket_items_attributes: requestBody.discount_basket_items_attributes
- text: Put the selected rewards into the mobile discount basket.
method: generated
generated: '2026-10-01'
- target: $.paths['/api2/mobile/discounts/unselect'].delete
update:
x-apievangelist-phrasing:
intent: Remove discounts from the discount basket
effect: destructive
questions:
- Can a guest take a discount back out of their basket in the app?
- Is it possible to remove several discount basket items at once?
instructions:
- text: Remove basket items {discount_basket_item_ids} from the guest's discount basket.
slots:
discount_basket_item_ids: requestBody.discount_basket_item_ids
- text: Unselect discount basket item {discount_basket_item_ids} in the mobile app.
slots:
discount_basket_item_ids: requestBody.discount_basket_item_ids
method: generated
generated: '2026-10-01'
- target: $.paths['/api2/mobile/discounts/active'].get
update:
x-apievangelist-phrasing:
intent: Show the guest's active discount basket
effect: read
questions:
- What discounts has the guest currently selected in their basket?
- Are expired discounts dropped from the active discount basket automatically?
instructions:
- text: Show me what's in the guest's active discount basket.
- text: Fetch the current discount basket for app client {client}.
slots:
client: requestBody.client
method: generated
generated: '2026-10-01'
- target: $.paths['/api2/mobile/single_scan_tokens'].post
update:
x-apievangelist-phrasing:
intent: Get a single-scan code to pay and redeem
effect: write
questions:
- How can a guest pay, earn and redeem with one scan at the register?
- Can the single-scan code include a tip or use a gift card as the payment method?
instructions:
- text: Generate a single-scan access code paid by {payment_type}.
slots:
payment_type: requestBody.payment_type
- text: Create a single-scan code using gift card {gift_card_uuid} with a tip of {tip}.
slots:
gift_card_uuid: requestBody.gift_card_uuid
tip: requestBody.tip
method: generated
generated: '2026-10-01'
- target: $.paths['/api2/mobile/subscriptions'].get
update:
x-apievangelist-phrasing:
intent: List subscription plans available to buy
effect: read
questions:
- What subscription plans can guests buy in the mobile app right now?
- Are expired subscription plans hidden from the purchasable list?
instructions:
- text: List the active subscription plans guests can purchase in the app.
- text: Show purchasable subscription plans for client {client}.
slots:
client: requestBody.client
method: generated
generated: '2026-10-01'
- target: $.paths['/api2/mobile/subscriptions'].post
update:
x-apievangelist-phrasing:
intent: Buy a subscription plan for the signed-in guest
effect: write
questions:
- How does a guest purchase a subscription plan from the mobile app?
- Why would buying a single-use plan with auto renewal turned on fail?
instructions:
- text: Purchase plan {plan_id} for {purchase_price} at location {location_id}, starting {start_time} and ending {end_time}, auto renew {auto_renewal}.
slots:
plan_id: requestBody.plan_id
purchase_price: requestBody.purchase_price
location_id: requestBody.location_id
start_time: requestBody.start_time
end_time: requestBody.end_time
auto_renewal: requestBody.auto_renewal
- text: Subscribe the guest to plan {plan_id} using saved card {payment_card_uuid}.
slots:
plan_id: requestBody.plan_id
payment_card_uuid: requestBody.payment_card_uuid
method: generated
generated: '2026-10-01'
- target: $.paths['/api2/mobile/user_subscriptions'].get
update:
x-apievangelist-phrasing:
intent: List the subscriptions a guest holds
effect: read
questions:
- Which subscriptions does this guest currently have on their profile?
- Can I see a guest's past or cancelled subscriptions, not just the active ones?
instructions:
- text: Show the guest's current subscriptions.
- text: List the guest's subscriptions filtered by {filter}.
slots:
filter: query.filter
method: generated
generated: '2026-10-01'
- target: $.paths['/api2/mobile/redemptions/subscription'].post
update:
x-apievangelist-phrasing:
intent: Generate a code to use a subscription benefit
effect: write
questions:
- How does a guest get a code to redeem their subscription perk at the POS or online?
- Can a subscription benefit be redeemed with a code generated in the app?
instructions:
- text: Generate a redemption code for subscription {subscription_id}.
slots:
subscription_id: requestBody.subscription_id
- text: Give the guest a code to use the benefits of subscription {subscription_id}.
slots:
subscription_id: requestBody.subscription_id
method: generated
generated: '2026-10-01'
- target: $.paths['/api2/mobile/subscriptions/cancel'].put
update:
x-apievangelist-phrasing:
intent: Turn off a guest's subscription auto renewal
effect: destructive
questions:
- How can a guest stop their subscription from renewing in the app?
- Do benefits stay active until the end date after a guest cancels from the app?
instructions:
- text: Cancel auto renewal on subscription {subscription_id} with reason {cancellation_reason_id} and feedback {cancellation_feedback}.
slots:
subscription_id: requestBody.subscription_id
cancellation_reason_id: requestBody.cancellation_reason_id
cancellation_feedback: requestBody.cancellation_feedback
- text: Stop subscription {subscription_id} from renewing because of reason {cancellation_reason_id}; the guest said {cancellation_feedback}.
slots:
subscription_id: requestBody.subscription_id
cancellation_reason_id: requestBody.cancellation_reason_id
cancellation_feedback: requestBody.cancellation_feedback
method: generated
generated: '2026-10-01'
- target: $.paths['/api2/dashboard/segments'].get
update:
x-apievangelist-phrasing:
intent: Browse audience segments for an external platform
effect: read
questions:
- Which guest segments are defined in Punchh that my marketing tool can target?
- Can I search segments by name and page through them?
instructions:
- text: List the segments whose name matches {query}.
slots:
query: requestBody.query
- text: Show page {page} of segments with {per_page} per page.
slots:
page: requestBody.page
per_page: requestBody.per_page
method: generated
generated: '2026-10-01'
- target: $.paths['/api2/dashboard/redeemables'].get
update:
x-apievangelist-phrasing:
intent: Browse offers to send from an external platform
effect: read
questions:
- What offers can my external campaign tool pick from to send to guests?
- Does the offer search look at descriptions as well as names?
instructions:
- text: Find offers whose name or description mentions {query} for my campaign tool.
slots:
query: requestBody.query
- text: Browse page {page} of campaign-ready offers, {per_page} at a time.
slots:
page: requestBody.page
per_page: requestBody.per_page
method: generated
generated: '2026-10-01'
- target: $.paths['/api2/dashboard/campaigns'].post
update:
x-apievangelist-phrasing:
intent: Schedule a mass offer campaign to a segment
effect: write
questions:
- How can an external platform have Punchh deliver an offer to everyone in a segment?
- Which campaign types are supported for mass gifting right now?
instructions:
- text: Schedule campaign {name} gifting redeemable {redeemable_uuid} to segment {segment_id} as {category} via {campaign_type}, starting {start_time}.
slots:
name: requestBody.name
redeemable_uuid: requestBody.redeemable_uuid
segment_id: requestBody.segment_id
category: requestBody.category
campaign_type: requestBody.campaign_type
start_time: requestBody.start_time
- text: Mass-gift offer {redeemable_uuid} to segment {segment_id} and tag it with external campaign {external_campaign_id}.
slots:
redeemable_uuid: requestBody.redeemable_uuid
segment_id: requestBody.segment_id
external_campaign_id: requestBody.external_campaign_id
method: generated
generated: '2026-10-01'
- target: $.paths['/api2/dashboard/users/support_gifting'].post
update:
x-apievangelist-phrasing:
intent: Queue a background support gift to a guest
effect: write
questions:
- What's the best way to send high volumes of support gifts without waiting on each one?
- Is there an asynchronous way to gift points or rewards to many guests one by one?
instructions:
- text: Queue an asynchronous gift of {gift_count} points to user {user_id}.
slots:
gift_count: requestBody.gift_count
user_id: requestBody.user_id
- text: In the background, gift redeemable {redeemable_id} to user {user_id} because {gift_reason}.
slots:
redeemable_id: requestBody.redeemable_id
user_id: requestBody.user_id
gift_reason: requestBody.gift_reason
method: generated
generated: '2026-10-01'
- target: $.paths['/api2/dashboard/users/support'].post
update:
x-apievangelist-phrasing:
intent: Gift a guest points, rewards or challenge progress
effect: write
questions:
- How can a support agent immediately make things right with a guest by gifting points or a reward?
- Can I gift fuel or progress toward a challenge to a single guest?
instructions:
- text: Right now, gift {reward_amount} in currency to user {user_id} with the message {message}.
slots:
reward_amount: requestBody.reward_amount
user_id: requestBody.user_id
message: requestBody.message
- text: Give user {user_id} {progress_count} steps on challenge {challenge_campaign_id}.
slots:
user_id: requestBody.user_id
progress_count: requestBody.progress_count
challenge_campaign_id: requestBody.challenge_campaign_id
- text: Gift {fuel_amount} of fuel to user {user_id}.
slots:
fuel_amount: requestBody.fuel_amount
user_id: requestBody.user_id
method: generated
generated: '2026-10-01'
- target: $.paths['/api2/dashboard/offers/lis'].get
update:
x-apievangelist-phrasing:
intent: List line item selectors
effect: read
questions:
- Which line item selectors are defined for my business's offers?
- Does listing line item selectors require offers ingestion to be enabled?
instructions:
- text: List line item selectors named like {query}.
slots:
query: requestBody.query
- text: Show page {page} of line item selectors.
slots:
page: requestBody.page
method: generated
generated: '2026-10-01'
- target: $.paths['/api2/dashboard/offers/lis'].post
update:
x-apievangelist-phrasing:
intent: Create line item selectors in bulk
effect: write
questions:
- How many line item selectors can I create in a single request?
- How do I define which menu items an offer applies to?
instructions:
- text: 'Create these new line item selectors: {data}.'
slots:
data: requestBody.data
- text: Add up to 20 new line item selectors from {data}.
slots:
data: requestBody.data
method: generated
generated: '2026-10-01'
- target: $.paths['/api2/dashboard/offers/lis'].patch
update:
x-apievangelist-phrasing:
intent: Update existing line item selectors
effect: write
questions:
- Can I edit line item selectors that already exist in bulk?
- What's the limit on line item selectors per update call?
instructions:
- text: Update the existing line item selectors with {data}.
slots:
data: requestBody.data
- text: 'Apply these changes to my current line item selectors: {data}.'
slots:
data: requestBody.data
method: generated
generated: '2026-10-01'
- target: $.paths['/api2/dashboard/offers/qc'].get
update:
x-apievangelist-phrasing:
intent: List qualification criteria
effect: read
questions:
- What qualification criteria rules are set up for my offers?
- Can I search qualification criteria by name?
instructions:
- text: List qualification criteria whose name contains {query}.
slots:
query: requestBody.query
- text: Show page {page} of qualification criteria, {per_page} per page.
slots:
page: requestBody.page
per_page: requestBody.per_page
method: generated
generated: '2026-10-01'
- target: $.paths['/api2/dashboard/offers/qc'].post
update:
x-apievangelist-phrasing:
intent: Create qualification criteria in bulk
effect: write
questions:
- How do I define the conditions a check must meet for an offer to apply?
- What happens if I send more than 20 qualification criteria at once?
instructions:
- text: Create new qualification criteria from {data}.
slots:
data: requestBody.data
- text: 'Define these offer qualification rules: {data}.'
slots:
data: requestBody.data
method: generated
generated: '2026-10-01'
- target: $.paths['/api2/dashboard/offers/qc'].patch
update:
x-apievangelist-phrasing:
intent: Update existing qualification criteria
effect: write
questions:
- Can I change qualification criteria that were already created?
- Do updates to qualification criteria go through the same validations as creating them?
instructions:
- text: Update existing qualification criteria with {data}.
slots:
data: requestBody.data
- text: Edit my current offer qualification rules using {data}.
slots:
data: requestBody.data
method: generated
generated: '2026-10-01'
- target: $.paths['/api2/dashboard/offers/redeemable'].get
update:
x-apievangelist-phrasing:
intent: List redeemables for offers ingestion
effect: read
questions:
- Which redeemables are defined at the business level for offers ingestion?
- Can I search offers-ingestion redeemables by name only?
instructions:
- text: List offers-ingestion redeemables named like {query}.
slots:
query: requestBody.query
- text: Show offers-ingestion redeemables page {page} with {per_page} per page.
slots:
page: requestBody.page
per_page: requestBody.per_page
method: generated
generated: '2026-10-01'
- target: $.paths['/api2/dashboard/offers/redeemable'].post
update:
x-apievangelist-phrasing:
intent: Create redeemables in bulk
effect: write
questions:
- How do I define new redeemables for my loyalty program through the API?
- Is there a cap on how many redeemables I can create per call?
instructions:
- text: 'Create these new redeemables: {data}.'
slots:
data: requestBody.data
- text: Bulk-define up to 20 redeemables from {data}.
slots:
data: requestBody.data
method: generated
generated: '2026-10-01'
- target: $.paths['/api2/dashboard/offers/redeemable'].patch
update:
x-apievangelist-phrasing:
intent: Update existing redeemables
effect: write
questions:
- Can I modify redeemables that already exist in bulk?
- How many existing redeemables can a single update touch?
instructions:
- text: Update the existing redeemables with {data}.
slots:
data: requestBody.data
- text: 'Change the details of my current redeemables: {data}.'
slots:
data: requestBody.data
method: generated
generated: '2026-10-01'
- target: $.paths['/api2/dashboard/offers/upload_redeemable_image'].post
update:
x-apievangelist-phrasing:
intent: Upload images for redeemables from URLs
effect: write
questions:
- How do I add pictures to my redeemables in bulk?
- What's the maximum image size for a redeemable image?
instructions:
- text: 'Upload redeemable images from these URLs: {data}.'
slots:
data: requestBody.data
- text: Attach the hosted images {data} to their redeemables.
slots:
data: requestBody.data
method: generated
generated: '2026-10-01'
- target: $.paths['/api2/dashboard/subscriptions/purchase'].post
update:
x-apievangelist-phrasing:
intent: Purchase or migrate a subscription for a guest
effect: write
questions:
- Can a back-end system buy a subscription for a guest who isn't logged in?
- How do I migrate a guest's active subscription from a previous loyalty system?
instructions:
- text: Purchase plan {plan_id} for user {user_id} at {purchase_price} at location {location_id}, from {start_time} to {end_time}, auto renew {auto_renewal}.
slots:
plan_id: requestBody.plan_id
user_id: requestBody.user_id
purchase_price: requestBody.purchase_price
location_id: requestBody.location_id
start_time: requestBody.start_time
end_time: requestBody.end_time
auto_renewal: requestBody.auto_renewal
- text: Migrate user {user_id}'s existing subscription to plan {plan_id} with {initial_savings} in prior savings.
slots:
user_id: requestBody.user_id
plan_id: requestBody.plan_id
initial_savings: requestBody.initial_savings
method: generated
generated: '2026-10-01'
- target: $.paths['/api2/dashboard/subscriptions/renew'].post
update:
x-apievangelist-phrasing:
intent: Renew a guest's subscription
effect: write
questions:
- How does the business renew a guest's subscription on its renewal date?
- Can a guest switch to a different plan when their subscription renews?
instructions:
- text: Renew subscription {subscription_id} for {purchase_price} from {start_time} to {end_time}.
slots:
subscription_id: requestBody.subscription_id
purchase_price: requestBody.purchase_price
start_time: requestBody.start_time
end_time: requestBody.end_time
- text: Renew subscription {subscription_id} onto new plan {new_plan_id}.
slots:
subscription_id: requestBody.subscription_id
new_plan_id: requestBody.new_plan_id
method: generated
generated: '2026-10-01'
- target: $.paths['/api2/dashboard/subscriptions/cancel'].patch
update:
x-apievangelist-phrasing:
intent: Cancel a guest subscription as an admin
effect: destructive
questions:
- How can an admin hard-cancel a guest's subscription immediately?
- What's the difference between a soft and hard cancellation from the dashboard?
instructions:
- text: Admin-cancel subscription {subscription_id} as {cancellation_type} because {cancellation_reason}.
slots:
subscription_id: requestBody.subscription_id
cancellation_type: requestBody.cancellation_type
cancellation_reason: requestBody.cancellation_reason
- text: From the dashboard, hard-cancel subscription {subscription_id} with reason {cancellation_reason} and type {cancellation_type}.
slots:
subscription_id: requestBody.subscription_id
cancellation_reason: requestBody.cancellation_reason
cancellation_type: requestBody.cancellation_type
method: generated
generated: '2026-10-01'