Update assigned plan for the partner's own organization
Changes the plan assigned to the partner's own (MSP) organization — the one referenced by the partner's organizationId. The change takes effect immediately: the current subscription (typically the trial the organization was provisioned with) is marked as upgraded and a new active, distributor-billed subscription is created with the selected plan. If the organization is already on the requested plan, no change is made.
This is the only way to move an MSP organization off its trial: it is deliberately not
addressable through the customer /organizations endpoints. Use the plans endpoint to
see available plan slugs and commitment options.
Long-lived distributor API key scoped to a channel partner on the shared smao instance.
In: header
Path Parameters
MongoDB ObjectId of the partner (MSP).
^[a-fA-F0-9]{24}$Response Body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
curl -X PATCH "https://api.smao.ai/api/distributor/v1/partners/665abc123def456789012345/plan" \ -H "Content-Type: application/json" \ -d '{ "plan": { "slug": "professional", "commitment": "yearly" } }'{
"status": "success",
"partner": {
"id": "665abc123def456789012345",
"name": "MSP Hamburg GmbH",
"externalPartnerId": "MSP-001",
"contactEmail": "[email protected]",
"contactName": "Hans Mueller",
"isActive": true,
"notes": null,
"organizationId": "665abc123def456789012346",
"organizationCount": 12,
"createdAt": "2026-03-20T10:41:14.553Z"
},
"plan": {
"id": "6967b1c7138bed3e7f6bf7e6",
"slug": "string",
"name": "string",
"commitment": "none",
"currency": "string",
"baseFee": 0
}
}{
"status": "error",
"errorCode": "INVALID_DATE_RANGE",
"message": "from and to must be valid YYYY-MM-DD values"
}{
"status": "error",
"errorCode": "INVALID_DATE_RANGE",
"message": "from and to must be valid YYYY-MM-DD values"
}{
"status": "error",
"errorCode": "INVALID_DATE_RANGE",
"message": "from and to must be valid YYYY-MM-DD values"
}{
"status": "error",
"errorCode": "INVALID_DATE_RANGE",
"message": "from and to must be valid YYYY-MM-DD values"
}{
"status": "error",
"errorCode": "RATE_LIMITED",
"message": "Too many requests for this API key."
}{
"status": "error",
"errorCode": "INVALID_DATE_RANGE",
"message": "from and to must be valid YYYY-MM-DD values"
}{
"status": "error",
"errorCode": "RATE_LIMIT_UNAVAILABLE",
"message": "Rate limit storage is unavailable. Try again shortly."
}