RequestRocketRequestRocketDocs
PersonalProfile

Profile API

Read and update the user, and read their configuration.

Promo codes on a user return the grant name, not the redemption code.

On this page

Endpoints

MethodPathWhat it does
GET/api/usersList users the caller can see
GET/api/users/:userIdRead a user
PUT/api/users/:userIdUpdate a user
GET/api/users/:userId/configurationsRead user configuration
PUT/api/users/:userId/configurationsUpdate user configuration
GET/api/users/:userId/promocodesList user grants
POST/api/users/:userId/promocodesRedeem a user code

Read a user

GET /api/users/:userId returns the user.

Request

curl -X GET "https://api.requestrocket.com/api/users/:userId" \
  -H "Authorization: u-your-token"
import axios from "axios";

const response = await axios.request({
  method: "GET",
  url: "https://api.requestrocket.com/api/users/:userId",
  headers: {
    "Authorization": "u-your-token",
  }
});

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

response = requests.request(
    "GET",
    "https://api.requestrocket.com/api/users/:userId",
    headers={
        "Authorization": "u-your-token",
    }
)
print(response.status_code, response.json())
package main

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

func main() {
    var payload io.Reader
    req, _ := http.NewRequest("GET", "https://api.requestrocket.com/api/users/:userId", payload)
    req.Header.Set("Authorization", "u-your-token")
    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/users/:userId"))
            .method("GET", HttpRequest.BodyPublishers.noBody())
            .header("Authorization", "u-your-token")
            .build();
        HttpResponse<String> response = HttpClient.newHttpClient()
            .send(request, HttpResponse.BodyHandlers.ofString());
        System.out.println(response.statusCode());
        System.out.println(response.body());
    }
}

Responses

{
  "users": [
    {
      "userId": "0f8e6c1a-2b7d-4c3e-9a55-1d2e3f4a5b6c",
      "userFirstName": "Alex",
      "userLastName": "Example",
      "userUsername": "alex",
      "userBio": null,
      "userEmail": "alex@example.com",
      "userPhone": "",
      "userClients": [
        "b3a1c7d2-5e44-4f0a-9c1e-7d2f8a6b1c90"
      ],
      "userMsps": [],
      "userCreated": "2026-11-02T07:30:00.000Z",
      "userUpdated": "2026-11-02T07:30:00.000Z",
      "isSystemAdmin": false
    }
  ],
  "message": "Success"
}
{
  "message": "Unauthorized to list this users details"
}
{
  "Message": "User is not authorized to access this resource with an explicit deny in an identity-based policy"
}
{
  "message": "method / endpoint not supported"
}

Returns the authenticated user in users, plus message. GET /api/users returns the same object. There are no query parameters and the call is not paginated. A different user's id returns 401.

Response attributes

AttributeTypeDescription
usersarrayOne object, the authenticated user.
users[].userIdstringUser id.
users[].userFirstNamestringFirst name.
users[].userLastNamestringLast name.
users[].userUsernamestringUsername.
users[].userBiostring or nullBiography.
users[].userEmailstringEmail address.
users[].userPhonestringPhone number. May be empty.
users[].userClientsarrayOrganisation ids the user belongs to.
users[].userMspsarrayPartner organisation ids, when the user belongs to any.
users[].userCreatedstringISO 8601 creation time.
users[].userUpdatedstringISO 8601 last update time.
users[].isSystemAdminbooleanTrue when the user has the system admin role.
messagestringSuccess.

Token ids and role names are left out of this object.

Update a user

PUT /api/users/:userId updates the signed-in user's name, biography, and phone number. All fields are optional. Omit a field to leave it unchanged. A blank value is left unchanged. A userEmail value in the body is ignored.

Request

curl -X PUT "https://api.requestrocket.com/api/users/:userId" \
  -H "Authorization: u-your-token" \
  -H "Content-Type: application/json" \
  -d '{
  "userFirstName": "Alex",
  "userLastName": "Example",
  "userBio": "Builds APIs.",
  "userPhone": "+61400000000"
}'
import axios from "axios";

const response = await axios.request({
  method: "PUT",
  url: "https://api.requestrocket.com/api/users/:userId",
  headers: {
    "Authorization": "u-your-token",
    "Content-Type": "application/json",
  },
  data: {
  "userFirstName": "Alex",
  "userLastName": "Example",
  "userBio": "Builds APIs.",
  "userPhone": "+61400000000"
}
});

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

response = requests.request(
    "PUT",
    "https://api.requestrocket.com/api/users/:userId",
    headers={
        "Authorization": "u-your-token",
        "Content-Type": "application/json",
    },
    data="{\n  \"userFirstName\": \"Alex\",\n  \"userLastName\": \"Example\",\n  \"userBio\": \"Builds APIs.\",\n  \"userPhone\": \"+61400000000\"\n}"
)
print(response.status_code, response.json())
package main

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

func main() {
    payload := strings.NewReader(`{
  "userFirstName": "Alex",
  "userLastName": "Example",
  "userBio": "Builds APIs.",
  "userPhone": "+61400000000"
}`)
    req, _ := http.NewRequest("PUT", "https://api.requestrocket.com/api/users/:userId", 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/users/:userId"))
            .method("PUT", HttpRequest.BodyPublishers.ofString("{\n  \"userFirstName\": \"Alex\",\n  \"userLastName\": \"Example\",\n  \"userBio\": \"Builds APIs.\",\n  \"userPhone\": \"+61400000000\"\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

{
  "users": [
    {
      "userId": "0f8e6c1a-2b7d-4c3e-9a55-1d2e3f4a5b6c",
      "userFirstName": "Alex",
      "userLastName": "Example",
      "userUsername": "alex",
      "userBio": "Builds APIs.",
      "userEmail": "alex@example.com",
      "userPhone": "+61400000000",
      "userClients": [
        "b3a1c7d2-5e44-4f0a-9c1e-7d2f8a6b1c90"
      ],
      "userMsps": [],
      "userCreated": "2026-11-02T07:30:00.000Z",
      "userUpdated": "2026-11-02T08:00:00.000Z",
      "isSystemAdmin": false
    }
  ],
  "message": "Success"
}
{
  "message": "Unauthorized to edit this users details"
}

Request body

ParameterTypeRequiredDescription
userFirstNamestringFirst name.
userLastNamestringLast name.
userBiostringBiography.
userPhonestringPhone number.

Returns the updated user in users. The attributes match Read a user.

Read user configuration

GET /api/users/:userId/configurations returns the user's preferences. configurationType=user is required. When nothing has been saved, the response is the platform default.

Request

curl -X GET "https://api.requestrocket.com/api/users/:userId/configurations?configurationType=user" \
  -H "Authorization: u-your-token"
import axios from "axios";

const response = await axios.request({
  method: "GET",
  url: "https://api.requestrocket.com/api/users/:userId/configurations?configurationType=user",
  headers: {
    "Authorization": "u-your-token",
  }
});

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

response = requests.request(
    "GET",
    "https://api.requestrocket.com/api/users/:userId/configurations?configurationType=user",
    headers={
        "Authorization": "u-your-token",
    }
)
print(response.status_code, response.json())
package main

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

func main() {
    var payload io.Reader
    req, _ := http.NewRequest("GET", "https://api.requestrocket.com/api/users/:userId/configurations?configurationType=user", payload)
    req.Header.Set("Authorization", "u-your-token")
    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/users/:userId/configurations?configurationType=user"))
            .method("GET", HttpRequest.BodyPublishers.noBody())
            .header("Authorization", "u-your-token")
            .build();
        HttpResponse<String> response = HttpClient.newHttpClient()
            .send(request, HttpResponse.BodyHandlers.ofString());
        System.out.println(response.statusCode());
        System.out.println(response.body());
    }
}

Responses

{
  "configuration": {
    "notifications": {
      "emailEnabled": false,
      "mobileEnabled": false
    },
    "promotionalCodes": null,
    "sharing": {},
    "achievements": {
      "createdProxyCredential": false,
      "createdTargetCredential": false,
      "createdProxy": false,
      "createdOrganisation": false,
      "invitedSomeone": false,
      "readNotifications": false,
      "viewedPerformance": false,
      "createdTokens": false,
      "usedTokens": false,
      "deletedToken": false,
      "createdTarget": false,
      "createdOverride": false,
      "createdRule": false,
      "createdFilter": false,
      "createdMeter": false,
      "createdAlert": false,
      "createdTransform": false,
      "createdMcp": false,
      "createdConsumer": false,
      "createdEntitlement": false,
      "createdMsp": false,
      "viewedRequests": false
    }
  },
  "message": "Success"
}
{
  "message": "configurationType query parameter is required"
}

Query parameters

ParameterTypeRequiredDescription
configurationTypestring✓Must be user.

Returns configuration and message. This call is not paginated.

Response attributes

AttributeTypeDescription
configuration.notifications.emailEnabledbooleanWhether email notifications are enabled.
configuration.notifications.mobileEnabledbooleanWhether mobile notifications are enabled.
configuration.promotionalCodesarray or nullApplied grants. Each item has name, createdAt, and expiresAt. The redemption code is absent.
configuration.sharingobjectFree-form sharing preferences.
configuration.achievementsobjectSystem-managed booleans: createdProxyCredential, createdTargetCredential, createdProxy, createdOrganisation, invitedSomeone, readNotifications, viewedPerformance, createdTokens, usedTokens, deletedToken, createdTarget, createdOverride, createdRule, createdFilter, createdMeter, createdAlert, createdTransform, createdMcp, createdConsumer, createdEntitlement, createdMsp, viewedRequests.
messagestringSuccess.

Update user configuration

PUT /api/users/:userId/configurations updates notification and sharing preferences. All fields are optional. Omit a field to leave it unchanged. Sending notifications replaces that object, so include both booleans. Sending sharing replaces the stored sharing object. configurationType=user is required.

A promotionalCodes value in the body is discarded. Redeem codes with POST /api/users/:userId/promocodes. achievements stays as stored. If you send achievements, it must include every flag listed above or the call is rejected.

Request

curl -X PUT "https://api.requestrocket.com/api/users/:userId/configurations?configurationType=user" \
  -H "Authorization: u-your-token" \
  -H "Content-Type: application/json" \
  -d '{
  "notifications": {
    "emailEnabled": true,
    "mobileEnabled": false
  }
}'
import axios from "axios";

const response = await axios.request({
  method: "PUT",
  url: "https://api.requestrocket.com/api/users/:userId/configurations?configurationType=user",
  headers: {
    "Authorization": "u-your-token",
    "Content-Type": "application/json",
  },
  data: {
  "notifications": {
    "emailEnabled": true,
    "mobileEnabled": false
  }
}
});

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

response = requests.request(
    "PUT",
    "https://api.requestrocket.com/api/users/:userId/configurations?configurationType=user",
    headers={
        "Authorization": "u-your-token",
        "Content-Type": "application/json",
    },
    data="{\n  \"notifications\": {\n    \"emailEnabled\": true,\n    \"mobileEnabled\": false\n  }\n}"
)
print(response.status_code, response.json())
package main

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

func main() {
    payload := strings.NewReader(`{
  "notifications": {
    "emailEnabled": true,
    "mobileEnabled": false
  }
}`)
    req, _ := http.NewRequest("PUT", "https://api.requestrocket.com/api/users/:userId/configurations?configurationType=user", 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/users/:userId/configurations?configurationType=user"))
            .method("PUT", HttpRequest.BodyPublishers.ofString("{\n  \"notifications\": {\n    \"emailEnabled\": true,\n    \"mobileEnabled\": false\n  }\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

{
  "configuration": {
    "notifications": {
      "emailEnabled": true,
      "mobileEnabled": false
    },
    "promotionalCodes": null,
    "sharing": {},
    "achievements": {
      "createdProxyCredential": false,
      "createdTargetCredential": false,
      "createdProxy": false,
      "createdOrganisation": false,
      "invitedSomeone": false,
      "readNotifications": false,
      "viewedPerformance": false,
      "createdTokens": false,
      "usedTokens": false,
      "deletedToken": false,
      "createdTarget": false,
      "createdOverride": false,
      "createdRule": false,
      "createdFilter": false,
      "createdMeter": false,
      "createdAlert": false,
      "createdTransform": false,
      "createdMcp": false,
      "createdConsumer": false,
      "createdEntitlement": false,
      "createdMsp": false,
      "viewedRequests": false
    }
  },
  "message": "Configuration updated successfully"
}
{
  "message": "Input failed data validation",
  "errors": [
    "/notifications: must have required property 'emailEnabled'"
  ]
}

Query parameters

ParameterTypeRequiredDescription
configurationTypestring✓Must be user.

Request body

ParameterTypeRequiredDescription
notificationsobjectEmail and mobile preferences. When present, both booleans below are required.
notifications.emailEnabledbooleanSend email notifications when true.
notifications.mobileEnabledbooleanSend mobile notifications when true.
sharingobjectFree-form sharing preferences. Replaces the stored object.

Returns the saved configuration. Attributes match Read user configuration. message is Configuration updated successfully.

List user grants

GET /api/users/:userId/promocodes lists the public names of grants on the user. The redemption code is absent.

Request

curl -X GET "https://api.requestrocket.com/api/users/:userId/promocodes" \
  -H "Authorization: u-your-token"
import axios from "axios";

const response = await axios.request({
  method: "GET",
  url: "https://api.requestrocket.com/api/users/:userId/promocodes",
  headers: {
    "Authorization": "u-your-token",
  }
});

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

response = requests.request(
    "GET",
    "https://api.requestrocket.com/api/users/:userId/promocodes",
    headers={
        "Authorization": "u-your-token",
    }
)
print(response.status_code, response.json())
package main

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

func main() {
    var payload io.Reader
    req, _ := http.NewRequest("GET", "https://api.requestrocket.com/api/users/:userId/promocodes", payload)
    req.Header.Set("Authorization", "u-your-token")
    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/users/:userId/promocodes"))
            .method("GET", HttpRequest.BodyPublishers.noBody())
            .header("Authorization", "u-your-token")
            .build();
        HttpResponse<String> response = HttpClient.newHttpClient()
            .send(request, HttpResponse.BodyHandlers.ofString());
        System.out.println(response.statusCode());
        System.out.println(response.body());
    }
}

Responses

{
  "promotionalCodes": [
    {
      "name": "Example grant",
      "createdAt": "2026-11-02T07:30:00.000Z",
      "expiresAt": "2027-02-02T07:30:00.000Z"
    }
  ],
  "message": "Success"
}

Returns the applied grants. This list is not paginated and takes no query parameters.

Response attributes

AttributeTypeDescription
promotionalCodesarray or nullGrants on the user.
promotionalCodes[].namestringPublic name of the grant.
promotionalCodes[].createdAtstringISO 8601 time of the first redemption.
promotionalCodes[].expiresAtstringRecorded end time. Expiry is not enforced.
messagestringSuccess.

Redeem a user code

POST /api/users/:userId/promocodes redeems a secret code onto the user. The code is checked and not stored. Redeeming a grant that is already present leaves createdAt and expiresAt as they were.

Request

curl -X POST "https://api.requestrocket.com/api/users/:userId/promocodes" \
  -H "Authorization: u-your-token" \
  -H "Content-Type: application/json" \
  -d '{
  "code": "YOUR-CODE"
}'
import axios from "axios";

const response = await axios.request({
  method: "POST",
  url: "https://api.requestrocket.com/api/users/:userId/promocodes",
  headers: {
    "Authorization": "u-your-token",
    "Content-Type": "application/json",
  },
  data: {
  "code": "YOUR-CODE"
}
});

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

response = requests.request(
    "POST",
    "https://api.requestrocket.com/api/users/:userId/promocodes",
    headers={
        "Authorization": "u-your-token",
        "Content-Type": "application/json",
    },
    data="{\n  \"code\": \"YOUR-CODE\"\n}"
)
print(response.status_code, response.json())
package main

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

func main() {
    payload := strings.NewReader(`{
  "code": "YOUR-CODE"
}`)
    req, _ := http.NewRequest("POST", "https://api.requestrocket.com/api/users/:userId/promocodes", 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/users/:userId/promocodes"))
            .method("POST", HttpRequest.BodyPublishers.ofString("{\n  \"code\": \"YOUR-CODE\"\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

{
  "promotionalCodes": [
    {
      "name": "Example grant",
      "createdAt": "2026-11-02T07:30:00.000Z",
      "expiresAt": "2027-02-02T07:30:00.000Z"
    }
  ],
  "applied": {
    "name": "Example grant",
    "createdAt": "2026-11-02T07:30:00.000Z",
    "expiresAt": "2027-02-02T07:30:00.000Z"
  },
  "alreadyApplied": false,
  "message": "Promotional code applied"
}
{
  "message": "code must not be empty"
}

Request body

ParameterTypeRequiredDescription
codestring✓Secret redemption code.

Returns the grants after this call, the grant this code maps to, and whether it was already present.

Response attributes

AttributeTypeDescription
promotionalCodesarrayGrants on the user after this call. Items match List user grants.
applied.namestringPublic name of the grant.
applied.createdAtstringISO 8601 time of the first redemption.
applied.expiresAtstringRecorded end time. Expiry is not enforced.
alreadyAppliedbooleanTrue when this grant was already on the user. The dates stay as they were.
messagestringPromotional code applied, or Promotional code already applied.

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

Next

On this page