Use this endpoint to transfer an existing active subscription from one user to another. This allows re-assigning access to a subscription.
Scope: Only productType=subscription is supported. One-time product transfers are not supported and return 400.
The transfer process is asynchronous. Upon successful registration, the API will return a 202 Accepted status with a unique synchronizationId in the response body.
You can then use the following methods to check the status of the transfer process:
- Polling: Use the /purchases/synchronizations/{synchronizationId} endpoint to periodically retrieve the status. This endpoint provides a concise response with the essential status information.
- Webhooks: Subscribe to the inappPurchaseSyncResult webhook to receive real-time updates on the status. The webhook payload (WebhookSynchronizationStatus) includes detailed information about the transfer, including the synchronizationId, purchase details (purchaseToken, packageName, cleengCustomerId), accessGranted, offerId, and result.
You can choose to use either the polling mechanism, the webhook, or both, depending on your needs.
Note: Only active purchases can be transferred.
Transfer-only semantics: This operation performs ownership transfer only - it does NOT run a synchronization with Google Play. The processor finalizes the synchronization record with PURCHASE_OWNERSHIP_TRANSFERRED (or PURCHASE_OWNERSHIP_UNCHANGED when the ownership is already aligned), and emits an inappPurchaseSyncResult event.
Please note that this endpoint can be authorized with a publisher (X-Publisher-Token) or JWT (Bearer) token. Depending on how you integrate with Cleeng (directly or through middleware), use either a JWT or X-Publisher-Token header authorization.
Please use JWT (Bearer) token to try out the endpoint in the API console in this documentation.
| Time | Status | User Agent | |
|---|---|---|---|
Retrieving recent requests… | |||
Errors
| HTTP Status Code | Error Code | Message |
|---|---|---|
| 400 | REQ0001 | Invalid request body |
| 400 | GPLAY0004 | Provided product type is not supported |
| 409 | GPLAY0300 | Synchronization already in progress |
| 422 | GPLAY0200 | No Google Play Billing configuration profile found for the provided packageName |
| 500 | SXXXX (X - number) | Internal server error |

