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

# Update User

PUT https://api.fortresstech.io/v1/users/{userId}

Available by RequestUpdate information for a specific user, such as changing their name, email, role, permissions, or other account details.This endpoint is part of our evolving API ecosystem.
To explore availability for your integration, please contact our team.

Reference: https://developer.fortresstech.io/api-reference/users/update-user

## Authentication

- `x-api-key` header (required) — API Key authentication via header

## Request

### Path parameters

- `userId` (string, required) — The id of the user

## Response

### 200

Expected response to a valid request

- `firstName` (string, optional)
- `lastName` (string, optional)
- `email` (string, optional)
- `username` (string, optional)
- `status` (enum, optional)
  - Allowed values: `ACTIVE`, `HOLD`, `INACTIVE`, `BLOCKED`
- `hasAllProperties` (boolean, optional)
- `id` (string, optional)
- `readableId` (string, optional)
- `idempotencyId` (string, optional)
- `createdAt` (datetime, optional)
- `updatedAt` (datetime, optional)
- `deletedAt` (datetime, optional)
- `organizationId` (string, optional)
- `propertyIds` (string, optional) — Comma-separated list of property UUIDs
- `workOrders` (list of workOrders_components-schemas-Base, optional)
- `applications` (list of applications_components-schemas-Base, optional)
- `userProperties` (list of userProperties_components-schemas-Base, optional)
- `prospects` (list of schemas-Base, optional)
- `activities` (list of Base, optional)

## Types

### workOrders_components-schemas-Base

- `status` (enum, optional)
  - Allowed values: `OPEN`, `COMPLETED`, `CANCELED`, `ON_HOLD`, `IN_PROGRESS`
- `priority` (enum, optional)
  - Allowed values: `LOW`, `MEDIUM`, `HIGH`, `URGENT`, `WARRANTY`
- `hasPetAlert` (boolean, optional)
- `completedAt` (datetime, optional)
- `requestorPhone` (string, optional, nullable)
- `requestorEmail` (string, optional, nullable)
- `requestedStartDateFrom` (date, optional)
- `requestedStartDateTo` (date, optional)
- `requestedStartTimeFrom` (string, optional)
- `requestedStartTimeTo` (string, optional)
- `dueDate` (date, optional)
- `description` (string, optional)
- `serviceNotes` (string, optional)
- `vendorNotes` (string, optional)
- `entryNotes` (string, optional)
- `entryPreference` (enum, optional)
  - Allowed values: `24_HOUR_NOTICE`, `BY_APPOINTMENT`, `CALL_FIRST`, `NO_PREFERENCE`, `ANYTIME`
- `isDoorCodeActive` (boolean, optional)
- `isAlarmActive` (boolean, optional)
- `doorCode` (string, optional)
- `alarmCode` (string, optional)
- `holdReason` (string, optional)
- `otherLocationDetail` (string, optional)
- `attachmentIds` (string, optional)
- `technicianNotes` (string, optional) — Notes to the technician.
- `previouslyReported` (boolean, optional) — If the Issue was previously reported, this will be true.
- `id` (string, optional)
- `readableId` (string, optional)
- `idempotencyId` (string, optional)
- `createdAt` (string, optional)
- `updatedAt` (datetime, optional)
- `deletedAt` (datetime, optional)
- `assignedUserId` (string, optional)
- `householdId` (string, optional)
- `customerId` (string, optional)
- `unitId` (string, optional)
- `maintenanceIssueId` (string, optional)
- `maintenanceLocationId` (string, optional)
- `propertyId` (string, optional)
- `organizationId` (string, optional)
- `totalCostOfMaterialsUsed` (double, optional) — The total cost of materials used.
- `totalAmountOwedByResident` (double, optional) — The total amount owed by the resident.
- `totalAmountOwedByProperty` (double, optional) — The total amount owed by the property.
- `hourlyServiceRate` (double, optional) — The hourly service rate.
- `totalLaborCost` (double, optional) — The total labor cost.

### applications_components-schemas-Base

- `notes` (string, optional)
- `status` (enum, optional)
  - Allowed values: `APPROVED`, `IN_PROCESS`, `DENIED`, `WAITLIST`, `CANCELED`, `ABANDONED`
- `submittedAt` (datetime, optional)
- `id` (string, optional)
- `readableId` (string, optional)
- `idempotencyId` (string, optional)
- `createdAt` (datetime, optional)
- `updatedAt` (datetime, optional)
- `deletedAt` (datetime, optional)
- `primaryFormCompletedAt` (datetime, optional) — Timestamp of the last completed primary form for any applicant.
- `secondaryFormCompletedAt` (datetime, optional) — Timestamp of the last completed secondary form for any applicant.
- `assignedUserId` (string, optional)
- `assignedUnitId` (string, optional)
- `householdId` (string, optional)
- `leaseId` (string, optional)
- `applicantId` (string, optional)
- `organizationId` (string, optional)
- `propertyId` (string, optional)

### userProperties_components-schemas-Base

- `id` (string, optional)
- `readableId` (string, optional)
- `idempotencyId` (string, optional)
- `userId` (string, optional)
- `propertyId` (string, optional)
- `organizationId` (string, optional)
- `createdAt` (datetime, optional)
- `updatedAt` (datetime, optional)
- `deletedAt` (datetime, optional)

### schemas-Base

- `firstName` (string, optional)
- `middleName` (string, optional)
- `lastName` (string, optional)
- `phone` (string, optional)
- `email` (string, optional)
- `referralSource` (string, optional)
- `propertyId` (string, optional)
- `organizationId` (string, optional)
- `assignedUserId` (string, optional)
- `prospectStatusId` (string, optional)
- `isPrimaryProspect` (boolean, optional, nullable) — Whether this prospect is the primary prospect — the household member Fortress marks as Primary on the application the prospect converted into. `false` means the prospect is a non-primary member of that household. `null` means the status cannot be determined: the prospect has not been converted to an applicant, so there is no household membership to read it from. The export pipeline omits null columns, so an undetermined prospect is returned without this key — treat a missing `isPrimaryProspect` as `null`.
- `portalInviteUrl` (string, optional, nullable) — The prospect's own resident portal link, to send them so they can register and apply. While the prospect's portal account is unclaimed this is the claim link; once claimed it is the property's portal login link. `null` (and omitted from the record) until a portal account exists for the prospect — call `POST /prospects/{prospectId}/portal-invitation` to create one — or when the resident portal is not active for the property. The claim link lets whoever holds it set the account password, so send it only to the prospect.
- `id` (string, optional)
- `readableId` (string, optional)
- `idempotencyId` (string, optional)
- `createdAt` (datetime, optional)
- `updatedAt` (datetime, optional)

### Base

- `notes` (string, optional)
- `type` (enum, optional)
  - Allowed values: `EMAILED`, `TEXTED`, `CALLED`, `CALL_FAILED`, `VISITED`, `VISIT_CANCELLED`, `VISIT_NO_SHOW`, `TOURED`, `TOUR_CANCELLED`, `TOUR_NO_SHOW`, `APPLICATION_CREATED`, `APPLICATION_WAITLISTED APPLICATION_CANCELLED`, `APPLICATION_DENIED`, `UNIT_ASSIGNED`, `UNIT_UNASSIGNED`, `LEASE_OFFERED`, `LEASE_EXECUTED`, `MOVE_IN`, `CALL`, `EMAIL`, `SMS`, `VISIT`, `TOUR`, `QUOTE`
- `prospectId` (string, optional)
- `assignedUserId` (string, optional)
- `propertyId` (string, optional)
- `organizationId` (string, optional)
- `householdId` (string, optional)
- `customerStatus` (string, optional)
- `startTime` (datetime, optional)
- `id` (string, optional)
- `readableId` (string, optional)
- `idempotencyId` (string, optional)
- `createdAt` (datetime, optional)
- `updatedAt` (datetime, optional)
- `deletedAt` (datetime, optional)

## Examples

**Response**

```json
{
  "firstName": "string",
  "lastName": "string",
  "email": "string",
  "username": "string",
  "status": "ACTIVE",
  "hasAllProperties": true,
  "id": "string",
  "readableId": "string",
  "idempotencyId": "string",
  "createdAt": "2024-01-15T09:30:00Z",
  "updatedAt": "2024-01-15T09:30:00Z",
  "deletedAt": "2024-01-15T09:30:00Z",
  "organizationId": "string",
  "propertyIds": "string",
  "workOrders": [
    {
      "status": "OPEN",
      "priority": "LOW",
      "hasPetAlert": true,
      "completedAt": "2024-01-15T09:30:00Z",
      "requestorPhone": "string",
      "requestorEmail": "string",
      "requestedStartDateFrom": "2023-01-15",
      "requestedStartDateTo": "2023-01-15",
      "requestedStartTimeFrom": "string",
      "requestedStartTimeTo": "string",
      "dueDate": "2023-01-15",
      "description": "string",
      "serviceNotes": "string",
      "vendorNotes": "string",
      "entryNotes": "string",
      "entryPreference": "24_HOUR_NOTICE",
      "isDoorCodeActive": true,
      "isAlarmActive": true,
      "doorCode": "string",
      "alarmCode": "string",
      "holdReason": "string",
      "otherLocationDetail": "string",
      "attachmentIds": "string",
      "technicianNotes": "string",
      "previouslyReported": true,
      "id": "string",
      "readableId": "string",
      "idempotencyId": "string",
      "createdAt": "string",
      "updatedAt": "2024-01-15T09:30:00Z",
      "deletedAt": "2024-01-15T09:30:00Z",
      "assignedUserId": "string",
      "householdId": "string",
      "customerId": "string",
      "unitId": "string",
      "maintenanceIssueId": "string",
      "maintenanceLocationId": "string",
      "propertyId": "string",
      "organizationId": "string",
      "totalCostOfMaterialsUsed": 1.1,
      "totalAmountOwedByResident": 1.1,
      "totalAmountOwedByProperty": 1.1,
      "hourlyServiceRate": 1.1,
      "totalLaborCost": 1.1
    }
  ],
  "applications": [
    {
      "notes": "string",
      "status": "APPROVED",
      "submittedAt": "2024-01-15T09:30:00Z",
      "id": "string",
      "readableId": "string",
      "idempotencyId": "string",
      "createdAt": "2024-01-15T09:30:00Z",
      "updatedAt": "2024-01-15T09:30:00Z",
      "deletedAt": "2024-01-15T09:30:00Z",
      "primaryFormCompletedAt": "2024-01-15T09:30:00Z",
      "secondaryFormCompletedAt": "2024-01-15T09:30:00Z",
      "assignedUserId": "string",
      "assignedUnitId": "string",
      "householdId": "string",
      "leaseId": "string",
      "applicantId": "string",
      "organizationId": "string",
      "propertyId": "string"
    }
  ],
  "userProperties": [
    {
      "id": "string",
      "readableId": "string",
      "idempotencyId": "string",
      "userId": "string",
      "propertyId": "string",
      "organizationId": "string",
      "createdAt": "2024-01-15T09:30:00Z",
      "updatedAt": "2024-01-15T09:30:00Z",
      "deletedAt": "2024-01-15T09:30:00Z"
    }
  ],
  "prospects": [
    {
      "firstName": "string",
      "middleName": "string",
      "lastName": "string",
      "phone": "string",
      "email": "string",
      "referralSource": "string",
      "propertyId": "string",
      "organizationId": "string",
      "assignedUserId": "string",
      "prospectStatusId": "string",
      "isPrimaryProspect": true,
      "portalInviteUrl": "string",
      "id": "string",
      "readableId": "string",
      "idempotencyId": "string",
      "createdAt": "2024-01-15T09:30:00Z",
      "updatedAt": "2024-01-15T09:30:00Z"
    }
  ],
  "activities": [
    {
      "notes": "string",
      "type": "EMAILED",
      "prospectId": "string",
      "assignedUserId": "string",
      "propertyId": "string",
      "organizationId": "string",
      "householdId": "string",
      "customerStatus": "string",
      "startTime": "2024-01-15T09:30:00Z",
      "id": "string",
      "readableId": "string",
      "idempotencyId": "string",
      "createdAt": "2024-01-15T09:30:00Z",
      "updatedAt": "2024-01-15T09:30:00Z",
      "deletedAt": "2024-01-15T09:30:00Z"
    }
  ]
}
```

**SDK Code**

```python
import requests

url = "https://api.fortresstech.io/v1/users/userId"

headers = {"x-api-key": "<apiKey>"}

response = requests.put(url, headers=headers)

print(response.json())
```

```javascript
const url = 'https://api.fortresstech.io/v1/users/userId';
const options = {method: 'PUT', headers: {'x-api-key': '<apiKey>'}};

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

```go
package main

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

func main() {

	url := "https://api.fortresstech.io/v1/users/userId"

	req, _ := http.NewRequest("PUT", url, nil)

	req.Header.Add("x-api-key", "<apiKey>")

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

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

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

}
```

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

url = URI("https://api.fortresstech.io/v1/users/userId")

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

request = Net::HTTP::Put.new(url)
request["x-api-key"] = '<apiKey>'

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

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

HttpResponse<String> response = Unirest.put("https://api.fortresstech.io/v1/users/userId")
  .header("x-api-key", "<apiKey>")
  .asString();
```

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

$client = new \GuzzleHttp\Client();

$response = $client->request('PUT', 'https://api.fortresstech.io/v1/users/userId', [
  'headers' => [
    'x-api-key' => '<apiKey>',
  ],
]);

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

```csharp
using RestSharp;

var client = new RestClient("https://api.fortresstech.io/v1/users/userId");
var request = new RestRequest(Method.PUT);
request.AddHeader("x-api-key", "<apiKey>");
IRestResponse response = client.Execute(request);
```

```swift
import Foundation

let headers = ["x-api-key": "<apiKey>"]

let request = NSMutableURLRequest(url: NSURL(string: "https://api.fortresstech.io/v1/users/userId")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "PUT"
request.allHTTPHeaderFields = headers

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()
```