RequestRocketRequestRocketDocs
PartnersManaged clients

Managed clients API

Create, read, and detach a client the MSP manages.

POST creates a client and links it without a relationship handshake. DELETE detaches the link. It does not delete the organisation. The path is /api/msps/:mspId/clients and /api/msps/:mspId/clients/:clientId.

Use Relationships API instead when the organisation already exists and must approve the MSP link.

Endpoints

MethodPathWhat it does
GET/api/msps/:mspId/clientsList managed clients
POST/api/msps/:mspId/clientsCreate a managed client
GET/api/msps/:mspId/clients/:clientIdRead a managed client
PUT/api/msps/:mspId/clients/:clientIdRename a managed client
DELETE/api/msps/:mspId/clients/:clientIdDetach a managed client
GET/api/msps/:mspId/clients/:clientId/membersList managed-client members
PUT/api/msps/:mspId/clients/:clientId/members/:memberIdChange member roles
DELETE/api/msps/:mspId/clients/:clientId/members/:memberIdRemove a member
GET/api/msps/:mspId/clients/:clientId/invitesList managed-client invites
POST/api/msps/:mspId/clients/:clientId/invitesCreate an invite
PUT/api/msps/:mspId/clients/:clientId/invites/:inviteIdRespond to an invite
DELETE/api/msps/:mspId/clients/:clientId/invites/:inviteIdDelete an invite
GET/api/msps/:mspId/clients/:clientId/telemetryRead managed-client telemetry

Create a managed client

POST /api/msps/:mspId/clients creates the organisation and links it to the MSP. A Stripe customer and a default configuration with billing charged to the MSP are created with it.

Request

curl -X POST "https://api.requestrocket.com/api/msps/:mspId/clients" \
  -H "Authorization: u-your-token" \
  -H "Content-Type: application/json" \
  -d '{
  "clientName": "Managed example"
}'
import axios from "axios";

const response = await axios.request({
  method: "POST",
  url: "https://api.requestrocket.com/api/msps/:mspId/clients",
  headers: {
    "Authorization": "u-your-token",
    "Content-Type": "application/json",
  },
  data: {
  "clientName": "Managed example"
}
});

console.log(response.status, response.data);
import requests

response = requests.request(
    "POST",
    "https://api.requestrocket.com/api/msps/:mspId/clients",
    headers={
        "Authorization": "u-your-token",
        "Content-Type": "application/json",
    },
    data="{\n  \"clientName\": \"Managed example\"\n}"
)
print(response.status_code, response.json())
package main

import (
    "fmt"
    "io"
    "net/http"
    "strings"
)

func main() {
    payload := strings.NewReader(`{
  "clientName": "Managed example"
}`)
    req, _ := http.NewRequest("POST", "https://api.requestrocket.com/api/msps/:mspId/clients", payload)
    req.Header.Set("Authorization", "u-your-token")
    req.Header.Set("Content-Type", "application/json")
    resp, _ := http.DefaultClient.Do(req)
    defer resp.Body.Close()
    body, _ := io.ReadAll(resp.Body)
    fmt.Println(resp.StatusCode, string(body))
}
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Example {
    public static void main(String[] args) throws Exception {
        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://api.requestrocket.com/api/msps/:mspId/clients"))
            .method("POST", HttpRequest.BodyPublishers.ofString("{\n  \"clientName\": \"Managed example\"\n}"))
            .header("Authorization", "u-your-token")
            .header("Content-Type", "application/json")
            .build();
        HttpResponse<String> response = HttpClient.newHttpClient()
            .send(request, HttpResponse.BodyHandlers.ofString());
        System.out.println(response.statusCode());
        System.out.println(response.body());
    }
}

Responses

{
  "clients": [
    {
      "clientId": "b3a1c7d2-5e44-4f0a-9c1e-7d2f8a6b1c90",
      "clientName": "Managed example",
      "clientMembers": [],
      "clientMSPs": [
        "msp-id"
      ],
      "clientStripeId": "cus_Example",
      "clientStripeSessionId": null,
      "clientStripeSubscriptions": [],
      "clientCreated": "2026-11-02T07:30:00.000Z",
      "clientUpdated": "2026-11-02T07:30:00.000Z"
    }
  ],
  "message": "Client created and linked to MSP"
}
{
  "message": "Client with same name already exists"
}
{
  "message": "Unauthorized"
}
{
  "Message": "User is not authorized to access this resource with an explicit deny in an identity-based policy"
}
{
  "message": "method / endpoint not supported"
}

Request body

ParameterTypeRequiredDescription
clientNamestring✓Organisation name, 3 to 256 characters. Letters, numbers, spaces, and hyphens. The name must be unique.

Returns the new organisation, already linked to the MSP. A Stripe customer and a default configuration with billing charged to the MSP are created with it. clientMembers is empty.

Response

AttributeTypeDescription
clientsarrayThe created organisation.
clients[].clientIdstringOrganisation id.
clients[].clientNamestringName from the request.
clients[].clientMembersarrayEmpty on create.
clients[].clientMSPsstring[]MSP ids linked to this organisation. Contains this MSP.
clients[].clientStripeIdstringStripe customer id.
clients[].clientStripeSessionIdstring or nullCheckout session. Null until one is opened.
clients[].clientStripeSubscriptionsarrayStripe subscriptions.
clients[].clientCreatedstringISO-8601 create time.
clients[].clientUpdatedstringISO-8601 update time.
messagestringClient created and linked to MSP.

List managed clients

GET /api/msps/:mspId/clients returns every organisation linked to the MSP.

Query parameters

None.

Response

AttributeTypeDescription
clientsarrayLinked organisations.
clients[].clientIdstringOrganisation id.
clients[].clientNamestringOrganisation name.
clients[].clientMembersarrayMembers, each with userId and roles.
clients[].clientMSPsstring[]Linked MSP ids.
messagestringSuccess.

Rename a managed client

PUT /api/msps/:mspId/clients/:clientId updates the organisation name. All fields are optional. Omit a field to leave it unchanged.

Request body

ParameterTypeRequiredDescription
clientNamestringReplacement name.

Returns the organisation after the update, including clientUpdated.

Response

AttributeTypeDescription
clientsarrayThe organisation.
clients[].clientNamestringName after the update.
clients[].clientUpdatedstringISO-8601 time of this call.
messagestringClient updated.

List managed-client members

GET /api/msps/:mspId/clients/:clientId/members returns the organisation team.

Query parameters

None.

Response

AttributeTypeDescription
membersarrayOrganisation members.
members[].userIdstringUser id.
members[].userFirstNamestringGiven name.
members[].userLastNamestringFamily name.
members[].userEmailstringEmail address.
members[].rolesstring[]One or more of owner, admin, devops, user, reader.
messagestringSuccess.

Change managed-client member roles

PUT /api/msps/:mspId/clients/:clientId/members/:memberId replaces one member's roles. There is no POST on this path; add someone with an invite.

Request body

ParameterTypeRequiredDescription
rolesstring[]✓Replacement roles. At least one of owner, admin, devops, user, reader. Only an owner of the organisation can grant or remove owner.

Returns the updated membership, with userId and roles.

Response

AttributeTypeDescription
membersarrayThe updated membership.
members[].userIdstringMember id from the path.
members[].rolesstring[]Roles after the owner guard.
messagestringMember roles updated.

List managed-client invites

GET /api/msps/:mspId/clients/:clientId/invites returns every invite stored for the organisation.

Query parameters

None.

Response

AttributeTypeDescription
invitesarrayInvites whose parent is this organisation.
invites[].inviteIdstringInvite id.
invites[].parentIdstringOrganisation id.
invites[].clientNamestringOrganisation name.
invites[].userEmailstringInvited email address.
invites[].rolesstring[]Roles the invite will grant.
invites[].inviteTypestringclient when set.
invites[].TTLnumberExpiry stored on the invite.
messagestringSuccess.

Create a managed-client invite

POST /api/msps/:mspId/clients/:clientId/invites invites an email address onto the organisation. A repeat invite for the same address updates the existing invite.

Request body

ParameterTypeRequiredDescription
userEmailstring✓Email address to invite.
userNamestringName used in the invitation email.
rolesstring[]✓At least one of owner, admin, devops, user, reader. Only an owner of the organisation can grant owner.

Returns the invite that was sent or refreshed.

Response

AttributeTypeDescription
invitesarrayThe invite.
invites[].inviteIdstringInvite id.
invites[].parentIdstringOrganisation id.
invites[].userEmailstringInvited email address.
invites[].rolesstring[]Roles on the invite.
invites[].inviteTypestringclient.
messagestringInvite sent.

Update a managed-client invite

PUT /api/msps/:mspId/clients/:clientId/invites/:inviteId replaces the roles on a pending invite and extends its expiry by 14 days.

Request body

ParameterTypeRequiredDescription
rolesstring[]✓Replacement roles. At least one of owner, admin, devops, user, reader. Only an owner of the organisation can grant or remove owner.

Returns the invite after the role replacement.

Response

AttributeTypeDescription
invitesarrayThe updated invite.
invites[].rolesstring[]Roles from the request.
invites[].TTLnumberUnix time, in seconds, 14 days from this call.
messagestringInvite updated.

Read managed-client telemetry

GET /api/msps/:mspId/clients/:clientId/telemetry returns call series for the managed organisation. The series is the organisation rollup, the same shape as the organisation telemetry route.

Query parameters

ParameterTypeRequiredDescription
intervalstringBucket size: minute, hour, day, or month. Defaults to hour.
startDatestringStart of the window. An ISO-8601 time or a Unix timestamp in seconds or milliseconds.
endDatestringEnd of the window. Defaults to now when a start is set. Same formats as startDate.
limitnumberMaximum buckets returned, most recent first. Defaults to 60 for minute, 24 for hour, 30 for day, and 12 for month.

There is no cursor or nextToken. limit caps how many buckets are returned.

Returns the interval you asked for and the buckets, newest first.

Response

AttributeTypeDescription
intervalstringBucket size used for this response.
telemetryarrayOne object per bucket.
telemetry[].sKeystringBucket timestamp.
telemetry[].clientIdstringOrganisation id.
telemetry[].countMapobjectRequest counts keyed by source, such as target.
telemetry[].successCountMapobjectSuccessful request counts by source.
telemetry[].errorCountMapobjectFailed request counts by source.
telemetry[].averageResponseTimeMapobjectAverage response time by source, computed on read.
messagestringSuccess.

Shared status codes, the 5.5 MB cap, and plan rate limits are on Platform limits.

Next

On this page