---
title: "Step 5: Create a user"
description: Use the POST {{apiPath}}/v1/environments/{{envID}}/users request to create a new user.
component: pingone-api
page_id: pingone-api:getting-started:create-a-test-environment/step-5-create-a-user
canonical_url: https://developer.pingidentity.com/pingone-api/getting-started/create-a-test-environment/step-5-create-a-user.html
section_ids:
  troubleshooting: Troubleshooting
  headers: Headers
  body: Body
  example-request: Example Request
  example-response: Example Response
---

# Step 5: Create a user

##

```none
POST {{apiPath}}/v1/environments/{{envID}}/users
```

Use the `POST {{apiPath}}/v1/environments/{{envID}}/users` request to create a new user.

In this request:

* ``{{apiPath}}`is the geographic domain for the PingOne API endpoints for your PingOne environment. The PingOne top-level domain is `https://api.pingone.com/v1`` for the U.S. Refer to [PingOne API domains](../../before-you-begin/introduction.html) for the top-level domains for other regions.

* `{{envID}}` is the ID of the environment you created in the previous step. If you're using Postman, this value is automatically set by the script in the Script tab used for the previous step.

In the request body:

* `email` is a String containing the unique email address for the new user.

* `{{sharedPopID}}` is a String containing the ID for the population you created in the previous step. If you're using Postman, you'll find that the `{{sharedPopID}}` variable has already been set by the Script in the prior call (to create a population).

* `username` is a String containing the name for the new user. This must be a unique name within your environment.

A successful response returns a `Status: 201 created` message, and shows the new user's coniguration data.

The configuration data includes the user's `id` property. If you're using Postman, the script in the Script tab automatically sets `{{sharedUserID}}` to this value. The `{{sharedUserID}}` property is needed to set user password in the next step.

In the next step, you'll find the admin roles needed to make your new user an admin with the same permissions as the Worker app you created.

### Troubleshooting

* Verify that `{{envID}}` is the ID for the new test environment you created.

* Verify that you've assigned either the Environment Admin or Identity Admin role to your Worker app. Refer to [Assign roles to the Worker app](../create-an-admin-worker-app/step-3-assign-roles.html).

* Verify that the `{{sharedPopID}}` value is the population ID value returned by the previous step to create a population. For Postman users, unassigned variables are shown in red, and assigned variables in blue.

* Verify that you're using Bearer authorization for this request (and all `{{apiPath}}` requests). For Postman users, check that the Authorization tab in Postman is set to Bearer Token, and the access token variable is assigned (shown in blue, not red).

* If you get a 401 Unauthorized message, this is likely due to the access token expiring (a 1 hour expiry time). Refer to the step to get an access token, and call this request again.

* Verify that `{{apiPath}}` is correct for your geographic domain .

### Headers

Authorization      Bearer {{accessToken}}

Content-Type      application/json

### Body

raw ( application/json )

```json
{
    "email": "{{email}}",
    "population": {
        "id": "{{sharedPopID}}"
    },
    "username": "sharedTestUser"
}
```

##

### Example Request

* cURL

* C#

* Go

* HTTP

* Java

* jQuery

* NodeJS

* Python

* PHP

* Ruby

* Swift

```shell
curl --location --globoff '{{apiPath}}/v1/environments/{{envID}}/users' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {{accessToken}}' \
--data '{
    "email": "{{email}}",
    "population": {
        "id": "{{sharedPopID}}"
    },
    "username": "sharedTestUser"
}'
```

```csharp
var options = new RestClientOptions("{{apiPath}}/v1/environments/{{envID}}/users")
{
  MaxTimeout = -1,
};
var client = new RestClient(options);
var request = new RestRequest("", Method.Post);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer {{accessToken}}");
var body = @"{" + "\n" +
@"    ""email"": ""{{email}}""," + "\n" +
@"    ""population"": {" + "\n" +
@"        ""id"": ""{{sharedPopID}}""" + "\n" +
@"    }," + "\n" +
@"    ""username"": ""sharedTestUser""" + "\n" +
@"}";
request.AddStringBody(body, DataFormat.Json);
RestResponse response = await client.ExecuteAsync(request);
Console.WriteLine(response.Content);
```

```golang
package main

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

func main() {

  url := "{{apiPath}}/v1/environments/{{envID}}/users"
  method := "POST"

  payload := strings.NewReader(`{
    "email": "{{email}}",
    "population": {
        "id": "{{sharedPopID}}"
    },
    "username": "sharedTestUser"
}`)

  client := &http.Client {
  }
  req, err := http.NewRequest(method, url, payload)

  if err != nil {
    fmt.Println(err)
    return
  }
  req.Header.Add("Content-Type", "application/json")
  req.Header.Add("Authorization", "Bearer {{accessToken}}")

  res, err := client.Do(req)
  if err != nil {
    fmt.Println(err)
    return
  }
  defer res.Body.Close()

  body, err := io.ReadAll(res.Body)
  if err != nil {
    fmt.Println(err)
    return
  }
  fmt.Println(string(body))
}
```

```http
POST /v1/environments/{{envID}}/users HTTP/1.1
Host: {{apiPath}}
Content-Type: application/json
Authorization: Bearer {{accessToken}}

{
    "email": "{{email}}",
    "population": {
        "id": "{{sharedPopID}}"
    },
    "username": "sharedTestUser"
}
```

```java
OkHttpClient client = new OkHttpClient().newBuilder()
  .build();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\n    \"email\": \"{{email}}\",\n    \"population\": {\n        \"id\": \"{{sharedPopID}}\"\n    },\n    \"username\": \"sharedTestUser\"\n}");
Request request = new Request.Builder()
  .url("{{apiPath}}/v1/environments/{{envID}}/users")
  .method("POST", body)
  .addHeader("Content-Type", "application/json")
  .addHeader("Authorization", "Bearer {{accessToken}}")
  .build();
Response response = client.newCall(request).execute();
```

```javascript
var settings = {
  "url": "{{apiPath}}/v1/environments/{{envID}}/users",
  "method": "POST",
  "timeout": 0,
  "headers": {
    "Content-Type": "application/json",
    "Authorization": "Bearer {{accessToken}}"
  },
  "data": JSON.stringify({
    "email": "{{email}}",
    "population": {
      "id": "{{sharedPopID}}"
    },
    "username": "sharedTestUser"
  }),
};

$.ajax(settings).done(function (response) {
  console.log(response);
});
```

```javascript
var request = require('request');
var options = {
  'method': 'POST',
  'url': '{{apiPath}}/v1/environments/{{envID}}/users',
  'headers': {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer {{accessToken}}'
  },
  body: JSON.stringify({
    "email": "{{email}}",
    "population": {
      "id": "{{sharedPopID}}"
    },
    "username": "sharedTestUser"
  })

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
```

```python
import requests
import json

url = "{{apiPath}}/v1/environments/{{envID}}/users"

payload = json.dumps({
  "email": "{{email}}",
  "population": {
    "id": "{{sharedPopID}}"
  },
  "username": "sharedTestUser"
})
headers = {
  'Content-Type': 'application/json',
  'Authorization': 'Bearer {{accessToken}}'
}

response = requests.request("POST", url, headers=headers, data=payload)

print(response.text)
```

```php
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('{{apiPath}}/v1/environments/{{envID}}/users');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/json',
  'Authorization' => 'Bearer {{accessToken}}'
));
$request->setBody('{\n    "email": "{{email}}",\n    "population": {\n        "id": "{{sharedPopID}}"\n    },\n    "username": "sharedTestUser"\n}');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}
```

```ruby
require "uri"
require "json"
require "net/http"

url = URI("{{apiPath}}/v1/environments/{{envID}}/users")

http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Post.new(url)
request["Content-Type"] = "application/json"
request["Authorization"] = "Bearer {{accessToken}}"
request.body = JSON.dump({
  "email": "{{email}}",
  "population": {
    "id": "{{sharedPopID}}"
  },
  "username": "sharedTestUser"
})

response = http.request(request)
puts response.read_body
```

```swift
let parameters = "{\n    \"email\": \"{{email}}\",\n    \"population\": {\n        \"id\": \"{{sharedPopID}}\"\n    },\n    \"username\": \"sharedTestUser\"\n}"
let postData = parameters.data(using: .utf8)

var request = URLRequest(url: URL(string: "{{apiPath}}/v1/environments/{{envID}}/users")!,timeoutInterval: Double.infinity)
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.addValue("Bearer {{accessToken}}", forHTTPHeaderField: "Authorization")

request.httpMethod = "POST"
request.httpBody = postData

let task = URLSession.shared.dataTask(with: request) { data, response, error in
  guard let data = data else {
    print(String(describing: error))
    return
  }
  print(String(data: data, encoding: .utf8)!)
}

task.resume()
```

### Example Response

201 Created

```json
{
    "_links": {
        "self": {
            "href": "https://api.pingone.com/v1/environments/abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6/users/b7119e13-9612-42d0-a57c-039e74a0f27c"
        },
        "environment": {
            "href": "https://api.pingone.com/v1/environments/abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6"
        },
        "population": {
            "href": "https://api.pingone.com/v1/environments/abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6/populations/fe09831e-bbf7-46f1-92e4-aafe10df56fd"
        },
        "devices": {
            "href": "https://api.pingone.com/v1/environments/abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6/users/b7119e13-9612-42d0-a57c-039e74a0f27c/devices"
        },
        "roleAssignments": {
            "href": "https://api.pingone.com/v1/environments/abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6/users/b7119e13-9612-42d0-a57c-039e74a0f27c/roleAssignments"
        },
        "password": {
            "href": "https://api.pingone.com/v1/environments/abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6/users/b7119e13-9612-42d0-a57c-039e74a0f27c/password"
        },
        "password.reset": {
            "href": "https://api.pingone.com/v1/environments/abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6/users/b7119e13-9612-42d0-a57c-039e74a0f27c/password"
        },
        "password.set": {
            "href": "https://api.pingone.com/v1/environments/abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6/users/b7119e13-9612-42d0-a57c-039e74a0f27c/password"
        },
        "password.check": {
            "href": "https://api.pingone.com/v1/environments/abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6/users/b7119e13-9612-42d0-a57c-039e74a0f27c/password"
        },
        "password.recover": {
            "href": "https://api.pingone.com/v1/environments/abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6/users/b7119e13-9612-42d0-a57c-039e74a0f27c/password"
        },
        "linkedAccounts": {
            "href": "https://api.pingone.com/v1/environments/abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6/users/b7119e13-9612-42d0-a57c-039e74a0f27c/linkedAccounts"
        },
        "account.sendVerificationCode": {
            "href": "https://api.pingone.com/v1/environments/abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6/users/b7119e13-9612-42d0-a57c-039e74a0f27c"
        },
        "memberOfGroups": {
            "href": "https://api.pingone.com/v1/environments/abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6/users/b7119e13-9612-42d0-a57c-039e74a0f27c/memberOfGroups"
        }
    },
    "id": "b7119e13-9612-42d0-a57c-039e74a0f27c",
    "environment": {
        "id": "abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6"
    },
    "account": {
        "canAuthenticate": true,
        "status": "OK"
    },
    "createdAt": "2026-03-23T16:37:59.659Z",
    "email": "sharedTestUser@example.com",
    "enabled": true,
    "identityProvider": {
        "type": "PING_ONE"
    },
    "lifecycle": {
        "status": "ACCOUNT_OK"
    },
    "mfaEnabled": false,
    "population": {
        "id": "fe09831e-bbf7-46f1-92e4-aafe10df56fd"
    },
    "updatedAt": "2026-03-23T16:37:59.659Z",
    "username": "sharedTestUser",
    "verifyStatus": "NOT_INITIATED"
}
```
