openapi: 3.2.0 info: title: Transact Contacts API version: 1.0.0 description: "# Transact API\n\n\n> **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//doc/transact/download`). 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://gateway.lwolf.com/oauth/token \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"grant_type\": \"client_credentials\",\n \"client_id\": \"\",\n \"client_secret\": \"\",\n \"audience\": \"https://api.lwolf.com\",\n \"lwt_client_id\": \"\"\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://gateway.lwolf.com/transact-workflow/v1/users//transactions\" \\\n -H \"Authorization: Bearer \" \\\n -H \"lw-subscription-key: \"\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 ` 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://gateway.lwolf.com/oauth/token` with a JSON body:\n\n```json\n{\n \"grant_type\": \"client_credentials\",\n \"client_id\": \"\",\n \"client_secret\": \"\",\n \"audience\": \"https://api.lwolf.com\",\n \"lwt_client_id\": \"\"\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 `) 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 & 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" contact: name: Lone Wolf Technologies url: https://www.lwolf.com servers: - url: https://gateway.lwolf.com description: Production API gateway - url: '{tw_host}' description: Environment-specific host (e.g. pre-production) variables: tw_host: default: https://api.pre.lwolf.com description: Base host for the target environment. security: - bearerAuth: [] subscriptionKey: [] tags: - name: Contacts description: Manage transaction contacts. paths: /transact-workflow/v1/Contacts: post: tags: - Contacts summary: Create a contact description: Creates a new contact on a transaction for the user specified in the request body. operationId: createContact responses: '201': description: Contact created. '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ContactCreate' /transact-workflow/v1/users/{userId}/Contacts: get: tags: - Contacts summary: List contacts description: Returns the transaction contacts visible to the specified user. operationId: getContacts responses: '200': description: Successful response '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' parameters: - name: userId in: path required: true description: Unique identifier (GUID) of the acting user. All Transact Workflow resources are scoped to a user. schema: type: string format: uuid /transact-workflow/v1/users/{userId}/Contacts/{contactId}: get: tags: - Contacts summary: Get a contact description: Returns a single contact by its key. operationId: getContactByKey responses: '200': description: Successful response '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' parameters: - name: userId in: path required: true description: Unique identifier (GUID) of the acting user. All Transact Workflow resources are scoped to a user. schema: type: string format: uuid - name: contactId in: path required: true description: GUID of the contact. schema: type: string format: uuid patch: tags: - Contacts summary: Update a contact description: Applies a partial update to a contact. Only the fields present in the body are modified. operationId: updateContact responses: '200': description: Successful response '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' parameters: - name: userId in: path required: true description: Unique identifier (GUID) of the acting user. All Transact Workflow resources are scoped to a user. schema: type: string format: uuid - name: contactId in: path required: true description: GUID of the contact. schema: type: string format: uuid requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ContactUpdate' delete: tags: - Contacts summary: Delete a contact description: Deletes the specified contact. operationId: deleteContact responses: '204': description: Contact deleted. '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' parameters: - name: userId in: path required: true description: Unique identifier (GUID) of the acting user. All Transact Workflow resources are scoped to a user. schema: type: string format: uuid - name: contactId in: path required: true description: GUID of the contact. schema: type: string format: uuid components: schemas: ContactCreate: allOf: - type: object required: - userId - transactionId properties: userId: type: string format: uuid description: GUID of the user creating the contact. transactionId: type: string format: uuid description: GUID of the transaction the contact belongs to. - $ref: '#/components/schemas/ContactBase' description: Payload for creating a new transaction contact. ContactUpdate: allOf: - type: object properties: transactionId: type: string format: uuid description: GUID of the transaction the contact belongs to. - $ref: '#/components/schemas/ContactBase' description: Partial contact representation. Only the provided fields are updated. ContactBase: type: object properties: contactType: type: integer enum: - 0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 - 13 - 14 - 15 - 16 - 17 - 18 - 19 - 20 - 21 description: 'Contact type code identifying the contact''s role on the transaction. | Value | Contact type | |---|---| | `0` | Buyer | | `1` | Seller | | `2` | BuyerAgent | | `3` | Other | | `4` | SellerAgent | | `5` | AppraisalCompany | | `6` | BuyerLawyer | | `7` | BuyerBroker | | `8` | CondoAssociationHOA | | `9` | EscrowCompany | | `10` | Landlord | | `11` | SellerBroker | | `12` | MortgageAppraiser | | `13` | BuyerLendingCompany | | `14` | SellerLawyer | | `15` | Tenant | | `16` | TitleCompany | | `17` | Admin | | `18` | SellerLendingCompany | | `19` | DisclosureCompany | | `20` | HomeWarrantyCompany | | `21` | PestControlCompany |' example: 0 slot: type: integer example: 1 minimum: 1 description: 'Determines the ordering of contacts of the same type: `1` = Buyer 1 / Seller 1, `2` = Buyer 2 / Seller 2, and so on.' prefix: type: string description: Name prefix (e.g. Mr., Dr.). suffix: type: string description: Name suffix (e.g. Jr.). firstname: type: string description: First name. middlename: type: string description: Middle name. lastname: type: string description: Last name. email: type: string format: email description: Email address. phone: type: string description: Primary phone number. cellPhone: type: string description: Cell phone number. workPhone: type: string description: Work phone number. fax: type: string description: Fax number. agentId: type: string description: Agent identifier. agentLicense: type: string description: Agent license number. companyName: type: string description: Company name. officeId: type: string description: Office identifier. officeLicense: type: string description: Office license number. escrowNumber: type: string description: Escrow number. address1: type: string description: Street address, line 1. address2: type: string description: Street address, line 2. address3: type: string description: Street address, line 3. address4: type: string description: Street address, line 4. locality: type: string description: City / locality. region: type: string description: State or province. postalCode: type: string description: Postal / ZIP code. country: type: string description: Country. llcPoa: type: string description: LLC / power of attorney designation. Error: type: object properties: error: type: string description: Error code or short error name. message: type: string description: Human-readable error description. additionalProperties: true responses: BadRequest: description: The request is malformed or contains invalid parameters. content: application/json: schema: $ref: '#/components/schemas/Error' NotFound: description: The requested resource does not exist. content: application/json: schema: $ref: '#/components/schemas/Error' Forbidden: description: The caller is not permitted to perform this operation. content: application/json: schema: $ref: '#/components/schemas/Error' Unauthorized: description: The access token is missing, invalid, or expired. content: application/json: schema: $ref: '#/components/schemas/Error' securitySchemes: bearerAuth: type: http scheme: bearer bearerFormat: JWT description: 'JWT access token obtained from the `/oauth/token` endpoint, sent as `Authorization: Bearer `.' subscriptionKey: type: apiKey in: header name: lw-subscription-key description: API subscription key issued by Lone Wolf, sent on every request.