openapi: 3.2.0 info: title: Lawmatics OAuth Contacts API version: 1.22.0 description: 'The official Lawmatics REST API for legal CRM, client intake and law firm automation. Manage matters (prospects), contacts, companies, custom forms and form entries, custom fields, events and appointments, tasks, notes, files, tags, users, time entries, expenses, invoices and transactions. Authentication is OAuth 2.0 authorization code grant; access tokens do not expire, there are no refresh tokens, and Lawmatics does not currently support scopes - an authorized app receives full CRUD access to the granted account. All list endpoints support the shared query-parameter grammar documented in the Param Guide: `fields` (field selection, one level deep, `fields=all` to expand), `page` (pagination), `sort_by`/`sort_order`, and `filter_by`/`filter_on`/`filter_with` (one filter at a time; operators `=`, `!=`, `<=`, `<`, `>=`, `>`, `like`, `ilike`, `null`, `not_null`). Responses follow a JSON:API-style `data` / `attributes` / `relationships` envelope.' contact: name: Lawmatics API Support email: api@lawmatics.com url: https://docs.lawmatics.com/ termsOfService: https://www.lawmatics.com/terms-of-use servers: - url: https://api.lawmatics.com description: Lawmatics production API security: - oauth2: [] - bearerAuth: [] tags: - name: Contacts description: 'A Contact can be thought of as a collection of data about a "Person". A Contact record is the base for all Contactables (Matters, Clients, and Companies). Since Contact data reflects a person, and is a base record, it is shared via any Contactable associated with the Contact. For Example: You be' paths: /v1/contacts/find_by_phone/{phone_number}: get: operationId: findContactByPhoneNumber summary: Find Contact By Phone Number description: Fuzzy find a specific Contact by Phone Number. tags: - Contacts parameters: - name: phone_number in: path required: true description: The phone number schema: type: string responses: '200': description: OK content: application/json: schema: type: object examples: getFindContactByPhoneNumber: summary: GET Find Contact By Phone Number value: data: id: '31556' type: contact attributes: first_name: test last_name: test email: test@nice.com phone: 123-123-1234 created_at: '2018-09-06T19:17:17.786-07:00' updated_at: '2018-09-10T16:31:58.836-07:00' relationships: {} '401': description: Unauthorized - missing or invalid OAuth 2.0 bearer token '429': description: Too Many Requests - the per-firm rate limit was exceeded; a Retry-After header is returned headers: Retry-After: description: Seconds to wait before retrying schema: type: integer /v1/contacts/find_by_email/{email_address}: get: operationId: findContactByEmailAddress summary: Find Contact By Email Address description: Fuzzy find a specific Contact by Email Address. tags: - Contacts parameters: - name: email_address in: path required: true description: The email address schema: type: string responses: '200': description: OK content: application/json: schema: type: object examples: getFindContactByEmailAddress: summary: GET Find Contact By Email Address value: data: id: '225' type: contact attributes: first_name: Existing last_name: Contact email: roey@lawmatics.com phone: 520-730-1042 created_at: '2018-07-17T10:32:50.009-07:00' updated_at: '2019-03-28T20:17:41.198-07:00' relationships: {} '401': description: Unauthorized - missing or invalid OAuth 2.0 bearer token '429': description: Too Many Requests - the per-firm rate limit was exceeded; a Retry-After header is returned headers: Retry-After: description: Seconds to wait before retrying schema: type: integer /v1/contacts/find_by_name/{name}: get: operationId: findContactByName summary: Find Contact By Name description: Fuzzy find (case-insensitive) a specific Contact by their Name. You can pass either '{first_name} {last_name}' or simply '{first_name}' tags: - Contacts parameters: - name: name in: path required: true description: The name schema: type: string responses: '200': description: OK content: application/json: schema: type: object examples: getFindContactByName: summary: GET Find Contact By Name value: data: id: '76746' type: contact attributes: first_name: Roey last_name: Chasman email: null phone: null created_at: '2019-02-04T12:38:11.574-08:00' updated_at: '2019-02-04T12:38:11.574-08:00' relationships: {} '401': description: Unauthorized - missing or invalid OAuth 2.0 bearer token '429': description: Too Many Requests - the per-firm rate limit was exceeded; a Retry-After header is returned headers: Retry-After: description: Seconds to wait before retrying schema: type: integer /v1/custom_contact_types/{custom_contact_type_id}: get: operationId: getCustomContactType summary: Custom Contact Type description: A specific Custom Contact Type by ID tags: - Contacts parameters: - name: custom_contact_type_id in: path required: true description: The custom contact type id schema: type: string responses: '200': description: OK content: application/json: schema: type: object examples: getCustomContactType: summary: GET Custom Contact Type value: data: id: '15' type: custom_contact_type attributes: name: Judge created_at: '2023-09-21T15:52:24.996-07:00' updated_at: '2023-09-21T15:52:24.996-07:00' relationships: {} '401': description: Unauthorized - missing or invalid OAuth 2.0 bearer token '429': description: Too Many Requests - the per-firm rate limit was exceeded; a Retry-After header is returned headers: Retry-After: description: Seconds to wait before retrying schema: type: integer delete: operationId: deleteCustomContactType summary: Delete Custom Contact Type description: 'Delete an existing Custom Contact Type by ID. Warning: This is irreversible!' tags: - Contacts parameters: - name: custom_contact_type_id in: path required: true description: The custom contact type id schema: type: string responses: '200': description: OK content: application/json: schema: type: object examples: deleteDeleteCustomContactType: summary: DELETE Delete Custom Contact Type value: data: id: '15' type: custom_contact_type attributes: name: Pudge created_at: '2023-09-21T15:49:44.773-07:00' updated_at: '2023-09-21T15:52:02.257-07:00' relationships: {} '401': description: Unauthorized - missing or invalid OAuth 2.0 bearer token '429': description: Too Many Requests - the per-firm rate limit was exceeded; a Retry-After header is returned headers: Retry-After: description: Seconds to wait before retrying schema: type: integer /v1/custom_contact_types: get: operationId: getCustomContactTypes summary: Custom Contact Types description: A paginated list of all Custom Contact Type in Lawmatics tags: - Contacts responses: '200': description: OK content: application/json: schema: type: object examples: getCustomContactTypes: summary: GET Custom Contact Types value: data: - id: '15' type: custom_contact_type attributes: name: Judge created_at: '2023-09-21T15:31:26.656-07:00' updated_at: '2023-09-21T15:31:26.656-07:00' relationships: {} - id: '12' type: custom_contact_type attributes: name: test2 created_at: '2023-09-21T11:00:26.002-07:00' updated_at: '2023-09-21T11:00:26.002-07:00' relationships: {} - id: '10' type: custom_contact_type attributes: name: test created_at: '2023-09-05T10:50:34.586-07:00' updated_at: '2023-09-21T11:00:04.446-07:00' relationships: {} - id: '7' type: custom_contact_type attributes: name: Cool Person created_at: '2023-08-10T21:13:53.027-07:00' updated_at: '2023-08-10T21:13:53.027-07:00' relationships: {} - id: '2' type: custom_contact_type attributes: name: Client created_at: '2023-07-21T14:56:35.146-07:00' updated_at: '2023-07-21T14:56:35.146-07:00' relationships: {} meta: total_pages: 1 limit_per_page: 25 total_entries: 5 links: self: /v1/custom_contact_types?page=1 getFilteredCustomContactTypes: summary: GET Filtered Custom Contact Types value: data: - id: '15' type: custom_contact_type attributes: name: Judge created_at: '2023-09-21T15:31:26.656-07:00' updated_at: '2023-09-21T15:31:26.656-07:00' relationships: {} meta: total_pages: 1 limit_per_page: 25 total_entries: 1 links: self: /v1/custom_contact_types?page=1 '401': description: Unauthorized - missing or invalid OAuth 2.0 bearer token '429': description: Too Many Requests - the per-firm rate limit was exceeded; a Retry-After header is returned headers: Retry-After: description: Seconds to wait before retrying schema: type: integer post: operationId: createCustomContactType summary: Create Custom Contact Type description: Create a new Custom Contact Type tags: - Contacts requestBody: required: true content: application/json: schema: type: object example: name: Judge-6f3bc6c0-98c7-4473-be46-62976e472353 responses: '201': description: Created content: application/json: schema: type: object examples: postCreateCustomContactType: summary: POST Create Custom Contact Type value: data: id: '15' type: custom_contact_type attributes: name: Judge created_at: '2023-09-21T15:49:44.773-07:00' updated_at: '2023-09-21T15:49:44.773-07:00' relationships: {} '401': description: Unauthorized - missing or invalid OAuth 2.0 bearer token '429': description: Too Many Requests - the per-firm rate limit was exceeded; a Retry-After header is returned headers: Retry-After: description: Seconds to wait before retrying schema: type: integer /v1/custom_contact_types/{contact_id}: put: operationId: updateCustomContactType summary: Update Custom Contact Type description: Update an existing Custom Contact Type by ID. tags: - Contacts parameters: - name: contact_id in: path required: true description: The contact id schema: type: string requestBody: required: true content: application/json: schema: type: object example: name: Pudge responses: '200': description: OK content: application/json: schema: type: object examples: putPATCHUpdateCustomContactType: summary: PUT/PATCH Update Custom Contact Type value: data: id: '15' type: custom_contact_type attributes: name: Pudge created_at: '2023-09-21T11:00:26.002-07:00' updated_at: '2023-09-21T15:43:39.161-07:00' relationships: {} '401': description: Unauthorized - missing or invalid OAuth 2.0 bearer token '429': description: Too Many Requests - the per-firm rate limit was exceeded; a Retry-After header is returned headers: Retry-After: description: Seconds to wait before retrying schema: type: integer /v1/contacts/{contact_id}: get: operationId: getContact summary: Contact description: A specific Contact by id tags: - Contacts parameters: - name: contact_id in: path required: true description: The contact id schema: type: string responses: '200': description: OK content: application/json: schema: type: object examples: getContact: summary: GET Contact value: data: id: '25' type: contact attributes: first_name: Gregor last_name: Clegane email: gregor@clegane.com email_address: gregor@clegane.com phone: null phone_number: null birthdate: null name_prefix: null middle_name: null name_suffix: null informal_name: null employer: null occupation: null citizenship: null bio: null title: null hobbies: null social_security: null age: null driver_license: null gender: null marital_status: null timezone: null tracking_source_id: null date_of_last_contact: '2018-03-07T13:38:58.288-08:00' days_since_last_contact: 223 photo_url: https://lm.lawmatics.com/attachments/0f060d4bbd3d8a2488c3f0b3352ce3ec0c9b6f3c/store/a49240eaa2d0bb7355b82b010b07a2c8f72c4d514b70616198d522266d48/photo custom_fields: [] contact_type: PNC created_at: '2018-03-07T13:38:58.288-08:00' updated_at: '2018-03-13T08:09:50.696-07:00' relationships: prospects: data: - id: '21' type: prospect created_by: data: id: '15' type: user client: data: null company: data: null '401': description: Unauthorized - missing or invalid OAuth 2.0 bearer token '429': description: Too Many Requests - the per-firm rate limit was exceeded; a Retry-After header is returned headers: Retry-After: description: Seconds to wait before retrying schema: type: integer put: operationId: updateContact summary: Update Contact description: 'Update an existing Contact by ID. Passing Custom Field id and value, will set the custom field value on the Contact, and overwrite any existing value. Passing null as the value will clear it out.' tags: - Contacts parameters: - name: contact_id in: path required: true description: The contact id schema: type: string requestBody: required: true content: application/json: schema: type: object example: first_name: Lawmatics last_name: ExampleChanged email: roey+changed@lawmatics.com phone: 555-555-5555 notes: - name: Cool Note body: This is a long form sweet new note responses: '200': description: OK content: application/json: schema: type: object examples: putPATCHUpdateContact: summary: PUT/PATCH Update Contact value: data: id: '161260' type: contact attributes: first_name: Lawmatics last_name: ExampleChanged email: roey+changed@lawmatics.com custom_fields: - id: 4788 name: text field_type: string value: Changed String formatted_value: Changed String - id: 4788 name: text field_type: string value: Changed String formatted_value: Changed String relationships: {} '401': description: Unauthorized - missing or invalid OAuth 2.0 bearer token '429': description: Too Many Requests - the per-firm rate limit was exceeded; a Retry-After header is returned headers: Retry-After: description: Seconds to wait before retrying schema: type: integer delete: operationId: deleteContact summary: Delete Contact description: 'Delete an existing Contact by ID. Warning: This is irreversible!' tags: - Contacts parameters: - name: contact_id in: path required: true description: The contact id schema: type: string responses: '200': description: OK content: application/json: schema: type: object examples: deleteDeleteContact: summary: DELETE Delete Contact value: data: id: '161260' type: contact attributes: first_name: Lawmatics last_name: ExampleChanged email: null phone: null created_at: '2021-08-27T15:36:02.920-07:00' updated_at: '2021-08-27T15:40:57.045-07:00' relationships: {} '401': description: Unauthorized - missing or invalid OAuth 2.0 bearer token '429': description: Too Many Requests - the per-firm rate limit was exceeded; a Retry-After header is returned headers: Retry-After: description: Seconds to wait before retrying schema: type: integer /v1/contacts: get: operationId: getContacts summary: Contacts description: A paginated list of all Contacts in Lawmatics tags: - Contacts responses: '200': description: OK content: application/json: schema: type: object examples: getContacts: summary: GET Contacts value: data: - id: '136' type: contact attributes: first_name: Linda last_name: Baker email: Linda35@gmail.com created_at: '2018-03-20T15:12:57.664-07:00' updated_at: '2018-07-16T15:12:57.669-07:00' relationships: {} - id: '135' type: contact attributes: first_name: James last_name: Lee email: James34@gmail.com created_at: '2018-04-18T15:12:57.598-07:00' updated_at: '2018-07-16T15:12:57.605-07:00' relationships: {} - id: '134' type: contact attributes: first_name: Barbara last_name: Martiniez email: Barbara33@gmail.com created_at: '2018-06-21T15:12:57.524-07:00' updated_at: '2018-07-16T15:12:57.529-07:00' relationships: {} - id: '133' type: contact attributes: first_name: Charles last_name: Williams email: Charles32@gmail.com created_at: '2018-03-19T15:12:57.445-07:00' updated_at: '2018-07-16T15:12:57.450-07:00' relationships: {} - id: '132' type: contact attributes: first_name: Joseph last_name: Moore email: Joseph31@gmail.com created_at: '2018-06-28T15:12:57.380-07:00' updated_at: '2018-07-16T15:12:57.384-07:00' relationships: {} - id: '131' type: contact attributes: first_name: Joseph last_name: Rodriguez email: Joseph30@gmail.com created_at: '2018-06-10T15:12:57.310-07:00' updated_at: '2018-07-16T15:12:57.317-07:00' relationships: {} - id: '130' type: contact attributes: first_name: Susan last_name: Smith email: Susan29@gmail.com created_at: '2018-04-16T15:12:57.232-07:00' updated_at: '2018-07-16T15:12:57.238-07:00' relationships: {} - id: '129' type: contact attributes: first_name: Richard last_name: Miller email: Richard28@gmail.com created_at: '2018-06-23T15:12:57.164-07:00' updated_at: '2018-07-16T15:12:57.169-07:00' relationships: {} - id: '128' type: contact attributes: first_name: Barbara last_name: Moore email: Barbara27@gmail.com created_at: '2018-05-01T15:12:57.102-07:00' updated_at: '2018-07-16T15:12:57.107-07:00' relationships: {} - id: '127' type: contact attributes: first_name: William last_name: Walker email: William26@gmail.com created_at: '2018-04-04T15:12:57.039-07:00' updated_at: '2018-07-16T15:12:57.044-07:00' relationships: {} - id: '126' type: contact attributes: first_name: Patricia last_name: Jones email: Patricia25@gmail.com created_at: '2018-02-14T14:12:56.978-08:00' updated_at: '2018-07-16T15:12:56.983-07:00' relationships: {} - id: '125' type: contact attributes: first_name: Sarah last_name: Wilson email: Sarah24@gmail.com created_at: '2018-04-09T15:12:56.918-07:00' updated_at: '2018-07-16T15:12:56.923-07:00' relationships: {} - id: '124' type: contact attributes: first_name: Susan last_name: Davis email: Susan23@gmail.com created_at: '2018-01-26T14:12:56.855-08:00' updated_at: '2018-07-16T15:12:56.860-07:00' relationships: {} - id: '123' type: contact attributes: first_name: Richard last_name: Taylor email: Richard22@gmail.com created_at: '2018-05-02T15:12:56.790-07:00' updated_at: '2018-07-16T15:12:56.796-07:00' relationships: {} - id: '122' type: contact attributes: first_name: Karen last_name: Lee email: Karen21@gmail.com created_at: '2018-07-04T15:12:56.724-07:00' updated_at: '2018-07-16T15:12:56.729-07:00' relationships: {} - id: '121' type: contact attributes: first_name: David last_name: Martiniez email: David20@gmail.com created_at: '2018-04-22T15:12:56.658-07:00' updated_at: '2018-07-16T15:12:56.664-07:00' relationships: {} - id: '120' type: contact attributes: first_name: Patricia last_name: Martiniez email: Patricia19@gmail.com created_at: '2018-01-28T14:12:56.585-08:00' updated_at: '2018-07-16T15:12:56.591-07:00' relationships: {} - id: '119' type: contact attributes: first_name: Susan last_name: Lee email: Susan18@gmail.com created_at: '2018-05-18T15:12:56.504-07:00' updated_at: '2018-07-16T15:12:56.509-07:00' relationships: {} - id: '118' type: contact attributes: first_name: Joseph last_name: Lee email: Joseph17@gmail.com created_at: '2018-02-01T14:12:56.442-08:00' updated_at: '2018-07-16T15:12:56.446-07:00' relationships: {} - id: '117' type: contact attributes: first_name: Joseph last_name: Baker email: Joseph16@gmail.com created_at: '2018-02-19T14:12:56.384-08:00' updated_at: '2018-07-16T15:12:56.388-07:00' relationships: {} - id: '116' type: contact attributes: first_name: Lisa last_name: Johnson email: Lisa15@gmail.com created_at: '2018-04-08T15:12:56.327-07:00' updated_at: '2018-07-16T15:12:56.331-07:00' relationships: {} - id: '115' type: contact attributes: first_name: Sarah last_name: Brown email: Sarah14@gmail.com created_at: '2018-06-06T15:12:56.269-07:00' updated_at: '2018-07-16T15:12:56.273-07:00' relationships: {} - id: '114' type: contact attributes: first_name: Robert last_name: Jackson email: Robert13@gmail.com created_at: '2018-05-08T15:12:56.212-07:00' updated_at: '2018-07-16T15:12:56.216-07:00' relationships: {} - id: '113' type: contact attributes: first_name: Sarah last_name: Taylor email: Sarah12@gmail.com created_at: '2018-04-03T15:12:56.151-07:00' updated_at: '2018-07-16T15:12:56.156-07:00' relationships: {} - id: '112' type: contact attributes: first_name: Lisa last_name: Johnson email: Lisa11@gmail.com created_at: '2018-03-01T14:12:56.087-08:00' updated_at: '2018-07-16T15:12:56.092-07:00' relationships: {} meta: total_pages: 11 limit_per_page: 25 total_entries: 261 links: self: /v1/contact?page=6 next: /v1/contact?page=7 prev: /v1/contact?page=5 '401': description: Unauthorized - missing or invalid OAuth 2.0 bearer token '429': description: Too Many Requests - the per-firm rate limit was exceeded; a Retry-After header is returned headers: Retry-After: description: Seconds to wait before retrying schema: type: integer post: operationId: createContact summary: Create Contact description: Create a new Contact tags: - Contacts requestBody: required: true content: application/json: schema: type: object example: first_name: Lawmatics last_name: Example email: fake@lawmatics.com phone: 123-123-1234 notes: - name: Example Note body: Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. responses: '201': description: Created content: application/json: schema: type: object examples: postCreateContact: summary: POST Create Contact value: data: id: '161257' type: contact attributes: first_name: Lawmatics last_name: Example email: roey@lawmatics.com phone: 123-123-1234 custom_fields: - id: 4788 name: text field_type: string value: Contact String formatted_value: Contact String - id: 4788 name: text field_type: string value: Contact String formatted_value: Contact String relationships: {} '401': description: Unauthorized - missing or invalid OAuth 2.0 bearer token '429': description: Too Many Requests - the per-firm rate limit was exceeded; a Retry-After header is returned headers: Retry-After: description: Seconds to wait before retrying schema: type: integer components: securitySchemes: oauth2: type: oauth2 description: OAuth 2.0 authorization code grant. Register a developer app at https://app.lawmatics.com/settings/developers (developer settings must be enabled by Lawmatics support). Access tokens are non-expiring; no refresh tokens are issued and scopes are not supported. flows: authorizationCode: authorizationUrl: https://app.lawmatics.com/oauth/authorize tokenUrl: https://api.lawmatics.com/oauth/token scopes: {} bearerAuth: type: http scheme: bearer description: 'The OAuth 2.0 access token is sent as `Authorization: Bearer `.' externalDocs: description: Official Lawmatics RESTful API documentation (Postman) url: https://docs.lawmatics.com/ x-provenance: generated: '2026-08-13' method: derived publisher: API Evangelist source: https://docs.lawmatics.com/api/collections/26379991/2sA3JM7gbw?segregateAuth=true&versionTag=latest source_type: Postman collection published by Lawmatics as its official API documentation source_file: postman/lawmatics-oauth-api.postman_collection.json note: 'NOT published by Lawmatics. Lawmatics publishes no OpenAPI. Every path, method, parameter, request example and response example in this document was converted mechanically from the provider-published Postman collection "Lawmatics OAuth API v1.22.0"; nothing was invented. Schemas are typed as generic objects because the collection carries examples, not JSON Schema. The server URL is the base documented in the collection Param Guide (https://api.lawmatics.com), not the collection''s disabled {{host}} placeholder. The 401 and 429 responses added to every authenticated operation are the provider-documented, globally applicable responses: the collection''s auth guide states a per-firm rate limit applies to all endpoints and returns 429 with a Retry-After header, and https://api.lawmatics.com/v1/contacts was observed returning 401 unauthenticated on 2026-08-13.'