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.
View Overlay File View on GitHub Overlay Specification

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

Raw ↑
# 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'