purchase.mp.microsoft.com/v8.0/b2b/recurrences/{recurrenceId}/change

Note

If using a development sandbox, currently this API will only work if the subscription product is published to the RETAIL sandbox. If the subscription is not published to RETAIL you will get back an HTTP 400 error response with a message stating "Requested catalog product data was not found". This is a known issue that has a work-item to be resolved in a future release. Until then, you will need to publish the subscription to either a private flight group or as hidden in RETAIL to be able to use this API.

This endpoint is used to change the billing state of the user's subscription product in the Microsoft Store. You can cancel, extend, refund, or disable automatic renewal for a subscription.

The Microsoft.StoreServices library (GitHub) provides the functionality of this method through the StoreServicesClient.RecurrenceChangeAsync API.

Prerequisites

To use this API, you need the following:

  • A Microsoft Entra ID access token that has the audience URI value https://onestore.microsoft.com
  • A User Purchase ID key that represents the identity of the user for whom you want to grant a free product

For more information, see Requesting a User Store ID for service-to-service authentication.

Additionally, the products that you want to be visible to your service require additional configuration in Partner Center.

See Additional configuration required to view and manage products with a User Store ID / Microsoft Entra ID auth for how to properly configure your products.

Note

If the product configuration has not been done and published through Partner Center, the calls to Purchase services will succeed but there will not be any results in the response.

Request

Request syntax

Method Request URI
POST purchase.mp.microsoft.com/v8.0/b2b/recurrences/{recurrenceId}/change

Request header

Header Type Description
Authorization string Required. The Microsoft Entra ID service access token in the form Bearer <token>.
Host string Must be set to the value purchase.mp.microsoft.com.
Content-Length number The length of the request body.
Content-Type string Specifies the request and response type. Currently, the only supported value is application/json.

Request parameters

Header Type Description Required
recurrenceId string Unique to the user's subscription and is obtained from the results of a query to purchase.mp.microsoft.com/v8.0/b2b/recurrences/query. Yes

Request body

Parameter Type Description Required
b2bKey string The User Purchase Id that represents the identity of the user for whom you are requesting. See User Store ID key. Yes
changeType string Identifies the type of change you want to make. See table below for the possible Change Type values. Yes
extensionTimeInDays string If the changeType parameter has the value Extend, this parameter specifies the number of days to extend the subscription. For testing scenarios, this number can be negative to remove days from the subscription. Yes, if changeType has the value Extend; otherwise, no.
sbx string Optional value for authenticating with UserStoreIds that specifies the Sandbox the results should be scoped to. Default without this value is the RETAIL sandbox. X-Token auth does not need this value as the Sandbox is specified within the X-Token. No

Change Type operations

Change Type Description
Cancel Cancels the subscription.
Extend Extends the subscription. If you specify this value, you must also include the extensionTimeInDays parameter in the request body.
Refund Refunds the subscription to the customer.
ToggleAutoRenew Disables automatic renewal for the subscription. If automatic renewal is currently disabled for the subscription, this value does nothing.

Request example

The following example demonstrates how to use this method to extend the subscription period by 5 days. Replace the b2bKey value with the User Store ID key that represents the identity of the user whose subscription you want to change.

POST https://purchase.mp.microsoft.com/v8.0/b2b/recurrences/mdr:0:bc0cb6960acd4515a0e1d638192d77b7:77d5ebee-0310-4d23-b204-83e8613baaac/change HTTP/1.1
Authorization: Bearer <your access token>
Content-Type: application/json
Host: https://purchase.mp.microsoft.com

{
  "b2bKey":  "eyJ0eXAiOiJ...",
  "changeType": "Extend",
  "extensionTimeInDays": "5"
}

Response

This method returns a JSON response body that contains information about the subscription add-on that was modified, including any fields that were modified. The following example demonstrates a response body for this method.

Note

If using a development sandbox, currently this API will only work if the subscription product is published to the RETAIL sandbox. If the subscription is not published to RETAIL you will get back an HTTP 400 error response with a message stating "Requested catalog product data was not found". This is a known issue that has a work-item to be resolved in a future release. Until then, you will need to publish the subscription to either a private flight group or as hidden in RETAIL to be able to use this API.

Response body

Parameter Type Description Required
continuationToken string If there are multiple sets of products, this token is returned when the page limit is reached. You can specify this continuation token in subsequent calls to retrieve remaining products. No
items list<RecurrenceItem> An array of products for the specified user. For more information, see the following table. Yes

The RecurrenceItem object contains the following parameters.

Parameter Type Description Required
autoRenew bool Indicates if the user is enrolled to have their subscription auto-renew at the end of the next billing cycle. Yes
beneficiary string The Publisher Id of the beneficiary within the User Purchase Id. Yes
expirationTime DateTime The UTC date and time that the subscription will or has expired Yes
expirationTimeWithGrace DateTime The UTC date and time that the user's Grace period will end if auto-renew fails at the ExpirationTime. During Grace, users should still have access and be considered valid subscribers, but notified they need to fix their auto-renew payment. Yes
id string An ID that identifies this collection item from other items that the user owns. This ID is unique per product. Yes
isTrial bool Indicates if the product is in a trial period, such as a subscription. Yes
lastModified DateTime The UTC date that this item was last modified. Yes
market string The country/region the product was purchased in following the two-character ISO 3166 country/region code. EX: US. Yes
productId string Also referred to as the Store ID for the product within the Microsoft Store catalog. An example Store ID for a product is 9NBLGGH42CFD. Yes
recurrenceState string Current state of the recurrence. See Recurrence Sates. Yes
skuId string The specific SKU identifier if there are multiple offerings of the product in the Microsoft Store catalog. An example Store ID for a SKU is 0010. Yes
startTime DateTime The UTC date that the subscription became or will become valid. Yes
cancellationDate DateTime The UTC date that the subscription was canceled. No

Recurrence Sates

Value Description
None This indicates a perpetual subscription.
Active The Subscription is valid, and the user is entitled to the subscription benefits.
Inactive The subscription is past the expiration date, and the user turned off the automatic renew option for the subscription.
Canceled The subscription has been purposefully terminated before the expiration date, with or without a refund.
InDunning The subscription is in dunning (that is, the subscription is nearing expiration, and Microsoft is trying to acquire funds to automatically renew the subscription). If the current date is before the expirationTimeWithGrace value, user should still be entitled to the subscription benefits. If current date is after the expirationTimeWithGrace value, user should not have access to subscription benefits.
Failed The dunning period is over, and the subscription failed to renew after several attempts.
  • Inactive/Canceled/Failed are terminal states. When a subscription enters one of these states, the user must repurchase the subscription to activate it again. The user is not entitled to use the services in these states.
  • When a subscription is Canceled, the expirationTime will be updated with the date and time of the cancellation.
  • The ID of the subscription will remain the same during its entire lifetime. It will not change if the auto-renew option is turned on or off. If a user repurchases a subscription after reaching a terminal state, a new subscription ID will be created.
  • The ID of a subscription should be used to execute any operation on an individual subscription.
  • When a user repurchases a subscription after canceling or discontinuing it, if you query the results for the user you will get two entries: one with the old subscription ID in a terminal state, and one with the new subscription ID in an active state.
  • It's always a good practice to check both recurrenceState and expirationTime, since updates to recurrenceState can potentially be delayed by a few minutes (or occasionally hours).

Response Example

HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Content-Length: 431
ms-correlationid: 95b2aee4-1118-437b-8910-a2f7d84d0766
ms-cv: Kl684e1htkqb19Ch.0
Date: Thu, 03 Mar 2022 23:19:12 GMT

{
    "autoRenew": true,
    "beneficiary": "pub:NoUserIdProvided",
    "expirationTime": "2022-03-03T23:59:59.00+00:00",
    "expirationTimeWithGrace": "2022-03-17T23:59:59.00+00:00",
    "id": "mdr:0:3172048a2d1849ba9a24fd305854d4a8:cedca1d3-9580-4229-9cb5-f00c4547078c",
    "isTrial": false,
    "lastModified": "2022-03-03T23:19:12.26+00:00",
    "market": "US",
    "productId": "CFQ7TTC0HC8Z",
    "skuId": "0003",
    "startTime": "2022-03-03T00:00:00.00+00:00",
    "recurrenceState": "Active"
}

purchase.mp.microsoft.com/v8.0/b2b/recurrences/query

Manage products from your services

Managing refunds and chargebacks from your service

Authenticating your service with the Microsoft Store APIs

Using PublisherQuery (Collections v9) to query a user's products and entitlements