Download OpenAPI specification:Download
Welcome to the API documentation for Milwaukee Tool's Customer Data Platform (CDP). This comprehensive guide is designed to help developers, partners, and stakeholders understand how to interact with the CDP programmatically. By leveraging our API, you can seamlessly integrate and access the wealth of customer data stored in our platform, enabling you to build custom applications, automate processes, and extract valuable insights.
NOTE: In places where the documentation states either an API key OR access token is required, both should be included. The documentation framework being used does not support specifying multiple authorization types for a single resource. Please reach out to dan.mcmanus@milwaukeetool.com to obtain Authentication credentials.
Supports querying for an address by an existing address id.
| id required | string <uuid> Example: https://cdp-api-test.milwaukeetool.com/v1/address/00000000-0000-0000-0000-000000000000 A unique identifier of the address you wish to retrieve |
{- "data": {
- "id": "00000000-0000-0000-0000-000000000000",
- "address1": "123 Fake Street",
- "address2": "Apt 456",
- "city": "Faketown",
- "state": "WI",
- "country": "US",
- "postalCode": "12345",
- "alias": "Home",
- "default": true,
- "addressType": "residential",
- "status": "active"
}
}This endpoint creates a new address with the provided details.
Details of the new address to be created.
| address1 | string |
| address2 | string |
| city | string |
| state | string |
| postalCode | string <postal-code> |
| country | string (CountryCode) = 2 characters ^[A-Z]{2}$ ISO 3166-1 alpha-2 country code. A two-letter uppercase code representing a country (e.g., "US" for United States, "CA" for Canada, "MX" for Mexico). See https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2 for the complete list of codes. |
| alias | string |
| default | boolean |
| addressType | string Enum: "residential" "commercial" |
{- "address1": "123 Fake Street",
- "address2": "Apt 456",
- "city": "Faketown",
- "state": "WI",
- "postalCode": "12345",
- "country": "US",
- "alias": "Home",
- "default": true,
- "addressType": "residential"
}{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08"
}
}This endpoint creates a new service address moment with the provided details.
Details of the new service address to be created.
| addressId required | string |
| userId | string |
| address1 | string |
| address2 | string |
| city | string |
| state | string |
| postalCode | string |
| country | string (CountryCode) = 2 characters ^[A-Z]{2}$ ISO 3166-1 alpha-2 country code. A two-letter uppercase code representing a country (e.g., "US" for United States, "CA" for Canada, "MX" for Mexico). See https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2 for the complete list of codes. |
| alias | string |
{- "addressId": "00000000-0000-0000-0000-000000000000",
- "userId": "00000000-0000-0000-0000-000000000001",
- "address1": "123 Service Street",
- "address2": "Suite 100",
- "city": "Faketown",
- "state": "CA",
- "postalCode": "90210",
- "country": "US",
- "alias": "Service Location"
}{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08"
}
}Retrieve a specific service address moment by its service address Id.
| id required | string The ID of the service address to retrieve. |
{- "data": {
- "addressId": "string",
- "userId": "string",
- "address1": "string",
- "address2": "string",
- "city": "string",
- "state": "string",
- "postalCode": "string",
- "country": "US",
- "alias": "string"
}
}Supports querying for an end user by any id.
| id | string Example: id=https://cdp-api-test.milwaukeetool.com/v1/user?id=john.doe@example.com A unique identifier of the user profile you wish to retrieve (e.g. email, identity vertex id, auth0 account id, etc.) |
{- "data": {
- "identity": {
- "emailAddress": "john@example.com",
- "firstName": "John",
- "lastName": "Doe",
- "address1": "456 S. Main St",
- "address2": "#101",
- "city": "Milwaukee",
- "state": "Wisconsin",
- "country": "US",
- "postalCode": "53211",
- "phoneNumber": "4141112222",
- "jobTitle": "superintendent",
- "trade": "carpentry",
- "tradeSector": "commercial",
- "secondaryTradeSectors": [
- "residential",
- "industrial"
], - "languagePreference": "English",
- "createdAt": 1691774580629,
- "updatedAt": 1691774580629
}, - "axId": "00000000-0000-0000-0000-000000000005",
- "hubspotId": "00000000-0000-0000-0000-000000000001",
- "oneKeyId": "00000000-0000-0000-0000-000000000003",
- "rudderId": "de305d54-75b4-431b-adb2-eb6b9e546014",
- "brazeId": "00000000-0000-0000-0000-000000000002",
- "d365ContactId": "00000000-0000-0000-0000-000000000004",
- "d365ContactGroup": "marketing",
- "d365ContactType": "distributor",
- "auth0Accounts": [
- {
- "id": "auth0|1234567890",
- "legacyUserId": "00000000-0000-0000-0000-000000000009",
- "emailVerified": true,
- "connection": "accounts-db-proxy"
}
], - "marketingPreferences": {
- "cookieOptIn": false,
- "subscribedHDNewsEmail": false,
- "subscribedOneKeyNewsletterEmail": false,
- "subscribedConnectEmail": false,
- "subscribedGridEmail": false,
- "subscribedResearchEmail": false,
- "subscribedHDNewsText": false,
- "subscribedHDCenterEmail": false,
- "subscribedHDCenterText": false,
- "subscribedGridText": false,
- "createdAt": 1691774580629,
- "updatedAt": 1691774580629
}, - "company": {
- "name": "Acme Corp",
- "address1": "123 Fake Street",
- "address2": "Apt 456",
- "city": "Faketown",
- "state": "WI",
- "postalCode": "12345",
- "country": "US",
- "size": "1000",
- "createdAt": 1691774580629,
- "updatedAt": 1691774580629
}, - "products": [
- "48-11-1850",
- "48-11-1852"
], - "hdaAccount": {
- "number": "123456789",
- "name": "Acme Corp",
- "partnerClassification": "transactional",
- "hdaStatus": "hda status",
- "hdaPceNumber": "hda pce number",
- "hdaEffectiveDate": "1/1/24",
- "hdaEndDate": "1/1/25"
}
}
}This endpoint creates a new user with the provided details. Calling this endpoint should be followed by sending an identify event to Rudderstack with the 'userId' field set to the newly created user's identityId.
Details of the new user to be created.
| emailAddress | string <email> |
| firstName | string |
| lastName | string |
| phoneNumber | string |
| address1 | string |
| address2 | string |
| city | string |
| state | string |
| postalCode | string |
| country | string (CountryCode) = 2 characters ^[A-Z]{2}$ ISO 3166-1 alpha-2 country code. A two-letter uppercase code representing a country (e.g., "US" for United States, "CA" for Canada, "MX" for Mexico). See https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2 for the complete list of codes. |
| jobTitle | string |
| languagePreference | string |
| trade | string |
| tradeSector | string |
| secondaryTradeSectors | Array of strings |
{- "emailAddress": "user@example.com",
- "firstName": "string",
- "lastName": "string",
- "phoneNumber": "string",
- "address1": "string",
- "address2": "string",
- "city": "string",
- "state": "string",
- "postalCode": "string",
- "country": "US",
- "jobTitle": "string",
- "languagePreference": "string",
- "trade": "string",
- "tradeSector": "string",
- "secondaryTradeSectors": [
- "string"
]
}{- "data": {
- "identityId": "ebc92baa-b430-498d-b30d-132ff32a5256"
}
}Supports querying for all addresses associated with a user by their identityId.
| id required | string Example: 00000000-0000-0000-0000-000000000000 A unique identifier of the user profile you wish to retrieve addresses for |
{- "data": [
- {
- "id": "00000000-0000-0000-0000-000000000000",
- "address1": "123 Fake Street",
- "address2": "Apt 456",
- "city": "Faketown",
- "state": "WI",
- "country": "US",
- "postalCode": "12345",
- "alias": "Home",
- "default": true,
- "addressType": "residential",
- "status": "active"
}, - {
- "id": "00000000-0000-0000-0000-000000000001",
- "address1": "456 Fake Street",
- "city": "Faketown",
- "state": "WI",
- "country": "US",
- "postalCode": "12345",
- "alias": "Work",
- "default": false,
- "addressType": "commercial",
- "status": "active"
}
]
}| phone | string Phone number to query by. |
| name | string Example: name=John%20Doe Full name to query by, in the format of {first_name}%20{last_name}. The client MUST remove all spaces from each name part, as well as URL encode the parameter. For example, John Doe would be encoded as John%20Doe. |
{- "data": [
- {
- "identityId": "00000000-0000-0000-0000-000000000000",
- "emailAddress": "john@example.com",
- "firstName": "John",
- "lastName": "Doe",
- "address1": "123 Fake Street",
- "address2": "Apt 456",
- "city": "Faketown",
- "state": "WI",
- "country": "US",
- "postalCode": "12345",
- "phoneNumber": "1234567890"
}, - {
- "identityId": "00000000-0000-0000-0000-000000000001",
- "emailAddress": "jane@example.com",
- "firstName": "Jane",
- "lastName": "Doe",
- "address1": "123 Fake Street",
- "address2": "Apt 456",
- "city": "Faketown",
- "state": "WI",
- "country": "US",
- "postalCode": "12345",
- "phoneNumber": "1234567890"
}
]
}Returns a list of all trades and their corresponding specialties. The response is localized based on the Accept-Language header. (en-US by default)
| Accept-Language | string Language code (e.g., en-US, es-MX). Used for localization. If value is not provided or language is unsupported, en-US is assumed. |
{- "data": {
- "language": "en-US",
- "trades": [
- {
- "tradeName": "Carpentry",
- "tradeId": "00000000-0000-0000-0000-000000000001",
- "displayName": "Carpentry",
- "specialties": [
- {
- "specialtyId": "00000000-0000-0000-0000-000000000002",
- "displayName": "Framing",
- "specialtyName": "Framing"
}, - {
- "specialtyId": "00000000-0000-0000-0000-000000000003",
- "displayName": "Finish Carpentry - Onsite",
- "specialtyName": "Finish Carpentry - Onsite"
}
]
}, - {
- "tradeName": "Plumbing",
- "tradeId": "00000000-0000-0000-0000-000000000004",
- "displayName": "Plumbing",
- "specialties": [
- {
- "specialtyId": "00000000-0000-0000-0000-000000000005",
- "displayName": "Commercial / Industrial Plumber",
- "specialtyName": "Commercial / Industrial Plumber"
}, - {
- "specialtyId": "00000000-0000-0000-0000-000000000006",
- "displayName": "Residential Plumber",
- "specialtyName": "Residential Plumber"
}
]
}
]
}
}Returns moments for a single user. By default, returns all moments filtered by type and sorted/paginated as requested. If view=latestPerCase is provided, moments are first filtered by type, then grouped by caseId, then the latest moment per case is selected. Sorting and pagination are applied to the selected per-case moments.
| userId required | string A unique identifier of the user for which to retrieve moments. |
| types | Array of strings Filter by one or more moment types. |
| view | string Value: "latestPerCase" Selects the result mode. Omit for default behavior (all moments). Use |
| orderby | string Enum: "asc" "desc" Example: orderby=desc Sort direction. Supported directions: |
| page | integer >= 1 Default: 1 The page number (1-based). Defaults to 1. |
| resultsperpage | integer [ 1 .. 200 ] Default: 25 Number of items per page. Defaults to 25. In |
{- "data": {
- "userId": "00000000-0000-0000-0000-000000000005",
- "email": "john@example.com",
- "phoneNumber": "4141112222",
- "firstName": "John",
- "lastName": "Doe",
- "moments": [
- {
- "caseId": "CASE-001",
- "type": "status.updated",
- "contextEventTimestamp": 1696277269279,
- "createdAt": 1696277270292,
- "contextSystemOfRecord": "OnePoint",
- "userId": "00000000-0000-0000-0000-000000000005"
}, - {
- "caseId": "CASE-002",
- "type": "note.added",
- "contextEventTimestamp": 1696277265300,
- "createdAt": 1696277266300,
- "contextSystemOfRecord": "OnePoint",
- "userId": "00000000-0000-0000-0000-000000000005"
}
], - "page": 1,
- "pageSize": 10,
- "totalCount": 100,
- "totalPages": 10
}
}Returns raw moments of the specified momentType. Results can be filtered using the supported query parameters (for example, userId and caseId) and paginated with page and resultsperpage. Used for retrieving user timelines, case-based workflows, and general type-based moment retrieval.
| momentType required | string The type of moment to retrieve (e.g. cx_case_management_v2, auth0_log_in_v1). |
| userId | string A unique identifier of the user for which to retrieve moments. |
| caseId | string Filter moments by case ID. |
| page | integer Default: 1 |
| resultsperpage | integer Default: 25 |
{- "data": {
- "userId": "00000000-0000-0000-0000-000000000005",
- "email": "john@example.com",
- "firstName": "John",
- "lastName": "Doe",
- "phoneNumber": "4141112222",
- "moments": [
- {
- "caseId": "CASE-001",
- "status": "Preparing",
- "createdAt": 1696277265300,
- "userId": "00000000-0000-0000-0000-000000000005"
}, - {
- "caseId": "CASE-001",
- "status": "Baking",
- "createdAt": 1696277266300,
- "userId": "00000000-0000-0000-0000-000000000005"
}, - {
- "caseId": "CASE-001",
- "status": "Out for delivery",
- "createdAt": 1696277270292,
- "userId": "00000000-0000-0000-0000-000000000005"
}
], - "page": 1,
- "pageSize": 25,
- "totalCount": 3,
- "totalPages": 1
}
}