# 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 userName and password, lowercase first letter. Any other casing (UserName, Username, etc.) will silently fail to bind, and the call will just return false as if the credentials were wrong.
  • If userName contains @ and the target environment has EnableOffice365Login turned on: password must 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/me and matches the returned account to an existing ContactManager user.
  • Otherwise, password is 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
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
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": ""
}
Last Updated: 9/3/2026, 12:58:48 PM