Repository: amp-labs/connectors
Pull request #1521 (2025-03-27 02:44:51)

[CON-1617] feat(catalog): Add modules
# Server

Old references to specific module IDs are preserved for backward compatability.
Once this is merged the server should use modules located at `providers` package.
Only then those references can be fully removed.

Cobalt0s: > [!WARNING]
> <b>This pull request is not mergeable via GitHub because a downstack PR is open. Once all requirements are satisfied, merge this PR as a stack <a href="https://app.graphite.dev/github/pr/amp-labs/connectors/1521?utm_source=stack-comment-downstack-mergeability-warning" >on Graphite</a>.</b>
> <a href="https://graphite.dev/docs/merge-pull-requests">Learn more</a>

* **#1525** <a href="https://app.graphite.dev/github/pr/amp-labs/connectors/1525?utm_source=stack-comment-icon" target="_blank"><img src="https://static.graphite.dev/graphite-32x32-black.png" alt="Graphite" width="10px" height="10px"/></a>
* **#1524** <a href="https://app.graphite.dev/github/pr/amp-labs/connectors/1524?utm_source=stack-comment-icon" target="_blank"><img src="https://static.graphite.dev/graphite-32x32-black.png" alt="Graphite" width="10px" height="10px"/></a>
* **#1523** <a href="https://app.graphite.dev/github/pr/amp-labs/connectors/1523?utm_source=stack-comment-icon" target="_blank"><img src="https://static.graphite.dev/graphite-32x32-black.png" alt="Graphite" width="10px" height="10px"/></a>
* **#1522** <a href="https://app.graphite.dev/github/pr/amp-labs/connectors/1522?utm_source=stack-comment-icon" target="_blank"><img src="https://static.graphite.dev/graphite-32x32-black.png" alt="Graphite" width="10px" height="10px"/></a>
* **#1521** <a href="https://app.graphite.dev/github/pr/amp-labs/connectors/1521?utm_source=stack-comment-icon" target="_blank"><img src="https://static.graphite.dev/graphite-32x32-black.png" alt="Graphite" width="10px" height="10px"/></a> 👈 <a href="https://app.graphite.dev/github/pr/amp-labs/connectors/1521?utm_source=stack-comment-view-in-graphite" target="_blank">(View in Graphite)</a>
* **#1520** <a href="https://app.graphite.dev/github/pr/amp-labs/connectors/1520?utm_source=stack-comment-icon" target="_blank"><img src="https://static.graphite.dev/graphite-32x32-black.png" alt="Graphite" width="10px" height="10px"/></a>
* **#1519** <a href="https://app.graphite.dev/github/pr/amp-labs/connectors/1519?utm_source=stack-comment-icon" target="_blank"><img src="https://static.graphite.dev/graphite-32x32-black.png" alt="Graphite" width="10px" height="10px"/></a>
* `main`


<h2></h2>

This stack of pull requests is managed by <a href="https://graphite.dev?utm-source=stack-comment"><b>Graphite</b></a>. Learn more about <a href="https://stacking.dev/?utm_source=stack-comment">stacking</a>.
<!-- Current dependencies on/for this PR: -->
RajatPawar: @greptileai

Patch:
diff --git a/providers/atlassian.go b/providers/atlassian.go
index bb0a3dd9..3ce7cfc0 100644
--- a/providers/atlassian.go
+++ b/providers/atlassian.go
@@ -1,7 +1,16 @@
 package providers
 
+import "github.com/amp-labs/connectors/common"
+
 const Atlassian Provider = "atlassian"
 
+const (
+	// ModuleAtlassianJira is the module used for listing Jira issues.
+	ModuleAtlassianJira common.ModuleID = "jira"
+	// ModuleAtlassianJiraConnect is the module used for Atlassian Connect.
+	ModuleAtlassianJiraConnect common.ModuleID = "atlassian-connect"
+)
+
 func init() {
 	// Atlassian Configuration
 	SetInfo(Atlassian, ProviderInfo{
@@ -16,6 +25,26 @@ func init() {
 			ExplicitWorkspaceRequired: true, // Needed for GetPostAuthInfo call
 		},
 		PostAuthInfoNeeded: true,
+		Modules: &Modules{
+			ModuleAtlassianJira: {
+				BaseURL:     "https://api.atlassian.com/ex/jira/{{.cloudId}}/rest/api/3",
+				DisplayName: "Atlassian Jira",
+				Support: Support{
+					Read:      true,
+					Subscribe: false,
+					Write:     true,
+				},
+			},
+			ModuleAtlassianJiraConnect: {
+				BaseURL:     "https://{{.workspace}}.atlassian.net/rest/api/3",
+				DisplayName: "Atlassian Connect",
+				Support: Support{
+					Read:      true,
+					Subscribe: false,
+					Write:     true,
+				},
+			},
+		},
 		//nolint:lll
 		Media: &Media{
 			DarkMode: &MediaTypeDarkMode{
diff --git a/providers/atlassian/connector.go b/providers/atlassian/connector.go
index 5a3f02b7..ad0f9e38 100644
--- a/providers/atlassian/connector.go
+++ b/providers/atlassian/connector.go
@@ -72,7 +72,7 @@ func (c *Connector) String() string {
 // https://developer.atlassian.com/cloud/jira/platform/rest/v2/intro/#other-integrations
 func (c *Connector) getJiraRestApiURL(arg string) (*urlbuilder.URL, error) {
 	// In the case of JIRA / Atlassian Cloud, we use this path. In other cases, we fall back to the base path.
-	if c.Module.ID == ModuleJira {
+	if c.Module.ID == providers.ModuleAtlassianJira {
 		cloudId, err := c.getCloudId()
 		if err != nil {
 			return nil, err
@@ -115,7 +115,7 @@ func (c *Connector) setProviderInfo() error {
 	// When the module is Atlassian Connect, the base URL is different, so we need to override it.
 	// TODO: Replace options with substitution map in the future to avoid having to know
 	// which values need to be substituted.
-	if c.Module.ID == ModuleAtlassianJiraConnect {
+	if c.Module.ID == providers.ModuleAtlassianJiraConnect {
 		vars := []catalogreplacer.CatalogVariable{
 			&paramsbuilder.Workspace{Name: c.workspace},
 		}
diff --git a/providers/atlassian/modules.go b/providers/atlassian/modules.go
index 1a199d63..ee7429bb 100644
--- a/providers/atlassian/modules.go
+++ b/providers/atlassian/modules.go
@@ -2,13 +2,16 @@ package atlassian
 
 import (
 	"github.com/amp-labs/connectors/common"
+	"github.com/amp-labs/connectors/providers"
 )
 
 const (
-	// ModuleJira is the module used for listing Jira issues.
-	ModuleJira common.ModuleID = "jira"
-	// ModuleAtlassianJiraConnect is the module used for Atlassian Connect.
-	ModuleAtlassianJiraConnect common.ModuleID = "atlassian-connect"
+	// ModuleJira
+	// Deprecated.
+	ModuleJira = providers.ModuleAtlassianJira
+	// ModuleAtlassianJiraConnect
+	// Deprecated.
+	ModuleAtlassianJiraConnect = providers.ModuleAtlassianJiraConnect
 )
 
 // supportedModules represents currently working and supported modules within the Atlassian connector.
@@ -19,13 +22,13 @@ var supportedModules = common.Modules{ // nolint: gochecknoglobals
 		Label:   "",
 		Version: "",
 	},
-	ModuleJira: {
-		ID:      ModuleJira,
+	providers.ModuleAtlassianJira: {
+		ID:      providers.ModuleAtlassianJira,
 		Label:   "rest/api",
 		Version: "3",
 	},
-	ModuleAtlassianJiraConnect: {
-		ID:      ModuleAtlassianJiraConnect,
+	providers.ModuleAtlassianJiraConnect: {
+		ID:      providers.ModuleAtlassianJiraConnect,
 		Label:   "rest/api",
 		Version: "3",
 	},
diff --git a/providers/hubspot.go b/providers/hubspot.go
index 0f743f30..6f8330a0 100644
--- a/providers/hubspot.go
+++ b/providers/hubspot.go
@@ -1,7 +1,14 @@
 package providers
 
+import "github.com/amp-labs/connectors/common"
+
 const Hubspot Provider = "hubspot"
 
+const (
+	// ModuleHubspotCRM is the module used for accessing standard CRM objects.
+	ModuleHubspotCRM common.ModuleID = "CRM"
+)
+
 func init() {
 	// Hubspot configuration
 	SetInfo(Hubspot, ProviderInfo{
@@ -27,6 +34,17 @@ func init() {
 			Subscribe: false,
 			Write:     true,
 		},
+		Modules: &Modules{
+			ModuleHubspotCRM: {
+				BaseURL:     "https://api.hubapi.com/crm/v3",
+				DisplayName: "HubSpot CRM",
+				Support: Support{
+					Read:      true,
+					Subscribe: false,
+					Write:     true,
+				},
+			},
+		},
 		Media: &Media{
 			DarkMode: &MediaTypeDarkMode{
 				IconURL: "https://res.cloudinary.com/dycvts6vp/image/upload/v1722479285/media/hubspot_1722479284.svg",
diff --git a/providers/hubspot/modules.go b/providers/hubspot/modules.go
index a213443d..9324b6cb 100644
--- a/providers/hubspot/modules.go
+++ b/providers/hubspot/modules.go
@@ -2,11 +2,13 @@ package hubspot
 
 import (
 	"github.com/amp-labs/connectors/common"
+	"github.com/amp-labs/connectors/providers"
 )
 
 const (
-	// ModuleCRM is the module used for accessing standard CRM objects.
-	ModuleCRM common.ModuleID = "CRM"
+	// ModuleCRM
+	// Deprecated.
+	ModuleCRM = providers.ModuleHubspotCRM
 )
 
 // supportedModules represents currently working and supported modules within the Hubspot connector.
@@ -17,8 +19,8 @@ var supportedModules = common.Modules{ // nolint: gochecknoglobals
 		Label:   "",
 		Version: "",
 	},
-	ModuleCRM: {
-		ID:      ModuleCRM,
+	providers.ModuleHubspotCRM: {
+		ID:      providers.ModuleHubspotCRM,
 		Label:   "crm",
 		Version: "v3",
 	},
diff --git a/providers/keap.go b/providers/keap.go
index def1b63e..1c118941 100644
--- a/providers/keap.go
+++ b/providers/keap.go
@@ -1,7 +1,18 @@
 package providers
 
+import "github.com/amp-labs/connectors/common"
+
 const Keap Provider = "keap"
 
+const (
+	// ModuleKeapV1 is a grouping of V1 API endpoints.
+	// https://developer.keap.com/docs/rest/
+	ModuleKeapV1 common.ModuleID = "version1"
+	// ModuleKeapV2 is a grouping of V2 API endpoints.
+	// https://developer.keap.com/docs/restv2/
+	ModuleKeapV2 common.ModuleID = "version2"
+)
+
 func init() {
 	// Keap configuration
 	SetInfo(Keap, ProviderInfo{
@@ -27,6 +38,26 @@ func init() {
 			Subscribe: false,
 			Write:     false,
 		},
+		Modules: &Modules{
+			ModuleKeapV1: {
+				BaseURL:     "https://api.infusionsoft.com/v1",
+				DisplayName: "Keap Version 1",
+				Support: Support{
+					Read:      false,
+					Subscribe: false,
+					Write:     false,
+				},
+			},
+			ModuleKeapV2: {
+				BaseURL:     "https://api.infusionsoft.com/v2",
+				DisplayName: "Keap Version 2",
+				Support: Support{
+					Read:      false,
+					Subscribe: false,
+					Write:     false,
+				},
+			},
+		},
 		Media: &Media{
 			DarkMode: &MediaTypeDarkMode{
 				IconURL: "https://res.cloudinary.com/dycvts6vp/image/upload/v1724217756/media/Keap_DMI.png",
diff --git a/providers/keap/connector.go b/providers/keap/connector.go
index e8c7b497..9f694351 100644
--- a/providers/keap/connector.go
+++ b/providers/keap/connector.go
@@ -18,7 +18,7 @@ type Connector struct {
 }
 
 func NewConnector(opts ...Option) (conn *Connector, outErr error) {
-	params, err := paramsbuilder.Apply(parameters{}, opts, WithModule(ModuleV1))
+	params, err := paramsbuilder.Apply(parameters{}, opts, WithModule(providers.ModuleKeapV1))
 	if err != nil {
 		return nil, err
 	}
diff --git a/providers/keap/modules.go b/providers/keap/modules.go
index bc65a953..d4758251 100644
--- a/providers/keap/modules.go
+++ b/providers/keap/modules.go
@@ -1,17 +1,17 @@
 package keap
 
 import (
-	"github.com/amp-labs/connectors/common"
+	"github.com/amp-labs/connectors/providers"
 	"github.com/amp-labs/connectors/providers/keap/metadata"
 )
 
 const (
-	// ModuleV1 is a grouping of V1 API endpoints.
-	// https://developer.keap.com/docs/rest/
-	ModuleV1 common.ModuleID = "version1"
-	// ModuleV2 is a grouping of V2 API endpoints.
-	// https://developer.keap.com/docs/restv2/
-	ModuleV2 common.ModuleID = "version2"
+	// ModuleV1
+	// Deprecated.
+	ModuleV1 = providers.ModuleKeapV1
+	// ModuleV2
+	// Deprecated.
+	ModuleV2 = providers.ModuleKeapV2
 )
 
 // SupportedModules represents currently working and supported modules within the Keap connector.
diff --git a/providers/keap/objectNames.go b/providers/keap/objectNames.go
index 93f6d337..9a28e2c5 100644
--- a/providers/keap/objectNames.go
+++ b/providers/keap/objectNames.go
@@ -3,6 +3,7 @@ package keap
 import (
 	"github.com/amp-labs/connectors/common"
 	"github.com/amp-labs/connectors/internal/datautils"
+	"github.com/amp-labs/connectors/providers"
 	"github.com/amp-labs/connectors/providers/keap/metadata"
 )
 
@@ -31,7 +32,7 @@ const (
 var supportedObjectsByRead = metadata.Schemas.ObjectNames() //nolint:gochecknoglobals
 
 var supportedObjectsByCreate = map[common.ModuleID]datautils.StringSet{ //nolint:gochecknoglobals
-	ModuleV1: datautils.NewSet(
+	providers.ModuleKeapV1: datautils.NewSet(
 		// https://developer.infusionsoft.com/docs/rest/#tag/Affiliate/operation/createAffiliateUsingPOST
 		objectNameAffiliates,
 		// https://developer.infusionsoft.com/docs/rest/#tag/Appointment/operation/createAppointmentUsingPOST
@@ -65,7 +66,7 @@ var supportedObjectsByCreate = map[common.ModuleID]datautils.StringSet{ //nolint
 		// https://developer.infusionsoft.com/docs/rest/#tag/Users/operation/createUserUsingPOST
 		objectNameUsers,
 	),
-	ModuleV2: datautils.NewSet(
+	providers.ModuleKeapV2: datautils.NewSet(
 		// https://developer.keap.com/docs/restv2/#tag/Affiliate/operation/addAffiliateUsingPOST
 		objectNameAffiliates,
 		// https://developer.keap.com/docs/restv2/#tag/AutomationCategory/operation/createCategoryUsingPOST
@@ -87,9 +88,9 @@ var supportedObjectsByCreate = map[common.ModuleID]datautils.StringSet{ //nolint
 	),
 }
 
-// Evert update performed using PATCH is not present in the PUT set.
+// Every update performed using PATCH is not present in the PUT set.
 var supportedObjectsByUpdatePATCH = map[common.ModuleID]datautils.StringSet{ //nolint:gochecknoglobals
-	ModuleV1: datautils.NewSet(
+	providers.ModuleKeapV1: datautils.NewSet(
 		// https://developer.infusionsoft.com/docs/rest/#tag/Appointment/operation/updatePropertiesOnAppointmentUsingPATCH
 		objectNameAppointments,
 		// https://developer.infusionsoft.com/docs/rest/#tag/Company/operation/updateCompanyUsingPATCH
@@ -105,7 +106,7 @@ var supportedObjectsByUpdatePATCH = map[common.ModuleID]datautils.StringSet{ //n
 		// https://developer.infusionsoft.com/docs/rest/#tag/Task/operation/updatePropertiesOnTaskUsingPATCH
 		objectNameTasks,
 	),
-	ModuleV2: datautils.NewSet(
+	providers.ModuleKeapV2: datautils.NewSet(
 		// https://developer.keap.com/docs/restv2/#tag/Affiliate/operation/updateAffiliateUsingPATCH
 		objectNameAffiliates,
 		// https://developer.keap.com/docs/restv2/#tag/Company/operation/patchCompanyUsingPATCH
@@ -119,22 +120,22 @@ var supportedObjectsByUpdatePATCH = map[common.ModuleID]datautils.StringSet{ //n
 	),
 }
 
-// Evert update performed using PUT is not present in the PATCH set.
+// Every update performed using PUT is not present in the PATCH set.
 var supportedObjectsByUpdatePUT = map[common.ModuleID]datautils.StringSet{ //nolint:gochecknoglobals
-	ModuleV1: datautils.NewSet(
+	providers.ModuleKeapV1: datautils.NewSet(
 		// https://developer.infusionsoft.com/docs/rest/#tag/File/operation/updateFileUsingPUT
 		objectNameFiles,
 		// https://developer.infusionsoft.com/docs/rest/#tag/REST-Hooks/operation/update_a_hook_subscription
 		objectNameHooks,
 	),
-	ModuleV2: datautils.NewSet(
+	providers.ModuleKeapV2: datautils.NewSet(
 		// https://developer.keap.com/docs/restv2/#tag/AutomationCategory/operation/saveCategoryUsingPUT
 		objectNameAutomationCategories,
 	),
 }
 
 var supportedObjectsByDelete = map[common.ModuleID]datautils.StringSet{ //nolint:gochecknoglobals
-	ModuleV1: datautils.NewSet(
+	providers.ModuleKeapV1: datautils.NewSet(
 		// https://developer.infusionsoft.com/docs/rest/#tag/Appointment/operation/deleteAppointmentUsingDELETE
 		objectNameAppointments,
 		// https://developer.keap.com/docs/rest/#tag/Contact/operation/deleteContactUsingDELETE
@@ -154,7 +155,7 @@ var supportedObjectsByDelete = map[common.ModuleID]datautils.StringSet{ //nolint
 		// https://developer.infusionsoft.com/docs/rest/#tag/Task/operation/deleteTaskUsingDELETE
 		objectNameTasks,
 	),
-	ModuleV2: datautils.NewSet(
+	providers.ModuleKeapV2: datautils.NewSet(
 		// https://developer.keap.com/docs/restv2/#tag/AutomationCategory/operation/deleteCategoriesUsingDELETE
 		objectNameAutomationCategories,
 		// https://developer.keap.com/docs/restv2/#tag/Company/operation/deleteCompanyUsingDELETE
@@ -186,7 +187,7 @@ var objectNameToWritePath = datautils.NewDefaultMap(map[string]string{ //nolint:
 )
 
 var objectNameToWriteResponseIdentifier = common.ModuleObjectNameToFieldName{ //nolint:gochecknoglobals
-	ModuleV1: datautils.NewDefaultMap(map[string]string{
+	providers.ModuleKeapV1: datautils.NewDefaultMap(map[string]string{
 		objectNameFiles: "id",
 
 		objectNameHooks: "key",
@@ -195,7 +196,7 @@ var objectNameToWriteResponseIdentifier = common.ModuleObjectNameToFieldName{ //
 			return "id"
 		},
 	),
-	ModuleV2: datautils.NewDefaultMap(map[string]string{
+	providers.ModuleKeapV2: datautils.NewDefaultMap(map[string]string{
 		objectNamePaymentMethodConfigs: "session_key",
 	},
 		func(objectName string) (id string) {
@@ -205,7 +206,7 @@ var objectNameToWriteResponseIdentifier = common.ModuleObjectNameToFieldName{ //
 }
 
 var objectsWithCustomFields = map[common.ModuleID]datautils.StringSet{ // nolint:gochecknoglobals
-	ModuleV1: datautils.NewStringSet(
+	providers.ModuleKeapV1: datautils.NewStringSet(
 		objectNameAffiliates,
 		objectNameAppointments,
 		objectNameCompanies,
@@ -216,7 +217,7 @@ var objectsWithCustomFields = map[common.ModuleID]datautils.StringSet{ // nolint
 		objectNameSubscriptions,
 		objectNameTasks,
 	),
-	ModuleV2: datautils.NewStringSet(
+	providers.ModuleKeapV2: datautils.NewStringSet(
 		objectNameAffiliates,
 		objectNameContacts,
 		objectNameNotes,
diff --git a/providers/keap/params.go b/providers/keap/params.go
index 7b067bad..38c739bf 100644
--- a/providers/keap/params.go
+++ b/providers/keap/params.go
@@ -7,6 +7,7 @@ import (
 
 	"github.com/amp-labs/connectors/common"
 	"github.com/amp-labs/connectors/common/paramsbuilder"
+	"github.com/amp-labs/connectors/providers"
 	"golang.org/x/oauth2"
 )
 
@@ -44,6 +45,6 @@ func WithAuthenticatedClient(client common.AuthenticatedHTTPClient) Option {
 
 func WithModule(module common.ModuleID) Option {
 	return func(params *parameters) {
-		params.WithModule(module, SupportedModules, ModuleV1)
+		params.WithModule(module, SupportedModules, providers.ModuleKeapV1)
 	}
 }
diff --git a/providers/keap/parse.go b/providers/keap/parse.go
index eb2757dd..9b6eb92d 100644
--- a/providers/keap/parse.go
+++ b/providers/keap/parse.go
@@ -3,6 +3,7 @@ package keap
 import (
 	"github.com/amp-labs/connectors/common"
 	"github.com/amp-labs/connectors/internal/jsonquery"
+	"github.com/amp-labs/connectors/providers"
 	"github.com/amp-labs/connectors/providers/keap/metadata"
 	"github.com/spyzhov/ajson"
 )
@@ -17,7 +18,7 @@ func makeGetRecords(moduleID common.ModuleID, objectName string) common.NodeReco
 
 func makeNextRecordsURL(moduleID common.ModuleID) common.NextPageFunc {
 	return func(node *ajson.Node) (string, error) {
-		if moduleID == ModuleV1 {
+		if moduleID == providers.ModuleKeapV1 {
 			return jsonquery.New(node).StrWithDefault("next", "")
 		}
 
diff --git a/providers/keap/read.go b/providers/keap/read.go
index 60c6a2ad..5de52b0d 100644
--- a/providers/keap/read.go
+++ b/providers/keap/read.go
@@ -8,6 +8,7 @@ import (
 	"github.com/amp-labs/connectors/common"
 	"github.com/amp-labs/connectors/common/urlbuilder"
 	"github.com/amp-labs/connectors/internal/datautils"
+	"github.com/amp-labs/connectors/providers"
 	"github.com/amp-labs/connectors/providers/keap/metadata"
 )
 
@@ -64,13 +65,13 @@ func (c *Connector) buildReadURL(config common.ReadParams) (*urlbuilder.URL, err
 		return nil, err
 	}
 
-	if c.Module.ID == ModuleV1 {
+	if c.Module.ID == providers.ModuleKeapV1 {
 		url.WithQueryParam("limit", strconv.Itoa(DefaultPageSize))
 
 		if !config.Since.IsZero() {
 			url.WithQueryParam("since", datautils.Time.FormatRFC3339inUTCWithMilliseconds(config.Since))
 		}
-	} else if c.Module.ID == ModuleV2 {
+	} else if c.Module.ID == providers.ModuleKeapV2 {
 		// Since parameter is not applicable to objects in Module V2.
 		if config.ObjectName == "contact_link_types" {
 			url.WithQueryParam("pageSize", strconv.Itoa(DefaultPageSize))
diff --git a/providers/klaviyo.go b/providers/klaviyo.go
index 7bbe5bd9..6d60dffa 100644
--- a/providers/klaviyo.go
+++ b/providers/klaviyo.go
@@ -1,7 +1,15 @@
 package providers
 
+import "github.com/amp-labs/connectors/common"
+
 const Klaviyo Provider = "klaviyo"
 
+const (
+	// ModuleKlaviyo2024Oct15 is the latest stable version of API as of the date of writing.
+	// https://developers.klaviyo.com/en/reference/api_overview
+	ModuleKlaviyo2024Oct15 common.ModuleID = "2024-10-15"
+)
+
 func init() {
 	// Klaviyo configuration
 	SetInfo(Klaviyo, ProviderInfo{
@@ -30,6 +38,17 @@ func init() {
 			Subscribe: false,
 			Write:     true,
 		},
+		Modules: &Modules{
+			ModuleKlaviyo2024Oct15: {
+				BaseURL:     "https://a.klaviyo.com",
+				DisplayName: "Klaviyo (Version 2024-10-15)",
+				Support: Support{
+					Read:      true,
+					Subscribe: false,
+					Write:     true,
+				},
+			},
+		},
 		Media: &Media{
 			DarkMode: &MediaTypeDarkMode{
 				IconURL: "https://res.cloudinary.com/dycvts6vp/image/upload/v1722480320/media/klaviyo_1722480318.svg",
diff --git a/providers/klaviyo/connector.go b/providers/klaviyo/connector.go
index 76d291a0..ed479fbb 100644
--- a/providers/klaviyo/connector.go
+++ b/providers/klaviyo/connector.go
@@ -16,7 +16,7 @@ type Connector struct {
 }
 
 func NewConnector(opts ...Option) (conn *Connector, outErr error) {
-	params, err := paramsbuilder.Apply(parameters{}, opts, WithModule(Module2024Oct15))
+	params, err := paramsbuilder.Apply(parameters{}, opts, WithModule(providers.ModuleKlaviyo2024Oct15))
 	if err != nil {
 		return nil, err
 	}
diff --git a/providers/klaviyo/modules.go b/providers/klaviyo/modules.go
index 2597e26a..62faf051 100644
--- a/providers/klaviyo/modules.go
+++ b/providers/klaviyo/modules.go
@@ -1,14 +1,14 @@
 package klaviyo
 
 import (
-	"github.com/amp-labs/connectors/common"
+	"github.com/amp-labs/connectors/providers"
 	"github.com/amp-labs/connectors/providers/klaviyo/metadata"
 )
 
 const (
-	// Module2024Oct15 is the latest stable version of API as of the date of writing.
-	// https://developers.klaviyo.com/en/reference/api_overview
-	Module2024Oct15 common.ModuleID = "2024-10-15"
+	// Module2024Oct15
+	// Deprecated.
+	Module2024Oct15 = providers.ModuleKlaviyo2024Oct15
 )
 
 // SupportedModules represents currently working and supported modules within the Klaviyo connector.
diff --git a/providers/klaviyo/objectNames.go b/providers/klaviyo/objectNames.go
index fc1fc8f2..4f6fde65 100644
--- a/providers/klaviyo/objectNames.go
+++ b/providers/klaviyo/objectNames.go
@@ -4,6 +4,7 @@ import (
 	"github.com/amp-labs/connectors/common"
 	"github.com/amp-labs/connectors/common/naming"
 	"github.com/amp-labs/connectors/internal/datautils"
+	"github.com/amp-labs/connectors/providers"
 	"github.com/amp-labs/connectors/providers/klaviyo/metadata"
 )
 
@@ -109,7 +110,7 @@ const (
 )
 
 var supportedObjectsByCreate = map[common.ModuleID]datautils.StringSet{ //nolint:gochecknoglobals
-	Module2024Oct15: datautils.NewSet(
+	providers.ModuleKlaviyo2024Oct15: datautils.NewSet(
 		// https://developers.klaviyo.com/en/reference/create_campaign
 		objectNameCampaigns,
 		// https://developers.klaviyo.com/en/reference/send_campaign
@@ -209,7 +210,7 @@ var supportedObjectsByCreate = map[common.ModuleID]datautils.StringSet{ //nolint
 }
 
 var supportedObjectsByUpdate = map[common.ModuleID]datautils.StringSet{ //nolint:gochecknoglobals
-	Module2024Oct15: datautils.NewSet(
+	providers.ModuleKlaviyo2024Oct15: datautils.NewSet(
 		// https://developers.klaviyo.com/en/reference/update_campaign
 		objectNameCampaigns,
 		// https://developers.klaviyo.com/en/reference/cancel_campaign_send
@@ -250,7 +251,7 @@ var supportedObjectsByUpdate = map[common.ModuleID]datautils.StringSet{ //nolint
 }
 
 var supportedObjectsByDelete = map[common.ModuleID]datautils.StringSet{ //nolint:gochecknoglobals
-	Module2024Oct15: datautils.NewSet(
+	providers.ModuleKlaviyo2024Oct15: datautils.NewSet(
 		// https://developers.klaviyo.com/en/reference/delete_campaign
 		objectNameCampaigns,
 		// https://developers.klaviyo.com/en/reference/delete_catalog_variant
diff --git a/providers/klaviyo/params.go b/providers/klaviyo/params.go
index 1c88d2dd..d19a11ab 100644
--- a/providers/klaviyo/params.go
+++ b/providers/klaviyo/params.go
@@ -7,6 +7,7 @@ import (
 
 	"github.com/amp-labs/connectors/common"
 	"github.com/amp-labs/connectors/common/paramsbuilder"
+	"github.com/amp-labs/connectors/providers"
 	"golang.org/x/oauth2"
 )
 
@@ -38,9 +39,9 @@ func WithAuthenticatedClient(client common.AuthenticatedHTTPClient) Option {
 	}
 }
 
-// WithModule sets the Atlassian API module to use for the connector. It's required.
+// WithModule sets the Klaviyo API module to use for the connector. It's required.
 func WithModule(module common.ModuleID) Option {
 	return func(params *parameters) {
-		params.WithModule(module, SupportedModules, Module2024Oct15)
+		params.WithModule(module, SupportedModules, providers.ModuleKlaviyo2024Oct15)
 	}
 }
diff --git a/providers/marketo.go b/providers/marketo.go
index c9106350..d96b402f 100644
--- a/providers/marketo.go
+++ b/providers/marketo.go
@@ -1,7 +1,16 @@
 package providers
 
+import "github.com/amp-labs/connectors/common"
+
 const Marketo Provider = "marketo"
 
+const (
+	// ModuleMarketoAssets is the module/API used for accessing assets objects.
+	ModuleMarketoAssets common.ModuleID = "assets"
+	// ModuleMarketoLeads is the module/API used for accessing leads objects.
+	ModuleMarketoLeads common.ModuleID = "leads"
+)
+
 func init() {
 	// Marketo configuration file
 	// workspace maps to marketo instance
@@ -28,6 +37,26 @@ func init() {
 				ScopesField: "scope",
 			},
 		},
+		Modules: &Modules{
+			ModuleMarketoAssets: {
+				BaseURL:     "https://{{.workspace}}.mktorest.com/asset/v1",
+				DisplayName: "Marketo (Assets)",
+				Support: Support{
+					Read:      true,
+					Subscribe: false,
+					Write:     true,
+				},
+			},
+			ModuleMarketoLeads: {
+				BaseURL:     "https://{{.workspace}}.mktorest.com/v1",
+				DisplayName: "Marketo (Leads)",
+				Support: Support{
+					Read:      true,
+					Subscribe: false,
+					Write:     true,
+				},
+			},
+		},
 		Support: Support{
 			BulkWrite: BulkWriteSupport{
 				Insert: false,
diff --git a/providers/marketo/connector.go b/providers/marketo/connector.go
index 2f2c2e40..18aaa374 100644
--- a/providers/marketo/connector.go
+++ b/providers/marketo/connector.go
@@ -15,7 +15,8 @@ type Connector struct {
 
 func NewConnector(opts ...Option) (conn *Connector, outErr error) {
 	params, err := paramsbuilder.Apply(parameters{}, opts,
-		WithModule(ModuleLeads), // The module is resolved on behalf of the user if the option is missing.
+		// The module is resolved on behalf of the user if the option is missing.
+		WithModule(providers.ModuleMarketoLeads),
 	)
 	if err != nil {
 		return nil, err
diff --git a/providers/marketo/module.go b/providers/marketo/module.go
index 40289668..ff309afd 100644
--- a/providers/marketo/module.go
+++ b/providers/marketo/module.go
@@ -2,13 +2,16 @@ package marketo
 
 import (
 	"github.com/amp-labs/connectors/common"
+	"github.com/amp-labs/connectors/providers"
 )
 
 const (
-	// ModuleAssets is the module/API used for accessing assets objects.
-	ModuleAssets common.ModuleID = "assets"
-	// ModuleLeads is the module/API used for accessing leads objects.
-	ModuleLeads common.ModuleID = "leads"
+	// ModuleAssets
+	// Deprecated.
+	ModuleAssets = providers.ModuleMarketoAssets
+	// ModuleLeads
+	// Deprecated.
+	ModuleLeads = providers.ModuleMarketoLeads
 )
 
 // supportedModules represents currently working and supported modules within the Marketo connector.
@@ -19,13 +22,13 @@ var supportedModules = common.Modules{ // nolint: gochecknoglobals
 		Label:   "",
 		Version: "",
 	},
-	ModuleAssets: {
-		ID:      ModuleAssets,
+	providers.ModuleMarketoAssets: {
+		ID:      providers.ModuleMarketoAssets,
 		Label:   "asset",
 		Version: "v1",
 	},
-	ModuleLeads: {
-		ID:      ModuleLeads,
+	providers.ModuleMarketoLeads: {
+		ID:      providers.ModuleMarketoLeads,
 		Label:   "",
 		Version: "v1",
 	},
diff --git a/providers/marketo/params.go b/providers/marketo/params.go
index aa675c1a..bc5ff34c 100644
--- a/providers/marketo/params.go
+++ b/providers/marketo/params.go
@@ -7,6 +7,7 @@ import (
 
 	"github.com/amp-labs/connectors/common"
 	"github.com/amp-labs/connectors/common/paramsbuilder"
+	"github.com/amp-labs/connectors/providers"
 	"golang.org/x/oauth2/clientcredentials"
 )
 
@@ -39,7 +40,7 @@ func WithClient(ctx context.Context, client *http.Client,
 // WithModule sets the marketo API module to use for the connector. It's required.
 func WithModule(module common.ModuleID) Option {
 	return func(params *parameters) {
-		params.WithModule(module, supportedModules, ModuleLeads)
+		params.WithModule(module, supportedModules, providers.ModuleMarketoLeads)
 	}
 }
 
diff --git a/providers/marketo/url.go b/providers/marketo/url.go
index a5039dc0..2af3c311 100644
--- a/providers/marketo/url.go
+++ b/providers/marketo/url.go
@@ -8,6 +8,7 @@ import (
 
 	"github.com/amp-labs/connectors/common"
 	"github.com/amp-labs/connectors/common/urlbuilder"
+	"github.com/amp-labs/connectors/providers"
 )
 
 const restAPIPrefix = "rest" //nolint:gochecknoglobals
@@ -25,11 +26,11 @@ func (c *Connector) constructReadURL(params common.ReadParams) (*urlbuilder.URL,
 	// The only objects in Assets API supporting this are: Emails, Programs, SmartCampaigns,SmartLists
 	if !params.Since.IsZero() {
 		switch c.Module.ID {
-		case ModuleAssets:
+		case providers.ModuleMarketoAssets:
 			fmtTime := params.Since.Format(time.RFC3339)
 			url.WithQueryParam("earliestUpdatedAt", fmtTime)
 			url.WithQueryParam("latestUpdatedAt", time.Now().Format(time.RFC3339))
-		case ModuleLeads:
+		case providers.ModuleMarketoLeads:
 			fallthrough
 		case common.ModuleRoot:
 			fallthrough
diff --git a/providers/zendesk.go b/providers/zendesk.go
index e1c66fd3..28cc6d81 100644
--- a/providers/zendesk.go
+++ b/providers/zendesk.go
@@ -1,10 +1,21 @@
 package providers
 
+import "github.com/amp-labs/connectors/common"
+
 const (
 	ZendeskChat    Provider = "zendeskChat"
 	ZendeskSupport Provider = "zendeskSupport"
 )
 
+const (
+	// ModuleZendeskTicketing is used for proxying requests through.
+	// https://developer.zendesk.com/api-reference/ticketing/introduction/
+	ModuleZendeskTicketing common.ModuleID = "ticketing"
+	// ModuleZendeskHelpCenter is Zendesk Help Center.
+	// https://developer.zendesk.com/api-reference/help_center/help-center-api/introduction/
+	ModuleZendeskHelpCenter common.ModuleID = "help-center"
+)
+
 func init() { // nolint:funlen
 	// Zendesk Support configuration
 	SetInfo(ZendeskSupport, ProviderInfo{
@@ -18,6 +29,26 @@ func init() { // nolint:funlen
 			ExplicitScopesRequired:    true,
 			ExplicitWorkspaceRequired: true,
 		},
+		Modules: &Modules{
+			ModuleZendeskTicketing: {
+				BaseURL:     "https://{{.workspace}}.zendesk.com/api/v2",
+				DisplayName: "Zendesk Ticketing",
+				Support: Support{
+					Read:      true,
+					Subscribe: false,
+					Write:     true,
+				},
+			},
+			ModuleZendeskHelpCenter: {
+				BaseURL:     "https://{{.workspace}}.zendesk.com/api/v2",
+				DisplayName: "Zendesk Help Center",
+				Support: Support{
+					Read:      true,
+					Subscribe: false,
+					Write:     true,
+				},
+			},
+		},
 		Media: &Media{
 			DarkMode: &MediaTypeDarkMode{
 				IconURL: "https://res.cloudinary.com/dycvts6vp/image/upload/v1724169124/media/wkaellrizizwvelbdl6r.png",
diff --git a/providers/zendesksupport/connector.go b/providers/zendesksupport/connector.go
index 40ca5c77..c98f3f23 100644
--- a/providers/zendesksupport/connector.go
+++ b/providers/zendesksupport/connector.go
@@ -17,7 +17,8 @@ type Connector struct {
 
 func NewConnector(opts ...Option) (conn *Connector, outErr error) {
 	params, err := paramsbuilder.Apply(parameters{}, opts,
-		WithModule(ModuleTicketing), // The module is resolved on behalf of the user if the option is missing.
+		// The module is resolved on behalf of the user if the option is missing.
+		WithModule(providers.ModuleZendeskTicketing),
 	)
 	if err != nil {
 		return nil, err
diff --git a/providers/zendesksupport/modules.go b/providers/zendesksupport/modules.go
index 46de5b6e..e71a13b9 100644
--- a/providers/zendesksupport/modules.go
+++ b/providers/zendesksupport/modules.go
@@ -1,17 +1,17 @@
 package zendesksupport
 
 import (
-	"github.com/amp-labs/connectors/common"
+	"github.com/amp-labs/connectors/providers"
 	"github.com/amp-labs/connectors/providers/zendesksupport/metadata"
 )
 
 const (
-	// ModuleTicketing is used for proxying requests through.
-	// https://developer.zendesk.com/api-reference/ticketing/introduction/
-	ModuleTicketing common.ModuleID = "ticketing"
-	// ModuleHelpCenter is Zendesk Help Center.
-	// https://developer.zendesk.com/api-reference/help_center/help-center-api/introduction/
-	ModuleHelpCenter common.ModuleID = "help-center"
+	// ModuleTicketing
+	// Deprecated.
+	ModuleTicketing = providers.ModuleZendeskTicketing
+	// ModuleHelpCenter
+	// Deprecated.
+	ModuleHelpCenter = providers.ModuleZendeskHelpCenter
 )
 
 // SupportedModules represents currently working and supported modules within the Zendesk connector.
diff --git a/providers/zendesksupport/objectNames.go b/providers/zendesksupport/objectNames.go
index 44e42600..cb22cb4e 100644
--- a/providers/zendesksupport/objectNames.go
+++ b/providers/zendesksupport/objectNames.go
@@ -3,6 +3,7 @@ package zendesksupport
 import (
 	"github.com/amp-labs/connectors/common"
 	"github.com/amp-labs/connectors/internal/datautils"
+	"github.com/amp-labs/connectors/providers"
 	"github.com/amp-labs/connectors/providers/zendesksupport/metadata"
 )
 
@@ -10,21 +11,21 @@ import (
 var supportedObjectsByRead = metadata.Schemas.ObjectNames() //nolint:gochecknoglobals
 
 var objectsUnsupportedWrite = map[common.ModuleID]datautils.Set[string]{ //nolint:gochecknoglobals
-	ModuleTicketing: datautils.NewSet(
+	providers.ModuleZendeskTicketing: datautils.NewSet(
 		"attribute_values",
 		"instance_values",
 		"ticket_events",
 		"ticket_metric_events",
 	),
-	ModuleHelpCenter: datautils.NewStringSet(),
+	providers.ModuleZendeskHelpCenter: datautils.NewStringSet(),
 }
 
 var writeURLExceptions = map[common.ModuleID]datautils.Map[string, string]{ //nolint:gochecknoglobals
-	ModuleTicketing: {
+	providers.ModuleZendeskTicketing: {
 		"attributes":    "/api/v2/routing/attributes",
 		"organizations": "/api/v2/organizations",
 		"tickets":       "/api/v2/tickets",
 		"users":         "/api/v2/users",
 	},
-	ModuleHelpCenter: {},
+	providers.ModuleZendeskHelpCenter: {},
 }
diff --git a/providers/zendesksupport/params.go b/providers/zendesksupport/params.go
index f601ef8f..345da91f 100644
--- a/providers/zendesksupport/params.go
+++ b/providers/zendesksupport/params.go
@@ -7,6 +7,7 @@ import (
 
 	"github.com/amp-labs/connectors/common"
 	"github.com/amp-labs/connectors/common/paramsbuilder"
+	"github.com/amp-labs/connectors/providers"
 	"golang.org/x/oauth2"
 )
 
@@ -51,6 +52,6 @@ func WithWorkspace(workspaceRef string) Option {
 // WithModule sets the zendesk API module to use for the connector. It's required.
 func WithModule(module common.ModuleID) Option {
 	return func(params *parameters) {
-		params.WithModule(module, SupportedModules, ModuleTicketing)
+		params.WithModule(module, SupportedModules, providers.ModuleZendeskTicketing)
 	}
 }
diff --git a/providers/zoom.go b/providers/zoom.go
index cea0f5be..687d7e6d 100644
--- a/providers/zoom.go
+++ b/providers/zoom.go
@@ -1,7 +1,14 @@
 package providers
 
+import "github.com/amp-labs/connectors/common"
+
 const Zoom Provider = "zoom"
 
+const (
+	ModuleZoomUser    common.ModuleID = "user"
+	ModuleZoomMeeting common.ModuleID = "meeting"
+)
+
 func init() {
 	// Zoom configuration
 	SetInfo(Zoom, ProviderInfo{
@@ -18,6 +25,26 @@ func init() {
 				ScopesField: "scope",
 			},
 		},
+		Modules: &Modules{
+			ModuleZoomUser: {
+				BaseURL:     "https://api.zoom.us/v2",
+				DisplayName: "Zoom (User)",
+				Support: Support{
+					Read:      true,
+					Subscribe: false,
+					Write:     true,
+				},
+			},
+			ModuleZoomMeeting: {
+				BaseURL:     "https://api.zoom.us/v2",
+				DisplayName: "Zoom (Meeting)",
+				Support: Support{
+					Read:      true,
+					Subscribe: false,
+					Write:     true,
+				},
+			},
+		},
 		//nolint:lll
 		Media: &Media{
 			DarkMode: &MediaTypeDarkMode{
diff --git a/providers/zoom/connector.go b/providers/zoom/connector.go
index 38dec670..cbfa3fb5 100644
--- a/providers/zoom/connector.go
+++ b/providers/zoom/connector.go
@@ -17,7 +17,7 @@ type Connector struct {
 }
 
 func NewConnector(opts ...Option) (conn *Connector, outErr error) {
-	params, err := paramsbuilder.Apply(parameters{}, opts, WithModule(ModuleMeeting))
+	params, err := paramsbuilder.Apply(parameters{}, opts, WithModule(providers.ModuleZoomMeeting))
 	if err != nil {
 		return nil, err
 	}
diff --git a/providers/zoom/modules.go b/providers/zoom/modules.go
index 9e434656..92cdb03e 100644
--- a/providers/zoom/modules.go
+++ b/providers/zoom/modules.go
@@ -1,14 +1,17 @@
 package zoom
 
 import (
-	"github.com/amp-labs/connectors/common"
+	"github.com/amp-labs/connectors/providers"
 	"github.com/amp-labs/connectors/providers/zoom/metadata"
 )
 
 const (
-	ModuleUser common.ModuleID = "user"
-
-	ModuleMeeting common.ModuleID = "meeting"
+	// ModuleUser
+	// Deprecated.
+	ModuleUser = providers.ModuleZoomUser
+	// ModuleMeeting
+	// Deprecated.
+	ModuleMeeting = providers.ModuleZoomMeeting
 )
 
 var SupportedModules = metadata.Schemas.ModuleRegistry() // nolint: gochecknoglobals
diff --git a/providers/zoom/objectNames.go b/providers/zoom/objectNames.go
index 85852203..f03b41f4 100644
--- a/providers/zoom/objectNames.go
+++ b/providers/zoom/objectNames.go
@@ -3,6 +3,7 @@ package zoom
 import (
 	"github.com/amp-labs/connectors/common"
 	"github.com/amp-labs/connectors/internal/datautils"
+	"github.com/amp-labs/connectors/providers"
 	"github.com/amp-labs/connectors/providers/zoom/metadata"
 )
 
@@ -19,7 +20,7 @@ var (
 // ObjectNameToResponseField maps ObjectName to the response field name which contains that object.
 var ObjectNameToResponseField = common.ModuleObjectNameToFieldName{ // nolint: gochecknoglobals
 
-	ModuleMeeting: datautils.NewDefaultMap(map[string]string{
+	providers.ModuleZoomMeeting: datautils.NewDefaultMap(map[string]string{
 		"device_groups":     "groups",
 		"archive_files":     "meetings",
 		"meeting_summaries": "summaries",
@@ -31,7 +32,7 @@ var ObjectNameToResponseField = common.ModuleObjectNameToFieldName{ // nolint: g
 			return objectName
 		},
 	),
-	ModuleUser: datautils.NewDefaultMap(map[string]string{
+	providers.ModuleZoomUser: datautils.NewDefaultMap(map[string]string{
 		"contacts_groups": "groups",
 	},
 		func(objectName string) (fieldName string) {
@@ -41,13 +42,13 @@ var ObjectNameToResponseField = common.ModuleObjectNameToFieldName{ // nolint: g
 }
 
 var supportedObjectsByWrite = map[common.ModuleID]datautils.StringSet{ // nolint: gochecknoglobals
-	ModuleUser: datautils.NewSet(
+	providers.ModuleZoomUser: datautils.NewSet(
 		ObjectNameContactGroup,
 		ObjectNameUser,
 		ObjectNameGroup,
 	),
 
-	ModuleMeeting: datautils.NewSet(
+	providers.ModuleZoomMeeting: datautils.NewSet(
 		objectNameTrackingField,
 		objectNameDevice,
 		objectNameH322Device,
@@ -70,7 +71,7 @@ var objectNameToWritePath = datautils.NewDefaultMap(map[string]string{ // nolint
 // This map is used to get the record id field for each object.
 var objectNameToWriteResponseIdentifier = common.ModuleObjectNameToFieldName{ // nolint: gochecknoglobals
 
-	ModuleMeeting: datautils.NewDefaultMap(map[string]string{
+	providers.ModuleZoomMeeting: datautils.NewDefaultMap(map[string]string{
 		objectNameTrackingField: "id",
 		objectNameDevice:        "",
 		objectNameH322Device:    "id",
@@ -80,7 +81,7 @@ var objectNameToWriteResponseIdentifier = common.ModuleObjectNameToFieldName{ //
 		},
 	),
 
-	ModuleUser: datautils.NewDefaultMap(map[string]string{
+	providers.ModuleZoomUser: datautils.NewDefaultMap(map[string]string{
 		ObjectNameContactGroup: "group_id",
 		ObjectNameUser:         "id",
 		ObjectNameGroup:        "",
diff --git a/providers/zoom/params.go b/providers/zoom/params.go
index 7f0eac6c..3ea7cb9d 100644
--- a/providers/zoom/params.go
+++ b/providers/zoom/params.go
@@ -7,6 +7,7 @@ import (
 
 	"github.com/amp-labs/connectors/common"
 	"github.com/amp-labs/connectors/common/paramsbuilder"
+	"github.com/amp-labs/connectors/providers"
 	"golang.org/x/oauth2"
 )
 
@@ -44,6 +45,6 @@ func WithAuthenticatedClient(client common.AuthenticatedHTTPClient) Option {
 
 func WithModule(module common.ModuleID) Option {
 	return func(params *parameters) {
-		params.WithModule(module, SupportedModules, ModuleUser)
+		params.WithModule(module, SupportedModules, providers.ModuleZoomUser)
 	}
 }
diff --git a/scripts/openapi/keap/metadata/main.go b/scripts/openapi/keap/metadata/main.go
index b23f22b2..e82a0310 100644
--- a/scripts/openapi/keap/metadata/main.go
+++ b/scripts/openapi/keap/metadata/main.go
@@ -8,7 +8,7 @@ import (
 	"github.com/amp-labs/connectors/internal/goutils"
 	"github.com/amp-labs/connectors/internal/metadatadef"
 	"github.com/amp-labs/connectors/internal/staticschema"
-	"github.com/amp-labs/connectors/providers/keap"
+	"github.com/amp-labs/connectors/providers"
 	"github.com/amp-labs/connectors/providers/keap/metadata"
 	keapv1 "github.com/amp-labs/connectors/scripts/openapi/keap/metadata/v1"
 	keapv2 "github.com/amp-labs/connectors/scripts/openapi/keap/metadata/v2"
@@ -20,8 +20,8 @@ func main() {
 	registry := datautils.NamedLists[string]{}
 	lists := datautils.IndexedLists[common.ModuleID, metadatadef.Schema]{}
 
-	lists.Add(keap.ModuleV1, keapv1.Objects()...)
-	lists.Add(keap.ModuleV2, keapv2.Objects()...)
+	lists.Add(providers.ModuleKeapV1, keapv1.Objects()...)
+	lists.Add(providers.ModuleKeapV2, keapv2.Objects()...)
 
 	for module, objects := range lists {
 		for _, object := range objects {
diff --git a/scripts/openapi/klaviyo/metadata/main.go b/scripts/openapi/klaviyo/metadata/main.go
index 28bc925e..275c6d5a 100644
--- a/scripts/openapi/klaviyo/metadata/main.go
+++ b/scripts/openapi/klaviyo/metadata/main.go
@@ -6,7 +6,7 @@ import (
 	"github.com/amp-labs/connectors/internal/datautils"
 	"github.com/amp-labs/connectors/internal/goutils"
 	"github.com/amp-labs/connectors/internal/staticschema"
-	"github.com/amp-labs/connectors/providers/klaviyo"
+	"github.com/amp-labs/connectors/providers"
 	"github.com/amp-labs/connectors/providers/klaviyo/metadata"
 	"github.com/amp-labs/connectors/providers/klaviyo/openapi"
 	"github.com/amp-labs/connectors/tools/fileconv/api3"
@@ -59,7 +59,8 @@ func main() {
 		}
 
 		for _, field := range object.Fields {
-			schemas.Add(klaviyo.Module2024Oct15, object.ObjectName, object.DisplayName, object.URLPath, object.ResponseKey,
+			schemas.Add(providers.ModuleKlaviyo2024Oct15,
+				object.ObjectName, object.DisplayName, object.URLPath, object.ResponseKey,
 				staticschema.FieldMetadataMapV1{
 					field.Name: field.Name,
 				}, nil, object.Custom)
diff --git a/scripts/openapi/zendesksupport/metadata/main.go b/scripts/openapi/zendesksupport/metadata/main.go
index c715d54a..8be0101c 100644
--- a/scripts/openapi/zendesksupport/metadata/main.go
+++ b/scripts/openapi/zendesksupport/metadata/main.go
@@ -8,7 +8,7 @@ import (
 	"github.com/amp-labs/connectors/internal/goutils"
 	"github.com/amp-labs/connectors/internal/metadatadef"
 	"github.com/amp-labs/connectors/internal/staticschema"
-	"github.com/amp-labs/connectors/providers/zendesksupport"
+	"github.com/amp-labs/connectors/providers"
 	"github.com/amp-labs/connectors/providers/zendesksupport/metadata"
 	utilsopenapi "github.com/amp-labs/connectors/scripts/openapi/utils"
 	"github.com/amp-labs/connectors/scripts/openapi/zendesksupport/metadata/helpcenter"
@@ -21,8 +21,8 @@ func main() {
 	registry := datautils.NamedLists[string]{}
 	lists := datautils.IndexedLists[common.ModuleID, metadatadef.ExtendedSchema[metadata.CustomProperties]]{}
 
-	lists.Add(zendesksupport.ModuleTicketing, support.Objects()...)
-	lists.Add(zendesksupport.ModuleHelpCenter, helpcenter.Objects()...)
+	lists.Add(providers.ModuleZendeskTicketing, support.Objects()...)
+	lists.Add(providers.ModuleZendeskHelpCenter, helpcenter.Objects()...)
 
 	for module, objects := range lists {
 		for _, object := range objects {
diff --git a/scripts/openapi/zoom/metadata/main.go b/scripts/openapi/zoom/metadata/main.go
index b5191864..f998bbf8 100644
--- a/scripts/openapi/zoom/metadata/main.go
+++ b/scripts/openapi/zoom/metadata/main.go
@@ -8,7 +8,7 @@ import (
 	"github.com/amp-labs/connectors/internal/goutils"
 	"github.com/amp-labs/connectors/internal/metadatadef"
 	"github.com/amp-labs/connectors/internal/staticschema"
-	"github.com/amp-labs/connectors/providers/zoom"
+	"github.com/amp-labs/connectors/providers"
 	"github.com/amp-labs/connectors/providers/zoom/metadata"
 	"github.com/amp-labs/connectors/scripts/openapi/zoom/metadata/meeting"
 	"github.com/amp-labs/connectors/scripts/openapi/zoom/metadata/user"
@@ -20,8 +20,8 @@ func main() {
 	registry := datautils.NamedLists[string]{}
 	lists := datautils.IndexedLists[common.ModuleID, metadatadef.Schema]{}
 
-	lists.Add(zoom.ModuleUser, user.Objects()...)
-	lists.Add(zoom.ModuleMeeting, meeting.Objects()...)
+	lists.Add(providers.ModuleZoomUser, user.Objects()...)
+	lists.Add(providers.ModuleZoomMeeting, meeting.Objects()...)
 
 	for module, objects := range lists {
 		for _, object := range objects {
diff --git a/scripts/openapi/zoom/metadata/meeting/object.go b/scripts/openapi/zoom/metadata/meeting/object.go
index 89c58307..28b1d8b5 100644
--- a/scripts/openapi/zoom/metadata/meeting/object.go
+++ b/scripts/openapi/zoom/metadata/meeting/object.go
@@ -3,6 +3,7 @@ package meeting
 import (
 	"github.com/amp-labs/connectors/internal/goutils"
 	"github.com/amp-labs/connectors/internal/metadatadef"
+	"github.com/amp-labs/connectors/providers"
 	"github.com/amp-labs/connectors/providers/zoom"
 	"github.com/amp-labs/connectors/providers/zoom/metadata/openapi"
 	"github.com/amp-labs/connectors/tools/fileconv/api3"
@@ -43,7 +44,7 @@ func Objects() []metadatadef.Schema {
 	objects, err := explorer.ReadObjectsGet(
 		api3.NewAllowPathStrategy(allowedEndpoints),
 		objectEndpoints, nil,
-		api3.CustomMappingObjectCheck(zoom.ObjectNameToResponseField[zoom.ModuleMeeting]),
+		api3.CustomMappingObjectCheck(zoom.ObjectNameToResponseField[providers.ModuleZoomMeeting]),
 	)
 
 	goutils.MustBeNil(err)
diff --git a/scripts/openapi/zoom/metadata/user/object.go b/scripts/openapi/zoom/metadata/user/object.go
index 5691e16f..fcc60695 100644
--- a/scripts/openapi/zoom/metadata/user/object.go
+++ b/scripts/openapi/zoom/metadata/user/object.go
@@ -3,6 +3,7 @@ package user
 import (
 	"github.com/amp-labs/connectors/internal/goutils"
 	"github.com/amp-labs/connectors/internal/metadatadef"
+	"github.com/amp-labs/connectors/providers"
 	"github.com/amp-labs/connectors/providers/zoom"
 	"github.com/amp-labs/connectors/providers/zoom/metadata/openapi"
 	"github.com/amp-labs/connectors/tools/fileconv/api3"
@@ -31,7 +32,9 @@ func Objects() []metadatadef.Schema {
 
 	objects, err := explorer.ReadObjectsGet(
 		api3.NewAllowPathStrategy(allowedEndpoints),
-		objectEndpoints, nil, api3.CustomMappingObjectCheck(zoom.ObjectNameToResponseField[zoom.ModuleUser]),
+		objectEndpoints, nil, api3.CustomMappingObjectCheck(
+			zoom.ObjectNameToResponseField[providers.ModuleZoomUser],
+		),
 	)
 
 	goutils.MustBeNil(err)


Test patch:
diff --git a/providers/atlassian/authmetadata_test.go b/providers/atlassian/authmetadata_test.go
index 4b527b21..9bf041f5 100644
--- a/providers/atlassian/authmetadata_test.go
+++ b/providers/atlassian/authmetadata_test.go
@@ -10,6 +10,7 @@ import (
 	"testing"
 
 	"github.com/amp-labs/connectors/common"
+	"github.com/amp-labs/connectors/providers"
 	"github.com/amp-labs/connectors/test/utils/mockutils/mockserver"
 	"github.com/amp-labs/connectors/test/utils/testutils"
 	"github.com/go-test/deep"
@@ -76,7 +77,7 @@ func TestGetPostAuthInfo(t *testing.T) { //nolint:funlen,gocognit,cyclop,maintid
 			connector, err := NewConnector(
 				WithAuthenticatedClient(http.DefaultClient),
 				WithWorkspace("second-proj"),
-				WithModule(ModuleJira),
+				WithModule(providers.ModuleAtlassianJira),
 			)
 			if err != nil {
 				t.Fatalf("%s: error in test while constructing connector %v", tt.name, err)
diff --git a/providers/atlassian/delete_test.go b/providers/atlassian/delete_test.go
index 93423aa1..674eeec6 100644
--- a/providers/atlassian/delete_test.go
+++ b/providers/atlassian/delete_test.go
@@ -8,6 +8,7 @@ import (
 
 	"github.com/amp-labs/connectors"
 	"github.com/amp-labs/connectors/common"
+	"github.com/amp-labs/connectors/providers"
 	"github.com/amp-labs/connectors/test/utils/mockutils/mockcond"
 	"github.com/amp-labs/connectors/test/utils/mockutils/mockserver"
 	"github.com/amp-labs/connectors/test/utils/testroutines"
@@ -74,7 +75,7 @@ func TestDeleteWithoutMetadata(t *testing.T) {
 	connector, err := NewConnector(
 		WithAuthenticatedClient(http.DefaultClient),
 		WithWorkspace("test-workspace"),
-		WithModule(ModuleJira),
+		WithModule(providers.ModuleAtlassianJira),
 	)
 	if err != nil {
 		t.Fatal("failed to create connector")
diff --git a/providers/atlassian/metadata_test.go b/providers/atlassian/metadata_test.go
index bb55acd1..a004568a 100644
--- a/providers/atlassian/metadata_test.go
+++ b/providers/atlassian/metadata_test.go
@@ -8,6 +8,7 @@ import (
 
 	"github.com/amp-labs/connectors"
 	"github.com/amp-labs/connectors/common"
+	"github.com/amp-labs/connectors/providers"
 	"github.com/amp-labs/connectors/test/utils/mockutils/mockserver"
 	"github.com/amp-labs/connectors/test/utils/testroutines"
 	"github.com/amp-labs/connectors/test/utils/testutils"
@@ -113,7 +114,7 @@ func TestListObjectMetadataWithoutMetadata(t *testing.T) {
 	connector, err := NewConnector(
 		WithAuthenticatedClient(http.DefaultClient),
 		WithWorkspace("test-workspace"),
-		WithModule(ModuleJira),
+		WithModule(providers.ModuleAtlassianJira),
 	)
 	if err != nil {
 		t.Fatal("failed to create connector")
diff --git a/providers/atlassian/read_test.go b/providers/atlassian/read_test.go
index 98ca067b..49095828 100644
--- a/providers/atlassian/read_test.go
+++ b/providers/atlassian/read_test.go
@@ -10,6 +10,7 @@ import (
 	"github.com/amp-labs/connectors"
 	"github.com/amp-labs/connectors/common"
 	"github.com/amp-labs/connectors/internal/jsonquery"
+	"github.com/amp-labs/connectors/providers"
 	"github.com/amp-labs/connectors/test/utils/mockutils/mockcond"
 	"github.com/amp-labs/connectors/test/utils/mockutils/mockserver"
 	"github.com/amp-labs/connectors/test/utils/testroutines"
@@ -266,7 +267,7 @@ func TestReadWithoutMetadata(t *testing.T) {
 	connector, err := NewConnector(
 		WithAuthenticatedClient(http.DefaultClient),
 		WithWorkspace("test-workspace"),
-		WithModule(ModuleJira),
+		WithModule(providers.ModuleAtlassianJira),
 	)
 	if err != nil {
 		t.Fatal("failed to create connector")
@@ -285,7 +286,7 @@ func constructTestConnector(serverURL string) (*Connector, error) {
 	connector, err := NewConnector(
 		WithAuthenticatedClient(http.DefaultClient),
 		WithWorkspace("test-workspace"),
-		WithModule(ModuleJira),
+		WithModule(providers.ModuleAtlassianJira),
 		WithMetadata(map[string]string{
 			"cloudId": "ebc887b2-7e61-4059-ab35-71f15cc16e12", // any value will work for the test
 		}),
diff --git a/providers/atlassian/write_test.go b/providers/atlassian/write_test.go
index 4aa7a485..10fad91c 100644
--- a/providers/atlassian/write_test.go
+++ b/providers/atlassian/write_test.go
@@ -8,6 +8,7 @@ import (
 
 	"github.com/amp-labs/connectors"
 	"github.com/amp-labs/connectors/common"
+	"github.com/amp-labs/connectors/providers"
 	"github.com/amp-labs/connectors/test/utils/mockutils/mockcond"
 	"github.com/amp-labs/connectors/test/utils/mockutils/mockserver"
 	"github.com/amp-labs/connectors/test/utils/testroutines"
@@ -116,7 +117,7 @@ func TestWriteWithoutMetadata(t *testing.T) {
 	connector, err := NewConnector(
 		WithAuthenticatedClient(http.DefaultClient),
 		WithWorkspace("test-workspace"),
-		WithModule(ModuleJira),
+		WithModule(providers.ModuleAtlassianJira),
 	)
 	if err != nil {
 		t.Fatal("failed to create connector")
diff --git a/providers/hubspot/metadata_test.go b/providers/hubspot/metadata_test.go
index cd29e0c6..9d2a90b3 100644
--- a/providers/hubspot/metadata_test.go
+++ b/providers/hubspot/metadata_test.go
@@ -6,6 +6,7 @@ import (
 
 	"github.com/amp-labs/connectors"
 	"github.com/amp-labs/connectors/common"
+	"github.com/amp-labs/connectors/providers"
 	"github.com/amp-labs/connectors/test/utils/mockutils/mockcond"
 	"github.com/amp-labs/connectors/test/utils/mockutils/mockserver"
 	"github.com/amp-labs/connectors/test/utils/testroutines"
@@ -342,7 +343,7 @@ func TestListObjectMetadata(t *testing.T) { // nolint:funlen,gocognit,cyclop,mai
 func constructTestConnector(serverURL string) (*Connector, error) {
 	connector, err := NewConnector(
 		WithAuthenticatedClient(http.DefaultClient),
-		WithModule(ModuleCRM),
+		WithModule(providers.ModuleHubspotCRM),
 	)
 	if err != nil {
 		return nil, err
diff --git a/providers/keap/delete_test.go b/providers/keap/delete_test.go
index 219c954d..fb745af3 100644
--- a/providers/keap/delete_test.go
+++ b/providers/keap/delete_test.go
@@ -7,6 +7,7 @@ import (
 
 	"github.com/amp-labs/connectors"
 	"github.com/amp-labs/connectors/common"
+	"github.com/amp-labs/connectors/providers"
 	"github.com/amp-labs/connectors/test/utils/mockutils/mockcond"
 	"github.com/amp-labs/connectors/test/utils/mockutils/mockserver"
 	"github.com/amp-labs/connectors/test/utils/testroutines"
@@ -73,7 +74,7 @@ func TestDelete(t *testing.T) { // nolint:funlen,cyclop
 			t.Parallel()
 
 			tt.Run(t, func() (connectors.DeleteConnector, error) {
-				return constructTestConnector(tt.Server.URL, ModuleV1)
+				return constructTestConnector(tt.Server.URL, providers.ModuleKeapV1)
 			})
 		})
 	}
diff --git a/providers/keap/metadata_test.go b/providers/keap/metadata_test.go
index f43f0cf7..e980aa8a 100644
--- a/providers/keap/metadata_test.go
+++ b/providers/keap/metadata_test.go
@@ -8,6 +8,7 @@ import (
 
 	"github.com/amp-labs/connectors"
 	"github.com/amp-labs/connectors/common"
+	"github.com/amp-labs/connectors/providers"
 	"github.com/amp-labs/connectors/test/utils/mockutils/mockcond"
 	"github.com/amp-labs/connectors/test/utils/mockutils/mockserver"
 	"github.com/amp-labs/connectors/test/utils/testroutines"
@@ -141,7 +142,7 @@ func TestListObjectMetadataV1(t *testing.T) { // nolint:funlen,gocognit,cyclop
 			t.Parallel()
 
 			tt.Run(t, func() (connectors.ObjectMetadataConnector, error) {
-				return constructTestConnector(tt.Server.URL, ModuleV1)
+				return constructTestConnector(tt.Server.URL, providers.ModuleKeapV1)
 			})
 		})
 	}
@@ -188,7 +189,7 @@ func TestListObjectMetadataV2(t *testing.T) { // nolint:funlen,gocognit,cyclop
 			t.Parallel()
 
 			tt.Run(t, func() (connectors.ObjectMetadataConnector, error) {
-				return constructTestConnector(tt.Server.URL, ModuleV2)
+				return constructTestConnector(tt.Server.URL, providers.ModuleKeapV2)
 			})
 		})
 	}
diff --git a/providers/keap/read_test.go b/providers/keap/read_test.go
index 1e7bdd82..49863057 100644
--- a/providers/keap/read_test.go
+++ b/providers/keap/read_test.go
@@ -8,6 +8,7 @@ import (
 
 	"github.com/amp-labs/connectors"
 	"github.com/amp-labs/connectors/common"
+	"github.com/amp-labs/connectors/providers"
 	"github.com/amp-labs/connectors/test/utils/mockutils/mockcond"
 	"github.com/amp-labs/connectors/test/utils/mockutils/mockserver"
 	"github.com/amp-labs/connectors/test/utils/testroutines"
@@ -168,7 +169,7 @@ func TestReadV1(t *testing.T) { //nolint:funlen,gocognit,cyclop,maintidx
 			t.Parallel()
 
 			tt.Run(t, func() (connectors.ReadConnector, error) {
-				return constructTestConnector(tt.Server.URL, ModuleV1)
+				return constructTestConnector(tt.Server.URL, providers.ModuleKeapV1)
 			})
 		})
 	}
@@ -219,7 +220,7 @@ func TestReadV2(t *testing.T) { //nolint:funlen,gocognit,cyclop,maintidx
 			t.Parallel()
 
 			tt.Run(t, func() (connectors.ReadConnector, error) {
-				return constructTestConnector(tt.Server.URL, ModuleV2)
+				return constructTestConnector(tt.Server.URL, providers.ModuleKeapV2)
 			})
 		})
 	}
diff --git a/providers/keap/write_test.go b/providers/keap/write_test.go
index 1f586a2b..dbe29432 100644
--- a/providers/keap/write_test.go
+++ b/providers/keap/write_test.go
@@ -7,6 +7,7 @@ import (
 
 	"github.com/amp-labs/connectors"
 	"github.com/amp-labs/connectors/common"
+	"github.com/amp-labs/connectors/providers"
 	"github.com/amp-labs/connectors/test/utils/mockutils/mockcond"
 	"github.com/amp-labs/connectors/test/utils/mockutils/mockserver"
 	"github.com/amp-labs/connectors/test/utils/testroutines"
@@ -110,7 +111,7 @@ func TestWrite(t *testing.T) { // nolint:funlen,cyclop
 			t.Parallel()
 
 			tt.Run(t, func() (connectors.WriteConnector, error) {
-				return constructTestConnector(tt.Server.URL, ModuleV1)
+				return constructTestConnector(tt.Server.URL, providers.ModuleKeapV1)
 			})
 		})
 	}
diff --git a/providers/zendesksupport/delete_test.go b/providers/zendesksupport/delete_test.go
index 2b0f7d77..836deabb 100644
--- a/providers/zendesksupport/delete_test.go
+++ b/providers/zendesksupport/delete_test.go
@@ -7,6 +7,7 @@ import (
 
 	"github.com/amp-labs/connectors"
 	"github.com/amp-labs/connectors/common"
+	"github.com/amp-labs/connectors/providers"
 	"github.com/amp-labs/connectors/test/utils/mockutils/mockcond"
 	"github.com/amp-labs/connectors/test/utils/mockutils/mockserver"
 	"github.com/amp-labs/connectors/test/utils/testroutines"
@@ -64,7 +65,7 @@ func TestDelete(t *testing.T) { // nolint:funlen,cyclop
 			t.Parallel()
 
 			tt.Run(t, func() (connectors.DeleteConnector, error) {
-				return constructTestConnector(tt.Server.URL, ModuleTicketing)
+				return constructTestConnector(tt.Server.URL, providers.ModuleZendeskTicketing)
 			})
 		})
 	}
diff --git a/providers/zendesksupport/metadata_test.go b/providers/zendesksupport/metadata_test.go
index 265ebfb7..351188b2 100644
--- a/providers/zendesksupport/metadata_test.go
+++ b/providers/zendesksupport/metadata_test.go
@@ -7,6 +7,7 @@ import (
 
 	"github.com/amp-labs/connectors"
 	"github.com/amp-labs/connectors/common"
+	"github.com/amp-labs/connectors/providers"
 	"github.com/amp-labs/connectors/test/utils/mockutils/mockserver"
 	"github.com/amp-labs/connectors/test/utils/testroutines"
 )
@@ -101,7 +102,7 @@ func TestListObjectMetadataZendeskSupportModule(t *testing.T) { // nolint:funlen
 			t.Parallel()
 
 			tt.Run(t, func() (connectors.ObjectMetadataConnector, error) {
-				return constructTestConnector(tt.Server.URL, ModuleTicketing)
+				return constructTestConnector(tt.Server.URL, providers.ModuleZendeskTicketing)
 			})
 		})
 	}
@@ -147,7 +148,7 @@ func TestListObjectMetadataHelpCenterModule(t *testing.T) { // nolint:funlen,goc
 			t.Parallel()
 
 			tt.Run(t, func() (connectors.ObjectMetadataConnector, error) {
-				return constructTestConnector(tt.Server.URL, ModuleHelpCenter)
+				return constructTestConnector(tt.Server.URL, providers.ModuleZendeskHelpCenter)
 			})
 		})
 	}
diff --git a/providers/zendesksupport/read_test.go b/providers/zendesksupport/read_test.go
index 93b40b90..6a20800b 100644
--- a/providers/zendesksupport/read_test.go
+++ b/providers/zendesksupport/read_test.go
@@ -9,6 +9,7 @@ import (
 	"github.com/amp-labs/connectors"
 	"github.com/amp-labs/connectors/common"
 	"github.com/amp-labs/connectors/internal/jsonquery"
+	"github.com/amp-labs/connectors/providers"
 	"github.com/amp-labs/connectors/test/utils/mockutils/mockcond"
 	"github.com/amp-labs/connectors/test/utils/mockutils/mockserver"
 	"github.com/amp-labs/connectors/test/utils/testroutines"
@@ -127,7 +128,7 @@ func TestReadZendeskSupportModule(t *testing.T) { //nolint:funlen,gocognit,cyclo
 			t.Parallel()
 
 			tt.Run(t, func() (connectors.ReadConnector, error) {
-				return constructTestConnector(tt.Server.URL, ModuleTicketing)
+				return constructTestConnector(tt.Server.URL, providers.ModuleZendeskTicketing)
 			})
 		})
 	}
@@ -273,7 +274,7 @@ func TestIncrementalReadZendeskSupportModule(t *testing.T) { //nolint:funlen,goc
 			t.Parallel()
 
 			tt.Run(t, func() (connectors.ReadConnector, error) {
-				return constructTestConnector(tt.Server.URL, ModuleTicketing)
+				return constructTestConnector(tt.Server.URL, providers.ModuleZendeskTicketing)
 			})
 		})
 	}
@@ -331,7 +332,7 @@ func TestReadHelpCenterModule(t *testing.T) { //nolint:funlen,gocognit,cyclop,ma
 			t.Parallel()
 
 			tt.Run(t, func() (connectors.ReadConnector, error) {
-				return constructTestConnector(tt.Server.URL, ModuleHelpCenter)
+				return constructTestConnector(tt.Server.URL, providers.ModuleZendeskHelpCenter)
 			})
 		})
 	}
diff --git a/providers/zendesksupport/schema_test.go b/providers/zendesksupport/schema_test.go
index 77ad8163..402e07fa 100644
--- a/providers/zendesksupport/schema_test.go
+++ b/providers/zendesksupport/schema_test.go
@@ -4,6 +4,7 @@ import (
 	"testing"
 
 	"github.com/amp-labs/connectors/common"
+	"github.com/amp-labs/connectors/providers"
 	"github.com/amp-labs/connectors/providers/zendesksupport/metadata"
 )
 
@@ -16,27 +17,27 @@ func TestLookupPaginationType(t *testing.T) {
 		want   string
 	}{
 		{
-			module: ModuleTicketing,
+			module: providers.ModuleZendeskTicketing,
 			object: "tickets",
 			want:   "cursor",
 		},
 		{
-			module: ModuleTicketing,
+			module: providers.ModuleZendeskTicketing,
 			object: "workspaces",
 			want:   "offset",
 		},
 		{
-			module: ModuleHelpCenter,
+			module: providers.ModuleZendeskHelpCenter,
 			object: "articles",
 			want:   "offset",
 		},
 		{
-			module: ModuleTicketing,
+			module: providers.ModuleZendeskTicketing,
 			object: "macros",
 			want:   "cursor",
 		},
 		{
-			module: ModuleHelpCenter,
+			module: providers.ModuleZendeskHelpCenter,
 			object: "community_posts",
 			want:   "offset",
 		},
diff --git a/providers/zendesksupport/write_test.go b/providers/zendesksupport/write_test.go
index d33c3763..72554e0f 100644
--- a/providers/zendesksupport/write_test.go
+++ b/providers/zendesksupport/write_test.go
@@ -7,6 +7,7 @@ import (
 
 	"github.com/amp-labs/connectors"
 	"github.com/amp-labs/connectors/common"
+	"github.com/amp-labs/connectors/providers"
 	"github.com/amp-labs/connectors/test/utils/mockutils/mockcond"
 	"github.com/amp-labs/connectors/test/utils/mockutils/mockserver"
 	"github.com/amp-labs/connectors/test/utils/testroutines"
@@ -166,7 +167,7 @@ func TestWriteZendeskSupportModule(t *testing.T) { // nolint:funlen,cyclop
 			t.Parallel()
 
 			tt.Run(t, func() (connectors.WriteConnector, error) {
-				return constructTestConnector(tt.Server.URL, ModuleTicketing)
+				return constructTestConnector(tt.Server.URL, providers.ModuleZendeskTicketing)
 			})
 		})
 	}
@@ -210,7 +211,7 @@ func TestWriteHelpCenterModule(t *testing.T) { //nolint:funlen,gocognit,cyclop,m
 			t.Parallel()
 
 			tt.Run(t, func() (connectors.WriteConnector, error) {
-				return constructTestConnector(tt.Server.URL, ModuleHelpCenter)
+				return constructTestConnector(tt.Server.URL, providers.ModuleZendeskHelpCenter)
 			})
 		})
 	}
diff --git a/providers/zoom/metadata_test.go b/providers/zoom/metadata_test.go
index 1e194605..dab8c277 100644
--- a/providers/zoom/metadata_test.go
+++ b/providers/zoom/metadata_test.go
@@ -6,6 +6,7 @@ import (
 
 	"github.com/amp-labs/connectors"
 	"github.com/amp-labs/connectors/common"
+	"github.com/amp-labs/connectors/providers"
 	"github.com/amp-labs/connectors/test/utils/mockutils/mockserver"
 	"github.com/amp-labs/connectors/test/utils/testroutines"
 )
@@ -61,7 +62,7 @@ func TestListObjectMetaUserModule(t *testing.T) {
 		t.Run(tt.Name, func(t *testing.T) {
 			t.Parallel()
 			tt.Run(t, func() (connectors.ObjectMetadataConnector, error) {
-				return constructTestConnector(tt.Server.URL, ModuleUser)
+				return constructTestConnector(tt.Server.URL, providers.ModuleZoomUser)
 			})
 		})
 	}
@@ -106,7 +107,7 @@ func TestListObjectMetaMeetingModule(t *testing.T) {
 		t.Run(tt.Name, func(t *testing.T) {
 			t.Parallel()
 			tt.Run(t, func() (connectors.ObjectMetadataConnector, error) {
-				return constructTestConnector(tt.Server.URL, ModuleMeeting)
+				return constructTestConnector(tt.Server.URL, providers.ModuleZoomMeeting)
 			})
 		})
 	}
diff --git a/providers/zoom/read_test.go b/providers/zoom/read_test.go
index 1fba486e..0edb6750 100644
--- a/providers/zoom/read_test.go
+++ b/providers/zoom/read_test.go
@@ -6,6 +6,7 @@ import (
 
 	"github.com/amp-labs/connectors"
 	"github.com/amp-labs/connectors/common"
+	"github.com/amp-labs/connectors/providers"
 	"github.com/amp-labs/connectors/test/utils/mockutils/mockserver"
 	"github.com/amp-labs/connectors/test/utils/testroutines"
 	"github.com/amp-labs/connectors/test/utils/testutils"
@@ -98,7 +99,7 @@ func TestReadModuleUser(t *testing.T) { //nolint:funlen,gocognit,cyclop,maintidx
 		t.Run(tt.Name, func(t *testing.T) {
 			t.Parallel()
 			tt.Run(t, func() (connectors.ReadConnector, error) {
-				return constructTestConnector(tt.Server.URL, ModuleUser)
+				return constructTestConnector(tt.Server.URL, providers.ModuleZoomUser)
 			})
 		})
 	}
@@ -176,7 +177,7 @@ func TestReadModuleMeeting(t *testing.T) { //nolint:funlen,gocognit,cyclop,maint
 		t.Run(tt.Name, func(t *testing.T) {
 			t.Parallel()
 			tt.Run(t, func() (connectors.ReadConnector, error) {
-				return constructTestConnector(tt.Server.URL, ModuleMeeting)
+				return constructTestConnector(tt.Server.URL, providers.ModuleZoomMeeting)
 			})
 		})
 	}
diff --git a/providers/zoom/write_test.go b/providers/zoom/write_test.go
index 951c35e5..ff80a40e 100644
--- a/providers/zoom/write_test.go
+++ b/providers/zoom/write_test.go
@@ -6,6 +6,7 @@ import (
 
 	"github.com/amp-labs/connectors"
 	"github.com/amp-labs/connectors/common"
+	"github.com/amp-labs/connectors/providers"
 	"github.com/amp-labs/connectors/test/utils/mockutils/mockcond"
 	"github.com/amp-labs/connectors/test/utils/mockutils/mockserver"
 	"github.com/amp-labs/connectors/test/utils/testroutines"
@@ -92,7 +93,7 @@ func TestWriteModuleMeeting(t *testing.T) { //nolint:funlen
 		t.Run(tt.Name, func(t *testing.T) {
 			t.Parallel()
 			tt.Run(t, func() (connectors.WriteConnector, error) {
-				return constructTestConnector(tt.Server.URL, ModuleMeeting)
+				return constructTestConnector(tt.Server.URL, providers.ModuleZoomMeeting)
 			})
 		})
 	}
@@ -155,7 +156,7 @@ func TestWriteModuleUser(t *testing.T) { //nolint:funlen
 		t.Run(tt.Name, func(t *testing.T) {
 			t.Parallel()
 			tt.Run(t, func() (connectors.WriteConnector, error) {
-				return constructTestConnector(tt.Server.URL, ModuleUser)
+				return constructTestConnector(tt.Server.URL, providers.ModuleZoomUser)
 			})
 		})
 	}
diff --git a/test/atlassian/connector.go b/test/atlassian/connector.go
index 9dc6fb32..a1c4b94f 100644
--- a/test/atlassian/connector.go
+++ b/test/atlassian/connector.go
@@ -21,7 +21,7 @@ func GetAtlassianConnector(ctx context.Context) *atlassian.Connector {
 	conn, err := atlassian.NewConnector(
 		atlassian.WithClient(ctx, http.DefaultClient, getConfig(reader), reader.GetOauthToken()),
 		atlassian.WithWorkspace(reader.Get(credscanning.Fields.Workspace)),
-		atlassian.WithModule(atlassian.ModuleJira),
+		atlassian.WithModule(providers.ModuleAtlassianJira),
 		atlassian.WithMetadata(map[string]string{
 			// This value can be obtained by following this API reference.
 			// https://developer.atlassian.com/cloud/confluence/oauth-2-3lo-apps/#3-1-get-the-cloudid-for-your-site
@@ -53,7 +53,7 @@ func GetAtlassianConnectConnector(ctx context.Context, claims map[string]any) *a
 	conn, err := atlassian.NewConnector(
 		atlassian.WithAuthenticatedClient(client),
 		atlassian.WithWorkspace(reader.Get(credscanning.Fields.Workspace)),
-		atlassian.WithModule(atlassian.ModuleAtlassianJiraConnect),
+		atlassian.WithModule(providers.ModuleAtlassianJiraConnect),
 	)
 	if err != nil {
 		utils.Fail("error creating connector", "error", err)
diff --git a/test/hubspot/connector.go b/test/hubspot/connector.go
index 164348e5..a92638c5 100644
--- a/test/hubspot/connector.go
+++ b/test/hubspot/connector.go
@@ -17,7 +17,7 @@ func GetHubspotConnector(ctx context.Context) *hubspot.Connector {
 
 	conn, err := hubspot.NewConnector(
 		hubspot.WithClient(ctx, http.DefaultClient, getConfig(reader), reader.GetOauthToken()),
-		hubspot.WithModule(hubspot.ModuleCRM))
+		hubspot.WithModule(providers.ModuleHubspotCRM))
 	if err != nil {
 		utils.Fail("error creating hubspot connector", "error", err)
 	}
diff --git a/test/marketo/connector.go b/test/marketo/connector.go
index b867e6dc..ea26ddaf 100644
--- a/test/marketo/connector.go
+++ b/test/marketo/connector.go
@@ -18,7 +18,7 @@ func GetMarketoConnector(ctx context.Context) *marketo.Connector {
 	conn, err := marketo.NewConnector(
 		marketo.WithClient(ctx, http.DefaultClient, getConfig(reader)),
 		marketo.WithWorkspace(reader.Get(credscanning.Fields.Workspace)),
-		marketo.WithModule(marketo.ModuleAssets),
+		marketo.WithModule(providers.ModuleMarketoAssets),
 	)
 	if err != nil {
 		utils.Fail("error creating connector", "error", err)
@@ -33,7 +33,7 @@ func GetMarketoConnectorLeads(ctx context.Context) *marketo.Connector {
 	conn, err := marketo.NewConnector(
 		marketo.WithClient(ctx, http.DefaultClient, getConfig(reader)),
 		marketo.WithWorkspace(reader.Get(credscanning.Fields.Workspace)),
-		marketo.WithModule(marketo.ModuleLeads),
+		marketo.WithModule(providers.ModuleMarketoLeads),
 	)
 	if err != nil {
 		utils.Fail("error creating connector", "error", err)
diff --git a/test/zendesksupport/connector.go b/test/zendesksupport/connector.go
index cfc50231..4016b8f3 100644
--- a/test/zendesksupport/connector.go
+++ b/test/zendesksupport/connector.go
@@ -19,7 +19,7 @@ func GetZendeskSupportConnector(ctx context.Context) *zendesksupport.Connector {
 	conn, err := zendesksupport.NewConnector(
 		zendesksupport.WithClient(ctx, http.DefaultClient, getConfig(reader), reader.GetOauthToken()),
 		zendesksupport.WithWorkspace(reader.Get(credscanning.Fields.Workspace)),
-		zendesksupport.WithModule(zendesksupport.ModuleTicketing),
+		zendesksupport.WithModule(providers.ModuleZendeskTicketing),
 	)
 	if err != nil {
 		utils.Fail("error creating connector", "error", err)
diff --git a/test/zoom/metadata/metadata.go b/test/zoom/metadata/metadata.go
index 97019422..d41d82fc 100644
--- a/test/zoom/metadata/metadata.go
+++ b/test/zoom/metadata/metadata.go
@@ -7,7 +7,7 @@ import (
 	"os/signal"
 	"syscall"
 
-	"github.com/amp-labs/connectors/providers/zoom"
+	"github.com/amp-labs/connectors/providers"
 	"github.com/amp-labs/connectors/test/utils"
 	connTest "github.com/amp-labs/connectors/test/zoom"
 )
@@ -19,7 +19,7 @@ func main() {
 	// Set up slog logging.
 	utils.SetupLogging()
 
-	conn := connTest.GetZoomConnector(ctx, zoom.ModuleUser)
+	conn := connTest.GetZoomConnector(ctx, providers.ModuleZoomUser)
 	defer utils.Close(conn)
 
 	metadata, err := conn.ListObjectMetadata(ctx, []string{"users", "groups"})
diff --git a/test/zoom/read/main.go b/test/zoom/read/main.go
index 4f9120b6..9cabf7bc 100644
--- a/test/zoom/read/main.go
+++ b/test/zoom/read/main.go
@@ -9,7 +9,7 @@ import (
 
 	"github.com/amp-labs/connectors"
 	"github.com/amp-labs/connectors/common"
-	"github.com/amp-labs/connectors/providers/zoom"
+	"github.com/amp-labs/connectors/providers"
 	"github.com/amp-labs/connectors/test/utils"
 	connTest "github.com/amp-labs/connectors/test/zoom"
 )
@@ -22,7 +22,7 @@ func main() {
 	// Set up slog logging.
 	utils.SetupLogging()
 
-	conn := connTest.GetZoomConnector(ctx, zoom.ModuleUser)
+	conn := connTest.GetZoomConnector(ctx, providers.ModuleZoomUser)
 
 	res, err := conn.Read(ctx, common.ReadParams{
 		ObjectName: objectName,
diff --git a/test/zoom/write/main.go b/test/zoom/write/main.go
index 64823546..d91fd412 100644
--- a/test/zoom/write/main.go
+++ b/test/zoom/write/main.go
@@ -8,6 +8,7 @@ import (
 	"syscall"
 
 	"github.com/amp-labs/connectors/common"
+	"github.com/amp-labs/connectors/providers"
 	"github.com/amp-labs/connectors/providers/zoom"
 	"github.com/amp-labs/connectors/test/utils"
 	connTest "github.com/amp-labs/connectors/test/zoom"
@@ -37,7 +38,7 @@ func main() {
 	// Set up slog logging.
 	utils.SetupLogging()
 
-	conn := connTest.GetZoomConnector(ctx, zoom.ModuleUser)
+	conn := connTest.GetZoomConnector(ctx, providers.ModuleZoomUser)
 
 	slog.Info("> TEST Create User")
 	slog.Info("Creating a user...")