> 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.

# Read Prospect

GET https://api.fortresstech.io/v1/prospects/{prospectId}

Info for a specific prospect.

The response includes `isPrimaryProspect`: `true` when the prospect is the primary member
of the household it converted into, `false` when it is a non-primary member, and `null`
when the prospect has not been converted to an applicant yet, so the status cannot be
determined — in which case the key is omitted from the response; treat a missing key as
`null`.


Reference: https://developer.fortresstech.io/api-reference/prospects/read-prospect

## Authentication

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

## Request

### Path parameters

- `prospectId` (string, required) — The id of the prospect

## Response

### 200

Expected response to a valid request

- `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)
- `activities` (list of Base, optional)
- `preferences` (ProspectPreferences, optional)
- `property` (properties_components-schemas-Base, optional)
- `assignedUser` (components-schemas-Base, optional)
- `households` (list of households_components-schemas-Base, optional)

## Types

### 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)

### ProspectPreferences

- `numBeds` (integer, optional)
- `numBaths` (integer, optional)
- `numHalfBaths` (integer, optional)
- `minPrice` (integer, optional)
- `maxPrice` (integer, optional)
- `leaseTerm` (integer, optional)
- `other` (string, optional)
- `moveInStart` (datetime, optional)
- `moveInEnd` (datetime, optional)

### properties_components-schemas-Base

- `name` (string, optional)
- `shortName` (string, optional)
- `email` (string, optional)
- `phone` (string, optional)
- `physicalStreetAddress1` (string, optional)
- `physicalStreetAddress2` (string, optional)
- `physicalCity` (string, optional)
- `physicalState` (string, optional)
- `physicalZip` (string, optional)
- `physicalCountry` (string, optional)
- `mailingStreetAddress1` (string, optional)
- `mailingStreetAddress2` (string, optional)
- `mailingCity` (string, optional)
- `mailingState` (string, optional)
- `mailingZip` (string, optional)
- `mailingCountry` (string, optional)
- `phoneNumber` (string, optional)
- `faxNumber` (string, optional)
- `timezone` (string, optional)
- `longitude` (double, optional)
- `latitude` (double, optional)
- `turnMoveOutDays` (integer, optional) — Number of days after move-out to calculate make ready date
- `status` (enum, optional, nullable) — Property lifecycle status. Fortress aggregates occupancy only for ACTIVE properties.
  - Allowed values: `ACTIVE`, `INACTIVE`, `PENDING`
- `propertyClass` (enum, optional, nullable) — The property's class. Null for properties with no class assigned.
  - Allowed values: `Conventional`, `Affordable`, `Mixed`
- `organizationId` (string, optional)
- `id` (string, optional)
- `readableId` (string, optional)
- `idempotencyId` (string, optional)
- `createdAt` (datetime, optional)
- `updatedAt` (datetime, optional)
- `deletedAt` (datetime, optional)
- `offboardedAt` (datetime, optional)
- `countyName` (string, optional)
- `acquisitionDate` (datetime, optional)

### components-schemas-Base

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

### households_components-schemas-Base

- `status` (enum, optional)
  - Allowed values: `APPLICANT`, `RESIDENT`, `PRIOR`
- `isUnderEviction` (boolean, optional)
- `id` (string, optional)
- `readableId` (string, optional)
- `idempotencyId` (string, optional)
- `createdAt` (datetime, optional)
- `updatedAt` (datetime, optional)
- `deletedAt` (datetime, optional)
- `currentUnitId` (string, optional) — Current unit the household is associated with. Set only when the lease is active
- `currentLeaseId` (string, optional) — Current active lease for the household.
- `applicationId` (string, optional)
- `organizationId` (string, optional)
- `propertyId` (string, optional)
- `currentCertificationId` (string, optional)
- `prospectId` (string, optional)
- `primaryCustomerId` (string, optional)
- `totalActiveRentAmount` (double, optional) — Sum of all active RENT monthly lease transactions for the household
- `totalActiveSubsidyAmount` (double, optional) — Sum of all active SUBRENT monthly lease transactions for the household
- `totalActiveFeesAmount` (double, optional) — Sum of all active non-optional fee (charge) monthly lease transactions for the household
- `unitId` (string, optional, deprecated) — Deprecated, use currentUnitId instead

## Examples

**Response**

```json
{
  "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"
    }
  ],
  "preferences": {
    "numBeds": 1,
    "numBaths": 1,
    "numHalfBaths": 1,
    "minPrice": 1,
    "maxPrice": 1,
    "leaseTerm": 1,
    "other": "string",
    "moveInStart": "2024-01-15T09:30:00Z",
    "moveInEnd": "2024-01-15T09:30:00Z"
  },
  "property": {
    "name": "string",
    "shortName": "string",
    "email": "string",
    "phone": "string",
    "physicalStreetAddress1": "string",
    "physicalStreetAddress2": "string",
    "physicalCity": "string",
    "physicalState": "string",
    "physicalZip": "string",
    "physicalCountry": "string",
    "mailingStreetAddress1": "string",
    "mailingStreetAddress2": "string",
    "mailingCity": "string",
    "mailingState": "string",
    "mailingZip": "string",
    "mailingCountry": "string",
    "phoneNumber": "string",
    "faxNumber": "string",
    "timezone": "string",
    "longitude": 1.1,
    "latitude": 1.1,
    "turnMoveOutDays": 1,
    "status": "ACTIVE",
    "propertyClass": "Conventional",
    "organizationId": "string",
    "id": "string",
    "readableId": "string",
    "idempotencyId": "string",
    "createdAt": "2024-01-15T09:30:00Z",
    "updatedAt": "2024-01-15T09:30:00Z",
    "deletedAt": "2024-01-15T09:30:00Z",
    "offboardedAt": "2024-01-15T09:30:00Z",
    "countyName": "string",
    "acquisitionDate": "2024-01-15T09:30:00Z"
  },
  "assignedUser": {
    "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"
  },
  "households": [
    {
      "status": "APPLICANT",
      "isUnderEviction": 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",
      "currentUnitId": "string",
      "currentLeaseId": "string",
      "applicationId": "string",
      "organizationId": "string",
      "propertyId": "string",
      "currentCertificationId": "string",
      "prospectId": "string",
      "primaryCustomerId": "string",
      "totalActiveRentAmount": 1.1,
      "totalActiveSubsidyAmount": 1.1,
      "totalActiveFeesAmount": 1.1,
      "unitId": "string"
    }
  ]
}
```

**SDK Code**

```python
import requests

url = "https://api.fortresstech.io/v1/prospects/prospectId"

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

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

print(response.json())
```

```javascript
const url = 'https://api.fortresstech.io/v1/prospects/prospectId';
const options = {method: 'GET', 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/prospects/prospectId"

	req, _ := http.NewRequest("GET", 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/prospects/prospectId")

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

request = Net::HTTP::Get.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.get("https://api.fortresstech.io/v1/prospects/prospectId")
  .header("x-api-key", "<apiKey>")
  .asString();
```

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

$client = new \GuzzleHttp\Client();

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

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

```csharp
using RestSharp;

var client = new RestClient("https://api.fortresstech.io/v1/prospects/prospectId");
var request = new RestRequest(Method.GET);
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/prospects/prospectId")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "GET"
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()
```