# ContactManager REST / JSON API
Base URL: {BaseUrl}Api/ContactManager.svc
All routes below are relative to that base URL. All responses are JSON. Only methods carrying an explicit [OperationContract] + [WebGet]/[WebInvoke] attribute in the source are reachable here — everything else in the underlying class is SOAP-only (see SOAP.md).
Every call other than LoginSecure requires a prior successful login on the same cookie-aware session (see README.md) — nearly all of them silently return an empty/default value instead of an HTTP error if you're not authenticated, so check IsAuthenticated if a call keeps coming back empty.
# Login
# POST LoginSecure
Logs in and establishes the session, same as the SOAP Login method underneath. This is the only supported REST login endpoint — the older query-string-based Login route still exists on the wire for backward compatibility with existing integrations, but is intentionally not documented here; new integrations should use LoginSecure.
Request body (JSON):
{
"userName": "someone@example.com",
"password": "..."
}
- Keys are case-sensitive — exactly
userNameandpassword, lowercase first letter. Any other casing (UserName,Username, etc.) will silently fail to bind, and the call will just returnfalseas if the credentials were wrong. - If
userNamecontains@and the target environment hasEnableOffice365Loginturned on:passwordmust be a Microsoft Graph bearer access token for that user (obtained via your own OAuth flow against Entra ID, e.g. device-code or auth-code+PKCE — this endpoint doesn't perform the M365 sign-in itself). The server validates the token against Microsoft Graph/v1.0/meand matches the returned account to an existing ContactManager user. - Otherwise,
passwordis treated as a literal ContactManager password.
Response: true on success, false on failure (wrong credentials, token didn't match any CM user, etc. — no distinction is made in the response).
On success, the response sets the session/Forms-auth cookies — your HTTP client must preserve and resend them (CookieContainer in .NET, -SessionVariable/-WebSession in PowerShell) for every subsequent call.
# GET IsAuthenticated
Returns true/false for whether the current session is logged in. Good sanity check right after LoginSecure.
# GET GetCurrentUserName
Returns the logged-in CM user's name, or "" if not authenticated. Useful to confirm who actually got logged in (e.g. after an M365 token login, to confirm it resolved to the expected CM user).
# GET GetCurrentContactID
Returns the Contact ID linked to the current user ("0" if none / not authenticated).
# GET GetCurrentUserLanguage
Returns the current user's culture/language code (falls back to the domain default if the user has none set, or the call isn't authenticated).
# POST Logout
Clears the session and signs out of Forms Authentication. Returns false if not authenticated to begin with, true otherwise.
# POST ChangeDefaultCulture
Route: POST ChangeDefaultCulture?cultureCode={cultureCode}. Switches the session's culture to cultureCode (case-insensitive match against the domain's registered cultures). Returns an empty body on success; throws (HTTP 500) if the culture isn't registered.
# Fetch — single record by ID
| Method | Route | Params | Returns | Notes |
|---|---|---|---|---|
| GetItem | GET GetItem/{ID} | ID (path) | Item | Generic record lookup by ID |
| GetItemByExternalID | GET GetItemByExternalID/{type}/{application}/{externalID} | type, application, externalID (path) | polymorphic (Company/CompanyDepartment/Person/Employee/Matter/Address/Attendee/Item) | |
| GetItemsByEmailAddress | GET GetItemsByEmailAddress/{emailaddresses} | emailaddresses (path, ;-separated) | Item[] | |
| GetLocation | GET GetLocation/{ID} | ID (path) | Item | Looks up a Location directly by ID, or via a contact/address's associated location |
| GetExternalCode | GET GetExternalCode/{ID}/{application} | ID, application (path) | string | |
| GetExternalID | GET GetExternalID/{ID}/{application} | ID, application (path) | string | |
| GetContact | GET GetContact/{ID} | ID (path) | polymorphic (Company/CompanyDepartment/Person/Employee/Item) | |
| GetContact2 | GET GetContact2/{ID} | ID (path) | polymorphic (Company2/CompanyDepartment/Person2/Employee2/Item) | Extended-field version of GetContact |
| GetContactByExternalID | GET GetContactByExternalID/{type}/{application}/{externalID} | type, application, externalID (path) | polymorphic (Company/CompanyDepartment/Person/Employee/Item) | |
| GetContactLookupItems | GET GetContactLookupItems/{id}/{fields} | id, fields (path, ,-separated field names) | FieldItems[] | Returns lookup-item collections for named fields on a contact |
| GetPerson | GET GetPerson/{ID} | ID (path) | Person | Also resolves via an Employee's linked Person if ID isn't a Person directly |
| GetPerson2 | GET GetPerson2/{ID} | ID (path) | Person2 | Extended-field version |
| GetIdentification | GET GetIdentification/{ID} | ID (path) | Identification | ID may be a Company or Person |
| GetAddress | GET GetAddress/{ID}/{originatingCountryCode} | ID, originatingCountryCode (path) | Address | |
| GetAddress2 | GET GetAddress2/{ID}/{originatingCountryCode} | ID, originatingCountryCode (path) | Address2 | Extended-field version |
| GetCompany | GET GetCompany/{ID} | ID (path) | Company | Also resolves via an Employee's or CompanyDepartment's linked Company |
| GetCompany2 | GET GetCompany2/{ID} | ID (path) | Company2 | Extended-field version |
| GetAttendee | GET GetAttendee/{ID} | ID (path) | Attendee | |
| GetEmployee | GET GetEmployee/{ID} | ID (path) | Employee | |
| GetEmployee2 | GET GetEmployee2/{ID} | ID (path) | Employee2 | Extended-field version |
| GetMatter | GET GetMatter/{ID} | ID (path) | Matter | |
| GetMatter2 | GET GetMatter2/{ID} | ID (path) | Matter2 | Extended-field version |
| GetMatter3 | GET GetMatter3/{ID} | ID (path) | Matter3 | Further-extended-field version |
| GetCompanyDepartment | GET GetCompanyDepartment/{ID} | ID (path) | CompanyDepartment | |
| GetUserNameForContact | GET GetUserNameForContact/{ID} | ID (path) | string | CM login name for a Contact's linked user, "" if none |
| GetUserIDForContact | GET GetUserIDForContact/{ID} | ID (path) | string | CM user ID for a Contact's linked user, "" if none |
| GetContactByUserName | GET GetContactByUserName/{userName} | userName (path) | polymorphic (Company/CompanyDepartment/Person/Employee/Item) | Reverse lookup of GetUserNameForContact |
| GetLookupItem | GET GetLookupItem/{type}/{ID} | type, ID (path) | Item | Single lookup item by type name and ID/code |
# Fetch — collections / related records
| Method | Route | Params | Returns | Notes |
|---|---|---|---|---|
| GetMatters | GET GetMatters/{ID}?includeRelated={includeRelated}&includeArchived={includeArchived} | ID (path); includeRelated, includeArchived (query, bool) | Matter[] | Matters for a given contact |
| GetAddresses | GET GetAddresses/{ID}/{originatingCountryCode} | ID, originatingCountryCode (path) | Address[] | All addresses for a contact or location |
| GetEmployees | GET GetEmployees/{ID} | ID (path) | Employee[] | Employees of a company, or employers of a person |
| GetContacts | GET GetContacts/{IDs} | IDs (path, ,-separated) | polymorphic[] (Company/CompanyDepartment/Person/Employee/Item) | Batch fetch by ID list |
| GetValues | GET GetValues/{ID}/{fields} | ID, fields (path, ,-separated) | object[] | Generic reflection-based field-value reader on any record |
| GetCommunicationItems | GET GetCommunicationItems/{ID} | ID (path) | Item[] | Communication items (extra phone/email/etc entries) for a contact, including linked person/company for employees |
| GetLookupItems | GET GetLookupItems/{type}?includeInActive={includeInActive} | type (path); includeInActive (query, bool) | Item[] | All lookup items of a given type |
| GetAddresseeFormatTypes | GET GetAddresseeFormatTypes | — | Item[] | |
| GetAttendees | GET GetAttendees/{activityID}?numberOfRecords={numberOfRecords} | activityID (path); numberOfRecords (query, int) | Item[] | Attendees of an activity/matter, first entry is the client |
| GetAttendees2 | GET GetAttendees2/{activityID} | activityID (path) | Attendee[] | Extended-field version, no record limit |
| GetInternalItems | GET GetInternalItems?namePrefix={namePrefix}&includeFolders={includeFolders} | namePrefix, includeFolders (query) | Item[] | Internal (employee) contacts matching a name prefix; result is cached |
| GetExternalItems | GET GetExternalItems?namePrefix={namePrefix}&includeFolders={includeFolders} | namePrefix, includeFolders (query) | Item[] | External contacts from all visible folders except internal/public, capped at 250 records |
| GetExternalItems2 | GET GetExternalItems2?namePrefix={namePrefix}&includeFolders={includeFolders}&numberOfRecords={numberOfRecords} | namePrefix, includeFolders, numberOfRecords (query) | Item[] | Same as GetExternalItems but with a caller-specified record limit |
| GetItems | GET GetItems?namePrefix={namePrefix}&includeFolders={includeFolders}&numberOfRecords={numberOfRecords} | namePrefix, includeFolders, numberOfRecords (query) | Item[] | Internal + external contacts from your visible folders |
| GetAllItems | GET GetAllItems?namePrefix={namePrefix}&includeInternalContacts={includeInternalContacts}&numberOfRecords={numberOfRecords} | namePrefix, includeInternalContacts, numberOfRecords (query) | Item[] | All contacts matching a name prefix |
| GetItemsFromFolder | GET GetItemsFromFolder/{folderID}?namePrefix={namePrefix}&includeFolders={includeFolders}&recursive={recursive} | folderID (path); namePrefix, includeFolders, recursive (query) | Item[] | |
| GetFoldersByName | GET GetFoldersByName?namePrefix={namePrefix}&numberOfRecords={numberOfRecords} | namePrefix, numberOfRecords (query) | Item[] | |
| GetFolders | GET GetFolders/{folderID} | folderID (path) | Item[] | Subfolders of a folder (or the workspace root if folderID doesn't resolve) |
| GetSearchTypes | GET GetSearchTypes | — | Item[] | Configured quick-search types |
| GetRevision | GET GetRevision | — | int | Current CM build revision number |
# Search
| Method | Route | Params | Returns | Notes |
|---|---|---|---|---|
| SearchContacts | GET SearchContacts/{searchType}?q={searchValue}&top={numberOfRecords} | searchType (path: Contact/Company/CompanyDepartment/Employee/Person, or c/cd/e/p shorthand); q, top (query) | Item[] | Free-text search; q may not start with a bare */? wildcard |
| SearchContactsByPhone | GET SearchContactsByPhone?phone={phone} | phone (query) | Contact[] | |
| SearchContactsByEmail | GET SearchContactsByEmail?email={email} | email (query) | Item[] | |
| SearchMatters | GET SearchMatters?matterCode={matterCode}&matterName={matterName}&orderBy={orderBy}&numberOfRecords={numberOfRecords} | matterCode, matterName (query, * wildcard supported); orderBy (query, int — 0=None/1=Code/2=Name); numberOfRecords (query) | Matter[] | Searches active and inactive matters; at least one of matterCode/matterName is required |
| SearchActiveMatters | GET SearchActiveMatters?matterCode={matterCode}&matterName={matterName}&orderBy={orderBy}&numberOfRecords={numberOfRecords} | same as SearchMatters | Matter[] | Same as SearchMatters, restricted to non-completed matters |
# Addressing / mail-merge helpers
These render formatted names/addresses server-side (localization, custom attention/salutation rules, etc.) rather than returning raw record data.
| Method | Route | Returns | Notes |
|---|---|---|---|
| GetContactPostalAddressee2 | GET GetContactPostalAddressee2/{ID}?attentionType=&countryCode=&languageCode=&showDepartment=&showJobTitle=&ignoreCustomAttention= | string | Formatted postal address block for a contact |
| GetContactPostalAddressee | GET GetContactPostalAddressee/{ID}?attentionType=&countryCode=&languageCode=&showDepartment=&showJobTitle=&ignoreCustomAttention= | string | Same, showDepartment/showJobTitle are plain bool here instead of tri-state string |
| GetContactVisitorsAddressee2 | GET GetContactVisitorsAddressee2/{ID}?attentionType=&countryCode=&languageCode=&showDepartment=&showJobTitle=&ignoreCustomAttention= | string | Visitor-address version of the above |
| GetContactVisitorsAddressee | GET GetContactVisitorsAddressee/{ID}?attentionType=&countryCode=&languageCode=&showDepartment=&showJobTitle=&ignoreCustomAttention= | string | |
| GetContactAddressee2 | GET GetContactAddressee2/{ID}?AddressID=&attentionType=&countryCode=&languageCode=&showDepartment=&showJobTitle=&ignoreCustomAttention= | string | Addressee for a specific AddressID rather than the default postal/visitor address |
| GetContactAddressee | GET GetContactAddressee/{ID}?AddressID=&attentionType=&countryCode=&languageCode=&showDepartment=&showJobTitle=&ignoreCustomAttention= | string | |
| GetItemMailMerge2 | GET GetItemMailMerge2/{IDs}?usePostalAddress=&countryCode=&languageCode=&attentionType=&ignoreCustomAttention=&showDepartment=&showJobTitle=&addresseeFormatType=&ignoreCustomSalutation=&attentionTypeName= | ItemMailMerge[] | IDs is ,-separated; returns addressee/salutation/attention plus contact details for each |
| GetItemMailMerge | GET GetItemMailMerge/{IDs}?usePostalAddress=&countryCode=&languageCode=&attentionType=&ignoreCustomAttention=&showDepartment=&showJobTitle=&addresseeFormatType=&ignoreCustomSalutation=&attentionTypeName= | ItemMailMerge[] | Same, showDepartment/showJobTitle are plain bool |
| GetSalutation | GET GetSalutation/{ID}?addresseeFormatType=&languageCode=&ignoreCustomSalutation= | string | |
| GetAttention | GET GetAttention/{ID}?attentionType=&languageCode=&ignoreCustomAttention= | string |
# Write (REST)
Full behavioral detail (matching logic, required fields, concurrency handling, etc.) for each of these is documented in SOAP.md — same underlying method, same behavior, just a different transport. Body-based methods (marked "JSON body") take the whole entity as the POST body, same shape as the corresponding Get* method's response; query-string methods take primitive params in the URL.
| Method | Route | Params | Returns | Notes |
|---|---|---|---|---|
| SavePerson2 | POST SavePerson2 | Person2 (JSON body) | long (ID) | See SOAP.md |
| SaveCompany2 | POST SaveCompany2 | Company2 (JSON body) | long (ID) | See SOAP.md |
| SaveEmployee2 | POST SaveEmployee2 | Employee2 (JSON body) | long (ID) | See SOAP.md |
| SaveAddress2 | POST SaveAddress2 | Address2 (JSON body) | long (ID) | See SOAP.md |
| SaveMatter3 | POST SaveMatter3 | Matter3 (JSON body) | long (ID) | See SOAP.md |
| SaveIdentification | POST SaveIdentification | Identification (JSON body) | long (ID) | Updates an existing record only — see SOAP.md |
| SaveAttendee | POST SaveAttendee | Attendee (JSON body) | long (ID) | See SOAP.md |
| SaveLookupItem | POST SaveLookupItem | Item (JSON body) | long (ID) | See SOAP.md |
| SaveActivity | POST SaveActivity?id={id}&activityType={activityType}&contactID={contactID}&subject={subject}&activityDate={activityDate}&ownerID={ownerID}&location={location}&docUrl={docUrl}&attendeesIDs={attendeesIDs} | query-string, see route | long (ID) | See SOAP.md |
| SaveActivityDescription | POST SaveActivityDescription?id={id}&description={description}&documentUrl={documentUrl} | query-string | bool | Existing activity only — see SOAP.md |
| DeleteAttendee | POST DeleteAttendee?id={id} | query-string | bool | See SOAP.md |
| DeDuplicate | POST DeDuplicate?masterID={masterID}&duplicateID={duplicateID} | query-string | string | Returns a result/error message string, not an HTTP error — see SOAP.md |
| SaveSynchronizableRecord | POST SaveSynchronizableRecord?id={id}&application={application}&externalID={externalID}&externalCode={externalCode}&markAsDirty={markAsDirty} | query-string | long (ID) | Attaches/updates an external-system sync record on an existing record identified by id. Returns 0 if id didn't resolve. |
SetValue (generic reflection-based field setter) remains SOAP-only — see SOAP.md.
# Entity shapes referenced above
None of these DTOs use [DataContract]/[DataMember] — they're plain public fields/properties, so the JSON key names below are exactly the C# names (PascalCase), verified directly against src/Web/Api/*.cs. The "2"/"3" variants are supersets — every field on the base type also appears (with the same name) on its extended version.
# Item
The generic, lightweight record shape used across most Get/Search results.
{
"ID": "50391",
"IsFolder": false,
"ObjectType": "Person",
"DisplayName": "Van Velzen, Mevr. J.",
"LocationName": "Amsterdam Office",
"EmailAddress": "jane.vanvelzen@example.com",
"PhoneNumber": "+31 20 123 4567",
"FaxNumber": "",
"MobileNumber": "+31 6 1234 5678",
"Website": "",
"AddressSummary": "Herengracht 1, 1015 BA Amsterdam",
"AddressSummaryLong": "Herengracht 1\n1015 BA Amsterdam\nNetherlands",
"Extra": ""
}
# FieldItems
Returned by GetContactLookupItems — one per requested field name, each with its resolved lookup items (Item shape above).
{
"Field": "Language",
"Items": [
{ "ID": "1", "IsFolder": false, "ObjectType": "Language", "DisplayName": "English", "LocationName": "", "EmailAddress": "", "PhoneNumber": "", "FaxNumber": "", "MobileNumber": "", "Website": "", "AddressSummary": "", "AddressSummaryLong": "", "Extra": "EN" }
]
}
# Person2 (Person is the same shape minus the fields after VersionID)
{
"ID": "50391",
"ObjectType": "Person",
"DisplayName": "Van Velzen, Mevr. J.",
"LastName": "Van Velzen",
"LastNamePrefixLastName": "Van Velzen",
"FirstName": "Jane",
"Initials": "J.",
"LastNamePrefix": "Van",
"Title": "Mevr.",
"PostTitle": "",
"Prefix": "",
"Suffix": "",
"EmailAddress": "jane.vanvelzen@example.com",
"PhoneNumber": "+31 20 123 4567",
"FaxNumber": "",
"MobileNumber": "+31 6 1234 5678",
"OtherNumber": "",
"Website": "",
"Language": "NL",
"Gender": "F",
"BirthDate": "1980-06-15T00:00:00",
"LocationName": "Amsterdam Office",
"LocationCode": "AMS",
"AddressSummary": "Herengracht 1, 1015 BA Amsterdam",
"AddressSummaryLong": "Herengracht 1\n1015 BA Amsterdam\nNetherlands",
"PostalAddressID": "50392",
"VisitorAddressID": "50392",
"Owner": { "ID": "17337", "IsFolder": false, "ObjectType": "Employee", "DisplayName": "J. Consultant", "LocationName": "", "EmailAddress": "", "PhoneNumber": "", "FaxNumber": "", "MobileNumber": "", "Website": "", "AddressSummary": "", "AddressSummaryLong": "", "Extra": "" },
"OwnerSub": null,
"VersionID": 3,
"ChristianNames": "Jane Elizabeth",
"CitizensServiceNumber": "",
"Partner": "",
"Nationality": "NL",
"BirthCity": "Amsterdam",
"BirthCountry": "NL",
"DeceasedDate": null,
"DeceasedCity": "",
"DeceasedCountry": "",
"LastNameFormat": null,
"InActive": false
}
# Company2 (Company is the same shape minus the fields after VisitorAddressID)
{
"ID": "26352",
"ObjectType": "Company",
"DisplayName": "Acme B.V.",
"Name": "Acme",
"OfficialName": "Acme B.V.",
"EmailAddress": "info@acme.example",
"PhoneNumber": "+31 20 987 6543",
"FaxNumber": "",
"MobileNumber": "",
"OtherNumber": "",
"Website": "www.acme.example",
"Language": "NL",
"DUNSNumber": "",
"ChamberOfCommerce": "12345678",
"LocationName": "Amsterdam Office",
"LocationCode": "AMS",
"AddressSummary": "Damrak 1, 1012 LG Amsterdam",
"AddressSummaryLong": "Damrak 1\n1012 LG Amsterdam\nNetherlands",
"PostalAddressID": "26353",
"VisitorAddressID": "26353",
"Owner": null,
"OwnerSub": null,
"PreviousName": "",
"RSINNumber": "1054294",
"TaxNumber": "",
"EntityType": "51",
"DateOfIncorporation": "1998-11-26T00:00:00",
"ArticlesOfAssociationDate": null,
"ChamberOfCommerceEstablishmentNumber": "",
"ChamberOfCommerceOffice": "",
"CorporateSeat": "Amsterdam",
"InActive": false,
"VersionID": 1
}
# Employee2 (Employee is the same shape minus the fields after VisitorAddressID; nested Company/Person are the base — not "2" — shapes)
{
"ID": "17337",
"ObjectType": "Employee",
"DisplayName": "J. Consultant",
"EmailAddress": "j.consultant@acme.example",
"PhoneNumber": "+31 20 987 6543",
"FaxNumber": "",
"MobileNumber": "+31 6 9876 5432",
"OtherNumber": "",
"Website": "",
"Language": "NL",
"Company": { "ID": "26352", "ObjectType": "Company", "DisplayName": "Acme B.V.", "Name": "Acme", "OfficialName": "Acme B.V.", "EmailAddress": "info@acme.example", "PhoneNumber": "+31 20 987 6543", "FaxNumber": "", "MobileNumber": "", "OtherNumber": "", "Website": "www.acme.example", "Language": "NL", "DUNSNumber": "", "ChamberOfCommerce": "12345678", "LocationName": "Amsterdam Office", "LocationCode": "AMS", "AddressSummary": "Damrak 1, 1012 LG Amsterdam", "AddressSummaryLong": "Damrak 1\n1012 LG Amsterdam\nNetherlands", "PostalAddressID": "26353", "VisitorAddressID": "26353" },
"Person": { "ID": "50391", "ObjectType": "Person", "DisplayName": "J. Consultant", "LastName": "Consultant", "LastNamePrefixLastName": "Consultant", "FirstName": "Jane", "Initials": "J.", "LastNamePrefix": "", "Title": "", "PostTitle": "", "Prefix": "", "Suffix": "", "EmailAddress": "j.consultant@acme.example", "PhoneNumber": "", "FaxNumber": "", "MobileNumber": "", "OtherNumber": "", "Website": "", "Language": "NL", "Gender": "F", "BirthDate": "0001-01-01T00:00:00", "LocationName": "", "LocationCode": "", "AddressSummary": "", "AddressSummaryLong": "", "PostalAddressID": "", "VisitorAddressID": "" },
"AddressLine": "",
"JobTitle": "Senior Consultant",
"JobFunction": "Consultant",
"DepartmentCode": "LEGAL",
"DepartmentName": "Legal",
"LocationName": "Amsterdam Office",
"LocationCode": "AMS",
"AddressSummary": "",
"AddressSummaryLong": "",
"PostalAddressID": "",
"VisitorAddressID": "",
"JobFunctionCode": "CONSULTANT",
"DepartmentID": "8001",
"InActive": false,
"VersionID": 2,
"StartDate": "2019-03-01T00:00:00",
"EndDate": null
}
# Address2 (Address is the same shape minus the fields after Addressee)
{
"ID": "26353",
"ContactID": "26352",
"LocationID": "9001",
"ObjectType": "Address",
"DefaultPostalAddress": true,
"DefaultVisitorAddress": true,
"DisplayName": "Damrak 1, 1012 LG Amsterdam",
"AddressLine": "Damrak 1",
"StreetLine": "Damrak 1",
"CityLine": "1012 LG Amsterdam",
"PostalCode": "1012 LG",
"City": "Amsterdam",
"District": "",
"ProvinceCode": "NH",
"ProvinceName": "Noord-Holland",
"CountryCode": "NL",
"CountryName": "Netherlands",
"Addressee": "Acme B.V.\nDamrak 1\n1012 LG Amsterdam",
"AddressType": "VISIT",
"LocationCode": "AMS",
"LocationName": "Amsterdam Office",
"VersionID": 1,
"Street": "Damrak",
"StreetNumber": "1",
"StreetNumberExtension": "",
"StartDate": null,
"EndDate": null,
"InActive": false
}
# Matter3 (Matter/Matter2 are the same shape with progressively fewer fields — see SOAP.md field lists for the exact cut points)
{
"ID": "70012",
"ObjectType": "Matter",
"Code": "2026.0142",
"Name": "Acquisition of XYZ Holding",
"LongName": "Acquisition of XYZ Holding B.V.",
"ClientID": "26352",
"ClientName": "Acme B.V.",
"ClientContactID": "17337",
"ClientContactName": "J. Consultant",
"Office": "Amsterdam",
"Department": "Legal",
"AreaOfLaw": "Corporate",
"MatterType": "M&A",
"Referral": "",
"RTK": { "ID": "17337", "IsFolder": false, "ObjectType": "Employee", "DisplayName": "J. Consultant", "LocationName": "", "EmailAddress": "", "PhoneNumber": "", "FaxNumber": "", "MobileNumber": "", "Website": "", "AddressSummary": "", "AddressSummaryLong": "", "Extra": "" },
"BTK": { "ID": "", "IsFolder": false, "ObjectType": "", "DisplayName": "", "LocationName": "", "EmailAddress": "", "PhoneNumber": "", "FaxNumber": "", "MobileNumber": "", "Website": "", "AddressSummary": "", "AddressSummaryLong": "", "Extra": "" },
"OpenDate": "2026-01-15T00:00:00",
"CloseDate": null,
"AdditionalInformation": "",
"Comments": "",
"ClientReference": "XYZ-2026-01",
"Description": "",
"Language": "NL",
"ActivityType": "MATTER",
"AreaOfLawCode": "CORP",
"MatterTypeCode": "MA",
"ReferralCode": "",
"Originator": { "ID": "17337", "IsFolder": false, "ObjectType": "Employee", "DisplayName": "J. Consultant", "LocationName": "", "EmailAddress": "", "PhoneNumber": "", "FaxNumber": "", "MobileNumber": "", "Website": "", "AddressSummary": "", "AddressSummaryLong": "", "Extra": "" },
"OfficeCode": "AMS",
"DepartmentCode": "LEGAL",
"ArchiveDate": null,
"ArchiveNumber": "",
"VersionID": 4
}
# Identification
{
"ID": "9001",
"Attachment": "https://cm.example.com/Content/File.ashx?type=identification&id=9001.2",
"IdentificationType": "PASSPORT",
"Number": "NX1234567",
"Nationality": "NL",
"Date": "2022-05-01T00:00:00",
"ExpireDate": "2032-05-01T00:00:00",
"City": "Amsterdam"
}
# Attendee
{
"ID": "3001",
"Activity": "70012",
"Contact": "26352",
"Role": "MATTER_PAYOR",
"Reference": "",
"Comments": "",
"Percentage": 100.0,
"VersionID": 1
}
# ItemMailMerge
{
"ID": "50391",
"ObjectType": "Person",
"DisplayName": "Van Velzen, Mevr. J.",
"Attention": "T.a.v. Mevrouw Van Velzen",
"Addressee": "Geachte mevrouw Van Velzen",
"Salutation": "Geachte mevrouw Van Velzen",
"PhoneNumber": "+31 20 123 4567",
"FaxNumber": "",
"MobileNumber": "+31 6 1234 5678",
"EmailAddress": "jane.vanvelzen@example.com",
"Website": "",
"CompanyName": "Acme B.V.",
"PersonName": "Jane Van Velzen"
}
# CompanyDepartment
Same shape family as Company, plus a nested Company and department fields.
{
"ID": "8001",
"ObjectType": "CompanyDepartment",
"DisplayName": "Acme B.V. - Legal",
"EmailAddress": "legal@acme.example",
"PhoneNumber": "+31 20 987 6543",
"FaxNumber": "",
"MobileNumber": "",
"OtherNumber": "",
"Website": "",
"Language": "NL",
"Department": "Legal",
"DepartmentCode": "LEGAL",
"DepartmentName": "Legal",
"Company": { "ID": "26352", "ObjectType": "Company", "DisplayName": "Acme B.V.", "Name": "Acme", "OfficialName": "Acme B.V.", "EmailAddress": "info@acme.example", "PhoneNumber": "+31 20 987 6543", "FaxNumber": "", "MobileNumber": "", "OtherNumber": "", "Website": "www.acme.example", "Language": "NL", "DUNSNumber": "", "ChamberOfCommerce": "12345678", "LocationName": "Amsterdam Office", "LocationCode": "AMS", "AddressSummary": "Damrak 1, 1012 LG Amsterdam", "AddressSummaryLong": "Damrak 1\n1012 LG Amsterdam\nNetherlands", "PostalAddressID": "26353", "VisitorAddressID": "26353" },
"LocationName": "Amsterdam Office",
"LocationCode": "AMS",
"AddressSummary": "",
"AddressSummaryLong": "",
"PostalAddressID": "",
"VisitorAddressID": ""
}