Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
Applies To
- Partner Center
Appropriate roles
- Admin agent
Important
The growth margins API is now available in production.
Partners can get a list of active growth margins for a given market (country/region) and segment. This method returns available current growth margins based on the growth margins available start and end dates.
Prerequisites
Credentials as described in Partner Center authentication. This scenario supports authentication with both standalone App and App+User credentials.
Segment represents the type of customer the growth margins are enabled for. Currently supports only commercial.
Country represents the customer country/region growth margins are available for. Country is represented by a two character country code.
REST request
[GET] /v1/catalog/benefits?type=growthmargin&country={country-code}&segment={segment}&baseSkuPaths={baseSkuPaths}
Request syntax
| Method | Request URI |
|---|---|
| GET | {baseURL}/v1/catalog/benefits?type=growthmargin&country={country-code}&segment={segment}&baseSkuPaths={baseSkuPaths} HTTP/1.1 |
URI parameter
Use the following query parameters to return available growth margins.
| Name | Type | Required | Description |
|---|---|---|---|
| type | string | Y | The type of benefit to retrieve. Use growthmargin for growth margins. |
| segment | string | Y | A string that determines which growth margins are available for a given segment. |
| country | string | Y | A two letter country code determining which customer country/region growth margins are available for. |
| baseSkuPaths | string | N | Optional. A comma-separated list of up to 10 base product SKUs in {productId}:{skuId} or {productId}/{skuId} format (for example, CFQ7TTC0ZSXK:0002,CFQ7TTC0ZSXK:0005). Returns only benefits whose requiredProducts match the specified SKUs. Requests with more than 10 SKU paths return HTTP 400 Bad Request. |
Request headers
For more information, see Partner Center REST headers.
Request body
None
Request example
GET https://api.partnercenter.microsoft.com/v1/catalog/benefits?type=growthmargin&country=US&segment=commercial HTTP/1.1
Authorization: Bearer <token>
Accept: application/json
MS-RequestId: 18752a69-1aa1-4ef7-8f9d-eb3681b2d70a
MS-CorrelationId: aaaa0000-bb11-2222-33cc-444444dddddd
X-Locale: en-US
Request example with baseSkuPaths filter
GET https://api.partnercenter.microsoft.com/v1/catalog/benefits?type=growthmargin&country=US&segment=commercial&baseSkuPaths=CFQ7TTC0ZSXK:0002,CFQ7TTC0ZSXK:0005 HTTP/1.1
Authorization: Bearer <token>
Accept: application/json
MS-RequestId: 18752a69-1aa1-4ef7-8f9d-eb3681b2d70a
MS-CorrelationId: aaaa0000-bb11-2222-33cc-444444dddddd
X-Locale: en-US
REST response
If successful, this method returns a collection of growth margins.
Response fields
The response uses a collection envelope. Response fields are read-only.
Response collection fields
| Field | Type | Returned | Description |
|---|---|---|---|
totalCount |
integer | Always | Number of growth margin objects returned in items. |
items |
array of objects | Always | Growth margins matching the requested market, segment, and optional baseSkuPaths filter. The array can be empty when no offers match. |
attributes |
object | Always | Metadata that describes the response collection. |
attributes.objectType |
string | Always | Resource type of the response. The value is Collection. |
Each object in items has the following fields.
Growth margin identity and required product fields
These fields distinguish the growth margin discount product from the base products to which it can apply.
| Field | Type | Returned | Description |
|---|---|---|---|
items[].id |
string | Always | Catalog identifier for the growth margin discount product and pricing point, in {productId}:{skuId}:{availabilityId} format. This value doesn't identify the base product being purchased. |
items[].productCodes |
array of objects | Always | Product code identities for the growth margin. Process every entry because a growth margin can have more than one product code or term association. |
items[].productCodes[].productCode |
string | Always | Product code, also called the Universal Product Name (UPN), that integrations can use to identify the growth margin. |
items[].productCodes[].termId |
string | Conditional | Term identifier associated with the product code. Omitted when the product code isn't term-specific. |
items[].name |
string | Always | Display name of the growth margin. |
items[].description |
string | Always | Human-readable description of the growth margin. |
items[].requiredProducts |
array of objects | Always | Base product purchase configurations to which the growth margin can apply. These values identify the product being purchased, not the growth margin discount product. |
items[].requiredProducts[].productId |
string | Always | Product ID of an applicable base product. |
items[].requiredProducts[].skuId |
string | Always | SKU ID of an applicable base product. Leading zeros are significant. |
items[].requiredProducts[].termDuration |
string | Always | Applicable base-product term in ISO 8601 duration format, such as P1Y. |
items[].requiredProducts[].billingCycle |
string | Always | Applicable base-product billing cycle, such as Monthly or Annual. |
Pricing and offer policy fields
Pricing policies describe the margin value. Offer policies describe when the growth margin is available and who receives it.
| Field | Type | Returned | Description |
|---|---|---|---|
items[].productPolicy |
object | Always | Container for the pricing, offer, and eligibility policies that define the growth margin. |
items[].productPolicy.pricingPolicies |
array of objects | Always | Pricing rules for the growth margin. Process every policy and benefit entry. |
items[].productPolicy.pricingPolicies[].policyId |
string | Always | Identifier of the pricing policy. |
items[].productPolicy.pricingPolicies[].policyData.benefits |
array of objects | Always | Margin calculations defined by the pricing policy. |
items[].productPolicy.pricingPolicies[].policyData.benefits[].type |
string | Always | Calculation type, such as PercentDiscount. |
items[].productPolicy.pricingPolicies[].policyData.benefits[].value |
decimal | Always | Margin value interpreted according to type. For PercentDiscount, 0.15 represents 15%. |
items[].productPolicy.offerPolicies |
array of objects | Always | Offer rules that define the growth margin availability period and beneficiary. |
items[].productPolicy.offerPolicies[].policyId |
string | Always | Identifier of the offer policy. |
items[].productPolicy.offerPolicies[].policyData.beneficiary |
string | Always | Recipient of the benefit. The value for a growth margin is Partner. |
items[].productPolicy.offerPolicies[].policyData.properties.startDate |
string | Always | Start of the availability period in ISO 8601 date-time format. |
items[].productPolicy.offerPolicies[].policyData.properties.endDate |
string | Always | End of the availability period in ISO 8601 date-time format. |
items[].productPolicy.offerPolicies[].policyData.isOptional |
boolean | Always | Whether applying the offer policy is optional. |
Eligibility policy fields
Eligibility policies describe the rules that the eligibility API evaluates. Discovery of a growth margin doesn't confirm that a specific customer transaction qualifies.
| Field | Type | Returned | Description |
|---|---|---|---|
items[].productPolicy.eligibilityPolicies |
array of objects | Always | Eligibility rule sets for the growth margin. Process every entry because an offer can have multiple policies. |
items[].productPolicy.eligibilityPolicies[].policyId |
string | Always | Identifier of the eligibility policy. |
items[].productPolicy.eligibilityPolicies[].policyData.eligibility.constraintsData |
object | Always | Static product, ownership, seat, purchase, prerequisite, and partner constraints used to evaluate qualification. |
items[].productPolicy.eligibilityPolicies[].policyData.eligibility.dynamicPurchaseConstraint |
object | Conditional | Dynamic purchase rule for Strategic SKU Mix scenarios. Omitted when the growth margin doesn't use a dynamic rule. |
Arrays can contain multiple entries. Process every item in productCodes, requiredProducts, pricingPolicies, benefits, offerPolicies, and eligibilityPolicies rather than assuming each collection contains one value.
The eligibilityPolicies array contains the following constraint types:
| Constraint | Definition |
|---|---|
| seatConstraints | Defines the minimum or maximum seat requirements that must be met for a transaction to qualify for Growth Margin. Examples include minimum net-new seats or required seat expansion thresholds. |
| assetOwnershipLimits | Defines limits based on the customer's existing ownership of qualifying subscriptions or assets. Growth Margin eligibility may depend on whether the customer already owns, previously owned, or currently holds qualifying subscriptions. |
| eligibilityConstraints | Defines the set of business rules that determine whether a transaction qualifies for Growth Margin. These rules can include customer history, seat growth requirements, product eligibility, purchase timing, and other qualifying criteria. |
| productOwnershipConstraints | Defines product ownership conditions that must be met before Growth Margin can be applied. For example, eligibility may depend on whether the customer currently owns, previously owned, or does not own a specific product or SKU. The structure uses AND-of-OR groups: the outer array represents AND conditions (all must be met), and each inner array represents OR alternatives (at least one must be met). For example, [[A, B], [C]] means the customer must own (A or B) AND C. |
| purchaseRequirementConstraints | Defines purchase-specific requirements that must be satisfied for Growth Margin eligibility, such as purchasing a qualifying product, meeting a minimum seat threshold, selecting an eligible term, or creating a new subscription when required. |
| prerequisiteConstraints | Defines prerequisite product ownership conditions evaluated within a configurable lookback window. Uses MustHaveAll, MustHaveAny, and MustHaveNone rules to specify products the customer must own, may own any of, or must not own to qualify. Each rule can include seat constraints and a lookback period over which ownership is evaluated. |
| partnerConstraints | Defines partner-level eligibility conditions through the isApplicable and type fields. |
The seatConstraints value is an array. Each entry has a type that determines which companion fields apply:
type |
Companion fields |
|---|---|
SubscriptionQuantity |
minSeats, maxSeats |
SeatGrowthMultiplier |
seatIncreaseMultiplier, minSeats, maxSeats |
A growth margin can define a subscription quantity constraint, a seat growth multiplier constraint, or both. When both types are present in the seatConstraints array, the transaction must satisfy both constraints to qualify. Process every entry in the array rather than assuming that seatConstraints contains a single value.
Partner constraints
Each entry in partnerConstraints defines a partner-level eligibility condition.
| Field | Type | Description |
|---|---|---|
isApplicable |
boolean | Indicates whether the partner condition identified by type applies. |
type |
string | Identifies the partner eligibility condition being evaluated. |
Prerequisite constraints
The prerequisiteConstraints object can contain MustHaveAll, MustHaveAny, and MustHaveNone rules. Each property contains a rule object or null:
MustHaveAll: The customer must satisfy every listed product prerequisite.MustHaveAny: The customer must satisfy at least one listed product prerequisite.MustHaveNone: The customer must not satisfy any listed product prerequisite.
Each non-null rule object can contain the following fields. Property names use the exact PascalCase returned by the API.
| Field | Type | Description |
|---|---|---|
Products |
array of objects | Products evaluated by the prerequisite rule. |
Products[].BigId |
string | Product and SKU in {productId}/{skuId} format, such as CFQ7TTC0LFLZ/0002. |
Products[].MinSeats |
integer or null | Minimum seats required for the product. |
Products[].MaxSeats |
integer or null | Maximum seats allowed for the product. |
SeatConstraint |
object | Aggregate seat rule across the products. |
SeatConstraint.Type |
string | Aggregate rule type, such as BaseCumulativeQuantity. |
SeatConstraint.MinSeats |
integer or null | Minimum aggregate seats required. |
SeatConstraint.MaxSeats |
integer or null | Maximum aggregate seats allowed. |
LookbackWindow |
object | Time window used to evaluate product ownership. |
LookbackWindow.Type |
string | Lookback type, such as Period. |
LookbackWindow.Period |
string | Lookback duration in ISO 8601 format, such as P1Y. |
Dynamic purchase constraint for Strategic SKU Mix
The optional dynamicPurchaseConstraint object defines a Strategic SKU Mix rule. It is omitted when the growth margin doesn't use a dynamic purchase rule.
| Field | Type | Description |
|---|---|---|
ResourceProvider |
string | Resource provider that evaluates the rule, such as saashubrp. |
ConfigurationProperties |
object | Configuration for the dynamic purchase rule. |
ConfigurationProperties.type |
string | Rule type. Use UpsellTargetRatio for a Strategic SKU Mix ratio rule. |
ConfigurationProperties.upsellSkuSet |
array of strings | Product and SKU paths counted as upsell SKUs. |
ConfigurationProperties.qualificationSkuSet |
array of strings | Product and SKU paths included in the qualification calculation. |
ConfigurationProperties.ratioThreshold |
string | Required ratio expressed as a decimal string, such as "0.8". |
ConfigurationProperties.minimumSeats |
integer | Minimum number of upsell seats required. |
ConfigurationProperties.evaluationScope |
string | Scope at which the rule is evaluated, such as TenantLevel. |
{
"ConfigurationProperties": {
"upsellSkuSet": [
"CFQ7TTC0LFLZ/0002"
],
"qualificationSkuSet": [
"CFQ7TTC0LFLX/0001",
"CFQ7TTC0LFLZ/0002"
],
"ratioThreshold": "0.8",
"minimumSeats": 5,
"evaluationScope": "TenantLevel",
"type": "UpsellTargetRatio"
},
"ResourceProvider": "saashubrp"
}
Response success and error codes
Each response comes with an HTTP status code that indicates success or failure and more debugging information. Use a network trace tool to read this code, error type, and more parameters. For the full list, see Error Codes.
Response example
HTTP/1.1 200 OK
Content-Type: application/json
MS-CorrelationId: aaaa0000-bb11-2222-33cc-444444dddddd
MS-RequestId: 18752a69-1aa1-4ef7-8f9d-eb3681b2d70a
Date: Fri, 27 Jun 2026 20:42:26 GMT
{
"totalCount": 1,
"items": [
{
"id": "39NFJQT10HW7:0002:084R5MQ9QF27",
"productCodes": [
{
"productCode": "00093c3a-0000-0280-f57d-f85412b6826d"
}
],
"name": "CSP Growth Margin Discount",
"description": "CSP Growth Margin Discount",
"requiredProducts": [
{
"productId": "CFQ7TTC0ZSXK",
"skuId": "0002",
"termDuration": "P1Y",
"billingCycle": "Monthly"
}
],
"productPolicy": {
"pricingPolicies": [
{
"policyId": "PricingPolicyId:1w11wcikt5po",
"policyData": {
"benefits": [
{
"type": "PercentDiscount",
"value": 0.185
}
]
}
}
],
"offerPolicies": [
{
"policyId": "OfferPolicyId:qossxtmg4hky",
"policyData": {
"beneficiary": "Partner",
"properties": {
"startDate": "2026-05-12T14:20:05Z",
"endDate": "2026-08-12T14:20:11Z"
},
"isOptional": false
}
}
],
"eligibilityPolicies": [
{
"policyId": "EligibilityPolicyId:ewgn4xy9whko",
"policyData": {
"eligibility": {
"constraintsData": {
"seatConstraints": [
{
"minSeats": 0,
"maxSeats": 0,
"seatIncreaseMultiplier": 0,
"type": "SeatGrowthMultiplier"
}
],
"assetOwnershipLimits": [],
"eligibilityConstraints": [],
"productOwnershipConstraints": [
[]
],
"purchaseRequirementConstraints": [],
"prerequisiteConstraints": {
"MustHaveAll": null,
"MustHaveAny": null,
"MustHaveNone": {
"Products": [
{
"BigId": "CFQ7TTC10849/0002",
"MinSeats": null,
"MaxSeats": 5
}
],
"SeatConstraint": {
"MinSeats": null,
"MaxSeats": null,
"Type": "BaseCumulativeQuantity"
},
"LookbackWindow": {
"Type": "Period",
"Period": "P1Y"
}
}
}
}
}
}
}
]
}
}
],
"attributes": {
"objectType": "Collection"
}
}
Note
The baseSkuPaths parameter is purely a server-side filter. The response shape is the same whether or not baseSkuPaths is supplied — it only restricts the result set to benefits matching those base SKUs.