# 

## Prerequisites

* A valid API key — see [Obtain API credentials](/docs/how-tos/setup/obtain-credentials)


## User reporting endpoints

| Endpoint | Method | Description |
|  --- | --- | --- |
| `/v1/users` | GET | List all users on the authenticated client account |
| `/v1/users/{id}` | GET | Retrieve details for a specific user |


## Option A: List all users

Send `GET /v1/users` to retrieve every user associated with the client account linked to your API key.

curl
```shell
curl https://api.dev.paradisegateway.net/v1/users \
  -H "APIKEY: YOUR-API-KEY"
```

Python
```python
import requests

resp = requests.get(
    "https://api.dev.paradisegateway.net/v1/users",
    headers={"APIKEY": "YOUR-API-KEY"},
)
users = resp.json()
for u in users:
    status = "active" if u["is_active"] else "inactive"
    mfa = "MFA on" if u["is_mfa_active"] else "MFA off"
    print(f"{u['id']} — {u['first_name']} {u['last_name']} ({status}, {mfa})")
```

JavaScript
```javascript
const resp = await fetch(
  "https://api.dev.paradisegateway.net/v1/users",
  { headers: { "APIKEY": "YOUR-API-KEY" } }
);
const users = await resp.json();
users.forEach((u) => {
  const status = u.is_active ? "active" : "inactive";
  const mfa = u.is_mfa_active ? "MFA on" : "MFA off";
  console.log(`${u.id} — ${u.first_name} ${u.last_name} (${status}, ${mfa})`);
});
```

C#
```csharp
using var client = new HttpClient();
client.DefaultRequestHeaders.Add("APIKEY", "YOUR-API-KEY");
var resp = await client.GetAsync(
    "https://api.dev.paradisegateway.net/v1/users");
Console.WriteLine(await resp.Content.ReadAsStringAsync());
```

Java
```java
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://api.dev.paradisegateway.net/v1/users"))
    .header("APIKEY", "YOUR-API-KEY")
    .GET().build();
HttpResponse<String> resp = client.send(request,
    HttpResponse.BodyHandlers.ofString());
System.out.println(resp.body());
```

Go
```go
req, _ := http.NewRequest("GET",
    "https://api.dev.paradisegateway.net/v1/users", nil)
req.Header.Set("APIKEY", "YOUR-API-KEY")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
fmt.Println(string(body))
```

PHP
```php
$ch = curl_init("https://api.dev.paradisegateway.net/v1/users");
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ["APIKEY: YOUR-API-KEY"],
]);
echo curl_exec($ch); curl_close($ch);
```

Ruby
```ruby
require "net/http"
uri = URI("https://api.dev.paradisegateway.net/v1/users")
req = Net::HTTP::Get.new(uri, { "APIKEY" => "YOUR-API-KEY" })
resp = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(req) }
puts resp.body
```

### Response example

The response is an array of user objects.

```json
[
  {
    "id": "USER-3MtwBwLkdIwHu7ix28a3tqPa",
    "object": "user",
    "first_name": "John",
    "last_name": "Doe",
    "email": "john.doe@example.com",
    "phone": "+15551234567",
    "time_zone": "America/New_York",
    "is_mfa_active": true,
    "is_active": true,
    "is_locked": false,
    "correlation_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
  },
  {
    "id": "USER-5NvxCyMmeKxIv8jz39b4urQb",
    "object": "user",
    "first_name": "Jane",
    "last_name": "Smith",
    "email": "jane.smith@example.com",
    "phone": "+15559876543",
    "time_zone": "America/Chicago",
    "is_mfa_active": false,
    "is_active": true,
    "is_locked": false,
    "correlation_id": "b2c3d4e5-f6a7-8901-bcde-f12345678901"
  }
]
```

## Option B: Retrieve a specific user

Send `GET /v1/users/{id}` to get the full details of a single user.

curl
```shell
curl https://api.dev.paradisegateway.net/v1/users/USER-3MtwBwLkdIwHu7ix28a3tqPa \
  -H "APIKEY: YOUR-API-KEY"
```

Python
```python
user_id = "USER-3MtwBwLkdIwHu7ix28a3tqPa"
resp = requests.get(
    f"https://api.dev.paradisegateway.net/v1/users/{user_id}",
    headers={"APIKEY": "YOUR-API-KEY"},
)
print(resp.json())
```

JavaScript
```javascript
const userId = "USER-3MtwBwLkdIwHu7ix28a3tqPa";
const resp = await fetch(
  `https://api.dev.paradisegateway.net/v1/users/${userId}`,
  { headers: { "APIKEY": "YOUR-API-KEY" } }
);
console.log(await resp.json());
```

C#
```csharp
var userId = "USER-3MtwBwLkdIwHu7ix28a3tqPa";
var resp = await client.GetAsync(
    $"https://api.dev.paradisegateway.net/v1/users/{userId}");
Console.WriteLine(await resp.Content.ReadAsStringAsync());
```

Java
```java
String userId = "USER-3MtwBwLkdIwHu7ix28a3tqPa";
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create(
        "https://api.dev.paradisegateway.net/v1/users/" + userId))
    .header("APIKEY", "YOUR-API-KEY")
    .GET().build();
HttpResponse<String> resp = client.send(request,
    HttpResponse.BodyHandlers.ofString());
System.out.println(resp.body());
```

Go
```go
userId := "USER-3MtwBwLkdIwHu7ix28a3tqPa"
req, _ := http.NewRequest("GET",
    "https://api.dev.paradisegateway.net/v1/users/"+userId, nil)
req.Header.Set("APIKEY", "YOUR-API-KEY")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
fmt.Println(string(body))
```

PHP
```php
$userId = "USER-3MtwBwLkdIwHu7ix28a3tqPa";
$ch = curl_init("https://api.dev.paradisegateway.net/v1/users/$userId");
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ["APIKEY: YOUR-API-KEY"],
]);
echo curl_exec($ch); curl_close($ch);
```

Ruby
```ruby
user_id = "USER-3MtwBwLkdIwHu7ix28a3tqPa"
uri = URI("https://api.dev.paradisegateway.net/v1/users/#{user_id}")
req = Net::HTTP::Get.new(uri, { "APIKEY" => "YOUR-API-KEY" })
resp = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(req) }
puts resp.body
```

### Key user fields

| Field | Description |
|  --- | --- |
| `id` | Unique user identifier |
| `email` | Email address (also the login username) |
| `is_active` | Whether the user can log in |
| `is_locked` | Whether the account is locked (too many failed logins) |
| `is_mfa_active` | Whether multi-factor authentication is enabled |
| `time_zone` | User's configured time zone |


## Common reporting use cases

| Goal | Approach |
|  --- | --- |
| Audit active users | List all users, filter for `is_active: true` |
| Find locked accounts | List all users, filter for `is_locked: true` |
| MFA compliance check | List all users, identify those with `is_mfa_active: false` |
| User lookup by email | Retrieve the full list and search client-side, or use `GET /v1/users/{id}` if the ID is known |


## Next steps

* [Add users to a client](/docs/how-tos/clients-users/add-users-client)
* [Update a user profile](/docs/how-tos/clients-users/update-user)
* [About users and roles](/docs/concepts/account-hierarchy/users-and-roles)
* [Generate a client report](/docs/how-tos/reports/client-reports)