Skip to content
Developer docs
⌘ K
Dashboard ↗

HTTP endpoints

listProgramVersions

Every saved version of a program, newest first, with readable terms.

GET /api/v1/programs/{programId}/versions

Requires read. Keep the Bearer key on your server.

SDK

ts
grizzlee.listProgramVersions(programId: string): Promise<ProgramVersionList>

HTTP

Use your backend's HTTP client. The cURL request shows the wire format. Replace path parameters and example values.

sh
curl --fail-with-body --request GET \
  'https://app.grizzlee.ca/api/v1/programs/{programId}/versions' \
  -H "Authorization: Bearer $GRIZZLEE_SERVER_KEY"

Response

HTTP responses wrap this value in data. The SDK returns the value directly unless the note above describes a wrapper.

FieldTypeRequiredDetails
versionsarrayYes

versions[]

FieldTypeRequiredDetails
versions.termsobjectYesReadable reward terms of this version, with the program's own compensation.
versions.companyIdstringYes
versions.programIdstringYes
versions.versionnumberYes
versions.programSnapshotobjectYes
versions.changedFieldsarrayYesTop-level program fields that differ from the previous version, such as compensation or friendIncentive. Empty for version 1.
versions.createdAtstringYesWhen this version took effect. Versions recorded when versioning started use the program's last saved change.

versions.terms

FieldTypeRequiredDetails
versions.terms.triggerunionYes
versions.terms.rewardTypeunionYes
versions.terms.currencyunionYes
versions.terms.compensationunionYesWhat the partner earns. This partner's custom terms replace the program's when it has them.
versions.terms.partnerOfferunionYesThe partner's earned discount with currency. Null for money rewards.
versions.terms.milestoneRewardsobjectNo
versions.terms.durationunionYesWhich orders of a referred customer earn a reward. Null for milestone programs.
versions.terms.fixedRefundModeunionYesHow a partial refund changes a fixed order reward. Null for percentage and milestone rewards.
versions.terms.referralWindowDaysunionYesDays a referral stays open until an order or milestone qualifies it. Null when it never expires.
versions.terms.textobjectYes

versions.terms.trigger

Variant 1

FieldTypeRequiredDetails
versions.terms.trigger.type"order"Yes

Variant 2

FieldTypeRequiredDetails
versions.terms.trigger.type"milestone"Yes
versions.terms.trigger.milestonestringYes

versions.terms.rewardType

Variant 1

Type: string.

Variant 2

Type: string.

Variant 3

Type: string.

versions.terms.currency

Variant 1

Type: string.

Variant 2

Type: string.

Variant 3

Type: string.

Variant 4

Type: string.

versions.terms.compensation

Variant 1

Type: null.

Variant 2

FieldTypeRequiredDetails
versions.terms.compensation.type"percentage"Yes
versions.terms.compensation.rateBpsnumberYesBase rate, before any performance tier bonus.
versions.terms.compensation.phasesarrayYesLater rates by months after the customer's first rewarded order. Empty when the rate never changes.

versions.terms.compensation.phases[]

FieldTypeRequiredDetails
versions.terms.compensation.phases.afterMonthsnumberYes
versions.terms.compensation.phases.rateBpsnumberYes

Variant 3

FieldTypeRequiredDetails
versions.terms.compensation.type"fixed"Yes
versions.terms.compensation.amountCentsnumberYes

versions.terms.partnerOffer

Variant 1

Type: null.

Variant 2

FieldTypeRequiredDetails
versions.terms.partnerOffer.type"percent"Yes
versions.terms.partnerOffer.rateBpsnumberYes
versions.terms.partnerOffer.ordersnumberYesHow many of the friend's orders get the incentive.
versions.terms.partnerOffer.expiresAfterDaysunionYesDays after the referral was captured, claimed or entered. null means it never expires.
versions.terms.partnerOffer.returnOnFullRefundbooleanYestrue: a full refund gives the use back, so the customer can get the offer again.
versions.terms.partnerOffer.maxDiscountCentsnumberNoLargest discount for one order.
versions.terms.partnerOffer.minOrderCentsnumberNoThe friend's order total before the discount must reach this amount. Checked by the merchant's checkout.
versions.terms.partnerOffer.orderCategoriesobjectNoOrder categories that get the discount. Checked apart from the program's own orderCategories, which decide rewards. Absent means every order qualifies.
versions.terms.partnerOffer.currencyunionYes

versions.terms.partnerOffer.expiresAfterDays

Variant 1

Type: null.

Variant 2

Type: number.

versions.terms.partnerOffer.orderCategories

FieldTypeRequiredDetails
versions.terms.partnerOffer.orderCategories.includearrayNo
versions.terms.partnerOffer.orderCategories.excludearrayNo

versions.terms.partnerOffer.currency

Variant 1

Type: string.

Variant 2

Type: string.

Variant 3

Type: string.

Variant 4

Type: string.

Variant 3

FieldTypeRequiredDetails
versions.terms.partnerOffer.type"fixed"Yes
versions.terms.partnerOffer.ordersnumberYesHow many of the friend's orders get the incentive.
versions.terms.partnerOffer.expiresAfterDaysunionYesDays after the referral was captured, claimed or entered. null means it never expires.
versions.terms.partnerOffer.returnOnFullRefundbooleanYestrue: a full refund gives the use back, so the customer can get the offer again.
versions.terms.partnerOffer.amountCentsnumberYes
versions.terms.partnerOffer.minOrderCentsnumberNoThe friend's order total before the discount must reach this amount. Checked by the merchant's checkout.
versions.terms.partnerOffer.orderCategoriesobjectNoOrder categories that get the discount. Checked apart from the program's own orderCategories, which decide rewards. Absent means every order qualifies.
versions.terms.partnerOffer.currencyunionYes

versions.terms.partnerOffer.expiresAfterDays

Variant 1

Type: null.

Variant 2

Type: number.

versions.terms.partnerOffer.orderCategories

FieldTypeRequiredDetails
versions.terms.partnerOffer.orderCategories.includearrayNo
versions.terms.partnerOffer.orderCategories.excludearrayNo

versions.terms.partnerOffer.currency

Variant 1

Type: string.

Variant 2

Type: string.

Variant 3

Type: string.

Variant 4

Type: string.

versions.terms.milestoneRewards

FieldTypeRequiredDetails
versions.terms.milestoneRewards.eachReportobjectNo
versions.terms.milestoneRewards.atCountobjectNo

versions.terms.milestoneRewards.eachReport

FieldTypeRequiredDetails
versions.terms.milestoneRewards.eachReport.compensationunionYes
versions.terms.milestoneRewards.eachReport.limitnumberNoAbsent means every counted report. Reversed reports do not count toward the limit.

versions.terms.milestoneRewards.eachReport.compensation

Variant 1

FieldTypeRequiredDetails
versions.terms.milestoneRewards.eachReport.compensation.type"fixed"Yes
versions.terms.milestoneRewards.eachReport.compensation.amountCentsnumberYes

Variant 2

FieldTypeRequiredDetails
versions.terms.milestoneRewards.eachReport.compensation.type"percentage"Yes
versions.terms.milestoneRewards.eachReport.compensation.rateBpsnumberYes

versions.terms.milestoneRewards.atCount

FieldTypeRequiredDetails
versions.terms.milestoneRewards.atCount.amountCentsnumberYes
versions.terms.milestoneRewards.atCount.countnumberYes

versions.terms.duration

Variant 1

Type: null.

Variant 2

FieldTypeRequiredDetails
versions.terms.duration.type"only_order"Yes

Variant 3

FieldTypeRequiredDetails
versions.terms.duration.type"first_order"Yes

Variant 4

FieldTypeRequiredDetails
versions.terms.duration.type"first_n_orders"Yes
versions.terms.duration.countnumberYes

Variant 5

FieldTypeRequiredDetails
versions.terms.duration.type"days"Yes
versions.terms.duration.daysnumberYes

Variant 6

FieldTypeRequiredDetails
versions.terms.duration.type"months"Yes
versions.terms.duration.monthsnumberYes

Variant 7

FieldTypeRequiredDetails
versions.terms.duration.type"lifetime"Yes

versions.terms.fixedRefundMode

Variant 1

Type: null.

Variant 2

Type: string.

Variant 3

Type: string.

versions.terms.referralWindowDays

Variant 1

Type: null.

Variant 2

Type: number.

versions.terms.text

FieldTypeRequiredDetails
versions.terms.text.rewardobjectYesWhat the partner earns, such as "$10 credit when your friend completes their first order after your referral".
versions.terms.text.incentiveunionYesWhat the referred friend gets, such as "20% off your first order". Null without a friend incentive.
versions.terms.text.headlineobjectYesBoth sides in a few words, such as "Give 20%, get $10", or "Get $10" without a friend incentive.

versions.terms.text.reward

FieldTypeRequiredDetails
versions.terms.text.reward.enstringYes
versions.terms.text.reward.fr-CAstringYes
versions.terms.text.reward.hystringYes
versions.terms.text.reward.rustringYes

versions.terms.text.incentive

Variant 1

Type: null.

Variant 2

FieldTypeRequiredDetails
versions.terms.text.incentive.enstringYes
versions.terms.text.incentive.fr-CAstringYes
versions.terms.text.incentive.hystringYes
versions.terms.text.incentive.rustringYes

versions.terms.text.headline

FieldTypeRequiredDetails
versions.terms.text.headline.enstringYes
versions.terms.text.headline.fr-CAstringYes
versions.terms.text.headline.hystringYes
versions.terms.text.headline.rustringYes

versions.programSnapshot

FieldTypeRequiredDetails
versions.programSnapshot.currencyunionYesMust match the company currency.
versions.programSnapshot.namestringYes
versions.programSnapshot.kindunionYes
versions.programSnapshot.rewardTypeunionYes
versions.programSnapshot.attributionWindowDaysunionYesDays after a referral that a first purchase, or a milestone, still counts. The latest referral always wins until one qualifies. Only milestone programs may use null, which means the referral never expires.
versions.programSnapshot.activebooleanYes
versions.programSnapshot.orderCategoriesobjectNoOrder categories that earn rewards. Order programs only. The friend incentive has its own orderCategories. Absent means every order can earn.
versions.programSnapshot.compensationunionNo
versions.programSnapshot.trackingobjectNoTracking methods are independent of kind. Provider discounts require a connected provider.
versions.programSnapshot.destinationUrlstringNoThe page partner links and QR codes open. A published signup page's destination takes precedence. Without either, partners have no link.
versions.programSnapshot.displayobjectNoOptional public name, headline and milestone label for partner and customer screens.
versions.programSnapshot.triggerunionNoWhat earns a reward. Defaults to completed orders.
versions.programSnapshot.milestoneRewardsobjectNo
versions.programSnapshot.fixedRefundModeunionNoHow fixed rewards change after a partial refund.
versions.programSnapshot.durationunionNo
versions.programSnapshot.deliveryobjectNoWho delivers approved rewards of each type. Defaults to the Grizzlee wallet for both.
versions.programSnapshot.reviewRewardsunionNoWhen true, new rewards wait as pending until someone approves them. Otherwise they start approved.
versions.programSnapshot.fraudChecksobjectNoSelf-referral and other fraud rules. Absent means every rule uses its default.
versions.programSnapshot.performanceobjectNo
versions.programSnapshot.limitsobjectNo
versions.programSnapshot.customTermsarrayNo
versions.programSnapshot.friendIncentiveunionNoOptional offer for the referred customer.
versions.programSnapshot.partnerOfferunionNoOffer programs only. What the partner earns per qualifying referred order.

versions.programSnapshot.currency

Variant 1

Type: string.

Variant 2

Type: string.

Variant 3

Type: string.

Variant 4

Type: string.

versions.programSnapshot.kind

Variant 1

Type: string.

Variant 2

Type: string.

Variant 3

Type: string.

versions.programSnapshot.rewardType

Variant 1

Type: string.

Variant 2

Type: string.

Variant 3

Type: string.

versions.programSnapshot.attributionWindowDays

Variant 1

Type: null.

Variant 2

Type: number.

versions.programSnapshot.orderCategories

FieldTypeRequiredDetails
versions.programSnapshot.orderCategories.includearrayNo
versions.programSnapshot.orderCategories.excludearrayNo

versions.programSnapshot.compensation

Variant 1

FieldTypeRequiredDetails
versions.programSnapshot.compensation.type"percentage"Yes
versions.programSnapshot.compensation.rateBpsnumberYes
versions.programSnapshot.compensation.phasesarrayNo

versions.programSnapshot.compensation.phases[]

FieldTypeRequiredDetails
versions.programSnapshot.compensation.phases.rateBpsnumberYes
versions.programSnapshot.compensation.phases.afterMonthsnumberYes

Variant 2

FieldTypeRequiredDetails
versions.programSnapshot.compensation.type"fixed"Yes
versions.programSnapshot.compensation.amountCentsnumberYes

versions.programSnapshot.tracking

FieldTypeRequiredDetails
versions.programSnapshot.tracking.linksunionNo
versions.programSnapshot.tracking.qrCodesunionNo
versions.programSnapshot.tracking.attributionCodesunionNo
versions.programSnapshot.tracking.providerPromoCodesunionNo

Variant 1

Type: boolean.

Variant 2

Type: boolean.

versions.programSnapshot.tracking.qrCodes

Variant 1

Type: boolean.

Variant 2

Type: boolean.

versions.programSnapshot.tracking.attributionCodes

Variant 1

Type: boolean.

Variant 2

Type: boolean.

versions.programSnapshot.tracking.providerPromoCodes

Variant 1

Type: boolean.

Variant 2

Type: boolean.

versions.programSnapshot.display

FieldTypeRequiredDetails
versions.programSnapshot.display.enobjectNo
versions.programSnapshot.display.fr-CAobjectNo
versions.programSnapshot.display.hyobjectNo
versions.programSnapshot.display.ruobjectNo

versions.programSnapshot.display.en

FieldTypeRequiredDetails
versions.programSnapshot.display.en.publicNamestringNoThe name partners and customers see. Falls back to the program name.
versions.programSnapshot.display.en.headlinestringNoReplaces the generated headline, such as "Give 20%, get $10".
versions.programSnapshot.display.en.milestoneLabelobjectNoMilestone programs only. What one report counts, such as one: "lesson", other: "lessons". In Russian, other is the genitive plural, such as "уроков", which reward terms put after "число".

versions.programSnapshot.display.en.milestoneLabel

FieldTypeRequiredDetails
versions.programSnapshot.display.en.milestoneLabel.onestringYes
versions.programSnapshot.display.en.milestoneLabel.otherstringYes

versions.programSnapshot.display.fr-CA

FieldTypeRequiredDetails
versions.programSnapshot.display.fr-CA.publicNamestringNoThe name partners and customers see. Falls back to the program name.
versions.programSnapshot.display.fr-CA.headlinestringNoReplaces the generated headline, such as "Give 20%, get $10".
versions.programSnapshot.display.fr-CA.milestoneLabelobjectNoMilestone programs only. What one report counts, such as one: "lesson", other: "lessons". In Russian, other is the genitive plural, such as "уроков", which reward terms put after "число".

versions.programSnapshot.display.fr-CA.milestoneLabel

FieldTypeRequiredDetails
versions.programSnapshot.display.fr-CA.milestoneLabel.onestringYes
versions.programSnapshot.display.fr-CA.milestoneLabel.otherstringYes

versions.programSnapshot.display.hy

FieldTypeRequiredDetails
versions.programSnapshot.display.hy.publicNamestringNoThe name partners and customers see. Falls back to the program name.
versions.programSnapshot.display.hy.headlinestringNoReplaces the generated headline, such as "Give 20%, get $10".
versions.programSnapshot.display.hy.milestoneLabelobjectNoMilestone programs only. What one report counts, such as one: "lesson", other: "lessons". In Russian, other is the genitive plural, such as "уроков", which reward terms put after "число".

versions.programSnapshot.display.hy.milestoneLabel

FieldTypeRequiredDetails
versions.programSnapshot.display.hy.milestoneLabel.onestringYes
versions.programSnapshot.display.hy.milestoneLabel.otherstringYes

versions.programSnapshot.display.ru

FieldTypeRequiredDetails
versions.programSnapshot.display.ru.publicNamestringNoThe name partners and customers see. Falls back to the program name.
versions.programSnapshot.display.ru.headlinestringNoReplaces the generated headline, such as "Give 20%, get $10".
versions.programSnapshot.display.ru.milestoneLabelobjectNoMilestone programs only. What one report counts, such as one: "lesson", other: "lessons". In Russian, other is the genitive plural, such as "уроков", which reward terms put after "число".

versions.programSnapshot.display.ru.milestoneLabel

FieldTypeRequiredDetails
versions.programSnapshot.display.ru.milestoneLabel.onestringYes
versions.programSnapshot.display.ru.milestoneLabel.otherstringYes

versions.programSnapshot.trigger

Variant 1

FieldTypeRequiredDetails
versions.programSnapshot.trigger.type"order"Yes

Variant 2

FieldTypeRequiredDetails
versions.programSnapshot.trigger.type"milestone"Yes
versions.programSnapshot.trigger.milestonestringYes

versions.programSnapshot.milestoneRewards

FieldTypeRequiredDetails
versions.programSnapshot.milestoneRewards.eachReportobjectNo
versions.programSnapshot.milestoneRewards.atCountobjectNo

versions.programSnapshot.milestoneRewards.eachReport

FieldTypeRequiredDetails
versions.programSnapshot.milestoneRewards.eachReport.compensationunionYes
versions.programSnapshot.milestoneRewards.eachReport.limitnumberNoAbsent means every counted report. Reversed reports do not count toward the limit.

versions.programSnapshot.milestoneRewards.eachReport.compensation

Variant 1

FieldTypeRequiredDetails
versions.programSnapshot.milestoneRewards.eachReport.compensation.type"fixed"Yes
versions.programSnapshot.milestoneRewards.eachReport.compensation.amountCentsnumberYes

Variant 2

FieldTypeRequiredDetails
versions.programSnapshot.milestoneRewards.eachReport.compensation.type"percentage"Yes
versions.programSnapshot.milestoneRewards.eachReport.compensation.rateBpsnumberYes

versions.programSnapshot.milestoneRewards.atCount

FieldTypeRequiredDetails
versions.programSnapshot.milestoneRewards.atCount.amountCentsnumberYes
versions.programSnapshot.milestoneRewards.atCount.countnumberYes

versions.programSnapshot.fixedRefundMode

Variant 1

Type: string.

Variant 2

Type: string.

versions.programSnapshot.duration

Variant 1

FieldTypeRequiredDetails
versions.programSnapshot.duration.type"only_order"Yes

Variant 2

FieldTypeRequiredDetails
versions.programSnapshot.duration.type"first_order"Yes

Variant 3

FieldTypeRequiredDetails
versions.programSnapshot.duration.type"first_n_orders"Yes
versions.programSnapshot.duration.countnumberYes

Variant 4

FieldTypeRequiredDetails
versions.programSnapshot.duration.type"days"Yes
versions.programSnapshot.duration.daysnumberYes

Variant 5

FieldTypeRequiredDetails
versions.programSnapshot.duration.type"months"Yes
versions.programSnapshot.duration.monthsnumberYes

Variant 6

FieldTypeRequiredDetails
versions.programSnapshot.duration.type"lifetime"Yes

versions.programSnapshot.delivery

FieldTypeRequiredDetails
versions.programSnapshot.delivery.cashunionNo
versions.programSnapshot.delivery.creditunionNo

versions.programSnapshot.delivery.cash

Variant 1

Type: string.

Variant 2

Type: string.

versions.programSnapshot.delivery.credit

Variant 1

Type: string.

Variant 2

Type: string.

versions.programSnapshot.reviewRewards

Variant 1

Type: boolean.

Variant 2

Type: boolean.

versions.programSnapshot.fraudChecks

FieldTypeRequiredDetails
versions.programSnapshot.fraudChecks.selfReferralobjectNo
versions.programSnapshot.fraudChecks.duplicateAccountsobjectNo
versions.programSnapshot.fraudChecks.rapidRepeatsobjectNo
versions.programSnapshot.fraudChecks.repeatCustomerobjectNo
versions.programSnapshot.fraudChecks.disposableEmailobjectNo

versions.programSnapshot.fraudChecks.selfReferral

FieldTypeRequiredDetails
versions.programSnapshot.fraudChecks.selfReferral.actionunionNo

versions.programSnapshot.fraudChecks.selfReferral.action

Variant 1

Type: string.

Variant 2

Type: string.

Variant 3

Type: string.

Variant 4

Type: string.

versions.programSnapshot.fraudChecks.duplicateAccounts

FieldTypeRequiredDetails
versions.programSnapshot.fraudChecks.duplicateAccounts.actionunionNo
versions.programSnapshot.fraudChecks.duplicateAccounts.accountsnumberNoCustomers sharing one card or device that trigger the rule. This one counts when referred inside the window.
versions.programSnapshot.fraudChecks.duplicateAccounts.windowDaysnumberNo
versions.programSnapshot.fraudChecks.duplicateAccounts.ipAccountsunionNoCustomers sharing one IP address that trigger the rule. null leaves IP addresses out.

versions.programSnapshot.fraudChecks.duplicateAccounts.action

Variant 1

Type: string.

Variant 2

Type: string.

Variant 3

Type: string.

Variant 4

Type: string.

versions.programSnapshot.fraudChecks.duplicateAccounts.ipAccounts

Variant 1

Type: null.

Variant 2

Type: number.

versions.programSnapshot.fraudChecks.rapidRepeats

FieldTypeRequiredDetails
versions.programSnapshot.fraudChecks.rapidRepeats.actionunionNo
versions.programSnapshot.fraudChecks.rapidRepeats.referralsnumberNoReferrals from one device that trigger the rule. This one counts when referred inside the window.
versions.programSnapshot.fraudChecks.rapidRepeats.windowMinutesnumberNo
versions.programSnapshot.fraudChecks.rapidRepeats.ipReferralsunionNoReferrals from one IP address that trigger the rule. null leaves IP addresses out.

versions.programSnapshot.fraudChecks.rapidRepeats.action

Variant 1

Type: string.

Variant 2

Type: string.

Variant 3

Type: string.

Variant 4

Type: string.

versions.programSnapshot.fraudChecks.rapidRepeats.ipReferrals

Variant 1

Type: null.

Variant 2

Type: number.

versions.programSnapshot.fraudChecks.repeatCustomer

FieldTypeRequiredDetails
versions.programSnapshot.fraudChecks.repeatCustomer.actionunionNo

versions.programSnapshot.fraudChecks.repeatCustomer.action

Variant 1

Type: string.

Variant 2

Type: string.

Variant 3

Type: string.

Variant 4

Type: string.

versions.programSnapshot.fraudChecks.disposableEmail

FieldTypeRequiredDetails
versions.programSnapshot.fraudChecks.disposableEmail.actionunionNoA disposable address does not show a second person, so this rule cannot block.

versions.programSnapshot.fraudChecks.disposableEmail.action

Variant 1

Type: string.

Variant 2

Type: string.

Variant 3

Type: string.

versions.programSnapshot.performance

FieldTypeRequiredDetails
versions.programSnapshot.performance.metricunionYes
versions.programSnapshot.performance.tiersarrayYes
versions.programSnapshot.performance.windowDaysnumberNo

versions.programSnapshot.performance.metric

Variant 1

Type: string.

Variant 2

Type: string.

versions.programSnapshot.performance.tiers[]

FieldTypeRequiredDetails
versions.programSnapshot.performance.tiers.namestringYes
versions.programSnapshot.performance.tiers.minValuenumberYes
versions.programSnapshot.performance.tiers.bonusBpsnumberYes

versions.programSnapshot.limits

FieldTypeRequiredDetails
versions.programSnapshot.limits.customerCapCentsnumberNo
versions.programSnapshot.limits.partnerCapCentsnumberNo

versions.programSnapshot.customTerms[]

Variant 1

FieldTypeRequiredDetails
versions.programSnapshot.customTerms.target"partner"Yes
versions.programSnapshot.customTerms.targetIdstringYes
versions.programSnapshot.customTerms.compensationunionNo
versions.programSnapshot.customTerms.milestoneRewardsobjectNo
versions.programSnapshot.customTerms.customerCapCentsunionNo
versions.programSnapshot.customTerms.partnerCapCentsunionNo

versions.programSnapshot.customTerms.compensation

Variant 1

FieldTypeRequiredDetails
versions.programSnapshot.customTerms.compensation.type"percentage"Yes
versions.programSnapshot.customTerms.compensation.rateBpsnumberYes
versions.programSnapshot.customTerms.compensation.phasesarrayNo

versions.programSnapshot.customTerms.compensation.phases[]

FieldTypeRequiredDetails
versions.programSnapshot.customTerms.compensation.phases.rateBpsnumberYes
versions.programSnapshot.customTerms.compensation.phases.afterMonthsnumberYes

Variant 2

FieldTypeRequiredDetails
versions.programSnapshot.customTerms.compensation.type"fixed"Yes
versions.programSnapshot.customTerms.compensation.amountCentsnumberYes

versions.programSnapshot.customTerms.milestoneRewards

FieldTypeRequiredDetails
versions.programSnapshot.customTerms.milestoneRewards.eachReportobjectNo
versions.programSnapshot.customTerms.milestoneRewards.atCountobjectNo

versions.programSnapshot.customTerms.milestoneRewards.eachReport

FieldTypeRequiredDetails
versions.programSnapshot.customTerms.milestoneRewards.eachReport.compensationunionYes
versions.programSnapshot.customTerms.milestoneRewards.eachReport.limitnumberNoAbsent means every counted report. Reversed reports do not count toward the limit.

versions.programSnapshot.customTerms.milestoneRewards.eachReport.compensation

versions.programSnapshot.customTerms.milestoneRewards.atCount

FieldTypeRequiredDetails
versions.programSnapshot.customTerms.milestoneRewards.atCount.amountCentsnumberYes
versions.programSnapshot.customTerms.milestoneRewards.atCount.countnumberYes

versions.programSnapshot.customTerms.customerCapCents

Variant 1

Type: null.

Variant 2

Type: number.

versions.programSnapshot.customTerms.partnerCapCents

Variant 1

Type: null.

Variant 2

Type: number.

Variant 2

FieldTypeRequiredDetails
versions.programSnapshot.customTerms.target"customer"Yes
versions.programSnapshot.customTerms.targetIdstringYes
versions.programSnapshot.customTerms.compensationunionNo
versions.programSnapshot.customTerms.milestoneRewardsobjectNo
versions.programSnapshot.customTerms.customerCapCentsunionNo

versions.programSnapshot.customTerms.compensation

Variant 1

FieldTypeRequiredDetails
versions.programSnapshot.customTerms.compensation.type"percentage"Yes
versions.programSnapshot.customTerms.compensation.rateBpsnumberYes
versions.programSnapshot.customTerms.compensation.phasesarrayNo

versions.programSnapshot.customTerms.compensation.phases[]

FieldTypeRequiredDetails
versions.programSnapshot.customTerms.compensation.phases.rateBpsnumberYes
versions.programSnapshot.customTerms.compensation.phases.afterMonthsnumberYes

Variant 2

FieldTypeRequiredDetails
versions.programSnapshot.customTerms.compensation.type"fixed"Yes
versions.programSnapshot.customTerms.compensation.amountCentsnumberYes

versions.programSnapshot.customTerms.milestoneRewards

FieldTypeRequiredDetails
versions.programSnapshot.customTerms.milestoneRewards.eachReportobjectNo
versions.programSnapshot.customTerms.milestoneRewards.atCountobjectNo

versions.programSnapshot.customTerms.milestoneRewards.eachReport

FieldTypeRequiredDetails
versions.programSnapshot.customTerms.milestoneRewards.eachReport.compensationunionYes
versions.programSnapshot.customTerms.milestoneRewards.eachReport.limitnumberNoAbsent means every counted report. Reversed reports do not count toward the limit.

versions.programSnapshot.customTerms.milestoneRewards.eachReport.compensation

versions.programSnapshot.customTerms.milestoneRewards.atCount

FieldTypeRequiredDetails
versions.programSnapshot.customTerms.milestoneRewards.atCount.amountCentsnumberYes
versions.programSnapshot.customTerms.milestoneRewards.atCount.countnumberYes

versions.programSnapshot.customTerms.customerCapCents

Variant 1

Type: null.

Variant 2

Type: number.

versions.programSnapshot.friendIncentive

Variant 1

FieldTypeRequiredDetails
versions.programSnapshot.friendIncentive.type"percent"Yes
versions.programSnapshot.friendIncentive.rateBpsnumberYes
versions.programSnapshot.friendIncentive.maxDiscountCentsnumberNoLargest discount for one order.
versions.programSnapshot.friendIncentive.minOrderCentsnumberNoThe friend's order total before the discount must reach this amount. Checked by the merchant's checkout.
versions.programSnapshot.friendIncentive.ordersnumberNoHow many of the friend's orders get the incentive.
versions.programSnapshot.friendIncentive.newCustomersOnlyunionNotrue: use the merchant's newCustomer answer, or recorded purchases when omitted. false: returning customers qualify too. A supplied answer uses the order limit after the referral.
versions.programSnapshot.friendIncentive.expiresAfterDaysunionNoDays after the referral was captured, claimed or entered. null means it never expires.
versions.programSnapshot.friendIncentive.returnOnFullRefundunionNotrue: a full refund gives the use back, so the customer can get the offer again.
versions.programSnapshot.friendIncentive.orderCategoriesobjectNoOrder categories that get the discount. Checked apart from the program's own orderCategories, which decide rewards. Absent means every order qualifies.

versions.programSnapshot.friendIncentive.newCustomersOnly

Variant 1

Type: boolean.

Variant 2

Type: boolean.

versions.programSnapshot.friendIncentive.expiresAfterDays

Variant 1

Type: null.

Variant 2

Type: number.

versions.programSnapshot.friendIncentive.returnOnFullRefund

Variant 1

Type: boolean.

Variant 2

Type: boolean.

versions.programSnapshot.friendIncentive.orderCategories

FieldTypeRequiredDetails
versions.programSnapshot.friendIncentive.orderCategories.includearrayNo
versions.programSnapshot.friendIncentive.orderCategories.excludearrayNo

Variant 2

FieldTypeRequiredDetails
versions.programSnapshot.friendIncentive.type"fixed"Yes
versions.programSnapshot.friendIncentive.amountCentsnumberYes
versions.programSnapshot.friendIncentive.minOrderCentsnumberNoThe friend's order total before the discount must reach this amount. Checked by the merchant's checkout.
versions.programSnapshot.friendIncentive.ordersnumberNoHow many of the friend's orders get the incentive.
versions.programSnapshot.friendIncentive.newCustomersOnlyunionNotrue: use the merchant's newCustomer answer, or recorded purchases when omitted. false: returning customers qualify too. A supplied answer uses the order limit after the referral.
versions.programSnapshot.friendIncentive.expiresAfterDaysunionNoDays after the referral was captured, claimed or entered. null means it never expires.
versions.programSnapshot.friendIncentive.returnOnFullRefundunionNotrue: a full refund gives the use back, so the customer can get the offer again.
versions.programSnapshot.friendIncentive.orderCategoriesobjectNoOrder categories that get the discount. Checked apart from the program's own orderCategories, which decide rewards. Absent means every order qualifies.

versions.programSnapshot.friendIncentive.newCustomersOnly

Variant 1

Type: boolean.

Variant 2

Type: boolean.

versions.programSnapshot.friendIncentive.expiresAfterDays

Variant 1

Type: null.

Variant 2

Type: number.

versions.programSnapshot.friendIncentive.returnOnFullRefund

Variant 1

Type: boolean.

Variant 2

Type: boolean.

versions.programSnapshot.friendIncentive.orderCategories

FieldTypeRequiredDetails
versions.programSnapshot.friendIncentive.orderCategories.includearrayNo
versions.programSnapshot.friendIncentive.orderCategories.excludearrayNo

versions.programSnapshot.partnerOffer

Variant 1

FieldTypeRequiredDetails
versions.programSnapshot.partnerOffer.type"percent"Yes
versions.programSnapshot.partnerOffer.rateBpsnumberYes
versions.programSnapshot.partnerOffer.maxDiscountCentsnumberNoLargest discount for one order.
versions.programSnapshot.partnerOffer.minOrderCentsnumberNoThe friend's order total before the discount must reach this amount. Checked by the merchant's checkout.
versions.programSnapshot.partnerOffer.ordersnumberNoHow many of the friend's orders get the incentive.
versions.programSnapshot.partnerOffer.expiresAfterDaysunionNoDays after the referral was captured, claimed or entered. null means it never expires.
versions.programSnapshot.partnerOffer.returnOnFullRefundunionNotrue: a full refund gives the use back, so the customer can get the offer again.
versions.programSnapshot.partnerOffer.orderCategoriesobjectNoOrder categories that get the discount. Checked apart from the program's own orderCategories, which decide rewards. Absent means every order qualifies.

versions.programSnapshot.partnerOffer.expiresAfterDays

Variant 1

Type: null.

Variant 2

Type: number.

versions.programSnapshot.partnerOffer.returnOnFullRefund

Variant 1

Type: boolean.

Variant 2

Type: boolean.

versions.programSnapshot.partnerOffer.orderCategories

FieldTypeRequiredDetails
versions.programSnapshot.partnerOffer.orderCategories.includearrayNo
versions.programSnapshot.partnerOffer.orderCategories.excludearrayNo

Variant 2

FieldTypeRequiredDetails
versions.programSnapshot.partnerOffer.type"fixed"Yes
versions.programSnapshot.partnerOffer.amountCentsnumberYes
versions.programSnapshot.partnerOffer.minOrderCentsnumberNoThe friend's order total before the discount must reach this amount. Checked by the merchant's checkout.
versions.programSnapshot.partnerOffer.ordersnumberNoHow many of the friend's orders get the incentive.
versions.programSnapshot.partnerOffer.expiresAfterDaysunionNoDays after the referral was captured, claimed or entered. null means it never expires.
versions.programSnapshot.partnerOffer.returnOnFullRefundunionNotrue: a full refund gives the use back, so the customer can get the offer again.
versions.programSnapshot.partnerOffer.orderCategoriesobjectNoOrder categories that get the discount. Checked apart from the program's own orderCategories, which decide rewards. Absent means every order qualifies.

versions.programSnapshot.partnerOffer.expiresAfterDays

Variant 1

Type: null.

Variant 2

Type: number.

versions.programSnapshot.partnerOffer.returnOnFullRefund

Variant 1

Type: boolean.

Variant 2

Type: boolean.

versions.programSnapshot.partnerOffer.orderCategories

FieldTypeRequiredDetails
versions.programSnapshot.partnerOffer.orderCategories.includearrayNo
versions.programSnapshot.partnerOffer.orderCategories.excludearrayNo

Response schema

json
{
  "type": "object",
  "properties": {
    "versions": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "terms": {
            "type": "object",
            "properties": {
              "trigger": {
                "anyOf": [
                  {
                    "type": "object",
                    "properties": {
                      "type": {
                        "type": "string",
                        "const": "order"
                      }
                    },
                    "required": [
                      "type"
                    ]
                  },
                  {
                    "type": "object",
                    "properties": {
                      "type": {
                        "type": "string",
                        "const": "milestone"
                      },
                      "milestone": {
                        "type": "string"
                      }
                    },
                    "required": [
                      "type",
                      "milestone"
                    ]
                  }
                ]
              },
              "rewardType": {
                "anyOf": [
                  {
                    "type": "string",
                    "const": "offer"
                  },
                  {
                    "type": "string",
                    "const": "cash"
                  },
                  {
                    "type": "string",
                    "const": "credit"
                  }
                ]
              },
              "currency": {
                "anyOf": [
                  {
                    "type": "string",
                    "const": "CAD"
                  },
                  {
                    "type": "string",
                    "const": "USD"
                  },
                  {
                    "type": "string",
                    "const": "EUR"
                  },
                  {
                    "type": "string",
                    "const": "GBP"
                  }
                ]
              },
              "compensation": {
                "anyOf": [
                  {
                    "type": "null"
                  },
                  {
                    "type": "object",
                    "properties": {
                      "type": {
                        "type": "string",
                        "const": "percentage"
                      },
                      "rateBps": {
                        "type": "number",
                        "description": "Base rate, before any performance tier bonus."
                      },
                      "phases": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "afterMonths": {
                              "type": "number"
                            },
                            "rateBps": {
                              "type": "number"
                            }
                          },
                          "required": [
                            "afterMonths",
                            "rateBps"
                          ]
                        },
                        "description": "Later rates by months after the customer's first rewarded order. Empty when the rate never changes."
                      }
                    },
                    "required": [
                      "type",
                      "rateBps",
                      "phases"
                    ]
                  },
                  {
                    "type": "object",
                    "properties": {
                      "type": {
                        "type": "string",
                        "const": "fixed"
                      },
                      "amountCents": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "type",
                      "amountCents"
                    ]
                  }
                ],
                "description": "What the partner earns. This partner's custom terms replace the program's when it has them."
              },
              "partnerOffer": {
                "anyOf": [
                  {
                    "type": "null"
                  },
                  {
                    "type": "object",
                    "properties": {
                      "type": {
                        "type": "string",
                        "const": "percent"
                      },
                      "rateBps": {
                        "type": "number"
                      },
                      "orders": {
                        "type": "number",
                        "description": "How many of the friend's orders get the incentive."
                      },
                      "expiresAfterDays": {
                        "anyOf": [
                          {
                            "type": "null"
                          },
                          {
                            "type": "number"
                          }
                        ],
                        "description": "Days after the referral was captured, claimed or entered. null means it never expires."
                      },
                      "returnOnFullRefund": {
                        "type": "boolean",
                        "description": "true: a full refund gives the use back, so the customer can get the offer again."
                      },
                      "maxDiscountCents": {
                        "type": "number",
                        "description": "Largest discount for one order."
                      },
                      "minOrderCents": {
                        "type": "number",
                        "description": "The friend's order total before the discount must reach this amount. Checked by the merchant's checkout."
                      },
                      "orderCategories": {
                        "type": "object",
                        "properties": {
                          "include": {
                            "type": "array",
                            "items": {
                              "type": "string"
                            }
                          },
                          "exclude": {
                            "type": "array",
                            "items": {
                              "type": "string"
                            }
                          }
                        },
                        "description": "Order categories that get the discount. Checked apart from the program's own orderCategories,\nwhich decide rewards. Absent means every order qualifies."
                      },
                      "currency": {
                        "anyOf": [
                          {
                            "type": "string",
                            "const": "CAD"
                          },
                          {
                            "type": "string",
                            "const": "USD"
                          },
                          {
                            "type": "string",
                            "const": "EUR"
                          },
                          {
                            "type": "string",
                            "const": "GBP"
                          }
                        ]
                      }
                    },
                    "required": [
                      "type",
                      "rateBps",
                      "orders",
                      "expiresAfterDays",
                      "returnOnFullRefund",
                      "currency"
                    ]
                  },
                  {
                    "type": "object",
                    "properties": {
                      "type": {
                        "type": "string",
                        "const": "fixed"
                      },
                      "orders": {
                        "type": "number",
                        "description": "How many of the friend's orders get the incentive."
                      },
                      "expiresAfterDays": {
                        "anyOf": [
                          {
                            "type": "null"
                          },
                          {
                            "type": "number"
                          }
                        ],
                        "description": "Days after the referral was captured, claimed or entered. null means it never expires."
                      },
                      "returnOnFullRefund": {
                        "type": "boolean",
                        "description": "true: a full refund gives the use back, so the customer can get the offer again."
                      },
                      "amountCents": {
                        "type": "number"
                      },
                      "minOrderCents": {
                        "type": "number",
                        "description": "The friend's order total before the discount must reach this amount. Checked by the merchant's checkout."
                      },
                      "orderCategories": {
                        "type": "object",
                        "properties": {
                          "include": {
                            "type": "array",
                            "items": {
                              "type": "string"
                            }
                          },
                          "exclude": {
                            "type": "array",
                            "items": {
                              "type": "string"
                            }
                          }
                        },
                        "description": "Order categories that get the discount. Checked apart from the program's own orderCategories,\nwhich decide rewards. Absent means every order qualifies."
                      },
                      "currency": {
                        "anyOf": [
                          {
                            "type": "string",
                            "const": "CAD"
                          },
                          {
                            "type": "string",
                            "const": "USD"
                          },
                          {
                            "type": "string",
                            "const": "EUR"
                          },
                          {
                            "type": "string",
                            "const": "GBP"
                          }
                        ]
                      }
                    },
                    "required": [
                      "type",
                      "orders",
                      "expiresAfterDays",
                      "returnOnFullRefund",
                      "amountCents",
                      "currency"
                    ]
                  }
                ],
                "description": "The partner's earned discount with currency. Null for money rewards."
              },
              "milestoneRewards": {
                "type": "object",
                "properties": {
                  "eachReport": {
                    "type": "object",
                    "properties": {
                      "compensation": {
                        "anyOf": [
                          {
                            "type": "object",
                            "properties": {
                              "type": {
                                "type": "string",
                                "const": "fixed"
                              },
                              "amountCents": {
                                "type": "number"
                              }
                            },
                            "required": [
                              "type",
                              "amountCents"
                            ]
                          },
                          {
                            "type": "object",
                            "properties": {
                              "type": {
                                "type": "string",
                                "const": "percentage"
                              },
                              "rateBps": {
                                "type": "number"
                              }
                            },
                            "required": [
                              "type",
                              "rateBps"
                            ]
                          }
                        ]
                      },
                      "limit": {
                        "type": "number",
                        "description": "Absent means every counted report. Reversed reports do not count toward the limit."
                      }
                    },
                    "required": [
                      "compensation"
                    ]
                  },
                  "atCount": {
                    "type": "object",
                    "properties": {
                      "amountCents": {
                        "type": "number"
                      },
                      "count": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "amountCents",
                      "count"
                    ]
                  }
                }
              },
              "duration": {
                "anyOf": [
                  {
                    "type": "null"
                  },
                  {
                    "type": "object",
                    "properties": {
                      "type": {
                        "type": "string",
                        "const": "only_order"
                      }
                    },
                    "required": [
                      "type"
                    ]
                  },
                  {
                    "type": "object",
                    "properties": {
                      "type": {
                        "type": "string",
                        "const": "first_order"
                      }
                    },
                    "required": [
                      "type"
                    ]
                  },
                  {
                    "type": "object",
                    "properties": {
                      "type": {
                        "type": "string",
                        "const": "first_n_orders"
                      },
                      "count": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "type",
                      "count"
                    ]
                  },
                  {
                    "type": "object",
                    "properties": {
                      "type": {
                        "type": "string",
                        "const": "days"
                      },
                      "days": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "type",
                      "days"
                    ]
                  },
                  {
                    "type": "object",
                    "properties": {
                      "type": {
                        "type": "string",
                        "const": "months"
                      },
                      "months": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "type",
                      "months"
                    ]
                  },
                  {
                    "type": "object",
                    "properties": {
                      "type": {
                        "type": "string",
                        "const": "lifetime"
                      }
                    },
                    "required": [
                      "type"
                    ]
                  }
                ],
                "description": "Which orders of a referred customer earn a reward. Null for milestone programs."
              },
              "fixedRefundMode": {
                "anyOf": [
                  {
                    "type": "null"
                  },
                  {
                    "type": "string",
                    "const": "prorate"
                  },
                  {
                    "type": "string",
                    "const": "full_refund_only"
                  }
                ],
                "description": "How a partial refund changes a fixed order reward. Null for percentage and milestone rewards."
              },
              "referralWindowDays": {
                "anyOf": [
                  {
                    "type": "null"
                  },
                  {
                    "type": "number"
                  }
                ],
                "description": "Days a referral stays open until an order or milestone qualifies it. Null when it never expires."
              },
              "text": {
                "type": "object",
                "properties": {
                  "reward": {
                    "type": "object",
                    "properties": {
                      "en": {
                        "type": "string"
                      },
                      "fr-CA": {
                        "type": "string"
                      },
                      "hy": {
                        "type": "string"
                      },
                      "ru": {
                        "type": "string"
                      }
                    },
                    "required": [
                      "en",
                      "fr-CA",
                      "hy",
                      "ru"
                    ],
                    "description": "What the partner earns, such as \"$10 credit when your friend completes their first order after your referral\"."
                  },
                  "incentive": {
                    "anyOf": [
                      {
                        "type": "null"
                      },
                      {
                        "type": "object",
                        "properties": {
                          "en": {
                            "type": "string"
                          },
                          "fr-CA": {
                            "type": "string"
                          },
                          "hy": {
                            "type": "string"
                          },
                          "ru": {
                            "type": "string"
                          }
                        },
                        "required": [
                          "en",
                          "fr-CA",
                          "hy",
                          "ru"
                        ]
                      }
                    ],
                    "description": "What the referred friend gets, such as \"20% off your first order\". Null without a friend incentive."
                  },
                  "headline": {
                    "type": "object",
                    "properties": {
                      "en": {
                        "type": "string"
                      },
                      "fr-CA": {
                        "type": "string"
                      },
                      "hy": {
                        "type": "string"
                      },
                      "ru": {
                        "type": "string"
                      }
                    },
                    "required": [
                      "en",
                      "fr-CA",
                      "hy",
                      "ru"
                    ],
                    "description": "Both sides in a few words, such as \"Give 20%, get $10\", or \"Get $10\" without a friend incentive."
                  }
                },
                "required": [
                  "reward",
                  "incentive",
                  "headline"
                ]
              }
            },
            "required": [
              "trigger",
              "rewardType",
              "currency",
              "compensation",
              "partnerOffer",
              "duration",
              "fixedRefundMode",
              "referralWindowDays",
              "text"
            ],
            "description": "Readable reward terms of this version, with the program's own compensation."
          },
          "companyId": {
            "type": "string"
          },
          "programId": {
            "type": "string"
          },
          "version": {
            "type": "number"
          },
          "programSnapshot": {
            "type": "object",
            "properties": {
              "currency": {
                "anyOf": [
                  {
                    "type": "string",
                    "const": "CAD"
                  },
                  {
                    "type": "string",
                    "const": "USD"
                  },
                  {
                    "type": "string",
                    "const": "EUR"
                  },
                  {
                    "type": "string",
                    "const": "GBP"
                  }
                ],
                "description": "Must match the company currency."
              },
              "name": {
                "type": "string"
              },
              "kind": {
                "anyOf": [
                  {
                    "type": "string",
                    "const": "referral"
                  },
                  {
                    "type": "string",
                    "const": "affiliate"
                  },
                  {
                    "type": "string",
                    "const": "both"
                  }
                ]
              },
              "rewardType": {
                "anyOf": [
                  {
                    "type": "string",
                    "const": "offer"
                  },
                  {
                    "type": "string",
                    "const": "cash"
                  },
                  {
                    "type": "string",
                    "const": "credit"
                  }
                ]
              },
              "attributionWindowDays": {
                "anyOf": [
                  {
                    "type": "null"
                  },
                  {
                    "type": "number"
                  }
                ],
                "description": "Days after a referral that a first purchase, or a milestone, still counts. The latest\nreferral always wins until one qualifies. Only milestone programs may use null, which means\nthe referral never expires."
              },
              "active": {
                "type": "boolean"
              },
              "orderCategories": {
                "type": "object",
                "properties": {
                  "include": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  },
                  "exclude": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  }
                },
                "description": "Order categories that earn rewards. Order programs only. The friend incentive has its own\norderCategories. Absent means every order can earn."
              },
              "compensation": {
                "anyOf": [
                  {
                    "type": "object",
                    "properties": {
                      "type": {
                        "type": "string",
                        "const": "percentage"
                      },
                      "rateBps": {
                        "type": "number"
                      },
                      "phases": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "rateBps": {
                              "type": "number"
                            },
                            "afterMonths": {
                              "type": "number"
                            }
                          },
                          "required": [
                            "rateBps",
                            "afterMonths"
                          ]
                        }
                      }
                    },
                    "required": [
                      "type",
                      "rateBps"
                    ]
                  },
                  {
                    "type": "object",
                    "properties": {
                      "type": {
                        "type": "string",
                        "const": "fixed"
                      },
                      "amountCents": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "type",
                      "amountCents"
                    ]
                  }
                ]
              },
              "tracking": {
                "type": "object",
                "properties": {
                  "links": {
                    "anyOf": [
                      {
                        "type": "boolean",
                        "const": false
                      },
                      {
                        "type": "boolean",
                        "const": true
                      }
                    ]
                  },
                  "qrCodes": {
                    "anyOf": [
                      {
                        "type": "boolean",
                        "const": false
                      },
                      {
                        "type": "boolean",
                        "const": true
                      }
                    ]
                  },
                  "attributionCodes": {
                    "anyOf": [
                      {
                        "type": "boolean",
                        "const": false
                      },
                      {
                        "type": "boolean",
                        "const": true
                      }
                    ]
                  },
                  "providerPromoCodes": {
                    "anyOf": [
                      {
                        "type": "boolean",
                        "const": false
                      },
                      {
                        "type": "boolean",
                        "const": true
                      }
                    ]
                  }
                },
                "description": "Tracking methods are independent of kind. Provider discounts require a connected provider."
              },
              "destinationUrl": {
                "type": "string",
                "description": "The page partner links and QR codes open. A published signup page's destination takes\nprecedence. Without either, partners have no link."
              },
              "display": {
                "type": "object",
                "properties": {
                  "en": {
                    "type": "object",
                    "properties": {
                      "publicName": {
                        "type": "string",
                        "description": "The name partners and customers see. Falls back to the program name."
                      },
                      "headline": {
                        "type": "string",
                        "description": "Replaces the generated headline, such as \"Give 20%, get $10\"."
                      },
                      "milestoneLabel": {
                        "type": "object",
                        "properties": {
                          "one": {
                            "type": "string"
                          },
                          "other": {
                            "type": "string"
                          }
                        },
                        "required": [
                          "one",
                          "other"
                        ],
                        "description": "Milestone programs only. What one report counts, such as one: \"lesson\", other: \"lessons\".\nIn Russian, other is the genitive plural, such as \"уроков\", which reward terms put after\n\"число\"."
                      }
                    }
                  },
                  "fr-CA": {
                    "type": "object",
                    "properties": {
                      "publicName": {
                        "type": "string",
                        "description": "The name partners and customers see. Falls back to the program name."
                      },
                      "headline": {
                        "type": "string",
                        "description": "Replaces the generated headline, such as \"Give 20%, get $10\"."
                      },
                      "milestoneLabel": {
                        "type": "object",
                        "properties": {
                          "one": {
                            "type": "string"
                          },
                          "other": {
                            "type": "string"
                          }
                        },
                        "required": [
                          "one",
                          "other"
                        ],
                        "description": "Milestone programs only. What one report counts, such as one: \"lesson\", other: \"lessons\".\nIn Russian, other is the genitive plural, such as \"уроков\", which reward terms put after\n\"число\"."
                      }
                    }
                  },
                  "hy": {
                    "type": "object",
                    "properties": {
                      "publicName": {
                        "type": "string",
                        "description": "The name partners and customers see. Falls back to the program name."
                      },
                      "headline": {
                        "type": "string",
                        "description": "Replaces the generated headline, such as \"Give 20%, get $10\"."
                      },
                      "milestoneLabel": {
                        "type": "object",
                        "properties": {
                          "one": {
                            "type": "string"
                          },
                          "other": {
                            "type": "string"
                          }
                        },
                        "required": [
                          "one",
                          "other"
                        ],
                        "description": "Milestone programs only. What one report counts, such as one: \"lesson\", other: \"lessons\".\nIn Russian, other is the genitive plural, such as \"уроков\", which reward terms put after\n\"число\"."
                      }
                    }
                  },
                  "ru": {
                    "type": "object",
                    "properties": {
                      "publicName": {
                        "type": "string",
                        "description": "The name partners and customers see. Falls back to the program name."
                      },
                      "headline": {
                        "type": "string",
                        "description": "Replaces the generated headline, such as \"Give 20%, get $10\"."
                      },
                      "milestoneLabel": {
                        "type": "object",
                        "properties": {
                          "one": {
                            "type": "string"
                          },
                          "other": {
                            "type": "string"
                          }
                        },
                        "required": [
                          "one",
                          "other"
                        ],
                        "description": "Milestone programs only. What one report counts, such as one: \"lesson\", other: \"lessons\".\nIn Russian, other is the genitive plural, such as \"уроков\", which reward terms put after\n\"число\"."
                      }
                    }
                  }
                },
                "description": "Optional public name, headline and milestone label for partner and customer screens."
              },
              "trigger": {
                "anyOf": [
                  {
                    "type": "object",
                    "properties": {
                      "type": {
                        "type": "string",
                        "const": "order"
                      }
                    },
                    "required": [
                      "type"
                    ]
                  },
                  {
                    "type": "object",
                    "properties": {
                      "type": {
                        "type": "string",
                        "const": "milestone"
                      },
                      "milestone": {
                        "type": "string"
                      }
                    },
                    "required": [
                      "type",
                      "milestone"
                    ]
                  }
                ],
                "description": "What earns a reward. Defaults to completed orders."
              },
              "milestoneRewards": {
                "type": "object",
                "properties": {
                  "eachReport": {
                    "type": "object",
                    "properties": {
                      "compensation": {
                        "anyOf": [
                          {
                            "type": "object",
                            "properties": {
                              "type": {
                                "type": "string",
                                "const": "fixed"
                              },
                              "amountCents": {
                                "type": "number"
                              }
                            },
                            "required": [
                              "type",
                              "amountCents"
                            ]
                          },
                          {
                            "type": "object",
                            "properties": {
                              "type": {
                                "type": "string",
                                "const": "percentage"
                              },
                              "rateBps": {
                                "type": "number"
                              }
                            },
                            "required": [
                              "type",
                              "rateBps"
                            ]
                          }
                        ]
                      },
                      "limit": {
                        "type": "number",
                        "description": "Absent means every counted report. Reversed reports do not count toward the limit."
                      }
                    },
                    "required": [
                      "compensation"
                    ]
                  },
                  "atCount": {
                    "type": "object",
                    "properties": {
                      "amountCents": {
                        "type": "number"
                      },
                      "count": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "amountCents",
                      "count"
                    ]
                  }
                }
              },
              "fixedRefundMode": {
                "anyOf": [
                  {
                    "type": "string",
                    "const": "prorate"
                  },
                  {
                    "type": "string",
                    "const": "full_refund_only"
                  }
                ],
                "description": "How fixed rewards change after a partial refund."
              },
              "duration": {
                "anyOf": [
                  {
                    "type": "object",
                    "properties": {
                      "type": {
                        "type": "string",
                        "const": "only_order"
                      }
                    },
                    "required": [
                      "type"
                    ]
                  },
                  {
                    "type": "object",
                    "properties": {
                      "type": {
                        "type": "string",
                        "const": "first_order"
                      }
                    },
                    "required": [
                      "type"
                    ]
                  },
                  {
                    "type": "object",
                    "properties": {
                      "type": {
                        "type": "string",
                        "const": "first_n_orders"
                      },
                      "count": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "type",
                      "count"
                    ]
                  },
                  {
                    "type": "object",
                    "properties": {
                      "type": {
                        "type": "string",
                        "const": "days"
                      },
                      "days": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "type",
                      "days"
                    ]
                  },
                  {
                    "type": "object",
                    "properties": {
                      "type": {
                        "type": "string",
                        "const": "months"
                      },
                      "months": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "type",
                      "months"
                    ]
                  },
                  {
                    "type": "object",
                    "properties": {
                      "type": {
                        "type": "string",
                        "const": "lifetime"
                      }
                    },
                    "required": [
                      "type"
                    ]
                  }
                ]
              },
              "delivery": {
                "type": "object",
                "properties": {
                  "cash": {
                    "anyOf": [
                      {
                        "type": "string",
                        "const": "grizzlee_wallet"
                      },
                      {
                        "type": "string",
                        "const": "merchant"
                      }
                    ]
                  },
                  "credit": {
                    "anyOf": [
                      {
                        "type": "string",
                        "const": "grizzlee_wallet"
                      },
                      {
                        "type": "string",
                        "const": "merchant"
                      }
                    ]
                  }
                },
                "description": "Who delivers approved rewards of each type. Defaults to the Grizzlee wallet for both."
              },
              "reviewRewards": {
                "anyOf": [
                  {
                    "type": "boolean",
                    "const": false
                  },
                  {
                    "type": "boolean",
                    "const": true
                  }
                ],
                "description": "When true, new rewards wait as pending until someone approves them. Otherwise they start approved."
              },
              "fraudChecks": {
                "type": "object",
                "properties": {
                  "selfReferral": {
                    "type": "object",
                    "properties": {
                      "action": {
                        "anyOf": [
                          {
                            "type": "string",
                            "const": "review"
                          },
                          {
                            "type": "string",
                            "const": "block"
                          },
                          {
                            "type": "string",
                            "const": "flag"
                          },
                          {
                            "type": "string",
                            "const": "off"
                          }
                        ]
                      }
                    }
                  },
                  "duplicateAccounts": {
                    "type": "object",
                    "properties": {
                      "action": {
                        "anyOf": [
                          {
                            "type": "string",
                            "const": "review"
                          },
                          {
                            "type": "string",
                            "const": "block"
                          },
                          {
                            "type": "string",
                            "const": "flag"
                          },
                          {
                            "type": "string",
                            "const": "off"
                          }
                        ]
                      },
                      "accounts": {
                        "type": "number",
                        "description": "Customers sharing one card or device that trigger the rule. This one counts when referred inside the window."
                      },
                      "windowDays": {
                        "type": "number"
                      },
                      "ipAccounts": {
                        "anyOf": [
                          {
                            "type": "null"
                          },
                          {
                            "type": "number"
                          }
                        ],
                        "description": "Customers sharing one IP address that trigger the rule. null leaves IP addresses out."
                      }
                    }
                  },
                  "rapidRepeats": {
                    "type": "object",
                    "properties": {
                      "action": {
                        "anyOf": [
                          {
                            "type": "string",
                            "const": "review"
                          },
                          {
                            "type": "string",
                            "const": "block"
                          },
                          {
                            "type": "string",
                            "const": "flag"
                          },
                          {
                            "type": "string",
                            "const": "off"
                          }
                        ]
                      },
                      "referrals": {
                        "type": "number",
                        "description": "Referrals from one device that trigger the rule. This one counts when referred inside the window."
                      },
                      "windowMinutes": {
                        "type": "number"
                      },
                      "ipReferrals": {
                        "anyOf": [
                          {
                            "type": "null"
                          },
                          {
                            "type": "number"
                          }
                        ],
                        "description": "Referrals from one IP address that trigger the rule. null leaves IP addresses out."
                      }
                    }
                  },
                  "repeatCustomer": {
                    "type": "object",
                    "properties": {
                      "action": {
                        "anyOf": [
                          {
                            "type": "string",
                            "const": "review"
                          },
                          {
                            "type": "string",
                            "const": "block"
                          },
                          {
                            "type": "string",
                            "const": "flag"
                          },
                          {
                            "type": "string",
                            "const": "off"
                          }
                        ]
                      }
                    }
                  },
                  "disposableEmail": {
                    "type": "object",
                    "properties": {
                      "action": {
                        "anyOf": [
                          {
                            "type": "string",
                            "const": "review"
                          },
                          {
                            "type": "string",
                            "const": "flag"
                          },
                          {
                            "type": "string",
                            "const": "off"
                          }
                        ],
                        "description": "A disposable address does not show a second person, so this rule cannot block."
                      }
                    }
                  }
                },
                "description": "Self-referral and other fraud rules. Absent means every rule uses its default."
              },
              "performance": {
                "type": "object",
                "properties": {
                  "metric": {
                    "anyOf": [
                      {
                        "type": "string",
                        "const": "orders"
                      },
                      {
                        "type": "string",
                        "const": "new_customers"
                      }
                    ]
                  },
                  "tiers": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "name": {
                          "type": "string"
                        },
                        "minValue": {
                          "type": "number"
                        },
                        "bonusBps": {
                          "type": "number"
                        }
                      },
                      "required": [
                        "name",
                        "minValue",
                        "bonusBps"
                      ]
                    }
                  },
                  "windowDays": {
                    "type": "number"
                  }
                },
                "required": [
                  "metric",
                  "tiers"
                ]
              },
              "limits": {
                "type": "object",
                "properties": {
                  "customerCapCents": {
                    "type": "number"
                  },
                  "partnerCapCents": {
                    "type": "number"
                  }
                }
              },
              "customTerms": {
                "type": "array",
                "items": {
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "target": {
                          "type": "string",
                          "const": "partner"
                        },
                        "targetId": {
                          "type": "string"
                        },
                        "compensation": {
                          "anyOf": [
                            {
                              "type": "object",
                              "properties": {
                                "type": {
                                  "type": "string",
                                  "const": "percentage"
                                },
                                "rateBps": {
                                  "type": "number"
                                },
                                "phases": {
                                  "type": "array",
                                  "items": {
                                    "type": "object",
                                    "properties": {
                                      "rateBps": {
                                        "type": "number"
                                      },
                                      "afterMonths": {
                                        "type": "number"
                                      }
                                    },
                                    "required": [
                                      "rateBps",
                                      "afterMonths"
                                    ]
                                  }
                                }
                              },
                              "required": [
                                "type",
                                "rateBps"
                              ]
                            },
                            {
                              "type": "object",
                              "properties": {
                                "type": {
                                  "type": "string",
                                  "const": "fixed"
                                },
                                "amountCents": {
                                  "type": "number"
                                }
                              },
                              "required": [
                                "type",
                                "amountCents"
                              ]
                            }
                          ]
                        },
                        "milestoneRewards": {
                          "type": "object",
                          "properties": {
                            "eachReport": {
                              "type": "object",
                              "properties": {
                                "compensation": {
                                  "anyOf": [
                                    {
                                      "type": "object",
                                      "properties": {
                                        "type": {
                                          "type": "string",
                                          "const": "fixed"
                                        },
                                        "amountCents": {
                                          "type": "number"
                                        }
                                      },
                                      "required": [
                                        "type",
                                        "amountCents"
                                      ]
                                    },
                                    {
                                      "type": "object",
                                      "properties": {
                                        "type": {
                                          "type": "string",
                                          "const": "percentage"
                                        },
                                        "rateBps": {
                                          "type": "number"
                                        }
                                      },
                                      "required": [
                                        "type",
                                        "rateBps"
                                      ]
                                    }
                                  ]
                                },
                                "limit": {
                                  "type": "number",
                                  "description": "Absent means every counted report. Reversed reports do not count toward the limit."
                                }
                              },
                              "required": [
                                "compensation"
                              ]
                            },
                            "atCount": {
                              "type": "object",
                              "properties": {
                                "amountCents": {
                                  "type": "number"
                                },
                                "count": {
                                  "type": "number"
                                }
                              },
                              "required": [
                                "amountCents",
                                "count"
                              ]
                            }
                          }
                        },
                        "customerCapCents": {
                          "anyOf": [
                            {
                              "type": "null"
                            },
                            {
                              "type": "number"
                            }
                          ]
                        },
                        "partnerCapCents": {
                          "anyOf": [
                            {
                              "type": "null"
                            },
                            {
                              "type": "number"
                            }
                          ]
                        }
                      },
                      "required": [
                        "target",
                        "targetId"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "target": {
                          "type": "string",
                          "const": "customer"
                        },
                        "targetId": {
                          "type": "string"
                        },
                        "compensation": {
                          "anyOf": [
                            {
                              "type": "object",
                              "properties": {
                                "type": {
                                  "type": "string",
                                  "const": "percentage"
                                },
                                "rateBps": {
                                  "type": "number"
                                },
                                "phases": {
                                  "type": "array",
                                  "items": {
                                    "type": "object",
                                    "properties": {
                                      "rateBps": {
                                        "type": "number"
                                      },
                                      "afterMonths": {
                                        "type": "number"
                                      }
                                    },
                                    "required": [
                                      "rateBps",
                                      "afterMonths"
                                    ]
                                  }
                                }
                              },
                              "required": [
                                "type",
                                "rateBps"
                              ]
                            },
                            {
                              "type": "object",
                              "properties": {
                                "type": {
                                  "type": "string",
                                  "const": "fixed"
                                },
                                "amountCents": {
                                  "type": "number"
                                }
                              },
                              "required": [
                                "type",
                                "amountCents"
                              ]
                            }
                          ]
                        },
                        "milestoneRewards": {
                          "type": "object",
                          "properties": {
                            "eachReport": {
                              "type": "object",
                              "properties": {
                                "compensation": {
                                  "anyOf": [
                                    {
                                      "type": "object",
                                      "properties": {
                                        "type": {
                                          "type": "string",
                                          "const": "fixed"
                                        },
                                        "amountCents": {
                                          "type": "number"
                                        }
                                      },
                                      "required": [
                                        "type",
                                        "amountCents"
                                      ]
                                    },
                                    {
                                      "type": "object",
                                      "properties": {
                                        "type": {
                                          "type": "string",
                                          "const": "percentage"
                                        },
                                        "rateBps": {
                                          "type": "number"
                                        }
                                      },
                                      "required": [
                                        "type",
                                        "rateBps"
                                      ]
                                    }
                                  ]
                                },
                                "limit": {
                                  "type": "number",
                                  "description": "Absent means every counted report. Reversed reports do not count toward the limit."
                                }
                              },
                              "required": [
                                "compensation"
                              ]
                            },
                            "atCount": {
                              "type": "object",
                              "properties": {
                                "amountCents": {
                                  "type": "number"
                                },
                                "count": {
                                  "type": "number"
                                }
                              },
                              "required": [
                                "amountCents",
                                "count"
                              ]
                            }
                          }
                        },
                        "customerCapCents": {
                          "anyOf": [
                            {
                              "type": "null"
                            },
                            {
                              "type": "number"
                            }
                          ]
                        }
                      },
                      "required": [
                        "target",
                        "targetId"
                      ]
                    }
                  ]
                }
              },
              "friendIncentive": {
                "anyOf": [
                  {
                    "type": "object",
                    "properties": {
                      "type": {
                        "type": "string",
                        "const": "percent"
                      },
                      "rateBps": {
                        "type": "number"
                      },
                      "maxDiscountCents": {
                        "type": "number",
                        "description": "Largest discount for one order."
                      },
                      "minOrderCents": {
                        "type": "number",
                        "description": "The friend's order total before the discount must reach this amount. Checked by the merchant's checkout."
                      },
                      "orders": {
                        "type": "number",
                        "description": "How many of the friend's orders get the incentive."
                      },
                      "newCustomersOnly": {
                        "anyOf": [
                          {
                            "type": "boolean",
                            "const": false
                          },
                          {
                            "type": "boolean",
                            "const": true
                          }
                        ],
                        "description": "true: use the merchant's newCustomer answer, or recorded purchases when omitted. false:\nreturning customers qualify too. A supplied answer uses the order limit after the referral."
                      },
                      "expiresAfterDays": {
                        "anyOf": [
                          {
                            "type": "null"
                          },
                          {
                            "type": "number"
                          }
                        ],
                        "description": "Days after the referral was captured, claimed or entered. null means it never expires."
                      },
                      "returnOnFullRefund": {
                        "anyOf": [
                          {
                            "type": "boolean",
                            "const": false
                          },
                          {
                            "type": "boolean",
                            "const": true
                          }
                        ],
                        "description": "true: a full refund gives the use back, so the customer can get the offer again."
                      },
                      "orderCategories": {
                        "type": "object",
                        "properties": {
                          "include": {
                            "type": "array",
                            "items": {
                              "type": "string"
                            }
                          },
                          "exclude": {
                            "type": "array",
                            "items": {
                              "type": "string"
                            }
                          }
                        },
                        "description": "Order categories that get the discount. Checked apart from the program's own orderCategories,\nwhich decide rewards. Absent means every order qualifies."
                      }
                    },
                    "required": [
                      "type",
                      "rateBps"
                    ]
                  },
                  {
                    "type": "object",
                    "properties": {
                      "type": {
                        "type": "string",
                        "const": "fixed"
                      },
                      "amountCents": {
                        "type": "number"
                      },
                      "minOrderCents": {
                        "type": "number",
                        "description": "The friend's order total before the discount must reach this amount. Checked by the merchant's checkout."
                      },
                      "orders": {
                        "type": "number",
                        "description": "How many of the friend's orders get the incentive."
                      },
                      "newCustomersOnly": {
                        "anyOf": [
                          {
                            "type": "boolean",
                            "const": false
                          },
                          {
                            "type": "boolean",
                            "const": true
                          }
                        ],
                        "description": "true: use the merchant's newCustomer answer, or recorded purchases when omitted. false:\nreturning customers qualify too. A supplied answer uses the order limit after the referral."
                      },
                      "expiresAfterDays": {
                        "anyOf": [
                          {
                            "type": "null"
                          },
                          {
                            "type": "number"
                          }
                        ],
                        "description": "Days after the referral was captured, claimed or entered. null means it never expires."
                      },
                      "returnOnFullRefund": {
                        "anyOf": [
                          {
                            "type": "boolean",
                            "const": false
                          },
                          {
                            "type": "boolean",
                            "const": true
                          }
                        ],
                        "description": "true: a full refund gives the use back, so the customer can get the offer again."
                      },
                      "orderCategories": {
                        "type": "object",
                        "properties": {
                          "include": {
                            "type": "array",
                            "items": {
                              "type": "string"
                            }
                          },
                          "exclude": {
                            "type": "array",
                            "items": {
                              "type": "string"
                            }
                          }
                        },
                        "description": "Order categories that get the discount. Checked apart from the program's own orderCategories,\nwhich decide rewards. Absent means every order qualifies."
                      }
                    },
                    "required": [
                      "type",
                      "amountCents"
                    ]
                  }
                ],
                "description": "Optional offer for the referred customer."
              },
              "partnerOffer": {
                "anyOf": [
                  {
                    "type": "object",
                    "properties": {
                      "type": {
                        "type": "string",
                        "const": "percent"
                      },
                      "rateBps": {
                        "type": "number"
                      },
                      "maxDiscountCents": {
                        "type": "number",
                        "description": "Largest discount for one order."
                      },
                      "minOrderCents": {
                        "type": "number",
                        "description": "The friend's order total before the discount must reach this amount. Checked by the merchant's checkout."
                      },
                      "orders": {
                        "type": "number",
                        "description": "How many of the friend's orders get the incentive."
                      },
                      "expiresAfterDays": {
                        "anyOf": [
                          {
                            "type": "null"
                          },
                          {
                            "type": "number"
                          }
                        ],
                        "description": "Days after the referral was captured, claimed or entered. null means it never expires."
                      },
                      "returnOnFullRefund": {
                        "anyOf": [
                          {
                            "type": "boolean",
                            "const": false
                          },
                          {
                            "type": "boolean",
                            "const": true
                          }
                        ],
                        "description": "true: a full refund gives the use back, so the customer can get the offer again."
                      },
                      "orderCategories": {
                        "type": "object",
                        "properties": {
                          "include": {
                            "type": "array",
                            "items": {
                              "type": "string"
                            }
                          },
                          "exclude": {
                            "type": "array",
                            "items": {
                              "type": "string"
                            }
                          }
                        },
                        "description": "Order categories that get the discount. Checked apart from the program's own orderCategories,\nwhich decide rewards. Absent means every order qualifies."
                      }
                    },
                    "required": [
                      "type",
                      "rateBps"
                    ]
                  },
                  {
                    "type": "object",
                    "properties": {
                      "type": {
                        "type": "string",
                        "const": "fixed"
                      },
                      "amountCents": {
                        "type": "number"
                      },
                      "minOrderCents": {
                        "type": "number",
                        "description": "The friend's order total before the discount must reach this amount. Checked by the merchant's checkout."
                      },
                      "orders": {
                        "type": "number",
                        "description": "How many of the friend's orders get the incentive."
                      },
                      "expiresAfterDays": {
                        "anyOf": [
                          {
                            "type": "null"
                          },
                          {
                            "type": "number"
                          }
                        ],
                        "description": "Days after the referral was captured, claimed or entered. null means it never expires."
                      },
                      "returnOnFullRefund": {
                        "anyOf": [
                          {
                            "type": "boolean",
                            "const": false
                          },
                          {
                            "type": "boolean",
                            "const": true
                          }
                        ],
                        "description": "true: a full refund gives the use back, so the customer can get the offer again."
                      },
                      "orderCategories": {
                        "type": "object",
                        "properties": {
                          "include": {
                            "type": "array",
                            "items": {
                              "type": "string"
                            }
                          },
                          "exclude": {
                            "type": "array",
                            "items": {
                              "type": "string"
                            }
                          }
                        },
                        "description": "Order categories that get the discount. Checked apart from the program's own orderCategories,\nwhich decide rewards. Absent means every order qualifies."
                      }
                    },
                    "required": [
                      "type",
                      "amountCents"
                    ]
                  }
                ],
                "description": "Offer programs only. What the partner earns per qualifying referred order."
              }
            },
            "required": [
              "currency",
              "name",
              "kind",
              "rewardType",
              "attributionWindowDays",
              "active"
            ]
          },
          "changedFields": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Top-level program fields that differ from the previous version, such as compensation or\nfriendIncentive. Empty for version 1."
          },
          "createdAt": {
            "type": "string",
            "description": "When this version took effect. Versions recorded when versioning started use the program's last saved change."
          }
        },
        "required": [
          "terms",
          "companyId",
          "programId",
          "version",
          "programSnapshot",
          "changedFields",
          "createdAt"
        ]
      }
    }
  },
  "required": [
    "versions"
  ]
}

Errors

Failures return { "error": { "code": "...", "message": "...", "details": {} } }. Details are optional. See error statuses. Reuse an unchanged event payload when retrying.