SMAO API Documentation
Partners

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.

PATCH
/partners/{partnerId}/plan
AuthorizationBearer <token>

Long-lived distributor API key scoped to a channel partner on the shared smao instance.

In: header

Path Parameters

partnerIdstring

MongoDB ObjectId of the partner (MSP).

Match^[a-fA-F0-9]{24}$
plan

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."
}