> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.insurgateway.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.insurgateway.com/_mcp/server.

# Create User

POST https://testgatewayapi.insurapps.net/api/offline/users
Content-Type: application/json

## Kullanıcı Oluştur

Offline kapsamda yeni bir kullanıcı kaydı oluşturur. Bu endpoint; sigorta şirketlerinin veya acentelerin kendi kapsamlarında API erişimi için yeni kullanıcılar tanımlamasına olanak tanır. İstek; doğrulama kontrolleri, kimlik kapsamı çözümlemesi (şirket/acente), e-posta ve kullanıcı adı tekillik kontrolü ardından kullanıcıyı oluşturur.

***

## Endpoint Bilgisi

| Özellik           | Değer                           |
| ----------------- | ------------------------------- |
| **HTTP Metodu**   | `POST`                          |
| **URL**           | `/api/offline/users`            |
| **Content-Type**  | `application/json`              |
| **Yetkilendirme** | `Authorization: Bearer {token}` |

### Yetkilendirme Rolleri

Çağıranın aşağıdaki rollerden birine sahip olması gerekir:

| Rol                        | Erişim Kapsamı                                        |
| -------------------------- | ----------------------------------------------------- |
| `InsuranceCompanyAPIAdmin` | Şirket kapsamında yeni kullanıcı oluşturabilir        |
| `Supervizor`               | Şirket/acente kapsamında yeni kullanıcı oluşturabilir |

> **Not:** Endpoint `Create` policy'si ile korunur. Bu rollere sahip olmayan kullanıcılar `403 Forbidden` alır.

***

## İstek Modeli

| Alan       | Tip      | Zorunlu | Açıklama             | Doğrulama Kuralları                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
| ---------- | -------- | ------- | -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `UserName` | `string` | Evet    | Kullanıcı adı        | Boş olamaz: `"UserName is required."`  Min. 3 karakter: `"UserName must be at least 3 characters."`  Maks. 256 karakter: `"UserName must be less than or equal to 256 characters."`                                                                                                                                                                                                                                                                                                                                                                                      |
| `Email`    | `string` | Evet    | E-posta adresi       | Boş olamaz: `"Email is required."`  Geçerli e-posta formatı olmalı: `"Email must be a valid email address."`                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| `Password` | `string` | Evet    | Kullanıcı şifresi    | Boş olamaz: `"Password is required."`  Min. 8 karakter: `"Password must be at least 8 characters."`  Maks. 100 karakter: `"Password must be less than or equal to 100 characters. Recommended length is 16 characters."`  En az bir büyük harf: `"Password must contain at least one uppercase letter (A-Z)."`  En az bir küçük harf: `"Password must contain at least one lowercase letter (a-z)."`  En az bir rakam: `"Password must contain at least one number (0-9)."`  En az bir özel karakter: `"Password must contain at least one non-alphanumeric character."` |
| `FullName` | `string` | Evet    | Kullanıcının tam adı | Boş olamaz: `"FullName is required."`  Min. 3 karakter: `"FullName must be at least 3 characters."`  Maks. 100 karakter: `"FullName must be less than or equal to 100 characters."`                                                                                                                                                                                                                                                                                                                                                                                      |

> **Şifre Politikası:** Şifre; en az bir büyük harf, bir küçük harf, bir rakam ve bir özel karakter içermelidir. Önerilen uzunluk 16 karakterdir.

***

## İstek Örneği

```http
POST /api/offline/users
Authorization: Bearer {token}
Content-Type: application/json
{
  "UserName": "api-user-01",
  "Email": "api-user-01@acme.local",
  "Password": "StrongPass123!",
  "FullName": "Api User"
}

```

***

## Yanıt Formatı

### Başarılı Yanıt

**HTTP Durumu:** `201 Created`

Yanıt gövdesinde oluşturulan kullanıcının kimliği döner:

```json
{
  "Id": "3f4f95f8-0f6a-4763-86c9-5e6cf9dd8d7b"
}

```

### Hata Yanıtı

```json
{
    "Status": false,
    "Code": "Error.Code",
    "Message": "Error description",
    "Response": null
}

```

Doğrulama hatalarında `Response` alanı detayları içerir:

```json
{
    "Status": false,
    "Code": "Validation.General",
    "Message": "One or more validation errors occurred",
    "Response": [
        {
            "Field": "FieldName",
            "Message": "Error message description"
        }
    ]
}

```

***

## HTTP Durum Kodları

| Durum                       | Açıklama                                 |
| --------------------------- | ---------------------------------------- |
| `201 Created`               | Kullanıcı başarıyla oluşturuldu          |
| `400 Bad Request`           | İstek doğrulama hatası                   |
| `401 Unauthorized`          | Eksik, geçersiz veya süresi dolmuş token |
| `403 Forbidden`             | Yetersiz yetki, geçersiz rol veya kapsam |
| `409 Conflict`              | Duplicate email veya kullanıcı adı       |
| `500 Internal Server Error` | Beklenmeyen business hatası              |

***

## Hata Kodları Referansı

| Kod                                       | HTTP Durumu | Mesaj                                                         |
| ----------------------------------------- | ----------- | ------------------------------------------------------------- |
| `Validation.General`                      | 400         | One or more validation errors occurred                        |
| `OfflineUsers.DuplicateEmail`             | 409         | Email '\{email}' already exists.                              |
| `OfflineUsers.DuplicateUserName`          | 409         | UserName '\{userName}' already exists.                        |
| `OfflineUsers.InsuranceCompanyNotFound`   | 403         | No valid insurance company assignment found in token.         |
| `OfflineUsers.AgentNotFound`              | 403         | No valid agent assignment found in token.                     |
| `OfflineUsers.AgentOrCompanyRoleRequired` | 403         | Only agent or company users are authorized for this endpoint. |
| `OfflineUsers.CreateFailed`               | 500         | User could not be created due to a business rule violation.   |

***

## İşleme Akışı

Endpoint, isteği aldığında aşağıdaki adımları sırasıyla uygular:

1. **Kimlik Doğrulama** — Bearer token doğrulanır; token yoksa/geçersizse `401` döner.

2. **Yetkilendirme** — `Create` policy'si ve `InsuranceCompanyAPIAdmin` / `Supervizor` rolü kontrol edilir; yetersizse `403` döner.

3. **İstek Doğrulama** — `CreateUserRequestValidator` ile alan bazlı kurallar uygulanır; ihlal varsa `400` döner.

4. **Identity Scope Çözümleme** — Token claim'lerinden `InsuranceCompanyIds` (company) veya `AgentId` (agent) okunur. Uygun rol/scope yoksa `403` döner.

5. **Duplicate Kontrolleri** — E-posta ve kullanıcı adı için tekillik kontrolü yapılır; çakışma varsa `409` döner.

6. **Kullanıcı Oluşturma** — Business katmanında gerekli işlemler yapılır.

7. **Sonuç** — Başarıyla oluşturulursa `201 Created` ve `{ Id }` döner. Business katmanından `BusinessRuleException` alınırsa `OfflineUsers.CreateFailed` koduyla `500` döner.

***

## Notlar

* **Identity Scope:** Oluşturulan kullanıcı, isteği yapan token sahibinin kapsamına (şirket veya acente) göre atanır. Company kullanıcıları kendi şirketlerine, agent kullanıcıları ise kendi acentelerine kullanıcı ekleyebilir.

* **Şifre Güvenliği:** Şifreler sistemde hash'lenerek saklanır; düz metin olarak döndürülmez. İstekten sonra şifreyi güvenli bir şekilde ilgili kullanıcıya iletmek çağıranın sorumluluğundadır.

* **Kullanıcı Adı & E-posta:** Her ikisi de sistem genelinde tekildir. Oluşturulduktan sonra aynı değerlerle yeni bir kullanıcı oluşturulamaz.

***

Reference: https://docs.insurgateway.com/insurgateway-api/offline/create-user

## Authentication

- `Authorization` header (bearer token, required) — Bearer authentication of the form `Bearer <token>`, where token is your auth token.

## Servers

- `https://testgatewayapi.insurapps.net` (https://testgatewayapi.insurapps.net, default)
- `https://gatewayapi.insurapps.net` (https://gatewayapi.insurapps.net)

## Response

### 201

Created

## Errors

### 400 Bad Request Error

Bad Request

### 403 Forbidden Error

Forbidden

### 409 Conflict Error

Conflict

## Examples

**Request**

```json
{
  "userName": "test.user",
  "email": "test.user@company.com",
  "password": "TemporaryPassword123!",
  "fullName": "Test User"
}
```

**Response**

```json
{
  "Id": "created-user-id"
}
```

**SDK Code**

```python Offline_createUser_example
import requests

url = "https://testgatewayapi.insurapps.net/api/offline/users"

payload = {
    "userName": "test.user",
    "email": "test.user@company.com",
    "password": "TemporaryPassword123!",
    "fullName": "Test User"
}
headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.json())
```

```javascript Offline_createUser_example
const url = 'https://testgatewayapi.insurapps.net/api/offline/users';
const options = {
  method: 'POST',
  headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
  body: '{"userName":"test.user","email":"test.user@company.com","password":"TemporaryPassword123!","fullName":"Test User"}'
};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go Offline_createUser_example
package main

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

func main() {

	url := "https://testgatewayapi.insurapps.net/api/offline/users"

	payload := strings.NewReader("{\n  \"userName\": \"test.user\",\n  \"email\": \"test.user@company.com\",\n  \"password\": \"TemporaryPassword123!\",\n  \"fullName\": \"Test User\"\n}")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("Authorization", "Bearer <token>")
	req.Header.Add("Content-Type", "application/json")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby Offline_createUser_example
require 'uri'
require 'net/http'

url = URI("https://testgatewayapi.insurapps.net/api/offline/users")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n  \"userName\": \"test.user\",\n  \"email\": \"test.user@company.com\",\n  \"password\": \"TemporaryPassword123!\",\n  \"fullName\": \"Test User\"\n}"

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

```java Offline_createUser_example
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://testgatewayapi.insurapps.net/api/offline/users")
  .header("Authorization", "Bearer <token>")
  .header("Content-Type", "application/json")
  .body("{\n  \"userName\": \"test.user\",\n  \"email\": \"test.user@company.com\",\n  \"password\": \"TemporaryPassword123!\",\n  \"fullName\": \"Test User\"\n}")
  .asString();
```

```php Offline_createUser_example
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://testgatewayapi.insurapps.net/api/offline/users', [
  'body' => '{
  "userName": "test.user",
  "email": "test.user@company.com",
  "password": "TemporaryPassword123!",
  "fullName": "Test User"
}',
  'headers' => [
    'Authorization' => 'Bearer <token>',
    'Content-Type' => 'application/json',
  ],
]);

echo $response->getBody();
```

```csharp Offline_createUser_example
using RestSharp;

var client = new RestClient("https://testgatewayapi.insurapps.net/api/offline/users");
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Bearer <token>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"userName\": \"test.user\",\n  \"email\": \"test.user@company.com\",\n  \"password\": \"TemporaryPassword123!\",\n  \"fullName\": \"Test User\"\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift Offline_createUser_example
import Foundation

let headers = [
  "Authorization": "Bearer <token>",
  "Content-Type": "application/json"
]
let parameters = [
  "userName": "test.user",
  "email": "test.user@company.com",
  "password": "TemporaryPassword123!",
  "fullName": "Test User"
] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://testgatewayapi.insurapps.net/api/offline/users")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```