{"id":"c50b8ab3-1483-4cd9-ab61-89fe78385c4c","name":"Lone Wolf Technologies","description":"## Lone Wolf APIs\r\nFor a high-level overview of Lone Wolf APIs or to request access, visit the [Lone Wolf API Portal](https://www.lwolf.com/api-portal).\r\n\r\nDocumentation on many of Lone Wolf's product suite APIs that are part of Lone Wolf Foundation are outlined below.","url":"https://apidocs.lwolf.com/apis","created":"2025-08-25","modified":"2026-07-10","specificationVersion":"0.16","apis":[{"id":"cd6417c7-f044-41a0-b2dc-4c4e1ef0066a","name":"Deals API","slug":"deals-api","url":"https://apidocs.lwolf.com/doc/deals-api","humanUrl":"https://apidocs.lwolf.com/doc/deals-api","created":"2026-06-22","modified":"2026-06-26","description":"## Index\n\nFor partner integration use (25.01.00)\n\n### Getting Started\n\n#### Getting a JWT Access Token\n\n`POST https://authentication.api.lwolf.com/v1/login`\n\nAll APIs require an *Authorization* HTTP Header that contains a *Bearer {token}* as its value. The token is a JSON Web Token (JWT) and can be generated as needed from the Authentication API using a POST request to the `/v1/login` endpoint with your provided credentials / secrets.\n\nThis will provide a JWT token in the response which can then be used as your Bearer token in your Authorization header when making API calls.\n\n**Request Example**\n\n```json\n{\n  \"emailAddress\": \"api-aaaa111@apps.lwolf.com\",\n  \"password\": \"AAAA111\",\n  \"clientId\": \"GgP8g-zksBgWuXum!DbXh*qASYCsfNZF\"\n}\n```\n\n**cURL**\n\n```bash\ncurl --location --request POST 'https://authentication.api.lwolf.com/v1/login' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{\n\"emailAddress\": \"api-aaa111@apps.lwolf.com\",\n\"clientId\": \"AAAA111\",\n\"password\": \"GgP8g-zksBgWuXum!DbXh*qASYCsfNZF\"\n}'\n```\n\n**Response Example (200 OK)**\n\n```json\n{\n  \"token\": \"\u003cJWT string\u003e\",\n  \"expiresIn\": 86400\n}\n```\n\n### Searching Deals\n\n#### Using Field Search on Summaries\n\n`GET https://deals.api.lwolf.com/v1/search`\n\nThe Deals API supports searching deal summaries, compact and heavily indexed versions of deals, by a single field and value.\n\n**Example**\n\n```\nhttps://deals.api.lwolf.com/v1/deals/search?entityPath=deal\u0026fieldName=bwId\u0026searchText=12345\n```\n\n#### Using OData on Full Details\n\n`GET https://deals.api.lwolf.com/v1/deals`\n\nThe Deals API supports searching deals using a subset of OData queries ($filter, $top, $skip, $limit). Any top-level field can be used in a query however at the current time fields from nested objects is not supported. As well the use of the IN operator is not supported, however multiple OR operators can be used instead.\n\n**Example**\n\n```\nhttps://deals.api.lwolf.com/v1/deals?$filter=addressStreetNumber%20eq%20%27263%27%20and%20%20addressStreetName%20eq%20%27Wellington%20St%27%20and%20addressUnitNumber%20eq%20%27701%27\n```\n\nAPI for managing deals, commissions, conditions, and client contacts.\n\n## Roster API\n\nLone Wolf Technologies Roster API\n\n**API Endpoint:** `https://roster.api.lwolf.com/v1`\n\n**Schemes:** https\n\n**Version:** 1.0.0\n\n### Authentication\n\n**Bearer Token**\n\nUse the Authentication API to retrieve the JSON Web Token for all calls to this API. Pass the token as `Authorization: Bearer {token}` in the request header.\n\n### Members\n\n#### Add new member\n\n`POST /members`\n\nIf the 'id' is passed in this object, the API will attempt to use that for its member id. If 'id' is null or undefined, the API will generate one.\n\n**Request Example**\n\n```json\n{\n  \"id\": \"string (UUID)\",\n  \"bwId\": \"number (int32)\",\n  \"firstName\": \"string\",\n  \"middleName\": \"string\",\n  \"lastName\": \"string\",\n  \"number\": \"string\",\n  \"officeId\": \"string (UUID)\",\n  \"bwOfficeId\": \"number (int32)\",\n  \"inactiveDate\": \"string (date)\",\n  \"legalName\": \"string\",\n  \"primaryEmailAddress\": \"string\",\n  \"addressLine1\": \"string\",\n  \"addressLine2\": \"string\",\n  \"addressCity\": \"string\",\n  \"addressPostalCode\": \"string\",\n  \"addressProvinceCode\": \"string\",\n  \"addressCountryCode\": \"string\",\n  \"birthDate\": \"string (date)\",\n  \"typeId\": \"string\",\n  \"lwaId\": \"string (UUID)\",\n  \"memberTypeCode\": {\n    \"createdTimestamp\": \"string (date-time)\",\n    \"modifiedTimestamp\": \"string (date-time)\",\n    \"id\": \"string (UUID)\",\n    \"code\": \"string\",\n    \"name\": \"string\"\n  }\n}\n```\n\n| Response | Description |\n|---|---|\n| 201 Created | Member created |\n| 400 Bad Request | Invalid request. See response body for details. |\n| 401 Unauthorized | Unauthorized request. See response body for details. |\n| 403 Forbidden | Permission denied. See response body for details. |\n| 409 Conflict | Member already exists. |\n| 500 Internal Server Error | Unknown error. See response body for details. |\n\n**Response Example (201 Created)**\n\n```json\n{\n  \"createdTimestamp\": \"string (date-time)\",\n  \"modifiedTimestamp\": \"string (date-time)\",\n  \"id\": \"string (UUID)\",\n  \"version\": \"number (int32)\",\n  \"bwId\": \"number (int32)\",\n  \"firstName\": \"string\",\n  \"middleName\": \"string\",\n  \"lastName\": \"string\",\n  \"number\": \"string\",\n  \"officeId\": \"string (UUID)\",\n  \"bwOfficeId\": \"number (int32)\",\n  \"inactiveDate\": \"string (date)\",\n  \"legalName\": \"string\",\n  \"primaryEmailAddress\": \"string\",\n  \"addressLine1\": \"string\",\n  \"addressLine2\": \"string\",\n  \"addressCity\": \"string\",\n  \"addressPostalCode\": \"string\",\n  \"addressProvinceCode\": \"string\",\n  \"addressCountryCode\": \"string\",\n  \"birthDate\": \"string (date)\",\n  \"typeId\": \"string\",\n  \"lwaId\": \"string (UUID)\",\n  \"memberTypeCode\": {\n    \"createdTimestamp\": \"string (date-time)\",\n    \"modifiedTimestamp\": \"string (date-time)\",\n    \"id\": \"string (UUID)\",\n    \"code\": \"string\",\n    \"name\": \"string\"\n  }\n}\n```\n\n**Response Example (409 Conflict)**\n\n```json\n{\n  \"code\": \"integer (int32)\",\n  \"message\": \"string\",\n  \"details\": [\"string\"]\n}\n```\n\n#### Get list of members\n\n`GET /members`\n\n| Response | Description |\n|---|---|\n| 200 OK | Success |\n| 400 Bad Request | Invalid request. See response body for details. |\n| 401 Unauthorized | Unauthorized request. See response body for details. |\n| 403 Forbidden | Permission denied. See response body for details. |\n| 500 Internal Server Error | Unknown error. See response body for details. |\n\n**Response Example (200 OK)**\n\n```json\n[\n  {\n    \"createdTimestamp\": \"string (date-time)\",\n    \"modifiedTimestamp\": \"string (date-time)\",\n    \"id\": \"string (UUID)\",\n    \"version\": \"number (int32)\",\n    \"bwId\": \"number (int32)\",\n    \"firstName\": \"string\",\n    \"middleName\": \"string\",\n    \"lastName\": \"string\",\n    \"number\": \"string\",\n    \"officeId\": \"string (UUID)\",\n    \"bwOfficeId\": \"number (int32)\",\n    \"inactiveDate\": \"string (date)\",\n    \"legalName\": \"string\",\n    \"primaryEmailAddress\": \"string\",\n    \"addressLine1\": \"string\",\n    \"addressLine2\": \"string\",\n    \"addressCity\": \"string\",\n    \"addressPostalCode\": \"string\",\n    \"addressProvinceCode\": \"string\",\n    \"addressCountryCode\": \"string\",\n    \"birthDate\": \"string (date)\",\n    \"typeId\": \"string\",\n    \"lwaId\": \"string (UUID)\",\n    \"memberTypeCode\": {\n      \"createdTimestamp\": \"string (date-time)\",\n      \"modifiedTimestamp\": \"string (date-time)\",\n      \"id\": \"string (UUID)\",\n      \"code\": \"string\",\n      \"name\": \"string\"\n    }\n  }\n]\n```\n\n#### Delete a specific member\n\n`DELETE /members/{memberId}`\n\n**Path Parameters**\n\n| Parameter | Type | Description |\n|---|---|---|\n| memberId | string (UUID) | |\n\n| Response | Description |\n|---|---|\n| 200 OK | Member deleted. |\n| 400 Bad Request | Invalid request. See response body for details. |\n| 401 Unauthorized | Unauthorized request. See response body for details. |\n| 403 Forbidden | Permission denied. See response body for details. |\n| 404 Not Found | Member not found. |\n| 500 Internal Server Error | Unknown error. See response body for details. |\n\n**Response Example (404 Not Found)**\n\n```json\n{\n  \"code\": \"integer (int32)\",\n  \"message\": \"string\",\n  \"details\": [\"string\"]\n}\n```\n\n#### Get a specific member\n\n`GET /members/{memberId}`\n\n**Path Parameters**\n\n| Parameter | Type | Description |\n|---|---|---|\n| memberId | string (UUID) | |\n\n**Query Parameters**\n\n| Parameter | Type | Description |\n|---|---|---|\n| isBwId | boolean | Indicates whether the passed 'memberId' should be treated as the brokerWOLF id |\n\n| Response | Description |\n|---|---|\n| 200 OK | Member found. |\n| 400 Bad Request | Invalid request. See response body for details. |\n| 401 Unauthorized | Unauthorized request. See response body for details. |\n| 403 Forbidden | Permission denied. See response body for details. |\n| 404 Not Found | Member not found. |\n| 500 Internal Server Error | Unknown error. See response body for details. |\n\n#### Update a member property\n\n`PATCH /members/{memberId}`\n\nUpdates properties on the member entity. None of its child collections can be updated with this route.\n\n**Path Parameters**\n\n| Parameter | Type | Description |\n|---|---|---|\n| memberId | string (UUID) | |\n\n**Request Example**\n\n```json\n{\n  \"bwId\": \"number (int32)\",\n  \"firstName\": \"string\",\n  \"middleName\": \"string\",\n  \"lastName\": \"string\",\n  \"number\": \"string\",\n  \"officeId\": \"string (UUID)\",\n  \"bwOfficeId\": \"number (int32)\",\n  \"inactiveDate\": \"string (date)\",\n  \"legalName\": \"string\",\n  \"primaryEmailAddress\": \"string\",\n  \"addressLine1\": \"string\",\n  \"addressLine2\": \"string\",\n  \"addressCity\": \"string\",\n  \"addressPostalCode\": \"string\",\n  \"addressProvinceCode\": \"string\",\n  \"addressCountryCode\": \"string\",\n  \"birthDate\": \"string (date)\",\n  \"typeId\": \"string\",\n  \"lwaId\": \"string (UUID)\",\n  \"memberTypeCode\": {\n    \"createdTimestamp\": \"string (date-time)\",\n    \"modifiedTimestamp\": \"string (date-time)\",\n    \"id\": \"string (UUID)\",\n    \"code\": \"string\",\n    \"name\": \"string\"\n  }\n}\n```\n\n| Response | Description |\n|---|---|\n| 200 OK | Member updated. |\n| 400 Bad Request | Invalid request. See response body for details. |\n| 401 Unauthorized | Unauthorized request. See response body for details. |\n| 403 Forbidden | Permission denied. See response body for details. |\n| 404 Not Found | Member not found. |\n| 412 Precondition Failed | Optimistic concurrency check failed. The If-Match header is missing or it does not contain the version currently in the database. |\n| 500 Internal Server Error | Unknown error. See response body for details. |\n\n### Offices\n\n#### Add new office\n\n`POST /offices`\n\nIf the 'id' is passed in this object, the API will attempt to use that for its office id. If 'id' is null or undefined, the API will generate one.\n\n**Request Example**\n\n```json\n{\n  \"id\": \"string (UUID)\",\n  \"bwId\": \"number (int32)\",\n  \"name\": \"string\",\n  \"shortName\": \"string\",\n  \"inactiveDate\": \"string (date)\"\n}\n```\n\n| Response | Description |\n|---|---|\n| 201 Created | Office created |\n| 400 Bad Request | Invalid request. See response body for details. |\n| 401 Unauthorized | Unauthorized request. See response body for details. |\n| 403 Forbidden | Permission denied. See response body for details. |\n| 409 Conflict | Office already exists. |\n| 500 Internal Server Error | Unknown error. See response body for details. |\n\n**Response Example (201 Created)**\n\n```json\n{\n  \"createdTimestamp\": \"string (date-time)\",\n  \"modifiedTimestamp\": \"string (date-time)\",\n  \"id\": \"string (UUID)\",\n  \"version\": \"number (int32)\",\n  \"bwId\": \"number (int32)\",\n  \"name\": \"string\",\n  \"shortName\": \"string\",\n  \"inactiveDate\": \"string (date)\"\n}\n```\n\n#### Get list of offices\n\n`GET /offices`\n\n| Response | Description |\n|---|---|\n| 200 OK | Success |\n| 400 Bad Request | Invalid request. See response body for details. |\n| 401 Unauthorized | Unauthorized request. See response body for details. |\n| 403 Forbidden | Permission denied. See response body for details. |\n| 500 Internal Server Error | Unknown error. See response body for details. |\n\n**Response Example (200 OK)**\n\n```json\n[\n  {\n    \"createdTimestamp\": \"string (date-time)\",\n    \"modifiedTimestamp\": \"string (date-time)\",\n    \"version\": \"number (int32)\",\n    \"id\": \"string (UUID)\",\n    \"bwId\": \"number (int32)\",\n    \"name\": \"string\",\n    \"shortName\": \"string\",\n    \"inactiveDate\": \"string (date)\"\n  }\n]\n```\n\n#### Delete a specific office\n\n`DELETE /offices/{officeId}`\n\n**Path Parameters**\n\n| Parameter | Type | Description |\n|---|---|---|\n| officeId | string (UUID) | |\n\n| Response | Description |\n|---|---|\n| 200 OK | Office deleted. |\n| 400 Bad Request | Invalid request. See response body for details. |\n| 401 Unauthorized | Unauthorized request. See response body for details. |\n| 403 Forbidden | Permission denied. See response body for details. |\n| 404 Not Found | Office not found. |\n| 500 Internal Server Error | Unknown error. See response body for details. |\n\n#### Get a specific office\n\n`GET /offices/{officeId}`\n\n**Path Parameters**\n\n| Parameter | Type | Description |\n|---|---|---|\n| officeId | string (UUID) | |\n\n**Query Parameters**\n\n| Parameter | Type | Description |\n|---|---|---|\n| isBwId | boolean | Indicates whether the passed 'officeId' should be treated as the brokerWOLF id |\n\n| Response | Description |\n|---|---|\n| 200 OK | Office found. |\n| 400 Bad Request | Invalid request. See response body for details. |\n| 401 Unauthorized | Unauthorized request. See response body for details. |\n| 403 Forbidden | Permission denied. See response body for details. |\n| 404 Not Found | Office not found. |\n| 500 Internal Server Error | Unknown error. See response body for details. |\n\n#### Update an office property\n\n`PATCH /offices/{officeId}`\n\n**Path Parameters**\n\n| Parameter | Type | Description |\n|---|---|---|\n| officeId | string (UUID) | |\n\n| Response | Description |\n|---|---|\n| 200 OK | Office updated. |\n| 400 Bad Request | Invalid request. See response body for details. |\n| 401 Unauthorized | Unauthorized request. See response body for details. |\n| 403 Forbidden | Permission denied. See response body for details. |\n| 404 Not Found | Office not found. |\n| 412 Precondition Failed | Optimistic concurrency check failed. The If-Match header is missing or it does not contain the version currently in the database. |\n| 500 Internal Server Error | Unknown error. See response body for details. |\n\n#### Get list of office summaries\n\n`GET /offices/summary`\n\n| Response | Description |\n|---|---|\n| 200 OK | Success |\n| 400 Bad Request | Invalid request. See response body for details. |\n| 401 Unauthorized | Unauthorized request. See response body for details. |\n| 403 Forbidden | Permission denied. See response body for details. |\n| 500 Internal Server Error | Unknown error. See response body for details. |\n\n**Response Example (200 OK)**\n\n```json\n[\n  {\n    \"id\": \"string (UUID)\",\n    \"name\": \"string\",\n    \"shortName\": \"string\",\n    \"inactiveDate\": \"string (date)\"\n  }\n]\n```\n\n### Brokerages\n\n#### Add new brokerage\n\n`POST /brokerages`\n\nIf the 'id' is passed in this object, the API will attempt to use that for its brokerage id. If 'id' is null or undefined, the API will generate one. An internal token is needed to access this endpoint.\n\n**Request Example**\n\n```json\n{\n  \"createdTimestamp\": \"string (date-time)\",\n  \"modifiedTimestamp\": \"string (date-time)\",\n  \"name\": \"string\",\n  \"shortName\": \"string\",\n  \"id\": \"string\",\n  \"companyTypeCode\": \"string\",\n  \"addressPostalCode\": \"string\",\n  \"addressCountryCode\": \"string\"\n}\n```\n\n| Response | Description |\n|---|---|\n| 201 Created | Brokerage created |\n| 400 Bad Request | Invalid request. See response body for details. |\n| 401 Unauthorized | Unauthorized request. See response body for details. |\n| 403 Forbidden | Permission denied. See response body for details. |\n| 409 Conflict | Brokerage already exists. |\n| 500 Internal Server Error | Unknown error. See response body for details. |\n\n**Response Example (201 Created)**\n\n```json\n{\n  \"createdTimestamp\": \"string (date-time)\",\n  \"modifiedTimestamp\": \"string (date-time)\",\n  \"name\": \"string\",\n  \"shortName\": \"string\",\n  \"id\": \"string\",\n  \"companyTypeCode\": \"string\",\n  \"addressPostalCode\": \"string\",\n  \"addressCountryCode\": \"string\"\n}\n```\n\n#### Retrieve all brokerages\n\n`GET /brokerages`\n\nThis endpoint is internal only and requires an internal token. The response will be all brokerages in the database.\n\n**Query Parameters**\n\n| Parameter | Type | Description |\n|---|---|---|\n| filter | string | Filter that will be used to query the database. |\n\n| Response | Description |\n|---|---|\n| 200 OK | Success |\n| 400 Bad Request | Invalid request. See response body for details. |\n| 401 Unauthorized | Unauthorized request. See response body for details. |\n| 500 Internal Server Error | Unknown error. See response body for details. |\n\n#### Delete a specific brokerage\n\n`DELETE /brokerages/{clientId}`\n\n**Path Parameters**\n\n| Parameter | Type | Description |\n|---|---|---|\n| clientId | string (UUID) | |\n\n| Response | Description |\n|---|---|\n| 200 OK | Brokerage deleted. |\n| 400 Bad Request | Invalid request. See response body for details. |\n| 401 Unauthorized | Unauthorized request. See response body for details. |\n| 403 Forbidden | Permission denied. See response body for details. |\n| 404 Not Found | Brokerage not found. |\n| 500 Internal Server Error | Unknown error. See response body for details. |\n\n#### Get a specific brokerage\n\n`GET /brokerages/{clientId}`\n\n**Path Parameters**\n\n| Parameter | Type | Description |\n|---|---|---|\n| clientId | string | |\n\n| Response | Description |\n|---|---|\n| 200 OK | Brokerage found. |\n| 400 Bad Request | Invalid request. See response body for details. |\n| 401 Unauthorized | Unauthorized request. See response body for details. |\n| 403 Forbidden | Permission denied. See response body for details. |\n| 404 Not Found | Brokerage not found. |\n| 500 Internal Server Error | Unknown error. See response body for details. |\n\n### Member Types\n\n#### Get a specific Member Type\n\n`GET /member-types`\n\n**Path Parameters**\n\n| Parameter | Type | Description |\n|---|---|---|\n| id | string (UUID) | |\n\n| Response | Description |\n|---|---|\n| 200 OK | Member Type found. |\n| 400 Bad Request | Invalid request. See response body for details. |\n| 401 Unauthorized | Unauthorized request. See response body for details. |\n| 403 Forbidden | Permission denied. See response body for details. |\n| 404 Not Found | Brokerage not found. |\n| 500 Internal Server Error | Unknown error. See response body for details. |\n\n**Response Example (200 OK)**\n\n```json\n{\n  \"id\": \"string (UUID)\",\n  \"createdTimestamp\": \"string (date-time)\",\n  \"modifiedTimestamp\": \"string (date-time)\",\n  \"version\": \"number (int32)\",\n  \"code\": \"string\",\n  \"name\": \"string\"\n}\n```\n\n#### Retrieve all Member Types\n\n`GET /member-types`\n\nThis endpoint is internal only and requires an internal token. The response will be all brokerages in the database.\n\n**Query Parameters**\n\n| Parameter | Type | Description |\n|---|---|---|\n| filter | string | Filter that will be used to query the database. |\n\n| Response | Description |\n|---|---|\n| 200 OK | Success |\n| 400 Bad Request | Invalid request. See response body for details. |\n| 401 Unauthorized | Unauthorized request. See response body for details. |\n| 500 Internal Server Error | Unknown error. See response body for details. |\n\n### Schema Definitions\n\n#### HttpStatus400\n\nInvalid request. See response body for details.\n\n```json\n{\n  \"code\": \"integer (int32)\",\n  \"message\": \"string\",\n  \"details\": [\"string\"]\n}\n```\n\n#### HttpStatus401\n\nUnauthorized request. See response body for details.\n\n```json\n{\n  \"code\": \"integer (int32)\",\n  \"message\": \"string\",\n  \"details\": [\"string\"]\n}\n```\n\n#### HttpStatus403\n\nPermission denied. See response body for details.\n\n```json\n{\n  \"code\": \"integer (int32)\",\n  \"message\": \"string\",\n  \"details\": [\"string\"]\n}\n```\n\n#### HttpStatus412\n\nOptimistic concurrency check failed. The If-Match header is missing or it does not contain the version currently in the database.\n\n```json\n{\n  \"code\": \"integer (int32)\",\n  \"message\": \"string\",\n  \"details\": [\"string\"]\n}\n```\n\n#### HttpStatus500\n\nUnknown error. See response body for details.\n\n```json\n{\n  \"code\": \"integer (int32)\",\n  \"message\": \"string\",\n  \"details\": [\"string\"]\n}\n```\n\n#### ApiError\n\n| Field | Type | Description |\n|---|---|---|\n| code | integer (int32) | An error code. This is typically the same as the http status code but can be different in some cases. |\n| message | string | Simple message about the error. |\n| details | string[] | An array of strings holding more details about the error. |\n\n```json\n{\n  \"code\": \"integer (int32)\",\n  \"message\": \"string\",\n  \"details\": [\"string\"]\n}\n```\n\n#### Member\n\n| Field | Type | Description |\n|---|---|---|\n| createdTimestamp | string (date-time) | |\n| modifiedTimestamp | string (date-time) | |\n| id | string (UUID) | |\n| bwId | number (int32) | The brokerWOLF Id of the member. This should not be used by third party systems as this value could go away in the future. |\n| version | number (int32) | The version of the member in the database. Used for optimistic concurrency checking. |\n| firstName | string | |\n| middleName | string | |\n| lastName | string | |\n| number | string | The brokerage specified number. |\n| officeId | string (UUID) | |\n| bwOfficeId | number (int32) | The brokerWOLF Id of the office. This should not be used by third party systems as this value could go away in the future. |\n| inactiveDate | string (date) | The date the member went inactive. If this is null, the member is active. |\n| legalName | string | The legal name of member. |\n| primaryEmailAddress | string | The primary email address of a member. |\n| addressLine1 | string | The address of a member. |\n| addressLine2 | string | The second address of a member. |\n| addressCity | string | The city of a member. |\n| addressPostalCode | string | The postal code of a member. |\n| addressProvinceCode | string | The province code of a member. |\n| addressCountryCode | string | The country code of a member. |\n| birthDate | string | The birth date of a member. |\n| typeId | string | The type id of a member. |\n| lwaId | string | The lwaId of a member. |\n| memberTypeCode | string | The member type of a member. |\n\n#### Office\n\n| Field | Type | Description |\n|---|---|---|\n| createdTimestamp | string (date-time) | |\n| modifiedTimestamp | string (date-time) | |\n| id | string (UUID) | |\n| version | number (int32) | The version of the office in the database. Used for optimistic concurrency checking. |\n| bwId | number (int32) | The brokerWOLF Id of the office. This should not be used by third party systems as this value could go away in the future. |\n| name | string | Main name of the office. |\n| shortName | string | Short name for the office. |\n| inactiveDate | string (date) | The date the office went inactive. If this is null, the office is active. |\n\n#### Brokerage\n\n| Field | Type | Description |\n|---|---|---|\n| createdTimestamp | string (date-time) | |\n| modifiedTimestamp | string (date-time) | |\n| version | number (int32) | The version of the brokerage in the database. Used for optimistic concurrency checking. |\n| name | string | Main name of the brokerage. |\n| shortName | string | Short name for the brokerage. |\n| id | string | |\n| companyTypeCode | string | Company Type Code for the brokerage. |\n| addressPostalCode | string | Address Postal Code for the brokerage. |\n| addressCountryCode | string | Country Code for the brokerage. |\n\n#### Member Type\n\n| Field | Type | Description |\n|---|---|---|\n| createdTimestamp | string (date-time) | |\n| modifiedTimestamp | string (date-time) | |\n| id | string | |\n| version | number (int32) | The version of the brokerage in the database. Used for optimistic concurrency checking. |\n| code | string | Member type code. |\n| name | string | Name of the member type. |\n\n#### Office Summary\n\n| Field | Type | Description |\n|---|---|---|\n| id | string (UUID) | |\n| name | string | Main name of the office. |\n| shortName | string | Short name for the office. |\n| inactiveDate | string (date) | The date the office went inactive. If this is null, the office is active. |\n\n","version":"1.0.0","properties":[{"type":"OpenAPI","url":"https://apidocs.lwolf.com/doc/deals-api.json"},{"type":"x-access-level","data":"public"},{"type":"x-definition-type","data":"REST"}]},{"id":"0a0c8e40-cb43-4f36-8021-63e8e6ead277","name":"Back Office Online API","slug":"back-office-online-api","url":"https://apidocs.lwolf.com/doc/back-office-online-api","humanUrl":"https://apidocs.lwolf.com/doc/back-office-online-api","created":"2025-08-25","modified":"2026-07-10","version":"1.0","properties":[{"type":"OpenAPI","url":"https://apidocs.lwolf.com/doc/back-office-online-api.yaml"},{"type":"x-access-level","data":"public"},{"type":"x-definition-type","data":"REST"}]},{"id":"0b67931f-5ba5-4fe1-a16b-6336fec038d6","name":"WolfConnect API","slug":"wolfconnect-api","url":"https://apidocs.lwolf.com/doc/wolfconnect-api","humanUrl":"https://apidocs.lwolf.com/doc/wolfconnect-api","created":"2026-07-10","modified":"2026-07-14","description":"The Lone Wolf WolfConnect API is a collection of RESTful web resources allowing third parties access to data.\n\n## Index\n\n1. [Authentication](#authentication)\n2. [Creating a Request](#creating-a-request)\n3. [Creating the Signature for the Authorization Header](#creating-the-signature-for-the-authorization-header)\n4. [Handling a Response](#handling-a-response)\n5. [Handling Time Zones](#handling-time-zones)\n6. [Supported Data Formats](#supported-data-formats)\n7. [Compression](#compression)\n8. [OData Support](#odata-support)\n9. [Creating and Updating Data](#creating-and-updating-data)\n10. [Concurrency Checking](#concurrency-checking)\n11. [Permissions](#permissions)\n12. [Error Codes](#error-codes)\n\n**APIs in this documentation:** Members, Transactions, Classifications, Conditions, Contact Types, Property Types, Sources of Business.\n\nThe Lone Wolf API is a language independent resource and will work with such languages as Java, JavaScript, PHP and .NET.\n\nThe base URL for all calls to the production version of the API is `https://api.globalwolfweb.com`. The base URL for all calls to the test version of the API is `https://api-sb.globalwolfweb.com`.\n\n## Authentication\n\nAuthentication begins with a consumer key, secret key, and an API token key, which will be provided by Lone Wolf Technologies.\n\nThe secret key is a string of characters used to seed or salt the signature of all requests made to the API. The secret key should be guarded in the same way you would guard your bank account password.\n\n## Creating a Request\n\nTo properly authenticate an API request, there are 2 headers that must be added: `Authorization` and `Content-MD5`.\n\n### Authorization Header\n\nThe Authorization header will be of the form:\n\n```\nAuthorization: [Scheme] [Authorization String]\n```\n\nThe scheme portion of the Authorization header tells the API how it should authenticate the request by telling the API how to interpret the authorization string portion of the header. The authorization string is a series of strings separated by a colon.\n\n```\nAuthorization: LoneWolfKey [Consumer Key]:[Signature]:[Date]\n```\n\n| Part | Description |\n|---|---|\n| Consumer Key | Your consumer key provided to you by Lone Wolf. |\n| Signature | The signature for the request (detailed below). |\n| Date | A string representing the **UTC** date and time of the request in the format specified below. |\n\nThe `LoneWolfKey` authorization scheme will be used when calling resources that deal with your API account.\n\n```\nAuthorization: LoneWolfToken [API Token]:[Client Code]:[Signature]:[Date]\n```\n\n| Part | Description |\n|---|---|\n| API Token | The API token is provided by Lone Wolf. |\n| Client Code | The code given to the office or office family that the request will pertain to. |\n| Signature | The signature for the request (detailed below). |\n| Date | A string representing the **UTC** date and time of the request in the format specified below. |\n\nThe `LoneWolfToken` authorization scheme will be used when calling resources that access your actual data.\n\nThere is never a scenario where you would send more than one type of authorization scheme.\n\n### Authorization Header Date and Time Format\n\nThe date and time format for any date specified in the Authorization header is:\n\n```\n[4 digit year]-[2 digit month starting at 01 for January]-[2 digit day of the month starting at 01]-[2 digit hour in 24 hour format from 00-23]-[2 digit minute from 00-59]-[2 digit second from 00-59]-[3 digit millisecond from 000-999][Single letter time zone for UTC]\n```\n\nThe actual string should all be on one line with a dash separating each part of the date/time. The Z at the end of the string represents the UTC time zone.\n\nTo format the date in .NET, use the string `yyyy-MM-dd-HH-mm-ss-fffK`.\n\nTo format the date in Java, use the string `yyyy-MM-dd-HH-mm-ss-SSSX`.\n\nTIP: If the language you are working with does not support milliseconds, use 000 every time.\n\nFor example, the date *January 1st, 2014 at 3:45:33.554 PM EST* would be represented as:\n\n```\n2014-01-01-20-45-33-554Z\n```\n\nNotice that the hour portion of the string has been changed from Eastern to Greenwich Mean Time.\n\n### Content-MD5 Header\n\nThe Content-MD5 header holds the base 64 encoded MD5 hash of the body of the request as described by the HTTP specification for normal PUT and POST requests.\n\nHowever not all requests will have a body: for instance, GET or DELETE requests. When this is the case the Content-MD5 header should only contain the base 64 encoded MD5 hash of an empty string:\n\n```\nContent-MD5: 1B2M2Y8AsgTpgAmY7PhCfg==\n```\n\nAnother circumstance in which the value for the Content-MD5 header is different is when a multipart request is made. Multipart requests will be used when streaming files to the API. The base 64 encoded MD5 hash of an empty string should be used for multipart requests as well.\n\nTo ensure generation of the correct value for the Content-MD5 header it is good practice setting the body of the request then passing the body of the request into a function that will perform the hash. This will ensure that what you put in the request is the exact same thing you are using to create the hash.\n\n```csharp\nprivate string CreateContentMD5Header(string bodyContent)\n{\n    byte[] md5 = MD5.Create().ComputeHash(Encoding.UTF8.GetBytes(bodyContent));\n    return Convert.ToBase64String(md5);\n}\n```\n\nA common mistake when generating the Content-MD5 header is base 64 encoding a string representation of the MD5 hash. You must keep the MD5 hash as a byte array and then base 64 encode that byte array.\n\n## Creating the Signature for the Authorization Header\n\nThe signature portion of the Authorization header is the HMACSHA256 hash of the following string:\n\n```\n[HTTP Method]:[Resource URI]:[Date]:[Content-MD5]\n```\n\n| Part | Description |\n|---|---|\n| HTTP Method | The HTTP method. GET, PUT, POST, DELETE. |\n| Resource URI | The non URL encoded resource URI without the host name. **This must start with a slash and does not include the `https://api.globalwolfweb.com` portion.** |\n| Date | A string representing the **UTC** date and time of the request in the format specified above. This should be the same string that is used in the Authorization header. |\n| Content-MD5 | The value in the Content-MD5 header. |\n\nFor example, to get the data for a transaction with id `WVnG90WFTSK2g9d_L7yd6g==` on *January 1st, 2014 at 3:45:33.554 PM EST*, the signature string to hash would be:\n\n```\nGET:/wolfconnect/transactions/v1/WVnG90WFTSK2g9d_L7yd6g==:2014-01-01-20-45-33-554Z:1B2M2Y8AsgTpgAmY7PhCfg==\n```\n\nNotice that the time string has been changed from EST to UTC. The Content-MD5 portion of the string to hash is the base 64 encoded MD5 hash of an empty string since this is a GET request.\n\nYou need to first create this string for the requested resource and then use your secret key to seed the HMACSHA256 hash function. The value that comes back would then be used as the signature for the Authorization header.\n\n```csharp\nstring stringToHash = \"GET:/wolfconnect/transactions/v1/WVnG90WFTSK2g9d_L7yd6g==:2014-01-01-20-45-33-554Z:1B2M2Y8AsgTpgAmY7PhCfg==\";\nvar hasher = new HMACSHA256(Encoding.UTF8.GetBytes([Your Secret Key]));\nbyte[] bytes = hasher.ComputeHash(Encoding.UTF8.GetBytes(stringToHash));\nStringBuilder signature = new StringBuilder();\nforeach(byte b in bytes)\n{\n    signature.AppendFormat(\"{0:x2}\", b);\n}\n// The signature variable now contains the value to use in the Authorization header.\n```\n\n### URL Encoding\n\nIf you URL encode the above resource URI, you would get:\n\n```\n/wolfconnect/transactions/v1/WVnG90WFTSK2g9d%5fL7yd6g%3d%3d\n```\n\nThis is perfectly valid when making the request to the API. However, when constructing the string to hash for the signature, the Resource URI must **not** be URL encoded.\n\n### Using a different Hash Algorithm\n\nThe default hash algorithm is HMACSHA256. However, the API also supports the use of HMACSHA384 and HMACSHA512 if you wish to increase security. To tell the API that you wish to use a different hash algorithm simply append it to the authorization scheme portion of the Authorization header separated by a dash.\n\n```\nAuthorization: LoneWolfToken-HMACSHA512 [Authorization string]\n```\n\n### Hash Examples\n\nThe following tables list HMAC SHA hashes for the specified strings. The table is there for your convenience to make sure you have your hashing algorithm code correctly setup. All hashes were created with the seed (or secret key in the context of the API) `LoneWolf`.\n\nHash of the string `Lone Wolf Real Estate Technologies`:\n\n| Algorithm | Hash |\n|---|---|\n| HMACSHA256 | cc62f4a577cd76277a97018bf7b476fc911823fac1cdc4ea3f672e8d4b84bac2 |\n| HMACSHA384 | 95d1805b87daf9f6259cec06a20c8051dd5894a160e7af2d1a371569a6fa5fcb7a0be67e825486e27d42d6b2e71829c1 |\n| HMACSHA512 | 814e10262e8bf47dcd103dabca0e44736e902beb15b1a10c561fcb3818d9d6b7c2eeb076b1c4d9a4f9d90909e406028066683a92ca2a6deec186aec456993342 |\n\nHash of the string `The Complete Enterprise Solution`:\n\n| Algorithm | Hash |\n|---|---|\n| HMACSHA256 | 358cde6aeb0cfb0750665e9b54efbaca1665621a0d7c71a2184fcf6e5c022c8f |\n| HMACSHA384 | 2936f83a7c1aff99fea0deefec6039c483834d74c7f3adf0e6e2854319b14592c588c7266dc2f4df5d8854a272ee59ba |\n| HMACSHA512 | 0d1c669ddd64f5bb1bc1d8377f8297f0f8a32416e69f4943a7883ad6dc9582229ebbde6eac037dedce85e408ec8b006c58f57ebde7e71182bf7318da19e910d8 |\n\n## Handling a Response\n\nLone Wolf API responses use the standard HTTP status codes to tell you how you should handle the content of the response. In general, there are 2 types of responses. Success and Error responses. Success responses will use the HTTP status codes OK (200) and Created (201). All other status codes indicate an error.\n\nTypically when a success message is received the response content will contain an object that relates to the accessed resource. When an error response is received it will contain a ClientError object. This object will contain its own Code value that will represent the problem that caused the error response. This means that you can use the standard HTTP response code to handle the error or ignore it all together and use the Lone Wolf Code to handle the error.\n\n## Handling Time Zones\n\nTime zones must be handled correctly as the API can return and accept dates with times. To make it easy all dates with times returned from the API will be sent back in UTC time. As a corollary, all dates and times sent to the API must include the time zone offset. If the time zone is not specified, UTC time is assumed.\n\nThe individual resource documentation will specify the type of date the property is. You do not have to perform the UTC conversion if it is just a date; the time portion of the Date property will be ignored if specified.\n\n## Supported Data Formats\n\nThe API supports JSON and XML data formats. Each individual API section has the definitions for the objects that it supports. These object definitions can be used to create classes in any language that can then be serialized to JSON or XML and passed to the API. The response from the API can then be deserialized into these same objects.\n\n### Date and Timestamp Properties\n\nDate and Timestamp properties have slight differences in how the API is expecting them. Dates are in the following format (all on one line) for both JSON and XML formats:\n\n```\n[4 digit year]-[2 digit month starting at 01]-[2 digit day of the month starting at 01]\n```\n\n.NET format string: `yyyy-MM-dd` — Java format string: `yyyy-MM-dd`\n\nIf you pass the time to the API during an update for a Date property it will be ignored when saving it to the database.\n\nA Timestamp value should be in ISO 8601 or Round-trip format (all on one line):\n\n```\n[4 digit year]-[2 digit month starting at 01]-[2 digit day of the month starting at 01]T[2 digit hour between 00-23]:[2 digit minute between 00-59]:[2 digit second between 00-59].[7 digit sub-second between 0000000-9999999]%2B00:00\n```\n\n.NET format string: `yyyy-MM-dd'T'HH:mm:ss.fffffffK` — Java format string: `yyyy-MM-dd'T'HH:mm:ss.SSSXXX`\n\nNOTE: The Java SimpleDateFormat class does not handle more than 3 sub-seconds. As of Java 7, you can use `javax.xml.bind.DatatypeConverter.parseDateTime(timestampString)` to get a Calendar object back. You do not need to specify the format in the `DatatypeConverter.parseDateTime()` function. If using Java 6 or earlier, you will have to write your own parser to handle the timestamp returned from the API. The above format should be used when sending a timestamp value to the API in any Java version.\n\nTimestamp values will always be in UTC time when retrieved from the API and must always specify the time zone when updating a time. If no time zone is specified, the API will assume UTC time.\n\n## Compression\n\nThe API supports gzip and deflate compression of the request and response. If you plan to send compressed requests to the API, make sure that the Content-Encoding request header is included and holds the type of compression used. If you want compressed responses, include the Accept-Encoding request header for the type of compression you support.\n\nNOTE: Compressed Multi-part requests are not supported at this time.\n\n## OData Support\n\nThe API supports OData style filtering for resources using the HTTP GET method. OData is a standard query string language used for filtering resources on REST APIs. Much more detailed information can be found at [www.odata.org](http://www.odata.org). The API currently supports the OData 4.0 specification for URL conventions but does not support the full range of query parameters.\n\n### Supported OData Parameters\n\nIf any parameter is not supported for a particular resource it will be noted in that resource's documentation. Otherwise it is safe to assume that all of these parameters are supported for all resources using the GET HTTP method.\n\n| Parameter | Description |\n|---|---|\n| $filter | Filters data on properties related to the resource. NOTE: Only Logical, Arithmetic and Grouping operators are currently supported. No Canonical functions are currently supported (contains, endswith, startswith, etc.). |\n| $orderby | Orders the objects returned in the response by a property related to the resource. |\n| $top | Returns the specified top number of records for the given query. $orderby must be specified for $top to be used. |\n| $skip | Skips the specified number of records before returning the results. $orderby must be specified for $top to be used. |\n| $search | Allows for free form text to be searched. Each API will note which fields are included in the free form search when this parameter is available. |\n| $expand | Instructs the API to include a child object or collection in the response. Please see the section below for more details on how to use this parameter. |\n\nThe maximum number of objects returned from any resource is 1,000. If the $top parameter is not passed in the query string, $top=1000 is assumed. If a value greater than 1,000 is specified an error will be thrown. If the response holds 1,000 objects, you must implement paging (described below) to make sure you retrieve all the records.\n\nOnly the $expand OData query parameter is supported for resources that return one specific object rather than allow you to filter many objects; all other OData query parameters will be ignored.\n\n### Usage of the $expand Query Parameter\n\nThe $expand parameter is used a little differently than the OData specification: if the $expand parameter is omitted from the query string then ALL child objects and collections will be returned. In the case of a Transaction object this would mean that the Tiers, ClientContacts, BusinessContacts, Classification, etc. child objects and collections will also be returned (provided you have permission to see those objects). If you want to return only the Transaction object pass in `$expand=` in the query string (the $expand parameter but with no values specified).\n\nThe reason for this difference is to maintain backward and forward compatibility. Before OData support, calls to the Transactions Resource had no way to tell the API to return only specific objects of a Transaction so the entire object including any child objects would be returned. Returning the full object maintains forward compatibility so if a new child object or collection is added to the Transaction object then not passing the $expand parameter will include the new child object or collection automatically. If you wish to only return the Transaction object and are already passing in `$expand=` in the query string then the new object or collection will still not be returned to you.\n\n### Implementing Paging\n\nThe $top and $skip query parameters can be used to implement paging for a given resource. However, each call to the API performs a new query so there is a chance that new records could be inserted or values updated between each API call.\n\n### Examples\n\nThe following URL returns transactions created on or after April 1st, 2014 (the full transaction object is returned because the $expand parameter is omitted):\n\n```\n/wolfconnect/transactions/v1?$filter=CreatedTimestamp ge datetimeoffset'2014-04-01T00:00:00Z'\n```\n\nThe following URL returns the top 10 transactions with the highest sell price (only the Transaction objects are returned because the $expand parameter is specified but empty):\n\n```\n/wolfconnect/transactions/v1?$top=10\u0026$orderby=SellPrice desc\u0026$expand=\n```\n\nThe following URL returns the transaction with id `98agdji99jasdof908==`. The Transaction object returned will include the ClientContacts and BusinessContacts. Classification, PropertyType, Tiers, etc. will all be null:\n\n```\n/wolfconnect/transactions/v1/98agdji99jasdof908==?$expand=ClientContacts,BusinessContacts\n```\n\n## Creating and Updating Data\n\nCreating and updating data with the API is pretty straight forward. If you set a property to a value the corresponding property in the database will be set to that value.\n\nHowever NULL-valued properties are handled differently. When creating a new record with a NULL-valued property its default value will be saved in the database. The default value will be returned to you in the response. When updating an existing record its current value will NOT be updated in the database and the original value will be returned to you in the response.\n\nThe other way to use the default value when creating data is to not send the property in the request at all. This also works when attempting to not update the current value when updating. We allow the use of NULL for this scenario to ease creating classes that can be serialized to a request.\n\nThere is one caveat to this rule: if a NULL value is an acceptable value for a given property then the NULL value will be saved in the database. Get the API to use the default value when creating data by not sending that property in the request at all. This also works when attempting to not update the existing value when updating. This will occur most often with Date, DateTime and Numeric data but it is possible for String data as well.\n\nAn example of this would be the Member.InactiveDate property: having a NULL value for the InactiveDate is valid and indicates that the member is still active. If you were using the Members Resource to update data for a member that is **inactive**, you have two options: send the value currently stored for InactiveDate (effectively updating it to the same value) or do not include the InactiveDate property in the request at all.\n\nThese types of properties are noted in the object definitions by the word (Nullable) in the property description. If you see a property described as (Nullable) then you know you must handle the property in this special way.\n\n### Collection Properties (Lists and Arrays)\n\nCollection properties will typically hold \"child\" records of a given parent object. If the property that holds a collection is null the current values for that collection are not changed. If the property is not sent in the request at all the current values are not updated. Send an empty collection to delete the collection for the given property. If the current state of the database had 3 items for a given collection but you only wanted to keep 1 of them, then you would send a collection containing only the one you wanted to keep; the other 2 items would be deleted.\n\nFor example, if you were updating a transaction but did not want to update the conditions associated to that transaction, simply set the Transaction.Conditions property to NULL or do not send that property in the request. If you wanted to delete all of the conditions from a transaction, you would set the Transaction.Conditions property to an empty collection. If the transaction had 3 conditions currently associated to it but you only wanted to keep the second one then you would set the Transaction.Conditions property to a collection containing only the second condition; conditions 1 and 3 would then be deleted.\n\n### Object Properties\n\nObject properties will typically hold an associated \"child\" object. They will have 2 properties associated to them. One for the Id of the object and the other for the object itself. When creating or updating an Object property you only need to send the Id property. The object property will be returned to you in the response.\n\nFor example: ClientContact objects. The ClientContact object has 2 properties for source of business. The ClientContact.SourceOfBusinessId property is of type string and holds the Lone Wolf Id for the source of business. The ClientContact.SourceOfBusiness property is of type SourceOfBusiness and holds the source of business object.\n\nWhen creating or updating a ClientContact object you only need to pass the SourceOfBusinessId value to the API. Whatever value is in ClientContact.SourceOfBusiness is ignored. However ClientContact.SourceOfBusiness will be available in the response and will reflect the source of business record for the sent SourceOfBusinessId. Set the SourceOfBusinessId value to NULL to leave the current source of business for a given ClientContact object. Send an empty string for SourceOfBusinessId to remove the source of business record from the ClientContact object.\n\n### String Properties\n\nString properties are no different than any other property in how they behave but since NULL is such a common value for a string property they deserve their own section. Set the string property to NULL or do not pass the string property in the request to use the default value when creating or keep the current value when updating. You must send an empty string for the property if you wish to clear the corresponding value in the database.\n\nFor example, if you were updating data for a given member and did not want to change the current value for the middle name, send NULL for Member.MiddleName or leave it out of the request all together. If the current value was \"Anne\" and you wanted to clear it then you would set Member.MiddleName to an empty string.\n\n## Concurrency Checking\n\nThe API supports concurrency checking. It is strongly recommended that you implement concurrency checking whenever updating data through the API as it will eliminate the possibility of overwriting someone else's changes. Let's take the following scenario:\n\n- A transaction is retrieved using the API and stored in a third party database. The close date for this transaction is 01/01/2015 and the price is $100,000.\n- A user opens up that same transaction on the EDS page in WOLFconnect and changes the price to $110,000.\n- The same transaction is then updated using the API. The API call changes the close date to 01/05/2015 but in doing so sends the price that it knows about which is $100,000. The user's change in WOLFconnect has just been overwritten.\n\nThere are 2 ways to avoid this scenario. The first is to only send the data that you want updated in the request. If you just want the close date updated, only set the Transaction.CloseDate property and leave the other properties as null or exclude them from the request all together.\n\nThe second way is to use the RowVersion property on the Transaction object. Any object that supports concurrency checking will have a RowVersion property associated to it. The RowVersion property holds the version of a particular record in the database. In the same scenario above, if the RowVersion was passed in the update in Step 3, it would not match the row version currently stored in the database. The API call would then fail with a Conflict HTTP Status.\n\nNOTE: If the RowVersion property is passed to the API as NULL, no concurrency check will take place and the data passed in the API call will be updated in the database.\n\nConcurrency checking may not need to be used in every scenario but there is no downside to implementing it. If there is even the slightest chance that data could be overwritten, it is strongly recommended that you implement concurrency checking.\n\n## Permissions\n\nLone Wolf has the ability to set read and edit permissions on a property-by-property basis for any object. Attempting to create or delete an object for which you do not have permission will return an error. Attempting to update a value for which you do not have permission will return an error. Retrieving an object without read permission for a given property will be NULL in the response.\n\nCollection properties will contain an empty collection if you do have read permission but no objects exist. For example, if you do not have read permission for the Transaction.Conditions property it will always be passed back in the response as NULL.\n\nIf you have read permission for object properties but no object exists then the Id property will be an empty string and the object property will be NULL. For example, if you do not have read permission for the ClientContact.SourceOfBusiness property the ClientContact.SourceOfBusinessId and ClientContact.SourceOfBusiness properties will both be null in the response. If you have read permission but the source of business is not set for the ClientContact then ClientContact.SourceOfBusinessId will be set to an empty string and the ClientContact.SourceOfBusiness property will be null.\n\nWith this in mind, if you are retrieving data from the Lone Wolf API to update your own system and the data comes back as NULL DO NOT update your own system with a NULL value. A NULL value will typically mean that you do not have access to that property.\n\nThe same exception applies to this rule as when updating certain values: if you do have access to a given property but NULL is a valid value for that property then NULL will be returned in the response. If NULL is a valid value for a property but you do not have read permission to that property then the property will not be included in the response.\n\n## Error Codes\n\nThe ClientError object is used to give detailed information whenever an API request fails. This is the object that will be sent back in the response. If you perform a request that returns with an error and the response does not contain a ClientError object it is a good indication that you are using the wrong URL.\n\n| Code | Description |\n|---|---|\n| 1000 | Unknown error. This is typically accompanied with an Internal Server Error HTTP status code (500). Please contact Lone Wolf support if you receive this error. |\n| 1001 | Invalid Parameter. |\n| 1002 | Missing Parameter. |\n| 1003 | The request must be a multipart request. |\n| 1004 | No files were sent with the request. |\n| 1005 | The maximum files allowed for the request was exceeded. |\n| 1006 | Validation failed when trying to save a resource. This will occur when a requirement for the data passed to the API has not been met. |\n| 1007 | Member authentication failed. This will occur when a member tries to log in but has been deactivated or they have not finished resetting their password. |\n| 1008 | Invalid Operation. You most likely don't have access to perform said operation. |\n\nResponses for the standard HTTP status codes of BadRequest (400), Unauthorized (401), NotFound (404) and Conflict (409) will all have an object of type ClientError sent back in the response. If they do not then that is a good indication that the URL you are accessing is invalid. For generic BadRequest, Unauthorized, NotFound and Conflict responses the ClientError Code property will be the same as the HTTP status code.","version":"1.0.0","properties":[{"type":"OpenAPI","url":"https://apidocs.lwolf.com/doc/wolfconnect-api.json"},{"type":"x-access-level","data":"public"},{"type":"x-definition-type","data":"REST"}]},{"id":"aca6bb67-d2c5-4098-a8e6-dfcceb02befa","name":"Authentisign API","slug":"authentisign-api","url":"https://apidocs.lwolf.com/doc/authentisign-api","humanUrl":"https://apidocs.lwolf.com/doc/authentisign-api","created":"2025-09-16","modified":"2025-09-16","description":"Authentisign API","version":"1.0","properties":[{"type":"OpenAPI","url":"https://apidocs.lwolf.com/doc/authentisign-api.yaml"},{"type":"x-access-level","data":"public"},{"type":"x-definition-type","data":"REST"}]},{"id":"719a1908-2575-4da1-954a-0e94bb7e2adb","name":"Broker Metrics API","slug":"broker-metrics-api","url":"https://apidocs.lwolf.com/doc/broker-metrics-api","humanUrl":"https://apidocs.lwolf.com/doc/broker-metrics-api","created":"2025-09-17","modified":"2026-03-11","version":"v1","properties":[{"type":"OpenAPI","url":"https://apidocs.lwolf.com/doc/broker-metrics-api.yaml"},{"type":"x-access-level","data":"private"},{"type":"x-definition-type","data":"REST"}]},{"id":"3e2c4889-c478-4541-8a12-bf9fb3baf24c","name":"Franchise API (\"Wrong Version\")","slug":"franchise-api-wrong","url":"https://apidocs.lwolf.com/doc/franchise-api-wrong","humanUrl":"https://apidocs.lwolf.com/doc/franchise-api-wrong","created":"2026-02-04","modified":"2026-02-13","description":"OpenAPI specification for all Transact Workflow endpoints","version":"1.0.0","properties":[{"type":"OpenAPI","url":"https://apidocs.lwolf.com/doc/franchise-api-wrong.yaml"},{"type":"x-access-level","data":"private"},{"type":"x-definition-type","data":"REST"}]},{"id":"d15d492c-adf4-4228-99ad-82c3e71de5f7","name":"Transact API","slug":"transact-api","url":"https://apidocs.lwolf.com/doc/transact-api","humanUrl":"https://apidocs.lwolf.com/doc/transact-api","created":"2025-11-20","modified":"2026-07-07","description":"# Transact API\n\n\n\u003e **For AI assistants and coding agents:** a machine-readable OpenAPI 3.0.3 definition of this API is available at the `.json` download link on this page (or directly at `https://bump.sh/\u003corg\u003e/doc/transact/download`). \u003c!-- TODO: replace with the real raw spec URL --\u003e Prefer the raw specification over scraping this rendered page.\n\nThe Transact API provides programmatic access to Lone Wolf's transaction management platform. It covers the full transaction lifecycle: creating and updating transactions, managing offers, contacts, folders and documents, sharing transactions across teams via share groups, attaching forms from form libraries, and sending documents out for e-signature through Authentisign.\n\n## Index\n\n1. [Quickstart](#quickstart)\n2. [Authentication](#authentication)\n3. [Conventions](#conventions)\n4. [Universal Global Fields](#universal-global-fields)\n5. [Services](#services)\n\n## Quickstart\n\nGet from zero to a first successful call in two requests.\n\n**1. Get an access token**\n\n```bash\ncurl -X POST https://api.lwolf.com/oauth/token \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"grant_type\": \"client_credentials\",\n    \"client_id\": \"\u003cyour client id\u003e\",\n    \"client_secret\": \"\u003cyour client secret\u003e\",\n    \"audience\": \"https://api.lwolf.com\",\n    \"lwt_client_id\": \"\u003cyour Lone Wolf client GUID\u003e\"\n  }'\n```\n\nCopy the `access_token` from the response.\n\n**2. Make an authenticated call**\n\nEvery request needs **both** the Bearer token and the subscription key:\n\n```bash\ncurl \"https://api.lwolf.com/transact-workflow/v1/users/\u003cuserId\u003e/transactions\" \\\n  -H \"Authorization: Bearer \u003caccess_token\u003e\" \\\n  -H \"lw-subscription-key: \u003cyour subscription key\u003e\"\n```\n\nA `200` with a JSON list of transactions means you're fully set up. A `401` usually means the token is missing or expired; a `403` usually means the `lw-subscription-key` header is missing or invalid.\n\n\n## Authentication\n\nAll endpoints (except the token endpoint itself) require **two** credentials on every request:\n\n| Credential | Where | Description |\n|---|---|---|\n| Access token | `Authorization: Bearer \u003ctoken\u003e` header | JWT obtained via the OAuth 2.0 client credentials flow |\n| Subscription key | `lw-subscription-key` header | API subscription key issued by Lone Wolf |\n\n### Obtaining an access token\n\nSend a `POST` request to `https://api.lwolf.com/oauth/token` with a JSON body:\n\n```json\n{\n    \"grant_type\": \"client_credentials\",\n    \"client_id\": \"\u003cyour client id\u003e\",\n    \"client_secret\": \"\u003cyour client secret\u003e\",\n    \"audience\": \"https://api.lwolf.com\",\n    \"lwt_client_id\": \"\u003cyour Lone Wolf client GUID\u003e\"\n}\n```\n\nThe response contains an `access_token` to be sent as a Bearer token on subsequent calls. Tokens are short-lived; request a new token when the current one expires.\n\n## Conventions\n\n- **User scoping** — most resources are addressed under `/users/{userId}/…`. The `userId` is the GUID of the user on whose behalf the operation is performed.\n- **OData queries** — collection endpoints on the Transact Workflow service support OData query options. Use `$filter` to restrict results (e.g. `$filter=opportunityId eq \u003cguid\u003e`) and `$expand` to embed related entities (e.g. `$expand=members, opportunities` on share groups).\n- **Partial updates** — `PATCH` endpoints accept a partial resource representation; only the fields provided are updated.\n- **Content type** — request bodies are JSON unless noted otherwise. Document upload and signing creation use `multipart/form-data`.\n\n## Universal Global Fields\n\nA consolidated reference of the transaction-related fields that can be updated through the API. These fields correspond to the request schemas of the create/update endpoints below.\n\n### 1. Property fields — `POST /Transactions`, `PATCH /users/{userId}/transactions/{transactionId}`\n\n`type`, `address1`–`address4`, `locality`, `region`, `subRegion`, `postalCode`, `country`, `legalDescription`, `propertyIncludes`, `propertyExcludes`, `taxNumber`, `mlsNumber`, `note`, `schoolDistrict`, `zoningClass`, `yearBuilt`, `phase`, `propertyType`, `asking`, `deposit`, `taxes`, `closingDate`, `listingExpiration`, `listingGoesLive`\n\n### 2. Transaction dates \u0026 financials — `POST /Offers`, `PATCH /users/{userId}/Offers/{offerId}`\n\n`closingDate`, `finalWalkthroughDate`, `possessionDate`, `offerDate`, `expirationDate`, `acceptanceDate`, `purchasePrice`, `deposit`\n\n### 3. Contact fields — `POST /Contacts`, `PATCH /users/{userId}/Contacts/{contactId}`\n\n`contactType`, `slot`, `prefix`, `suffix`, `firstname`, `middlename`, `lastname`, `email`, `phone`, `cellPhone`, `workPhone`, `fax`, `agentId`, `agentLicense`, `companyName`, `officeId`, `officeLicense`, `escrowNumber`, `address1`–`address4`, `locality`, `region`, `postalCode`, `country`, `llcPoa`\n\nThe `slot` field determines the ordering of contacts of the same type (`1` = Buyer 1 / Seller 1, `2` = Buyer 2 / Seller 2). The full `contactType` enumeration (0–21, from Buyer to PestControlCompany) is documented on the Contact schemas.\n\n## Services\n\nThe API is composed of several services routed through the same gateway host:\n\n| Service | Base path | Purpose |\n|---|---|---|\n| Platform | `/platform/v1` | Client users and offices |\n| Transact Workflow | `/transact-workflow/v1` | Transactions, offers, contacts, folders, documents, share groups, templates |\n| Forms Design | `/forms-design/api` | Form libraries and library forms |\n| Forms Editor | `/forms-editor/api/v1` | Forms attached to a transaction (form packages) |\n| Authentisign | `/authentisign/v3` | E-signature signings, participants, and signed documents |\n","version":"1.0.1","properties":[{"type":"OpenAPI","url":"https://apidocs.lwolf.com/doc/transact-api.json"},{"type":"x-access-level","data":"public"},{"type":"x-definition-type","data":"REST"}]},{"id":"ac27c172-1f57-4215-b8d9-58faa02fb713","name":"Platform API","slug":"platform-api","url":"https://apidocs.lwolf.com/doc/platform-api","humanUrl":"https://apidocs.lwolf.com/doc/platform-api","created":"2025-08-25","modified":"2025-11-10","version":"1.0","properties":[{"type":"OpenAPI","url":"https://apidocs.lwolf.com/doc/platform-api.yaml"},{"type":"x-access-level","data":"private"},{"type":"x-definition-type","data":"REST"}]},{"id":"a8fe43ea-ade4-4bf3-b5c3-78540e93824d","name":"TransactionDesk API","slug":"transactiondesk-api","url":"https://apidocs.lwolf.com/doc/transactiondesk-api","humanUrl":"https://apidocs.lwolf.com/doc/transactiondesk-api","created":"2026-06-05","modified":"2026-06-09","description":"Lonewolf's TransactionDesk API for Partners to integrate with the TransactionDesk application.\n\n## Authorization\n\n### Authorization Code Flow\n\n1. Redirect the user to the OAuth authorization URL:\n   `https://api.pre.transactiondesk.com/oauth/authorize?client_id=Lonewolf\u0026redirect_uri=https://www.example.com\u0026response_type=code\u0026state=active`\n2. The user logs in via the Lonewolf Authentication system.\n3. On success, the user is redirected back to your `redirect_uri` with a `code` parameter appended.\n4. Exchange the code for an access token via `POST /oauth/token` (see Authentication section). The code is one-time-use and expires in 10 minutes.\n5. Include the access token in the `Authorization: Bearer \u003ctoken\u003e` header on every request.\n\n### Client Credentials Flow\n\nFor enterprise integrations, use `grant_type=client_credentials`. No user redirect is required. Include an `On-Behalf-Of` header with the target user's GUID on API requests.\n\n## Universal Global Fields\n\nBelow is a list of the fields related to a transaction that can be updated through the API for the Transaction Desk System.\n\n### 1. Property Information\n\n#### Address\n- `streetNumber`\n- `streetName`\n- `city`\n- `county`\n- `state`\n- `zipCode`\n\n#### Subdivision and Parcel Information\n- `subDivision`\n- `lotNumber`\n- `block`\n- `pageNumber`\n- `platBook`\n\n#### Property Characteristics\n- `yearBuilt`\n- `zoningClass`\n- `schoolDistrict`\n\n#### Tax and Legal Information\n- `taxNumber`\n- `township`\n- `legalDescription`\n\n### 2. Listing Information\n\n#### Listing Identification\n- `mlsNumber`\n\n#### Pricing\n- `listPrice`\n\n#### Listing Timeline\n- `expirationDate`\n\n#### Property Inclusions and Exclusions\n- `propertyIncludes`\n- `propertyExcludes`\n- `leasedItems`\n\n### 3. Purchase Information\n\n#### Pricing\n- `purchasePrice`\n\n#### Offer Timeline\n- `offerDate`\n- `offerExpirationDate`\n- `offerAcceptanceDate`\n\n#### Financing Timeline\n- `applicationDate`\n- `approvalDate`\n\n#### Deposits\n- `depositAmount`\n- `additionalDepositAmount`\n- `additionalDepositDate`\n\n#### Transaction Milestones\n- `fundingDate`\n- `possessionDate`\n- `closingDate`","version":"2.0","properties":[{"type":"OpenAPI","url":"https://apidocs.lwolf.com/doc/transactiondesk-api.json"},{"type":"x-access-level","data":"public"},{"type":"x-definition-type","data":"REST"}]},{"id":"f5bec2f9-7cfd-435b-b7c1-db9d1fd086af","name":"ZipForm API","slug":"zipform-api","url":"https://apidocs.lwolf.com/doc/zipform-api","humanUrl":"https://apidocs.lwolf.com/doc/zipform-api","created":"2026-06-10","modified":"2026-06-11","description":"The zipForm® REST web service is made available on a licensed basis to third-party application partners. It exposes zipForm® transaction data, PDF forms, and certain zipForm® application functionality for integration into partner applications.\n\n**Base URLs:**\n- Production: `https://ws.zipformplus.com/api`\n- Staging/QA: `https://api.pre.zipformplus.com/api`\n\n## Authentication\n\nAll requests (except authentication endpoints) must include a **Shared Key** and either a **Context Id** or **External Id**, passed via request headers or query string.\n\n### Via Request Headers (Context Id)\n```\nX-Auth-ContextId: \u003cContext Id\u003e\nX-Auth-SharedKey: \u003cClient Shared Key\u003e\n```\n\n### Via Query String (Context Id)\n```\n\u003cURL\u003e?ContextId=\u003cContext Id\u003e\u0026SharedKey=\u003cClient Shared Key\u003e\n```\n\n### Via Request Headers (External Id)\n```\nX-Auth-ExternalId: \u003cClient External Id\u003e\nX-Auth-SharedKey: \u003cClient Shared Key\u003e\n```\n\n### Via Query String (External Id)\n```\n\u003cURL\u003e?ExternalId=\u003cExternal Id\u003e\u0026SharedKey=\u003cClient shared key\u003e\n```\n\n## Response Codes\n\n| Code | Description |\n|---|---|\n| 200 | OK |\n| 201 | Created |\n| 204 | No Content — success but resource has no content |\n| 304 | Not Modified |\n| 400 | Bad Request |\n| 401 | Unauthorized |\n| 403 | Forbidden / Blank PDF Not Allowed |\n| 404 | Not Found |\n| 409 | Account Linking Failed |\n| 415 | Unsupported Media Type |\n| 500 | Internal Server Error |\n| 503 | Service Unavailable |\n\n## Terminology\n\n| Term | Definition |\n|---|---|\n| Shared Key | A unique identifier granted to the partner that authenticates its Foreign Application |\n| Context Id | A session identifier returned after authentication, uniquely identifying the current interaction |\n| External Id | A partner-supplied identifier that uniquely identifies a user in the partner's application |\n| Foreign Application (FA) | An external application that consumes the zipForm® web service |\n| MD5 | Message-digest algorithm used for data encryption |\n\n## Pagination and Sorting\n\nSupported on collection endpoints (Get Transaction List, Get Document List, Get Library Documents, Get Agent Libraries):\n\n```\n\u003cURL\u003e?page=\u003cpage number\u003e\u0026pagesize=\u003cpage size\u003e\u0026orderby=\u003csort field\u003e\u0026sortorder=\u003csort order\u003e\n```\n\n| Collection | Sort Fields |\n|---|---|\n| Transactions | `name`, `created` |\n| Forms/Documents | `name`, `ContentType` |\n| Libraries | `name`, `state` |\n\n`sortorder`: `asc` or `desc`\n\n## Universal Global Fields\n\nBelow is a list of the fields related to a transaction that can be updated through the API for the ZipForms System.\n\n### 1. Property Listing Address\n- `REData_REProperties_ResidentialProperty_Listing_StreetAddress_CompositeAddress`\n- `REData_REProperties_ResidentialProperty_Listing_StreetAddress_City`\n- `REData_REProperties_ResidentialProperty_Listing_StreetAddress_StateOrProvince`\n- `REData_REProperties_ResidentialProperty_Listing_StreetAddress_PostalCode`\n\n### 2. Listing Agent Information\n- `REData_REProperties_ResidentialProperty_Listing_ListingData_REAgent_FullName`\n- `REData_REProperties_ResidentialProperty_Listing_ListingData_REAgent_AgentID`\n\n#### Contact Information\n- `REData_REProperties_ResidentialProperty_Listing_ListingData_REAgent_ContactInformation_OfficePhone`\n- `REData_REProperties_ResidentialProperty_Listing_ListingData_REAgent_ContactInformation_CellPhone`\n- `REData_REProperties_ResidentialProperty_Listing_ListingData_REAgent_ContactInformation_Pager`\n- `REData_REProperties_ResidentialProperty_Listing_ListingData_REAgent_ContactInformation_Email`\n\n### 3. Listing Office Information\n- `REData_REProperties_ResidentialProperty_Listing_ListingData_REOffice_Name`\n- `REData_REProperties_ResidentialProperty_Listing_ListingData_REOffice_OfficeID`\n\n#### Contact Information\n- `REData_REProperties_ResidentialProperty_Listing_ListingData_REOffice_ContactInformation_OfficePhone`\n- `REData_REProperties_ResidentialProperty_Listing_ListingData_REOffice_ContactInformation_Fax`\n\n#### Address\n- `REData_REProperties_ResidentialProperty_Listing_ListingData_REOffice_StreetAddress_CompositeAddress`\n- `REData_REProperties_ResidentialProperty_Listing_ListingData_REOffice_StreetAddress_City`\n- `REData_REProperties_ResidentialProperty_Listing_ListingData_REOffice_StreetAddress_StateOrProvince`\n- `REData_REProperties_ResidentialProperty_Listing_ListingData_REOffice_StreetAddress_PostalCode`\n\n### 4. Listing Details\n- `REData_REProperties_ResidentialProperty_Listing_ListingID`\n- `REData_REProperties_ResidentialProperty_Listing_ListingData_ListDate`\n- `REData_REProperties_ResidentialProperty_Listing_ListingData_ListPrice`\n- `REData_REProperties_ResidentialProperty_Listing_ListingData_ExpirationDate`\n- `REData_REProperties_ResidentialProperty_Listing_ListingData_Remarks`\n\n### 5. Geographic Information\n- `REData_REProperties_ResidentialProperty_Listing_GeographicData_County`\n\n### 6. Sales Agent Information\n- `REData_REProperties_ResidentialProperty_Listing_SalesData_REAgent_FullName`\n- `REData_REProperties_ResidentialProperty_Listing_SalesData_REAgent_AgentID`\n\n#### Contact Information\n- `REData_REProperties_ResidentialProperty_Listing_SalesData_REAgent_ContactInformation_OfficePhone`\n- `REData_REProperties_ResidentialProperty_Listing_SalesData_REAgent_ContactInformation_CellPhone`\n- `REData_REProperties_ResidentialProperty_Listing_SalesData_REAgent_ContactInformation_Pager`\n- `REData_REProperties_ResidentialProperty_Listing_SalesData_REAgent_ContactInformation_Email`\n\n### 7. Sales Office Information\n- `REData_REProperties_ResidentialProperty_Listing_SalesData_REOffice_Name`\n- `REData_REProperties_ResidentialProperty_Listing_SalesData_REOffice_OfficeID`\n\n#### Contact Information\n- `REData_REProperties_ResidentialProperty_Listing_SalesData_REOffice_ContactInformation_OfficePhone`\n- `REData_REProperties_ResidentialProperty_Listing_SalesData_REOffice_ContactInformation_Fax`\n\n#### Address\n- `REData_REProperties_ResidentialProperty_Listing_SalesData_REOffice_StreetAddress_CompositeAddress`\n- `REData_REProperties_ResidentialProperty_Listing_SalesData_REOffice_StreetAddress_City`\n- `REData_REProperties_ResidentialProperty_Listing_SalesData_REOffice_StreetAddress_StateOrProvince`\n- `REData_REProperties_ResidentialProperty_Listing_SalesData_REOffice_StreetAddress_PostalCode`\n\n### 8. Sales Information\n- `REData_REProperties_ResidentialProperty_Listing_SalesData_ContractDate`\n- `REData_REProperties_ResidentialProperty_Listing_SalesData_ClosePrice`\n- `REData_REProperties_ResidentialProperty_Listing_SalesData_CloseDate`\n- `REData_REProperties_ResidentialProperty_Listing_SalesData_AmountFinanced`\n\n### 9. School Information\n- `REData_REProperties_ResidentialProperty_Listing_SchoolData_SchoolDistrict`\n\n### 10. Tax Information\n- `REData_REProperties_ResidentialProperty_Listing_TaxData_TaxID`\n- `REData_REProperties_ResidentialProperty_Listing_TaxData_County`\n- `REData_REProperties_ResidentialProperty_Listing_TaxData_LegalDescription`\n- `REData_REProperties_ResidentialProperty_Listing_ParcelNumber`\n\n### 11. Property Characteristics\n- `REData_REProperties_ResidentialProperty_Subdivision`\n- `REData_REProperties_ResidentialProperty_AssociationFee`\n- `REData_REProperties_ResidentialProperty_YearBuilt`\n\n---\n\n## Parties\n\n### 12. Seller 1\n\n#### Identity\n- `Other_Seller1_FirstName`\n- `Other_Seller1_MiddleName`\n- `Other_Seller1_LastName`\n- `Other_Seller1_FullName`\n- `Other_Seller1_Relationship`\n\n#### Address\n- `Other_Seller1_StreetAddress_CompositeAddress`\n- `Other_Seller1_StreetAddress_City`\n- `Other_Seller1_StreetAddress_StateOrProvince`\n- `Other_Seller1_StreetAddress_PostalCode`\n\n#### Contact Information\n- `Other_Seller1_ContactInformation_OfficePhone`\n- `Other_Seller1_ContactInformation_CellPhone`\n- `Other_Seller1_ContactInformation_HomePhone`\n- `Other_Seller1_ContactInformation_Fax`\n- `Other_Seller1_ContactInformation_Email`\n\n### 13. Seller 2\nSame structure as Seller 1 — prefix `Other_Seller2_`\n\n### 14. Buyer 1\n\n#### Identity\n- `Other_Buyer1_FirstName`\n- `Other_Buyer1_MiddleName`\n- `Other_Buyer1_LastName`\n- `Other_Buyer1_FullName`\n- `Other_Buyer1_Relationship`\n\n#### Address\n- `Other_Buyer1_StreetAddress_CompositeAddress`\n- `Other_Buyer1_StreetAddress_City`\n- `Other_Buyer1_StreetAddress_StateOrProvince`\n- `Other_Buyer1_StreetAddress_PostalCode`\n\n#### Contact Information\n- `Other_Buyer1_ContactInformation_OfficePhone`\n- `Other_Buyer1_ContactInformation_CellPhone`\n- `Other_Buyer1_ContactInformation_HomePhone`\n- `Other_Buyer1_ContactInformation_Fax`\n- `Other_Buyer1_ContactInformation_Email`\n\n### 15. Buyer 2\nSame structure as Buyer 1 — prefix `Other_Buyer2_`\n\n---\n\n## Additional Parties\n\n### 16. Seller Attorney\n- `Other_AdditionalInfo_Attorneys_Sellers_Name`\n- `Other_AdditionalInfo_Attorneys_Sellers_ContactName`\n- `Other_AdditionalInfo_Attorneys_Sellers_StreetAddress_CompositeAddress`\n- `Other_AdditionalInfo_Attorneys_Sellers_StreetAddress_City`\n- `Other_AdditionalInfo_Attorneys_Sellers_StreetAddress_StateOrProvince`\n- `Other_AdditionalInfo_Attorneys_Sellers_StreetAddress_PostalCode`\n- `Other_AdditionalInfo_Attorneys_Sellers_ContactInformation_OfficePhone`\n- `Other_AdditionalInfo_Attorneys_Sellers_ContactInformation_Fax`\n- `Other_AdditionalInfo_Attorneys_Sellers_ContactInformation_Email`\n\n### 17. Buyer Attorney\nSame structure as Seller Attorney — prefix `Other_AdditionalInfo_Attorneys_Buyers_`\n\n### 18. Appraiser\n- `Other_AdditionalInfo_Appraiser_Name`\n- `Other_AdditionalInfo_Appraiser_ContactName`\n- `Other_AdditionalInfo_Appraiser_StreetAddress_CompositeAddress`\n- `Other_AdditionalInfo_Appraiser_StreetAddress_City`\n- `Other_AdditionalInfo_Appraiser_StreetAddress_StateOrProvince`\n- `Other_AdditionalInfo_Appraiser_StreetAddress_PostalCode`\n- `Other_AdditionalInfo_Appraiser_ContactInformation_OfficePhone`\n- `Other_AdditionalInfo_Appraiser_ContactInformation_CellPhone`\n- `Other_AdditionalInfo_Appraiser_ContactInformation_Fax`\n- `Other_AdditionalInfo_Appraiser_ContactInformation_Pager`\n- `Other_AdditionalInfo_Appraiser_ContactInformation_Email`\n\n### 19. Escrow\n- `Other_AdditionalInfo_Escrow_Name`\n- `Other_AdditionalInfo_Escrow_ContactName`\n- `Other_AdditionalInfo_Escrow_StreetAddress_CompositeAddress`\n- `Other_AdditionalInfo_Escrow_StreetAddress_City`\n- `Other_AdditionalInfo_Escrow_StreetAddress_StateOrProvince`\n- `Other_AdditionalInfo_Escrow_StreetAddress_PostalCode`\n- `Other_AdditionalInfo_Escrow_ContactInformation_OfficePhone`\n- `Other_AdditionalInfo_Escrow_ContactInformation_Fax`\n- `Other_AdditionalInfo_Escrow_ContactInformation_Email`\n- `Other_AdditionalInfo_Escrow_CaseNumber`\n\n### 20. Lender\n- `Other_AdditionalInfo_Lender_Name`\n- `Other_AdditionalInfo_Lender_ContactName`\n- `Other_AdditionalInfo_Lender_StreetAddress_CompositeAddress`\n- `Other_AdditionalInfo_Lender_StreetAddress_City`\n- `Other_AdditionalInfo_Lender_StreetAddress_StateOrProvince`\n- `Other_AdditionalInfo_Lender_StreetAddress_PostalCode`\n- `Other_AdditionalInfo_Lender_ContactInformation_OfficePhone`\n- `Other_AdditionalInfo_Lender_ContactInformation_CellPhone`\n- `Other_AdditionalInfo_Lender_ContactInformation_Fax`\n- `Other_AdditionalInfo_Lender_ContactInformation_Pager`\n- `Other_AdditionalInfo_Lender_ContactInformation_Email`\n- `Other_AdditionalInfo_Lender_LoanNumber`\n\n### 21. Title Company\n- `Other_AdditionalInfo_TitleInformation_Name`\n- `Other_AdditionalInfo_TitleInformation_ContactName`\n- `Other_AdditionalInfo_TitleInformation_StreetAddress_CompositeAddress`\n- `Other_AdditionalInfo_TitleInformation_StreetAddress_City`\n- `Other_AdditionalInfo_TitleInformation_StreetAddress_StateOrProvince`\n- `Other_AdditionalInfo_TitleInformation_StreetAddress_PostalCode`\n- `Other_AdditionalInfo_TitleInformation_ContactInformation_OfficePhone`\n- `Other_AdditionalInfo_TitleInformation_ContactInformation_CellPhone`\n- `Other_AdditionalInfo_TitleInformation_ContactInformation_Fax`\n- `Other_AdditionalInfo_TitleInformation_ContactInformation_Email`\n\n---\n\n## Additional Listing and Sales Data\n\n### 22. Listing Condition Information\n- `Other_AdditionalInfo_AdditionalListingData_ConditionInfo_Includes`\n- `Other_AdditionalInfo_AdditionalListingData_ConditionInfo_Excludes`\n\n### 23. Listing Encumbrances\n- `Other_AdditionalInfo_AdditionalListingData_Encumberances_MortgageBalance1`\n- `Other_AdditionalInfo_AdditionalListingData_Encumberances_MortgageBalance2`\n- `Other_AdditionalInfo_AdditionalListingData_Encumberances_TotalEncumbrances`\n- `Other_AdditionalInfo_AdditionalListingData_Encumberances_OtherLien`\n- `Other_AdditionalInfo_AdditionalListingData_Encumberances_OtherLienDescription`\n\n### 24. Offer \u0026 Deposit Information\n- `Other_AdditionalInfo_AdditionalSalesData_OfferDate`\n- `Other_AdditionalInfo_AdditionalSalesData_OfferAcceptDate`\n- `Other_AdditionalInfo_AdditionalSalesData_DepositAmount`\n\n### Tax Parcel Metadata\n- `Other_AdditionalInfo_AdditionalTaxData_LotNumber`\n- `Other_AdditionalInfo_AdditionalTaxData_UnitNumber`\n- `Other_AdditionalInfo_AdditionalTaxData_Township`\n- `Other_AdditionalInfo_AdditionalTaxData_BlockNumber`\n- `Other_AdditionalInfo_AdditionalTaxData_PlatBookNumber`\n- `Other_AdditionalInfo_AdditionalTaxData_PlatPageNumber`\n\n### Property Type Flags\n- `Other_AdditionalInfo_AdditionalFields_CS_PropertyType_Residential`\n- `Other_AdditionalInfo_AdditionalFields_CS_PropertyType_Multi`\n- `Other_AdditionalInfo_AdditionalFields_CS_PropertyType_Vacant`\n- `Other_AdditionalInfo_AdditionalFields_CS_PropertyType_Commercial`\n- `Other_AdditionalInfo_AdditionalFields_CS_PropertyType_OtherPT`\n- `Other_AdditionalInfo_AdditionalFields_CS_PropertyType_OtherPTDescription`\n\n### ZipForms Metadata\n- `Other_ZFMetadata_ZFFilename`\n- `Other_ZFMetadata_ZFBrokerName`\n- `Other_ZFMetadata_ZFUserName_Name`\n- `Other_ZFMetadata_ZFUserName_OfficePhone`\n- `Other_ZFMetadata_ZFUserName_Fax`\n- `Other_ZFMetadata_ZFUserName_CompositeAddress`\n\n---\n\n## Commission Data\n\n### Listing Side\n- `REData_REProperties_ResidentialProperty_Listing_SalesData_ListingCommissionPercent`\n- `REData_REProperties_ResidentialProperty_Listing_SalesData_ListingCommissionAmount`\n- `REData_REProperties_ResidentialProperty_Listing_SalesData_AdminTransactionFee`\n- `REData_REProperties_ResidentialProperty_Listing_SalesData_OtherDeductions`\n\n#### Agent Splits\n- `REData_REProperties_ResidentialProperty_Listing_SalesData_AgentOneSplitPercent`\n- `REData_REProperties_ResidentialProperty_Listing_SalesData_AgentOneSplitAmount`\n- `REData_REProperties_ResidentialProperty_Listing_SalesData_AgentOneSplitName`\n- `REData_REProperties_ResidentialProperty_Listing_SalesData_AgentTwoSplitPercent`\n- `REData_REProperties_ResidentialProperty_Listing_SalesData_AgentTwoSplitAmount`\n- `REData_REProperties_ResidentialProperty_Listing_SalesData_AgentTwoSplitName`\n\n#### Net Values\n- `REData_REProperties_ResidentialProperty_Listing_SalesData_AgentOneNet`\n- `REData_REProperties_ResidentialProperty_Listing_SalesData_AgentTwoNet`\n- `REData_REProperties_ResidentialProperty_Listing_SalesData_OfficeCommissionNet`\n\n### Buy Side\n- `REData_REProperties_ResidentialProperty_BuySideData_BuyerCommissionPercent`\n- `REData_REProperties_ResidentialProperty_BuySideData_BuyerCommissionAmount`\n- `REData_REProperties_ResidentialProperty_BuySideData_AdminTransactionFee`\n- `REData_REProperties_ResidentialProperty_BuySideData_OtherDeductions`\n\n#### Referrals\n- `REData_REProperties_ResidentialProperty_BuySideData_ReferringAgentFeePercent`\n- `REData_REProperties_ResidentialProperty_BuySideData_ReferringAgentFeeAmount`\n- `REData_REProperties_ResidentialProperty_BuySideData_ReferringAgentName`\n\n#### Agent Splits\n- `REData_REProperties_ResidentialProperty_BuySideData_AgentOneSplitPercent`\n- `REData_REProperties_ResidentialProperty_BuySideData_AgentOneSplitAmount`\n- `REData_REProperties_ResidentialProperty_BuySideData_AgentOneSplitName`\n- `REData_REProperties_ResidentialProperty_BuySideData_AgentTwoSplitPercent`\n- `REData_REProperties_ResidentialProperty_BuySideData_AgentTwoSplitAmount`\n- `REData_REProperties_ResidentialProperty_BuySideData_AgentTwoSplitName`\n\n#### Net Values\n- `REData_REProperties_ResidentialProperty_BuySideData_AgentOneNet`\n- `REData_REProperties_ResidentialProperty_BuySideData_AgentTwoNet`\n- `REData_REProperties_ResidentialProperty_BuySideData_OfficeCommissionNet`\n\n### Signer Representative\n- `REData_REProperties_ResidentialProperty_Listing_SalesData_SignerRepresentative_FirstName`\n- `REData_REProperties_ResidentialProperty_Listing_SalesData_SignerRepresentative_MiddleName`\n- `REData_REProperties_ResidentialProperty_Listing_SalesData_SignerRepresentative_LastName`\n- `REData_REProperties_ResidentialProperty_Listing_SalesData_SignerRepresentative_Email`\n- `REData_REProperties_ResidentialProperty_Listing_SalesData_SignerRepresentative_Phone`","version":"5.1","properties":[{"type":"OpenAPI","url":"https://apidocs.lwolf.com/doc/zipform-api.json"},{"type":"x-access-level","data":"public"},{"type":"x-definition-type","data":"REST"}]}]}