Repository: amp-labs/connectors
Pull request #699 (2024-07-16 18:47:39)

feat: Enable Read+Write: Dynamics CRM
# Installation
![image](https://github.com/user-attachments/assets/155e6937-4353-48b9-bc31-fc29bd71dee8)

# Read
![image](https://github.com/user-attachments/assets/224c8f22-359a-4fbe-8fbb-7a2bff4a24d9)
Webhook recieved data.
![image](https://github.com/user-attachments/assets/3ff61766-e7a7-4b72-ad5b-a41390d8283f)

# Write
Create contact.
![image](https://github.com/user-attachments/assets/1b2815e7-7437-4efa-91fa-1fdb37262110)
![image](https://github.com/user-attachments/assets/0937250b-5ab9-444b-ba1a-daa1c1713cc8)

Create account.
![image](https://github.com/user-attachments/assets/e52cca5e-01f5-40e7-8bcb-fd7e6bb236a7)
![image](https://github.com/user-attachments/assets/5d784ab5-8f5f-4911-bf73-578ea6a86a3c)

Create lead.
![image](https://github.com/user-attachments/assets/6717304d-8723-4029-9400-07fc6636a15e)
![image](https://github.com/user-attachments/assets/625a67db-40b4-4d53-b650-6a7b532f68ea)

Update lead.
![image](https://github.com/user-attachments/assets/f3ad3ad3-480e-460e-899d-98b53da4cc56)
![image](https://github.com/user-attachments/assets/42276d87-75d6-4869-a79c-0d1ac0f0c589)



Cobalt0s: * **#699** <a href="https://app.graphite.dev/github/pr/amp-labs/connectors/699?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`

This stack of pull requests is managed by Graphite. <a href="https://stacking.dev/?utm_source=stack-comment">Learn more about stacking.</a>
<h2></h2>

 Join @Cobalt0s and the rest of your teammates on <a href="https://graphite.dev?utm-source=stack-comment"><img src="https://static.graphite.dev/graphite-32x32-black.png" alt="Graphite" width="11px" height="11px"/> <b>Graphite</b></a>
  <!-- Current dependencies on/for this PR: -->

Patch:
diff --git a/common/handy/lists.go b/common/handy/lists.go
index fb2bcda5..778e28af 100644
--- a/common/handy/lists.go
+++ b/common/handy/lists.go
@@ -1,7 +1,10 @@
 package handy
 
+// Lists is a collection of named lists.
 type Lists[T any] map[string][]T
 
+// Add objects into the named list.
+// If the list didn't exist it will create it.
 func (l Lists[T]) Add(kind string, objects ...T) {
 	if _, ok := l[kind]; !ok {
 		l[kind] = make([]T, 0)
diff --git a/common/handy/maps.go b/common/handy/maps.go
index b527b678..6db8bc80 100644
--- a/common/handy/maps.go
+++ b/common/handy/maps.go
@@ -16,32 +16,3 @@ func (m Map[K, V]) Keys() []K {
 func (m Map[K, V]) KeySet() Set[K] {
 	return NewSet(m.Keys())
 }
-
-type Set[V comparable] map[V]struct{}
-
-func NewSet[V comparable](values []V) Set[V] {
-	result := make(Set[V])
-	for _, v := range values {
-		result[v] = struct{}{}
-	}
-
-	return result
-}
-
-func (s Set[V]) Diff(other Set[V]) []V {
-	difference := s.Subtract(other)
-
-	return append(difference, other.Subtract(s)...)
-}
-
-func (s Set[V]) Subtract(other Set[V]) []V {
-	difference := make([]V, 0)
-
-	for v := range s {
-		if _, ok := other[v]; !ok {
-			difference = append(difference, v)
-		}
-	}
-
-	return difference
-}
diff --git a/common/handy/pointers.go b/common/handy/pointers.go
new file mode 100644
index 00000000..f7caf8e1
--- /dev/null
+++ b/common/handy/pointers.go
@@ -0,0 +1,25 @@
+package handy
+
+// Pointers is a collection of utility functions that help with go pointer referencing.
+var Pointers = pointers{} // nolint:gochecknoglobals
+
+type pointers struct{}
+
+// Str returns a pointer to the given string.
+func (pointers) Str(input string) *string {
+	return &input
+}
+
+// Bool returns a pointer to the given boolean.
+func (pointers) Bool(input bool) *bool {
+	return &input
+}
+
+// IsTrue checks boolean pointer was set and is true.
+func (pointers) IsTrue(input *bool) bool {
+	if input == nil {
+		return false
+	}
+
+	return *input
+}
diff --git a/common/handy/set.go b/common/handy/set.go
new file mode 100644
index 00000000..ac2b65fc
--- /dev/null
+++ b/common/handy/set.go
@@ -0,0 +1,55 @@
+package handy
+
+// Set data structure that can hold any type of data.
+type Set[T comparable] map[T]struct{}
+
+// NewSet creates a set from slice.
+func NewSet[V comparable](values []V) Set[V] {
+	result := make(Set[V])
+	result.Add(values)
+
+	return result
+}
+
+// Add will add a list of values to the unique set. Repetitions will be omitted.
+func (s Set[T]) Add(values []T) {
+	for _, value := range values {
+		s.AddOne(value)
+	}
+}
+
+// AddOne will add single value to the unique set.
+func (s Set[T]) AddOne(value T) {
+	s[value] = struct{}{}
+}
+
+// List returns unique set in a shape of a slice.
+func (s Set[T]) List() []T {
+	list := make([]T, 0)
+	for v := range s {
+		list = append(list, v)
+	}
+
+	return list
+}
+
+// Diff is a difference between 2 sets.
+// Every object that is not within intersection will be returned.
+func (s Set[V]) Diff(other Set[V]) []V {
+	difference := s.Subtract(other)
+
+	return append(difference, other.Subtract(s)...)
+}
+
+// Subtract will return objects from current set that didn't occur in the input.
+func (s Set[V]) Subtract(other Set[V]) []V {
+	difference := make([]V, 0)
+
+	for v := range s {
+		if _, ok := other[v]; !ok {
+			difference = append(difference, v)
+		}
+	}
+
+	return difference
+}
diff --git a/internal/generated/catalog.json b/internal/generated/catalog.json
index 747489f9..edb87ce4 100644
--- a/internal/generated/catalog.json
+++ b/internal/generated/catalog.json
@@ -1,1 +1,1 @@
-{"aWeber":{"authType":"oauth2","baseURL":"https://api.aweber.com","displayName":"AWeber","name":"aWeber","oauth2Opts":{"authURL":"https://auth.aweber.com/oauth2/authorize","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://auth.aweber.com/oauth2/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"acuityScheduling":{"authType":"oauth2","baseURL":"https://acuityscheduling.com","displayName":"Acuity Scheduling","name":"acuityScheduling","oauth2Opts":{"authURL":"https://acuityscheduling.com/oauth2/authorize","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://acuityscheduling.com/oauth2/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"adobeExperiencePlatform":{"authType":"oauth2","baseURL":"https://platform.adobe.io","displayName":"Adobe Experience Platform","name":"adobeExperiencePlatform","oauth2Opts":{"explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"clientCredentials","tokenMetadataFields":{},"tokenURL":"https://ims-na1.adobelogin.com/ims/token/v3"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"aha":{"authType":"oauth2","baseURL":"https://{{.workspace}}.aha.io/api","displayName":"Aha","name":"aha","oauth2Opts":{"authURL":"https://{{.workspace}}.aha.io/oauth/authorize","explicitScopesRequired":false,"explicitWorkspaceRequired":true,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://{{.workspace}}.aha.io/oauth/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"aircall":{"authType":"oauth2","baseURL":"https://api.aircall.io","displayName":"Aircall","name":"aircall","oauth2Opts":{"authURL":"https://dashboard.aircall.io/oauth/authorize","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://api.aircall.io/v1/oauth/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"airtable":{"authType":"oauth2","baseURL":"https://api.airtable.com","displayName":"Airtable","name":"airtable","oauth2Opts":{"authURL":"https://airtable.com/oauth2/v1/authorize","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"PKCE","tokenMetadataFields":{"scopesField":"scope"},"tokenURL":"https://airtable.com/oauth2/v1/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"amplitude":{"authType":"basic","baseURL":"https://amplitude.com","displayName":"Amplitude","name":"amplitude","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"anthropic":{"apiKeyOpts":{"attachmentType":"header","docsURL":"https://docs.anthropic.com/en/api/getting-started#authentication","header":{"name":"x-api-key"}},"authType":"apiKey","baseURL":"https://api.anthropic.com","displayName":"Anthropic","name":"anthropic","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"apollo":{"apiKeyOpts":{"attachmentType":"header","docsURL":"https://apolloio.github.io/apollo-api-docs/?shell#authentication","header":{"name":"X-Api-Key"}},"authType":"apiKey","baseURL":"https://api.apollo.io","displayName":"Apollo","name":"apollo","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"asana":{"authType":"oauth2","baseURL":"https://app.asana.com/api","displayName":"Asana","name":"asana","oauth2Opts":{"authURL":"https://app.asana.com/-/oauth_authorize","explicitScopesRequired":false,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{"consumerRefField":"data.id"},"tokenURL":"https://app.asana.com/-/oauth_token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"atlassian":{"authType":"oauth2","baseURL":"https://api.atlassian.com","displayName":"Atlassian (Jira, Confluence)","name":"atlassian","oauth2Opts":{"authURL":"https://auth.atlassian.com/authorize","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://auth.atlassian.com/oauth/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"attio":{"authType":"oauth2","baseURL":"https://api.attio.com","displayName":"Attio","name":"attio","oauth2Opts":{"authURL":"https://app.attio.com/authorize","explicitScopesRequired":false,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://app.attio.com/oauth/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"basecamp":{"authType":"oauth2","baseURL":"https://3.basecampapi.com/{{.workspace}}","displayName":"Basecamp","name":"basecamp","oauth2Opts":{"authURL":"https://launchpad.37signals.com/authorization/new?type=web_server","explicitScopesRequired":false,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://launchpad.37signals.com/authorization/token?type=refresh"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"blueshift":{"authType":"basic","baseURL":"https://api.getblueshift.com/api","displayName":"Blueshift","name":"blueshift","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"blueshiftEU":{"authType":"basic","baseURL":"https://api.eu.getblueshift.com/api","displayName":"Blueshift (EU)","name":"blueshiftEU","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"box":{"authType":"oauth2","baseURL":"https://api.box.com","displayName":"Box","name":"box","oauth2Opts":{"authURL":"https://account.box.com/api/oauth2/authorize","explicitScopesRequired":false,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://api.box.com/oauth2/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"braintree":{"authType":"basic","baseURL":"https://payments.sandbox.braintree-api.com/graphql","displayName":"Braintree","name":"braintree","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"brevo":{"apiKeyOpts":{"attachmentType":"header","docsURL":"https://developers.brevo.com/docs/getting-started","header":{"name":"api-key"}},"authType":"apiKey","baseURL":"https://api.brevo.com","displayName":"Brevo","name":"brevo","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"bynder":{"authType":"oauth2","baseURL":"https://{{.workspace}}.bynder.com/api","displayName":"bynder","name":"bynder","oauth2Opts":{"authURL":"https://{{.workspace}}.bynder.com/v6/authentication/oauth2/auth","explicitScopesRequired":true,"explicitWorkspaceRequired":true,"grantType":"authorizationCode","tokenMetadataFields":{"scopesField":"scope"},"tokenURL":"https://{{.workspace}}.bynder.com/v6/authentication/oauth2/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"calendly":{"authType":"oauth2","baseURL":"https://api.calendly.com","displayName":"Calendly","name":"calendly","oauth2Opts":{"authURL":"https://auth.calendly.com/oauth/authorize","explicitScopesRequired":false,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://auth.calendly.com/oauth/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"callRail":{"apiKeyOpts":{"attachmentType":"header","docsURL":"https://apidocs.callrail.com/#getting-started","header":{"name":"Authorization","valuePrefix":"Token token="}},"authType":"apiKey","baseURL":"https://api.callrail.com","name":"callRail","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"campaignMonitor":{"authType":"oauth2","baseURL":"https://api.createsend.com","displayName":"Campaign Monitor","name":"campaignMonitor","oauth2Opts":{"authURL":"https://api.createsend.com/oauth","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://api.createsend.com/oauth/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"capsule":{"authType":"oauth2","baseURL":"https://api.capsulecrm.com/api","displayName":"Capsule","name":"capsule","oauth2Opts":{"authURL":"https://api.capsulecrm.com/oauth/authorise","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://api.capsulecrm.com/oauth/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"chargeOver":{"authType":"basic","baseURL":"https://{{.workspace}}.chargeover.com","displayName":"ChargeOver","name":"chargeOver","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"chargebee":{"authType":"basic","baseURL":"https://{{.workspace}}.chargebee.com/api","displayName":"Chargebee","name":"chargebee","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"chartMogul":{"authType":"basic","baseURL":"https://api.chartmogul.com","displayName":"ChartMogul","name":"chartMogul","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"clari":{"apiKeyOpts":{"attachmentType":"header","docsURL":"https://developer.clari.com/documentation/external_spec","header":{"name":"apiKey"}},"authType":"apiKey","baseURL":"https://api.clari.com","displayName":"Clari","name":"clari","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"clickup":{"authType":"oauth2","baseURL":"https://api.clickup.com","displayName":"ClickUp","name":"clickup","oauth2Opts":{"authURL":"https://app.clickup.com/api","explicitScopesRequired":false,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://api.clickup.com/api/v2/oauth/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"close":{"authType":"oauth2","baseURL":"https://api.close.com/api","displayName":"Close","name":"close","oauth2Opts":{"authURL":"https://app.close.com/oauth2/authorize","explicitScopesRequired":false,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{"consumerRefField":"user_id","scopesField":"scope","workspaceRefField":"organization_id"},"tokenURL":"https://api.close.com/oauth2/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"coda":{"apiKeyOpts":{"attachmentType":"header","docsURL":"https://coda.io/developers/apis/v1#section/Introduction","header":{"name":"Authorization","valuePrefix":"Bearer "}},"authType":"apiKey","baseURL":"https://coda.io/apis","displayName":"Coda","name":"coda","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"constantContact":{"authType":"oauth2","baseURL":"https://api.cc.email","displayName":"Constant Contact","name":"constantContact","oauth2Opts":{"authURL":"https://authz.constantcontact.com/oauth2/default/v1/authorize","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://authz.constantcontact.com/oauth2/default/v1/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"copper":{"authType":"oauth2","baseURL":"https://api.copper.com/developer_api","displayName":"Copper","name":"copper","oauth2Opts":{"authURL":"https://app.copper.com/oauth/authorize","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://app.copper.com/oauth/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"crunchbase":{"apiKeyOpts":{"attachmentType":"header","docsURL":"https://data.crunchbase.com/docs/getting-started","header":{"name":"X-cb-user-key"}},"authType":"apiKey","baseURL":"https://api.crunchbase.com","displayName":"Crunchbase","name":"crunchbase","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"customerDataPipelines":{"authType":"basic","baseURL":"https://cdp.customer.io/v1","displayName":"Customer.io Data Pipelines","name":"customerDataPipelines","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"customerJourneysApp":{"apiKeyOpts":{"attachmentType":"header","docsURL":"https://customer.io/docs/api/app/#section/Authentication","header":{"name":"Authorization","valuePrefix":"Bearer "}},"authType":"apiKey","baseURL":"https://api.customer.io","displayName":"Customer.io Journeys App","name":"customerJourneysApp","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"customerJourneysTrack":{"authType":"basic","baseURL":"https://track.customer.io","displayName":"Customer.io Journeys Track","name":"customerJourneysTrack","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"discord":{"authType":"oauth2","baseURL":"https://discord.com","displayName":"Discord","name":"discord","oauth2Opts":{"authURL":"https://discord.com/oauth2/authorize","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{"scopesField":"scope"},"tokenURL":"https://discord.com/api/oauth2/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"dixa":{"apiKeyOpts":{"attachmentType":"header","docsURL":"https://docs.dixa.io/docs/api-standards-rules/#authentication","header":{"name":"Authorization"}},"authType":"apiKey","baseURL":"https://dev.dixa.io","displayName":"Dixa","name":"dixa","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"docusign":{"authType":"oauth2","baseURL":"https://{{.server}}.docusign.net","displayName":"Docusign","name":"docusign","oauth2Opts":{"authURL":"https://account.docusign.com/oauth/auth","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://account.docusign.com/oauth/token"},"postAuthInfoNeeded":true,"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"docusignDeveloper":{"authType":"oauth2","baseURL":"https://demo.docusign.net","displayName":"Docusign Developer","name":"docusignDeveloper","oauth2Opts":{"authURL":"https://account-d.docusign.com/oauth/auth","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{"scopesField":"scope"},"tokenURL":"https://account-d.docusign.com/oauth/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"domo":{"authType":"oauth2","baseURL":"https://api.domo.com","displayName":"Domo","name":"domo","oauth2Opts":{"explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"clientCredentials","tokenMetadataFields":{"consumerRefField":"userId","scopesField":"scope"},"tokenURL":"https://api.domo.com/oauth/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"drift":{"authType":"oauth2","baseURL":"https://driftapi.com","displayName":"Drift","name":"drift","oauth2Opts":{"authURL":"https://dev.drift.com/authorize","explicitScopesRequired":false,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{"workspaceRefField":"orgId"},"tokenURL":"https://driftapi.com/oauth2/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"dropbox":{"authType":"oauth2","baseURL":"https://api.dropboxapi.com","displayName":"Dropbox","name":"dropbox","oauth2Opts":{"authURL":"https://www.dropbox.com/oauth2/authorize","explicitScopesRequired":false,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{"consumerRefField":"account_id","scopesField":"scope"},"tokenURL":"https://api.dropboxapi.com/oauth2/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"dropboxSign":{"authType":"oauth2","baseURL":"https://api.hellosign.com","displayName":"Dropbox Sign","name":"dropboxSign","oauth2Opts":{"authURL":"https://app.hellosign.com/oauth/authorize","explicitScopesRequired":false,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://app.hellosign.com/oauth/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"dynamicsBusinessCentral":{"authType":"oauth2","baseURL":"https://api.businesscentral.dynamics.com","displayName":"Microsoft Dynamics Business Central","name":"dynamicsBusinessCentral","oauth2Opts":{"authURL":"https://login.microsoftonline.com/{{.workspace}}/oauth2/v2.0/authorize","explicitScopesRequired":true,"explicitWorkspaceRequired":true,"grantType":"authorizationCode","tokenMetadataFields":{"scopesField":"scope"},"tokenURL":"https://login.microsoftonline.com/{{.workspace}}/oauth2/v2.0/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"dynamicsCRM":{"authType":"oauth2","baseURL":"https://{{.workspace}}.api.crm.dynamics.com/api/data","displayName":"Microsoft Dynamics CRM","name":"dynamicsCRM","oauth2Opts":{"authURL":"https://login.microsoftonline.com/common/oauth2/v2.0/authorize","explicitScopesRequired":true,"explicitWorkspaceRequired":true,"grantType":"authorizationCode","tokenMetadataFields":{"scopesField":"scope"},"tokenURL":"https://login.microsoftonline.com/common/oauth2/v2.0/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"facebook":{"authType":"oauth2","baseURL":"https://graph.facebook.com","displayName":"Facebook","name":"facebook","oauth2Opts":{"authURL":"https://www.facebook.com/v19.0/dialog/oauth","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://graph.facebook.com/v19.0/oauth/access_token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"figma":{"authType":"oauth2","baseURL":"https://api.figma.com","displayName":"Figma","name":"figma","oauth2Opts":{"authURL":"https://www.figma.com/oauth","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{"consumerRefField":"user_id"},"tokenURL":"https://www.figma.com/api/oauth/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"formstack":{"authType":"oauth2","baseURL":"https://www.formstack.com/api","displayName":"Formstack","name":"formstack","oauth2Opts":{"authURL":"https://www.formstack.com/api/v2/oauth2/authorize","explicitScopesRequired":false,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{"consumerRefField":"user_id"},"tokenURL":"https://www.formstack.com/api/v2/oauth2/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"freshdesk":{"authType":"basic","baseURL":"https://{{.workspace}}.freshdesk.com","displayName":"Freshdesk","name":"freshdesk","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"freshsales":{"apiKeyOpts":{"attachmentType":"header","docsURL":"https://developers.freshworks.com/crm/api/#authentication","header":{"name":"Authorization","valuePrefix":"Token token="}},"authType":"apiKey","baseURL":"https://{{.workspace}}.myfreshworks.com/crm/sales","displayName":"Freshsales","name":"freshsales","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"freshservice":{"authType":"basic","baseURL":"https://{{.workspace}}.freshservice.com","displayName":"Freshservice","name":"freshservice","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"front":{"apiKeyOpts":{"attachmentType":"header","docsURL":"https://dev.frontapp.com/docs/create-and-revoke-api-tokens","header":{"name":"Authorization","valuePrefix":"Bearer "}},"authType":"apiKey","baseURL":"https://api2.frontapp.com","displayName":"Front","name":"front","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"gainsight":{"authType":"oauth2","baseURL":"https://{{.workspace}}.gainsightcloud.com","displayName":"Gainsight","name":"gainsight","oauth2Opts":{"authURL":"https://{{.workspace}}.gainsightcloud.com/v1/authorize","explicitScopesRequired":false,"explicitWorkspaceRequired":true,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://{{.workspace}}.gainsightcloud.com/v1/users/oauth/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"geckoboard":{"authType":"basic","baseURL":"https://api.geckoboard.com","displayName":"Geckoboard","name":"geckoboard","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"getResponse":{"authType":"oauth2","baseURL":"https://api.getresponse.com","displayName":"GetResponse","name":"getResponse","oauth2Opts":{"authURL":"https://app.getresponse.com/oauth2_authorize.html","explicitScopesRequired":false,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://api.getresponse.com/v3/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"github":{"authType":"oauth2","baseURL":"https://api.github.com","displayName":"GitHub","name":"github","oauth2Opts":{"authURL":"https://github.com/login/oauth/authorize","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{"scopesField":"scope"},"tokenURL":"https://github.com/login/oauth/access_token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"gmail":{"authType":"oauth2","baseURL":"https://gmail.googleapis.com","displayName":"Gmail","name":"gmail","oauth2Opts":{"authURL":"https://accounts.google.com/o/oauth2/v2/auth","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{"scopesField":"scope"},"tokenURL":"https://oauth2.googleapis.com/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"gong":{"authType":"oauth2","baseURL":"https://api.gong.io","displayName":"Gong","name":"gong","oauth2Opts":{"authURL":"https://app.gong.io/oauth2/authorize","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{"scopesField":"scope"},"tokenURL":"https://app.gong.io/oauth2/generate-customer-token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"google":{"authType":"oauth2","baseURL":"https://www.googleapis.com","displayName":"Google","name":"google","oauth2Opts":{"authURL":"https://accounts.google.com/o/oauth2/v2/auth","authURLParams":{"access_type":"offline"},"explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{"scopesField":"scope"},"tokenURL":"https://oauth2.googleapis.com/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"googleAds":{"authType":"oauth2","baseURL":"https://googleads.googleapis.com","displayName":"Google Ads","name":"googleAds","oauth2Opts":{"authURL":"https://accounts.google.com/o/oauth2/v2/auth","authURLParams":{"access_type":"offline"},"explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{"scopesField":"scope"},"tokenURL":"https://oauth2.googleapis.com/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"googleContacts":{"authType":"oauth2","baseURL":"https://people.googleapis.com","displayName":"Google Contacts","name":"googleContacts","oauth2Opts":{"authURL":"https://accounts.google.com/o/oauth2/v2/auth","authURLParams":{"access_type":"offline"},"explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{"scopesField":"scope"},"tokenURL":"https://oauth2.googleapis.com/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"gorgias":{"authType":"oauth2","baseURL":"https://{{.workspace}}.gorgias.com","displayName":"Gorgias","name":"gorgias","oauth2Opts":{"authURL":"https://{{.workspace}}.gorgias.com/oauth/authorize","explicitScopesRequired":true,"explicitWorkspaceRequired":true,"grantType":"authorizationCode","tokenMetadataFields":{"scopesField":"scope"},"tokenURL":"https://{{.workspace}}.gorgias.com/oauth/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"guru":{"authType":"basic","baseURL":"https://api.getguru.com","displayName":"Guru","name":"guru","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"helpScoutMailbox":{"authType":"oauth2","baseURL":"https://api.helpscout.net","displayName":"Help Scout Mailbox","name":"helpScoutMailbox","oauth2Opts":{"authURL":"https://secure.helpscout.net/authentication/authorizeClientApplication","explicitScopesRequired":false,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://api.helpscout.net/v2/oauth2/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"hive":{"apiKeyOpts":{"attachmentType":"header","docsURL":"https://developers.hive.com/reference/api-keys-and-auth","header":{"name":"api_key"}},"authType":"apiKey","baseURL":"https://app.hive.com","displayName":"Hive","name":"hive","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"hubspot":{"authType":"oauth2","baseURL":"https://api.hubapi.com","displayName":"HubSpot","name":"hubspot","oauth2Opts":{"authURL":"https://app.hubspot.com/oauth/authorize","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://api.hubapi.com/oauth/v1/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":true,"subscribe":false,"write":true}},"hunter":{"apiKeyOpts":{"attachmentType":"query","docsURL":"https://hunter.io/api-documentation#authentication","query":{"name":"api_key"}},"authType":"apiKey","baseURL":"https://api.hunter.io/","displayName":"Hunter","name":"hunter","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"insightly":{"authType":"basic","baseURL":"https://api.insightly.com","displayName":"Insightly","name":"insightly","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"instagram":{"authType":"oauth2","baseURL":"https://graph.instagram.com","displayName":"Instagram","name":"instagram","oauth2Opts":{"authURL":"https://api.instagram.com/oauth/authorize","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{"scopesField":"user_id"},"tokenURL":"https://api.instagram.com/oauth/access_token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"intercom":{"authType":"oauth2","baseURL":"https://api.intercom.io","displayName":"Intercom","name":"intercom","oauth2Opts":{"authURL":"https://app.intercom.com/oauth","explicitScopesRequired":false,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://api.intercom.io/auth/eagle/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":true,"subscribe":false,"write":true}},"ironclad":{"authType":"oauth2","baseURL":"https://ironcladapp.com","displayName":"Ironclad","name":"ironclad","oauth2Opts":{"authURL":"https://ironcladapp.com/oauth/authorize","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{"scopesField":"scope"},"tokenURL":"https://ironcladapp.com/oauth/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"ironcladDemo":{"authType":"oauth2","baseURL":"https://demo.ironcladapp.com","displayName":"Ironclad Demo","name":"ironcladDemo","oauth2Opts":{"authURL":"https://demo.ironcladapp.com/oauth/authorize","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{"scopesField":"scope"},"tokenURL":"https://demo.ironcladapp.com/oauth/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"ironcladEU":{"authType":"oauth2","baseURL":"https://eu1.ironcladapp.com","displayName":"Ironclad Europe","name":"ironcladEU","oauth2Opts":{"authURL":"https://eu1.ironcladapp.com/oauth/authorize","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{"scopesField":"scope"},"tokenURL":"https://eu1.ironcladapp.com/oauth/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"iterable":{"apiKeyOpts":{"attachmentType":"header","docsURL":"https://app.iterable.com/settings/apiKeys","header":{"name":"Api-Key"}},"authType":"apiKey","baseURL":"https://api.iterable.com","displayName":"Iterable","name":"iterable","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"jotform":{"apiKeyOpts":{"attachmentType":"query","docsURL":"https://api.jotform.com/docs/#authentication","query":{"name":"apiKey"}},"authType":"apiKey","baseURL":"https://api.jotform.com","displayName":"Jotform","name":"jotform","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"keap":{"authType":"oauth2","baseURL":"https://api.infusionsoft.com","displayName":"Keap","name":"keap","oauth2Opts":{"authURL":"https://accounts.infusionsoft.com/app/oauth/authorize","explicitScopesRequired":false,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://api.infusionsoft.com/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"klaviyo":{"authType":"oauth2","baseURL":"https://a.klaviyo.com","displayName":"Klaviyo","name":"klaviyo","oauth2Opts":{"authURL":"https://www.klaviyo.com/oauth/authorize","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"PKCE","tokenMetadataFields":{"scopesField":"scope"},"tokenURL":"https://a.klaviyo.com/oauth/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"linkedIn":{"authType":"oauth2","baseURL":"https://api.linkedin.com","displayName":"LinkedIn","name":"linkedIn","oauth2Opts":{"authURL":"https://www.linkedin.com/oauth/v2/authorization","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{"scopesField":"scope"},"tokenURL":"https://www.linkedin.com/oauth/v2/accessToken"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"mailgun":{"authType":"basic","baseURL":"https://api.mailgun.net","displayName":"Mailgun","name":"mailgun","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"marketo":{"authType":"oauth2","baseURL":"https://{{.workspace}}.mktorest.com","displayName":"Marketo","name":"marketo","oauth2Opts":{"explicitScopesRequired":false,"explicitWorkspaceRequired":true,"grantType":"clientCredentials","tokenMetadataFields":{"scopesField":"scope"},"tokenURL":"https://{{.workspace}}.mktorest.com/identity/oauth/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"maxio":{"authType":"basic","baseURL":"https://{{.workspace}}.chargify.com","displayName":"Maxio","name":"maxio","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"messageBird":{"apiKeyOpts":{"attachmentType":"header","docsURL":"https://docs.bird.com/api","header":{"name":"Authorization","valuePrefix":"AccessKey "}},"authType":"apiKey","baseURL":"https://api.bird.com","displayName":"MessageBird","name":"messageBird","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"microsoftOffice365":{"authType":"oauth2","baseURL":"https://graph.microsoft.com","displayName":"Microsoft Office 365","name":"microsoftOffice365","oauth2Opts":{"authURL":"https://login.microsoftonline.com/common/oauth2/v2.0/authorize","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://login.microsoftonline.com/common/oauth2/v2.0/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"miro":{"authType":"oauth2","baseURL":"https://api.miro.com","displayName":"Miro","name":"miro","oauth2Opts":{"authURL":"https://miro.com/oauth/authorize","explicitScopesRequired":false,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{"consumerRefField":"user_id","scopesField":"scope","workspaceRefField":"team_id"},"tokenURL":"https://api.miro.com/v1/oauth/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"monday":{"authType":"oauth2","baseURL":"https://api.monday.com","displayName":"Monday","name":"monday","oauth2Opts":{"authURL":"https://auth.monday.com/oauth2/authorize","explicitScopesRequired":false,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{"scopesField":"scope"},"tokenURL":"https://auth.monday.com/oauth2/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"mural":{"authType":"oauth2","baseURL":"https://api.mural.co/api","displayName":"Mural","name":"mural","oauth2Opts":{"authURL":"https://api.mural.co/oauth/authorize","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{"scopesField":"scope"},"tokenURL":"https://api.mural.co/oauth/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"notion":{"authType":"oauth2","baseURL":"https://api.notion.com","displayName":"Notion","name":"notion","oauth2Opts":{"authURL":"https://api.notion.com/v1/oauth/authorize","explicitScopesRequired":false,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{"consumerRefField":"owner.user.id","workspaceRefField":"workspace_id"},"tokenURL":"https://api.notion.com/v1/oauth/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"nutshell":{"authType":"basic","baseURL":"https://app.nutshell.com","displayName":"Nutshell","name":"nutshell","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"openAI":{"apiKeyOpts":{"attachmentType":"header","docsURL":"https://platform.openai.com/docs/api-reference/api-keys","header":{"name":"Authorization","valuePrefix":"Bearer "}},"authType":"apiKey","baseURL":"https://api.openai.com","displayName":"OpenAI","name":"openAI","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"outreach":{"authType":"oauth2","baseURL":"https://api.outreach.io","displayName":"Outreach","name":"outreach","oauth2Opts":{"authURL":"https://api.outreach.io/oauth/authorize","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{"scopesField":"scope"},"tokenURL":"https://api.outreach.io/oauth/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"paddle":{"apiKeyOpts":{"attachmentType":"header","docsURL":"https://developer.paddle.com/api-reference/about/authentication","header":{"name":"Authorization","valuePrefix":"Bearer "}},"authType":"apiKey","baseURL":"https://api.paddle.com","displayName":"Paddle","name":"paddle","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"paddleSandbox":{"apiKeyOpts":{"attachmentType":"header","docsURL":"https://developer.paddle.com/api-reference/about/authentication","header":{"name":"Authorization","valuePrefix":"Bearer "}},"authType":"apiKey","baseURL":"https://sandbox-api.paddle.com","displayName":"Paddle Sandbox","name":"paddleSandbox","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"pinterest":{"authType":"oauth2","baseURL":"https://api.pinterest.com","displayName":"Pinterest","name":"pinterest","oauth2Opts":{"authURL":"https://www.pinterest.com/oauth","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{"scopesField":"scope"},"tokenURL":"https://api.pinterest.com/v5/oauth/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"pipedrive":{"authType":"oauth2","baseURL":"https://api.pipedrive.com","displayName":"Pipedrive","name":"pipedrive","oauth2Opts":{"authURL":"https://oauth.pipedrive.com/oauth/authorize","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://oauth.pipedrive.com/oauth/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"pipeliner":{"authType":"basic","baseURL":"https://eu-central.api.pipelinersales.com","displayName":"Pipeliner","name":"pipeliner","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"podium":{"authType":"oauth2","baseURL":"https://api.podium.com","displayName":"Podium","name":"podium","oauth2Opts":{"authURL":"https://api.podium.com/oauth/authorize","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://api.podium.com/oauth/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"powerBI":{"authType":"oauth2","baseURL":"https://api.powerbi.com","displayName":"PowerBI","name":"powerBI","oauth2Opts":{"authURL":"https://login.microsoftonline.com/common/oauth2/v2.0/authorize","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://login.microsoftonline.com/common/oauth2/v2.0/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"rebilly":{"apiKeyOpts":{"attachmentType":"header","docsURL":"https://www.rebilly.com/catalog/all/section/authentication/manage-api-keys","header":{"name":"REB-APIKEY"}},"authType":"apiKey","baseURL":"https://api.rebilly.com","displayName":"Rebilly","name":"rebilly","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"recurly":{"authType":"basic","baseURL":"https://v3.recurly.com","displayName":"Recurly","name":"recurly","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"ringCentral":{"authType":"oauth2","baseURL":"https://platform.ringcentral.com","displayName":"RingCentral","name":"ringCentral","oauth2Opts":{"authURL":"https://platform.ringcentral.com/restapi/oauth/authorize","explicitScopesRequired":false,"explicitWorkspaceRequired":false,"grantType":"PKCE","tokenMetadataFields":{"consumerRefField":"owner_id","scopesField":"scope"},"tokenURL":"https://platform.ringcentral.com/restapi/oauth/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"salesflare":{"apiKeyOpts":{"attachmentType":"header","docsURL":"https://api.salesflare.com/docs#section/Introduction/Authentication","header":{"name":"Authorization","valuePrefix":"Bearer "}},"authType":"apiKey","baseURL":"https://api.salesflare.com","displayName":"Salesflare","name":"salesflare","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"salesforce":{"authType":"oauth2","baseURL":"https://{{.workspace}}.my.salesforce.com","displayName":"Salesforce","name":"salesforce","oauth2Opts":{"authURL":"https://{{.workspace}}.my.salesforce.com/services/oauth2/authorize","explicitScopesRequired":false,"explicitWorkspaceRequired":true,"grantType":"authorizationCode","tokenMetadataFields":{"consumerRefField":"id","scopesField":"scope","workspaceRefField":"instance_url"},"tokenURL":"https://{{.workspace}}.my.salesforce.com/services/oauth2/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":true,"insert":false,"update":false,"upsert":true},"proxy":true,"read":true,"subscribe":false,"write":true}},"salesloft":{"authType":"oauth2","baseURL":"https://api.salesloft.com","displayName":"Salesloft","name":"salesloft","oauth2Opts":{"authURL":"https://accounts.salesloft.com/oauth/authorize","explicitScopesRequired":false,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{"scopesField":"scope"},"tokenURL":"https://accounts.salesloft.com/oauth/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":true,"subscribe":false,"write":true}},"seismic":{"authType":"oauth2","baseURL":"https://api.seismic.com","displayName":"Seismic","name":"seismic","oauth2Opts":{"authURL":"https://auth.seismic.com/tenants/{{.workspace}}/connect/authorize","explicitScopesRequired":false,"explicitWorkspaceRequired":true,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://auth.seismic.com/tenants/{{.workspace}}/connect/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"sellsy":{"authType":"oauth2","baseURL":"https://api.sellsy.com","displayName":"Sellsy","name":"sellsy","oauth2Opts":{"authURL":"https://login.sellsy.com/oauth2/authorization","explicitScopesRequired":false,"explicitWorkspaceRequired":false,"grantType":"PKCE","tokenMetadataFields":{},"tokenURL":"https://login.sellsy.com/oauth2/access-tokens"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"sendGrid":{"apiKeyOpts":{"attachmentType":"header","docsURL":"https://www.twilio.com/docs/sendgrid","header":{"name":"Authorization","valuePrefix":"Bearer "}},"authType":"apiKey","baseURL":"https://api.sendgrid.com","displayName":"SendGrid","name":"sendGrid","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"serviceNow":{"authType":"oauth2","baseURL":"https://{{.workspace}}.service-now.com","displayName":"ServiceNow","name":"serviceNow","oauth2Opts":{"authURL":"https://{{.workspace}}.service-now.com/oauth_auth.do","explicitScopesRequired":false,"explicitWorkspaceRequired":true,"grantType":"authorizationCode","tokenMetadataFields":{"scopesField":"scope"},"tokenURL":"https://{{.workspace}}.service-now.com/oauth_token.do"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"sharePoint":{"authType":"oauth2","baseURL":"https://{{.workspace}}.sharepoint.com/_api","displayName":"SharePoint","name":"sharePoint","oauth2Opts":{"authURL":"https://login.microsoftonline.com/common/oauth2/v2.0/authorize","explicitScopesRequired":true,"explicitWorkspaceRequired":true,"grantType":"authorizationCode","tokenMetadataFields":{"scopesField":"scope"},"tokenURL":"https://login.microsoftonline.com/common/oauth2/v2.0/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"shopify":{"apiKeyOpts":{"attachmentType":"header","docsURL":"https://shopify.dev/docs/api/admin-rest#authentication","header":{"name":"X-Shopify-Access-Token"}},"authType":"apiKey","baseURL":"https://{{.workspace}}.myshopify.com","displayName":"Shopify","name":"shopify","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"slack":{"authType":"oauth2","baseURL":"https://slack.com/api","displayName":"Slack","name":"slack","oauth2Opts":{"authURL":"https://slack.com/oauth/v2/authorize","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{"scopesField":"scope","workspaceRefField":"workspace_name"},"tokenURL":"https://slack.com/api/oauth.v2.access"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"smartsheet":{"authType":"oauth2","baseURL":"https://api.smartsheet.com","displayName":"Smartsheet","name":"smartsheet","oauth2Opts":{"authURL":"https://app.smartsheet.com/b/authorize","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://api.smartsheet.com/2.0/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"snapchatAds":{"authType":"oauth2","baseURL":"https://adsapi.snapchat.com","displayName":"Snapchat Ads","name":"snapchatAds","oauth2Opts":{"authURL":"https://accounts.snapchat.com/login/oauth2/authorize","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://accounts.snapchat.com/login/oauth2/access_token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"stackExchange":{"authType":"oauth2","baseURL":"https://api.stackexchange.com","displayName":"StackExchange","name":"stackExchange","oauth2Opts":{"authURL":"https://stackoverflow.com/oauth","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://stackoverflow.com/oauth/access_token/json"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"stripe":{"apiKeyOpts":{"attachmentType":"header","docsURL":"https://docs.stripe.com/keys","header":{"name":"Authorization","valuePrefix":"Bearer "}},"authType":"apiKey","baseURL":"https://api.stripe.com","displayName":"Stripe","name":"stripe","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"sugarCRM":{"authType":"oauth2","baseURL":"{{.workspace}}/rest/v11_24","displayName":"SugarCRM","name":"sugarCRM","oauth2Opts":{"explicitScopesRequired":false,"explicitWorkspaceRequired":true,"grantType":"password","tokenMetadataFields":{},"tokenURL":"{{.workspace}}/rest/v11_24/oauth2/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"surveyMonkey":{"authType":"oauth2","baseURL":"https://api.surveymonkey.com","displayName":"SurveyMonkey","name":"surveyMonkey","oauth2Opts":{"authURL":"https://api.surveymonkey.com/oauth/authorize","explicitScopesRequired":false,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://api.surveymonkey.com/oauth/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"teamleader":{"authType":"oauth2","baseURL":"https://api.focus.teamleader.eu","displayName":"Teamleader","name":"teamleader","oauth2Opts":{"authURL":"https://focus.teamleader.eu/oauth2/authorize","explicitScopesRequired":false,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://focus.teamleader.eu/oauth2/access_token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"teamwork":{"authType":"oauth2","baseURL":"https://{{.workspace}}.teamwork.com","displayName":"Teamwork","name":"teamwork","oauth2Opts":{"authURL":"https://www.teamwork.com/launchpad/login","explicitScopesRequired":false,"explicitWorkspaceRequired":true,"grantType":"authorizationCode","tokenMetadataFields":{"consumerRefField":"user.id"},"tokenURL":"https://www.teamwork.com/launchpad/v1/token.json"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"timely":{"authType":"oauth2","baseURL":"https://api.timelyapp.com","displayName":"Timely","name":"timely","oauth2Opts":{"authURL":"https://api.timelyapp.com/1.1/oauth/authorize","explicitScopesRequired":false,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{"scopesField":"scope"},"tokenURL":"https://api.timelyapp.com/1.1/oauth/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"typeform":{"authType":"oauth2","baseURL":"https://api.typeform.com","displayName":"Typeform","name":"typeform","oauth2Opts":{"authURL":"https://api.typeform.com/oauth/authorize","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://api.typeform.com/oauth/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"webflow":{"authType":"oauth2","baseURL":"https://api.webflow.com","displayName":"Webflow","name":"webflow","oauth2Opts":{"authURL":"https://webflow.com/oauth/authorize","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{"scopesField":"scope"},"tokenURL":"https://api.webflow.com/oauth/access_token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"wordPress":{"authType":"oauth2","baseURL":"https://public-api.wordpress.com","displayName":"WordPress","name":"wordPress","oauth2Opts":{"authURL":"https://public-api.wordpress.com/oauth2/authorize","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{"scopesField":"scope"},"tokenURL":"https://public-api.wordpress.com/oauth2/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"wrike":{"authType":"oauth2","baseURL":"https://www.wrike.com/api","displayName":"Wrike","name":"wrike","oauth2Opts":{"authURL":"https://www.wrike.com/oauth2/authorize","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://www.wrike.com/oauth2/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"zendeskChat":{"authType":"oauth2","baseURL":"https://www.zopim.com","displayName":"Zendesk Chat","name":"zendeskChat","oauth2Opts":{"authURL":"https://www.zopim.com/oauth2/authorizations/new?subdomain={{.workspace}}","explicitScopesRequired":true,"explicitWorkspaceRequired":true,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://www.zopim.com/oauth2/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"zendeskSupport":{"authType":"oauth2","baseURL":"https://{{.workspace}}.zendesk.com/api","displayName":"Zendesk Support","name":"zendeskSupport","oauth2Opts":{"authURL":"https://{{.workspace}}.zendesk.com/oauth/authorizations/new","explicitScopesRequired":true,"explicitWorkspaceRequired":true,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://{{.workspace}}.zendesk.com/oauth/tokens"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"zohoCRM":{"authType":"oauth2","baseURL":"https://www.zohoapis.com","displayName":"Zoho CRM","name":"zohoCRM","oauth2Opts":{"authURL":"https://accounts.zoho.com/oauth/v2/auth","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{"scopesField":"scope","workspaceRefField":"api_domain"},"tokenURL":"https://accounts.zoho.com/oauth/v2/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"zoom":{"authType":"oauth2","baseURL":"https://api.zoom.us","displayName":"Zoom","name":"zoom","oauth2Opts":{"authURL":"https://zoom.us/oauth/authorize","explicitScopesRequired":false,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{"scopesField":"scope"},"tokenURL":"https://zoom.us/oauth/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"zuora":{"authType":"oauth2","baseURL":"https://{{.workspace}}.zuora.com","displayName":"Zuora","name":"zuora","oauth2Opts":{"explicitScopesRequired":false,"explicitWorkspaceRequired":true,"grantType":"clientCredentials","tokenMetadataFields":{},"tokenURL":"https://{{.workspace}}.zuora.com/oauth/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}}}
\ No newline at end of file
+{"aWeber":{"authType":"oauth2","baseURL":"https://api.aweber.com","displayName":"AWeber","name":"aWeber","oauth2Opts":{"authURL":"https://auth.aweber.com/oauth2/authorize","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://auth.aweber.com/oauth2/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"acuityScheduling":{"authType":"oauth2","baseURL":"https://acuityscheduling.com","displayName":"Acuity Scheduling","name":"acuityScheduling","oauth2Opts":{"authURL":"https://acuityscheduling.com/oauth2/authorize","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://acuityscheduling.com/oauth2/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"adobeExperiencePlatform":{"authType":"oauth2","baseURL":"https://platform.adobe.io","displayName":"Adobe Experience Platform","name":"adobeExperiencePlatform","oauth2Opts":{"explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"clientCredentials","tokenMetadataFields":{},"tokenURL":"https://ims-na1.adobelogin.com/ims/token/v3"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"aha":{"authType":"oauth2","baseURL":"https://{{.workspace}}.aha.io/api","displayName":"Aha","name":"aha","oauth2Opts":{"authURL":"https://{{.workspace}}.aha.io/oauth/authorize","explicitScopesRequired":false,"explicitWorkspaceRequired":true,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://{{.workspace}}.aha.io/oauth/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"aircall":{"authType":"oauth2","baseURL":"https://api.aircall.io","displayName":"Aircall","name":"aircall","oauth2Opts":{"authURL":"https://dashboard.aircall.io/oauth/authorize","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://api.aircall.io/v1/oauth/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"airtable":{"authType":"oauth2","baseURL":"https://api.airtable.com","displayName":"Airtable","name":"airtable","oauth2Opts":{"authURL":"https://airtable.com/oauth2/v1/authorize","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"PKCE","tokenMetadataFields":{"scopesField":"scope"},"tokenURL":"https://airtable.com/oauth2/v1/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"amplitude":{"authType":"basic","baseURL":"https://amplitude.com","displayName":"Amplitude","name":"amplitude","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"anthropic":{"apiKeyOpts":{"attachmentType":"header","docsURL":"https://docs.anthropic.com/en/api/getting-started#authentication","header":{"name":"x-api-key"}},"authType":"apiKey","baseURL":"https://api.anthropic.com","displayName":"Anthropic","name":"anthropic","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"apollo":{"apiKeyOpts":{"attachmentType":"header","docsURL":"https://apolloio.github.io/apollo-api-docs/?shell#authentication","header":{"name":"X-Api-Key"}},"authType":"apiKey","baseURL":"https://api.apollo.io","displayName":"Apollo","name":"apollo","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"asana":{"authType":"oauth2","baseURL":"https://app.asana.com/api","displayName":"Asana","name":"asana","oauth2Opts":{"authURL":"https://app.asana.com/-/oauth_authorize","explicitScopesRequired":false,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{"consumerRefField":"data.id"},"tokenURL":"https://app.asana.com/-/oauth_token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"atlassian":{"authType":"oauth2","baseURL":"https://api.atlassian.com","displayName":"Atlassian (Jira, Confluence)","name":"atlassian","oauth2Opts":{"authURL":"https://auth.atlassian.com/authorize","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://auth.atlassian.com/oauth/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"attio":{"authType":"oauth2","baseURL":"https://api.attio.com","displayName":"Attio","name":"attio","oauth2Opts":{"authURL":"https://app.attio.com/authorize","explicitScopesRequired":false,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://app.attio.com/oauth/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"basecamp":{"authType":"oauth2","baseURL":"https://3.basecampapi.com/{{.workspace}}","displayName":"Basecamp","name":"basecamp","oauth2Opts":{"authURL":"https://launchpad.37signals.com/authorization/new?type=web_server","explicitScopesRequired":false,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://launchpad.37signals.com/authorization/token?type=refresh"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"bird":{"apiKeyOpts":{"attachmentType":"header","docsURL":"https://docs.bird.com/api","header":{"name":"Authorization","valuePrefix":"AccessKey "}},"authType":"apiKey","baseURL":"https://api.bird.com","displayName":"Bird (MessageBird)","name":"bird","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"blueshift":{"authType":"basic","baseURL":"https://api.getblueshift.com/api","displayName":"Blueshift","name":"blueshift","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"blueshiftEU":{"authType":"basic","baseURL":"https://api.eu.getblueshift.com/api","displayName":"Blueshift (EU)","name":"blueshiftEU","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"box":{"authType":"oauth2","baseURL":"https://api.box.com","displayName":"Box","name":"box","oauth2Opts":{"authURL":"https://account.box.com/api/oauth2/authorize","explicitScopesRequired":false,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://api.box.com/oauth2/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"braintree":{"authType":"basic","baseURL":"https://payments.sandbox.braintree-api.com/graphql","displayName":"Braintree","name":"braintree","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"brevo":{"apiKeyOpts":{"attachmentType":"header","docsURL":"https://developers.brevo.com/docs/getting-started","header":{"name":"api-key"}},"authType":"apiKey","baseURL":"https://api.brevo.com","displayName":"Brevo","name":"brevo","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"bynder":{"authType":"oauth2","baseURL":"https://{{.workspace}}.bynder.com/api","displayName":"Bynder","name":"bynder","oauth2Opts":{"authURL":"https://{{.workspace}}.bynder.com/v6/authentication/oauth2/auth","explicitScopesRequired":true,"explicitWorkspaceRequired":true,"grantType":"authorizationCode","tokenMetadataFields":{"scopesField":"scope"},"tokenURL":"https://{{.workspace}}.bynder.com/v6/authentication/oauth2/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"calendly":{"authType":"oauth2","baseURL":"https://api.calendly.com","displayName":"Calendly","name":"calendly","oauth2Opts":{"authURL":"https://auth.calendly.com/oauth/authorize","explicitScopesRequired":false,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://auth.calendly.com/oauth/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"callRail":{"apiKeyOpts":{"attachmentType":"header","docsURL":"https://apidocs.callrail.com/#getting-started","header":{"name":"Authorization","valuePrefix":"Token token="}},"authType":"apiKey","baseURL":"https://api.callrail.com","displayName":"CallRail","name":"callRail","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"campaignMonitor":{"authType":"oauth2","baseURL":"https://api.createsend.com","displayName":"Campaign Monitor","name":"campaignMonitor","oauth2Opts":{"authURL":"https://api.createsend.com/oauth","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://api.createsend.com/oauth/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"capsule":{"authType":"oauth2","baseURL":"https://api.capsulecrm.com/api","displayName":"Capsule","name":"capsule","oauth2Opts":{"authURL":"https://api.capsulecrm.com/oauth/authorise","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://api.capsulecrm.com/oauth/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"chargeOver":{"authType":"basic","baseURL":"https://{{.workspace}}.chargeover.com","displayName":"ChargeOver","name":"chargeOver","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"chargebee":{"authType":"basic","baseURL":"https://{{.workspace}}.chargebee.com/api","displayName":"Chargebee","name":"chargebee","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"chartMogul":{"authType":"basic","baseURL":"https://api.chartmogul.com","displayName":"ChartMogul","name":"chartMogul","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"clari":{"apiKeyOpts":{"attachmentType":"header","docsURL":"https://developer.clari.com/documentation/external_spec","header":{"name":"apiKey"}},"authType":"apiKey","baseURL":"https://api.clari.com","displayName":"Clari","name":"clari","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"clickup":{"authType":"oauth2","baseURL":"https://api.clickup.com","displayName":"ClickUp","name":"clickup","oauth2Opts":{"authURL":"https://app.clickup.com/api","explicitScopesRequired":false,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://api.clickup.com/api/v2/oauth/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"close":{"authType":"oauth2","baseURL":"https://api.close.com/api","displayName":"Close","name":"close","oauth2Opts":{"authURL":"https://app.close.com/oauth2/authorize","explicitScopesRequired":false,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{"consumerRefField":"user_id","scopesField":"scope","workspaceRefField":"organization_id"},"tokenURL":"https://api.close.com/oauth2/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"coda":{"apiKeyOpts":{"attachmentType":"header","docsURL":"https://coda.io/developers/apis/v1#section/Introduction","header":{"name":"Authorization","valuePrefix":"Bearer "}},"authType":"apiKey","baseURL":"https://coda.io/apis","displayName":"Coda","name":"coda","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"constantContact":{"authType":"oauth2","baseURL":"https://api.cc.email","displayName":"Constant Contact","name":"constantContact","oauth2Opts":{"authURL":"https://authz.constantcontact.com/oauth2/default/v1/authorize","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://authz.constantcontact.com/oauth2/default/v1/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"copper":{"authType":"oauth2","baseURL":"https://api.copper.com/developer_api","displayName":"Copper","name":"copper","oauth2Opts":{"authURL":"https://app.copper.com/oauth/authorize","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://app.copper.com/oauth/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"crunchbase":{"apiKeyOpts":{"attachmentType":"header","docsURL":"https://data.crunchbase.com/docs/getting-started","header":{"name":"X-cb-user-key"}},"authType":"apiKey","baseURL":"https://api.crunchbase.com","displayName":"Crunchbase","name":"crunchbase","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"customerDataPipelines":{"authType":"basic","baseURL":"https://cdp.customer.io/v1","displayName":"Customer.io Data Pipelines","name":"customerDataPipelines","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"customerJourneysApp":{"apiKeyOpts":{"attachmentType":"header","docsURL":"https://customer.io/docs/api/app/#section/Authentication","header":{"name":"Authorization","valuePrefix":"Bearer "}},"authType":"apiKey","baseURL":"https://api.customer.io","displayName":"Customer.io Journeys App","name":"customerJourneysApp","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"customerJourneysTrack":{"authType":"basic","baseURL":"https://track.customer.io","displayName":"Customer.io Journeys Track","name":"customerJourneysTrack","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"discord":{"authType":"oauth2","baseURL":"https://discord.com","displayName":"Discord","name":"discord","oauth2Opts":{"authURL":"https://discord.com/oauth2/authorize","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{"scopesField":"scope"},"tokenURL":"https://discord.com/api/oauth2/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"dixa":{"apiKeyOpts":{"attachmentType":"header","docsURL":"https://docs.dixa.io/docs/api-standards-rules/#authentication","header":{"name":"Authorization"}},"authType":"apiKey","baseURL":"https://dev.dixa.io","displayName":"Dixa","name":"dixa","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"docusign":{"authType":"oauth2","baseURL":"https://{{.server}}.docusign.net","displayName":"Docusign","name":"docusign","oauth2Opts":{"authURL":"https://account.docusign.com/oauth/auth","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://account.docusign.com/oauth/token"},"postAuthInfoNeeded":true,"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"docusignDeveloper":{"authType":"oauth2","baseURL":"https://demo.docusign.net","displayName":"Docusign Developer","name":"docusignDeveloper","oauth2Opts":{"authURL":"https://account-d.docusign.com/oauth/auth","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{"scopesField":"scope"},"tokenURL":"https://account-d.docusign.com/oauth/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"domo":{"authType":"oauth2","baseURL":"https://api.domo.com","displayName":"Domo","name":"domo","oauth2Opts":{"explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"clientCredentials","tokenMetadataFields":{"consumerRefField":"userId","scopesField":"scope"},"tokenURL":"https://api.domo.com/oauth/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"drift":{"authType":"oauth2","baseURL":"https://driftapi.com","displayName":"Drift","name":"drift","oauth2Opts":{"authURL":"https://dev.drift.com/authorize","explicitScopesRequired":false,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{"workspaceRefField":"orgId"},"tokenURL":"https://driftapi.com/oauth2/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"dropbox":{"authType":"oauth2","baseURL":"https://api.dropboxapi.com","displayName":"Dropbox","name":"dropbox","oauth2Opts":{"authURL":"https://www.dropbox.com/oauth2/authorize","explicitScopesRequired":false,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{"consumerRefField":"account_id","scopesField":"scope"},"tokenURL":"https://api.dropboxapi.com/oauth2/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"dropboxSign":{"authType":"oauth2","baseURL":"https://api.hellosign.com","displayName":"Dropbox Sign","name":"dropboxSign","oauth2Opts":{"authURL":"https://app.hellosign.com/oauth/authorize","explicitScopesRequired":false,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://app.hellosign.com/oauth/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"dynamicsBusinessCentral":{"authType":"oauth2","baseURL":"https://api.businesscentral.dynamics.com","displayName":"Microsoft Dynamics Business Central","name":"dynamicsBusinessCentral","oauth2Opts":{"authURL":"https://login.microsoftonline.com/{{.workspace}}/oauth2/v2.0/authorize","explicitScopesRequired":true,"explicitWorkspaceRequired":true,"grantType":"authorizationCode","tokenMetadataFields":{"scopesField":"scope"},"tokenURL":"https://login.microsoftonline.com/{{.workspace}}/oauth2/v2.0/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"dynamicsCRM":{"authType":"oauth2","baseURL":"https://{{.workspace}}.api.crm.dynamics.com/api/data","displayName":"Microsoft Dynamics CRM","name":"dynamicsCRM","oauth2Opts":{"authURL":"https://login.microsoftonline.com/common/oauth2/v2.0/authorize","explicitScopesRequired":true,"explicitWorkspaceRequired":true,"grantType":"authorizationCode","tokenMetadataFields":{"scopesField":"scope"},"tokenURL":"https://login.microsoftonline.com/common/oauth2/v2.0/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"facebook":{"authType":"oauth2","baseURL":"https://graph.facebook.com","displayName":"Facebook","name":"facebook","oauth2Opts":{"authURL":"https://www.facebook.com/v19.0/dialog/oauth","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://graph.facebook.com/v19.0/oauth/access_token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"figma":{"authType":"oauth2","baseURL":"https://api.figma.com","displayName":"Figma","name":"figma","oauth2Opts":{"authURL":"https://www.figma.com/oauth","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{"consumerRefField":"user_id"},"tokenURL":"https://www.figma.com/api/oauth/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"formstack":{"authType":"oauth2","baseURL":"https://www.formstack.com/api","displayName":"Formstack","name":"formstack","oauth2Opts":{"authURL":"https://www.formstack.com/api/v2/oauth2/authorize","explicitScopesRequired":false,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{"consumerRefField":"user_id"},"tokenURL":"https://www.formstack.com/api/v2/oauth2/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"freshdesk":{"authType":"basic","baseURL":"https://{{.workspace}}.freshdesk.com","displayName":"Freshdesk","name":"freshdesk","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"freshsales":{"apiKeyOpts":{"attachmentType":"header","docsURL":"https://developers.freshworks.com/crm/api/#authentication","header":{"name":"Authorization","valuePrefix":"Token token="}},"authType":"apiKey","baseURL":"https://{{.workspace}}.myfreshworks.com/crm/sales","displayName":"Freshsales","name":"freshsales","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"freshservice":{"authType":"basic","baseURL":"https://{{.workspace}}.freshservice.com","displayName":"Freshservice","name":"freshservice","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"front":{"apiKeyOpts":{"attachmentType":"header","docsURL":"https://dev.frontapp.com/docs/create-and-revoke-api-tokens","header":{"name":"Authorization","valuePrefix":"Bearer "}},"authType":"apiKey","baseURL":"https://api2.frontapp.com","displayName":"Front","name":"front","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"gainsight":{"authType":"oauth2","baseURL":"https://{{.workspace}}.gainsightcloud.com","displayName":"Gainsight","name":"gainsight","oauth2Opts":{"authURL":"https://{{.workspace}}.gainsightcloud.com/v1/authorize","explicitScopesRequired":false,"explicitWorkspaceRequired":true,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://{{.workspace}}.gainsightcloud.com/v1/users/oauth/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"geckoboard":{"authType":"basic","baseURL":"https://api.geckoboard.com","displayName":"Geckoboard","name":"geckoboard","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"getResponse":{"authType":"oauth2","baseURL":"https://api.getresponse.com","displayName":"GetResponse","name":"getResponse","oauth2Opts":{"authURL":"https://app.getresponse.com/oauth2_authorize.html","explicitScopesRequired":false,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://api.getresponse.com/v3/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"github":{"authType":"oauth2","baseURL":"https://api.github.com","displayName":"GitHub","name":"github","oauth2Opts":{"authURL":"https://github.com/login/oauth/authorize","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{"scopesField":"scope"},"tokenURL":"https://github.com/login/oauth/access_token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"gong":{"authType":"oauth2","baseURL":"https://api.gong.io","displayName":"Gong","name":"gong","oauth2Opts":{"authURL":"https://app.gong.io/oauth2/authorize","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{"scopesField":"scope"},"tokenURL":"https://app.gong.io/oauth2/generate-customer-token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"google":{"authType":"oauth2","baseURL":"https://www.googleapis.com","displayName":"Google","name":"google","oauth2Opts":{"authURL":"https://accounts.google.com/o/oauth2/v2/auth","authURLParams":{"access_type":"offline"},"explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{"scopesField":"scope"},"tokenURL":"https://oauth2.googleapis.com/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"gorgias":{"authType":"oauth2","baseURL":"https://{{.workspace}}.gorgias.com","displayName":"Gorgias","name":"gorgias","oauth2Opts":{"authURL":"https://{{.workspace}}.gorgias.com/oauth/authorize","explicitScopesRequired":true,"explicitWorkspaceRequired":true,"grantType":"authorizationCode","tokenMetadataFields":{"scopesField":"scope"},"tokenURL":"https://{{.workspace}}.gorgias.com/oauth/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"guru":{"authType":"basic","baseURL":"https://api.getguru.com","displayName":"Guru","name":"guru","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"helpScoutMailbox":{"authType":"oauth2","baseURL":"https://api.helpscout.net","displayName":"Help Scout Mailbox","name":"helpScoutMailbox","oauth2Opts":{"authURL":"https://secure.helpscout.net/authentication/authorizeClientApplication","explicitScopesRequired":false,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://api.helpscout.net/v2/oauth2/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"hive":{"apiKeyOpts":{"attachmentType":"header","docsURL":"https://developers.hive.com/reference/api-keys-and-auth","header":{"name":"api_key"}},"authType":"apiKey","baseURL":"https://app.hive.com","displayName":"Hive","name":"hive","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"hubspot":{"authType":"oauth2","baseURL":"https://api.hubapi.com","displayName":"HubSpot","name":"hubspot","oauth2Opts":{"authURL":"https://app.hubspot.com/oauth/authorize","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://api.hubapi.com/oauth/v1/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":true,"subscribe":false,"write":true}},"hunter":{"apiKeyOpts":{"attachmentType":"query","docsURL":"https://hunter.io/api-documentation#authentication","query":{"name":"api_key"}},"authType":"apiKey","baseURL":"https://api.hunter.io/","displayName":"Hunter","name":"hunter","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"insightly":{"authType":"basic","baseURL":"https://api.insightly.com","displayName":"Insightly","name":"insightly","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"instagram":{"authType":"oauth2","baseURL":"https://graph.instagram.com","displayName":"Instagram","name":"instagram","oauth2Opts":{"authURL":"https://api.instagram.com/oauth/authorize","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{"scopesField":"user_id"},"tokenURL":"https://api.instagram.com/oauth/access_token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"intercom":{"authType":"oauth2","baseURL":"https://api.intercom.io","displayName":"Intercom","name":"intercom","oauth2Opts":{"authURL":"https://app.intercom.com/oauth","explicitScopesRequired":false,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://api.intercom.io/auth/eagle/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":true,"subscribe":false,"write":true}},"ironclad":{"authType":"oauth2","baseURL":"https://ironcladapp.com","displayName":"Ironclad","name":"ironclad","oauth2Opts":{"authURL":"https://ironcladapp.com/oauth/authorize","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{"scopesField":"scope"},"tokenURL":"https://ironcladapp.com/oauth/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"ironcladDemo":{"authType":"oauth2","baseURL":"https://demo.ironcladapp.com","displayName":"Ironclad Demo","name":"ironcladDemo","oauth2Opts":{"authURL":"https://demo.ironcladapp.com/oauth/authorize","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{"scopesField":"scope"},"tokenURL":"https://demo.ironcladapp.com/oauth/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"ironcladEU":{"authType":"oauth2","baseURL":"https://eu1.ironcladapp.com","displayName":"Ironclad Europe","name":"ironcladEU","oauth2Opts":{"authURL":"https://eu1.ironcladapp.com/oauth/authorize","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{"scopesField":"scope"},"tokenURL":"https://eu1.ironcladapp.com/oauth/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"iterable":{"apiKeyOpts":{"attachmentType":"header","docsURL":"https://app.iterable.com/settings/apiKeys","header":{"name":"Api-Key"}},"authType":"apiKey","baseURL":"https://api.iterable.com","displayName":"Iterable","name":"iterable","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"jotform":{"apiKeyOpts":{"attachmentType":"query","docsURL":"https://api.jotform.com/docs/#authentication","query":{"name":"apiKey"}},"authType":"apiKey","baseURL":"https://api.jotform.com","displayName":"Jotform","name":"jotform","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"keap":{"authType":"oauth2","baseURL":"https://api.infusionsoft.com","displayName":"Keap","name":"keap","oauth2Opts":{"authURL":"https://accounts.infusionsoft.com/app/oauth/authorize","explicitScopesRequired":false,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://api.infusionsoft.com/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"klaviyo":{"authType":"oauth2","baseURL":"https://a.klaviyo.com","displayName":"Klaviyo","name":"klaviyo","oauth2Opts":{"authURL":"https://www.klaviyo.com/oauth/authorize","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"PKCE","tokenMetadataFields":{"scopesField":"scope"},"tokenURL":"https://a.klaviyo.com/oauth/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"linkedIn":{"authType":"oauth2","baseURL":"https://api.linkedin.com","displayName":"LinkedIn","name":"linkedIn","oauth2Opts":{"authURL":"https://www.linkedin.com/oauth/v2/authorization","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{"scopesField":"scope"},"tokenURL":"https://www.linkedin.com/oauth/v2/accessToken"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"mailgun":{"authType":"basic","baseURL":"https://api.mailgun.net","displayName":"Mailgun","name":"mailgun","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"marketo":{"authType":"oauth2","baseURL":"https://{{.workspace}}.mktorest.com","displayName":"Marketo","name":"marketo","oauth2Opts":{"explicitScopesRequired":false,"explicitWorkspaceRequired":true,"grantType":"clientCredentials","tokenMetadataFields":{"scopesField":"scope"},"tokenURL":"https://{{.workspace}}.mktorest.com/identity/oauth/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"maxio":{"authType":"basic","baseURL":"https://{{.workspace}}.chargify.com","displayName":"Maxio","name":"maxio","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"microsoft":{"authType":"oauth2","baseURL":"https://graph.microsoft.com","displayName":"Microsoft","name":"microsoft","oauth2Opts":{"authURL":"https://login.microsoftonline.com/common/oauth2/v2.0/authorize","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://login.microsoftonline.com/common/oauth2/v2.0/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"miro":{"authType":"oauth2","baseURL":"https://api.miro.com","displayName":"Miro","name":"miro","oauth2Opts":{"authURL":"https://miro.com/oauth/authorize","explicitScopesRequired":false,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{"consumerRefField":"user_id","scopesField":"scope","workspaceRefField":"team_id"},"tokenURL":"https://api.miro.com/v1/oauth/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"monday":{"authType":"oauth2","baseURL":"https://api.monday.com","displayName":"Monday","name":"monday","oauth2Opts":{"authURL":"https://auth.monday.com/oauth2/authorize","explicitScopesRequired":false,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{"scopesField":"scope"},"tokenURL":"https://auth.monday.com/oauth2/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"mural":{"authType":"oauth2","baseURL":"https://api.mural.co/api","displayName":"Mural","name":"mural","oauth2Opts":{"authURL":"https://api.mural.co/oauth/authorize","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{"scopesField":"scope"},"tokenURL":"https://api.mural.co/oauth/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"notion":{"authType":"oauth2","baseURL":"https://api.notion.com","displayName":"Notion","name":"notion","oauth2Opts":{"authURL":"https://api.notion.com/v1/oauth/authorize","explicitScopesRequired":false,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{"consumerRefField":"owner.user.id","workspaceRefField":"workspace_id"},"tokenURL":"https://api.notion.com/v1/oauth/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"nutshell":{"authType":"basic","baseURL":"https://app.nutshell.com","displayName":"Nutshell","name":"nutshell","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"openAI":{"apiKeyOpts":{"attachmentType":"header","docsURL":"https://platform.openai.com/docs/api-reference/api-keys","header":{"name":"Authorization","valuePrefix":"Bearer "}},"authType":"apiKey","baseURL":"https://api.openai.com","displayName":"OpenAI","name":"openAI","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"outreach":{"authType":"oauth2","baseURL":"https://api.outreach.io","displayName":"Outreach","name":"outreach","oauth2Opts":{"authURL":"https://api.outreach.io/oauth/authorize","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{"scopesField":"scope"},"tokenURL":"https://api.outreach.io/oauth/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"paddle":{"apiKeyOpts":{"attachmentType":"header","docsURL":"https://developer.paddle.com/api-reference/about/authentication","header":{"name":"Authorization","valuePrefix":"Bearer "}},"authType":"apiKey","baseURL":"https://api.paddle.com","displayName":"Paddle","name":"paddle","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"paddleSandbox":{"apiKeyOpts":{"attachmentType":"header","docsURL":"https://developer.paddle.com/api-reference/about/authentication","header":{"name":"Authorization","valuePrefix":"Bearer "}},"authType":"apiKey","baseURL":"https://sandbox-api.paddle.com","displayName":"Paddle Sandbox","name":"paddleSandbox","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"pinterest":{"authType":"oauth2","baseURL":"https://api.pinterest.com","displayName":"Pinterest","name":"pinterest","oauth2Opts":{"authURL":"https://www.pinterest.com/oauth","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{"scopesField":"scope"},"tokenURL":"https://api.pinterest.com/v5/oauth/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"pipedrive":{"authType":"oauth2","baseURL":"https://api.pipedrive.com","displayName":"Pipedrive","name":"pipedrive","oauth2Opts":{"authURL":"https://oauth.pipedrive.com/oauth/authorize","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://oauth.pipedrive.com/oauth/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"pipeliner":{"authType":"basic","baseURL":"https://eu-central.api.pipelinersales.com","displayName":"Pipeliner","name":"pipeliner","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"podium":{"authType":"oauth2","baseURL":"https://api.podium.com","displayName":"Podium","name":"podium","oauth2Opts":{"authURL":"https://api.podium.com/oauth/authorize","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://api.podium.com/oauth/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"rebilly":{"apiKeyOpts":{"attachmentType":"header","docsURL":"https://www.rebilly.com/catalog/all/section/authentication/manage-api-keys","header":{"name":"REB-APIKEY"}},"authType":"apiKey","baseURL":"https://api.rebilly.com","displayName":"Rebilly","name":"rebilly","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"recurly":{"authType":"basic","baseURL":"https://v3.recurly.com","displayName":"Recurly","name":"recurly","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"ringCentral":{"authType":"oauth2","baseURL":"https://platform.ringcentral.com","displayName":"RingCentral","name":"ringCentral","oauth2Opts":{"authURL":"https://platform.ringcentral.com/restapi/oauth/authorize","explicitScopesRequired":false,"explicitWorkspaceRequired":false,"grantType":"PKCE","tokenMetadataFields":{"consumerRefField":"owner_id","scopesField":"scope"},"tokenURL":"https://platform.ringcentral.com/restapi/oauth/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"salesflare":{"apiKeyOpts":{"attachmentType":"header","docsURL":"https://api.salesflare.com/docs#section/Introduction/Authentication","header":{"name":"Authorization","valuePrefix":"Bearer "}},"authType":"apiKey","baseURL":"https://api.salesflare.com","displayName":"Salesflare","name":"salesflare","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"salesforce":{"authType":"oauth2","baseURL":"https://{{.workspace}}.my.salesforce.com","displayName":"Salesforce","name":"salesforce","oauth2Opts":{"authURL":"https://{{.workspace}}.my.salesforce.com/services/oauth2/authorize","explicitScopesRequired":false,"explicitWorkspaceRequired":true,"grantType":"authorizationCode","tokenMetadataFields":{"consumerRefField":"id","scopesField":"scope","workspaceRefField":"instance_url"},"tokenURL":"https://{{.workspace}}.my.salesforce.com/services/oauth2/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":true,"insert":false,"update":false,"upsert":true},"proxy":true,"read":true,"subscribe":false,"write":true}},"salesloft":{"authType":"oauth2","baseURL":"https://api.salesloft.com","displayName":"Salesloft","name":"salesloft","oauth2Opts":{"authURL":"https://accounts.salesloft.com/oauth/authorize","explicitScopesRequired":false,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{"scopesField":"scope"},"tokenURL":"https://accounts.salesloft.com/oauth/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":true,"subscribe":false,"write":true}},"seismic":{"authType":"oauth2","baseURL":"https://api.seismic.com","displayName":"Seismic","name":"seismic","oauth2Opts":{"authURL":"https://auth.seismic.com/tenants/{{.workspace}}/connect/authorize","explicitScopesRequired":false,"explicitWorkspaceRequired":true,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://auth.seismic.com/tenants/{{.workspace}}/connect/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"sellsy":{"authType":"oauth2","baseURL":"https://api.sellsy.com","displayName":"Sellsy","name":"sellsy","oauth2Opts":{"authURL":"https://login.sellsy.com/oauth2/authorization","explicitScopesRequired":false,"explicitWorkspaceRequired":false,"grantType":"PKCE","tokenMetadataFields":{},"tokenURL":"https://login.sellsy.com/oauth2/access-tokens"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"sendGrid":{"apiKeyOpts":{"attachmentType":"header","docsURL":"https://www.twilio.com/docs/sendgrid","header":{"name":"Authorization","valuePrefix":"Bearer "}},"authType":"apiKey","baseURL":"https://api.sendgrid.com","displayName":"SendGrid","name":"sendGrid","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"serviceNow":{"authType":"oauth2","baseURL":"https://{{.workspace}}.service-now.com","displayName":"ServiceNow","name":"serviceNow","oauth2Opts":{"authURL":"https://{{.workspace}}.service-now.com/oauth_auth.do","explicitScopesRequired":false,"explicitWorkspaceRequired":true,"grantType":"authorizationCode","tokenMetadataFields":{"scopesField":"scope"},"tokenURL":"https://{{.workspace}}.service-now.com/oauth_token.do"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"shopify":{"apiKeyOpts":{"attachmentType":"header","docsURL":"https://shopify.dev/docs/api/admin-rest#authentication","header":{"name":"X-Shopify-Access-Token"}},"authType":"apiKey","baseURL":"https://{{.workspace}}.myshopify.com","displayName":"Shopify","name":"shopify","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"slack":{"authType":"oauth2","baseURL":"https://slack.com/api","displayName":"Slack","name":"slack","oauth2Opts":{"authURL":"https://slack.com/oauth/v2/authorize","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{"scopesField":"scope","workspaceRefField":"workspace_name"},"tokenURL":"https://slack.com/api/oauth.v2.access"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"smartsheet":{"authType":"oauth2","baseURL":"https://api.smartsheet.com","displayName":"Smartsheet","name":"smartsheet","oauth2Opts":{"authURL":"https://app.smartsheet.com/b/authorize","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://api.smartsheet.com/2.0/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"snapchatAds":{"authType":"oauth2","baseURL":"https://adsapi.snapchat.com","displayName":"Snapchat Ads","name":"snapchatAds","oauth2Opts":{"authURL":"https://accounts.snapchat.com/login/oauth2/authorize","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://accounts.snapchat.com/login/oauth2/access_token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"stackExchange":{"authType":"oauth2","baseURL":"https://api.stackexchange.com","displayName":"StackExchange","name":"stackExchange","oauth2Opts":{"authURL":"https://stackoverflow.com/oauth","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://stackoverflow.com/oauth/access_token/json"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"stripe":{"apiKeyOpts":{"attachmentType":"header","docsURL":"https://docs.stripe.com/keys","header":{"name":"Authorization","valuePrefix":"Bearer "}},"authType":"apiKey","baseURL":"https://api.stripe.com","displayName":"Stripe","name":"stripe","providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"sugarCRM":{"authType":"oauth2","baseURL":"{{.workspace}}/rest/v11_24","displayName":"SugarCRM","name":"sugarCRM","oauth2Opts":{"explicitScopesRequired":false,"explicitWorkspaceRequired":true,"grantType":"password","tokenMetadataFields":{},"tokenURL":"{{.workspace}}/rest/v11_24/oauth2/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"surveyMonkey":{"authType":"oauth2","baseURL":"https://api.surveymonkey.com","displayName":"SurveyMonkey","name":"surveyMonkey","oauth2Opts":{"authURL":"https://api.surveymonkey.com/oauth/authorize","explicitScopesRequired":false,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://api.surveymonkey.com/oauth/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"teamleader":{"authType":"oauth2","baseURL":"https://api.focus.teamleader.eu","displayName":"Teamleader","name":"teamleader","oauth2Opts":{"authURL":"https://focus.teamleader.eu/oauth2/authorize","explicitScopesRequired":false,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://focus.teamleader.eu/oauth2/access_token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"teamwork":{"authType":"oauth2","baseURL":"https://{{.workspace}}.teamwork.com","displayName":"Teamwork","name":"teamwork","oauth2Opts":{"authURL":"https://www.teamwork.com/launchpad/login","explicitScopesRequired":false,"explicitWorkspaceRequired":true,"grantType":"authorizationCode","tokenMetadataFields":{"consumerRefField":"user.id"},"tokenURL":"https://www.teamwork.com/launchpad/v1/token.json"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"timely":{"authType":"oauth2","baseURL":"https://api.timelyapp.com","displayName":"Timely","name":"timely","oauth2Opts":{"authURL":"https://api.timelyapp.com/1.1/oauth/authorize","explicitScopesRequired":false,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{"scopesField":"scope"},"tokenURL":"https://api.timelyapp.com/1.1/oauth/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"typeform":{"authType":"oauth2","baseURL":"https://api.typeform.com","displayName":"Typeform","name":"typeform","oauth2Opts":{"authURL":"https://api.typeform.com/oauth/authorize","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://api.typeform.com/oauth/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"webflow":{"authType":"oauth2","baseURL":"https://api.webflow.com","displayName":"Webflow","name":"webflow","oauth2Opts":{"authURL":"https://webflow.com/oauth/authorize","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{"scopesField":"scope"},"tokenURL":"https://api.webflow.com/oauth/access_token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"wordPress":{"authType":"oauth2","baseURL":"https://public-api.wordpress.com","displayName":"WordPress","name":"wordPress","oauth2Opts":{"authURL":"https://public-api.wordpress.com/oauth2/authorize","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{"scopesField":"scope"},"tokenURL":"https://public-api.wordpress.com/oauth2/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"wrike":{"authType":"oauth2","baseURL":"https://www.wrike.com/api","displayName":"Wrike","name":"wrike","oauth2Opts":{"authURL":"https://www.wrike.com/oauth2/authorize","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://www.wrike.com/oauth2/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"zendeskChat":{"authType":"oauth2","baseURL":"https://www.zopim.com","displayName":"Zendesk Chat","name":"zendeskChat","oauth2Opts":{"authURL":"https://www.zopim.com/oauth2/authorizations/new?subdomain={{.workspace}}","explicitScopesRequired":true,"explicitWorkspaceRequired":true,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://www.zopim.com/oauth2/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}},"zendeskSupport":{"authType":"oauth2","baseURL":"https://{{.workspace}}.zendesk.com/api","displayName":"Zendesk Support","name":"zendeskSupport","oauth2Opts":{"authURL":"https://{{.workspace}}.zendesk.com/oauth/authorizations/new","explicitScopesRequired":true,"explicitWorkspaceRequired":true,"grantType":"authorizationCode","tokenMetadataFields":{},"tokenURL":"https://{{.workspace}}.zendesk.com/oauth/tokens"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"zoho":{"authType":"oauth2","baseURL":"https://www.zohoapis.com","displayName":"Zoho","name":"zoho","oauth2Opts":{"authURL":"https://accounts.zoho.com/oauth/v2/auth","explicitScopesRequired":true,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{"scopesField":"scope","workspaceRefField":"api_domain"},"tokenURL":"https://accounts.zoho.com/oauth/v2/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"zoom":{"authType":"oauth2","baseURL":"https://api.zoom.us","displayName":"Zoom","name":"zoom","oauth2Opts":{"authURL":"https://zoom.us/oauth/authorize","explicitScopesRequired":false,"explicitWorkspaceRequired":false,"grantType":"authorizationCode","tokenMetadataFields":{"scopesField":"scope"},"tokenURL":"https://zoom.us/oauth/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":true,"read":false,"subscribe":false,"write":false}},"zuora":{"authType":"oauth2","baseURL":"https://{{.workspace}}.zuora.com","displayName":"Zuora","name":"zuora","oauth2Opts":{"explicitScopesRequired":false,"explicitWorkspaceRequired":true,"grantType":"clientCredentials","tokenMetadataFields":{},"tokenURL":"https://{{.workspace}}.zuora.com/oauth/token"},"providerOpts":null,"support":{"bulkWrite":{"delete":false,"insert":false,"update":false,"upsert":false},"proxy":false,"read":false,"subscribe":false,"write":false}}}
\ No newline at end of file
diff --git a/internal/generated/provider_count.go b/internal/generated/provider_count.go
index 8a992e11..122ce7ee 100644
--- a/internal/generated/provider_count.go
+++ b/internal/generated/provider_count.go
@@ -2,4 +2,4 @@ package generated
 
 // This file will be updated automatically, do not edit it manually.
 
-const ProviderCount = 129
+const ProviderCount = 124
diff --git a/pipeliner/client.go b/pipeliner/client.go
new file mode 100644
index 00000000..57eadb6d
--- /dev/null
+++ b/pipeliner/client.go
@@ -0,0 +1,16 @@
+package pipeliner
+
+import "github.com/amp-labs/connectors/common"
+
+// JSONHTTPClient returns the underlying JSON HTTP client.
+func (c *Connector) JSONHTTPClient() *common.JSONHTTPClient {
+	return c.Client
+}
+
+func (c *Connector) HTTPClient() *common.HTTPClient {
+	return c.Client.HTTPClient
+}
+
+func (c *Connector) Close() error {
+	return nil
+}
diff --git a/pipeliner/connector.go b/pipeliner/connector.go
new file mode 100644
index 00000000..cd621999
--- /dev/null
+++ b/pipeliner/connector.go
@@ -0,0 +1,69 @@
+package pipeliner
+
+import (
+	"fmt"
+
+	"github.com/amp-labs/connectors/common"
+	"github.com/amp-labs/connectors/common/interpreter"
+	"github.com/amp-labs/connectors/common/paramsbuilder"
+	"github.com/amp-labs/connectors/common/urlbuilder"
+	"github.com/amp-labs/connectors/providers"
+)
+
+type Connector struct {
+	BaseURL   string
+	Workspace string
+	Client    *common.JSONHTTPClient
+}
+
+func NewConnector(opts ...Option) (conn *Connector, outErr error) {
+	defer common.PanicRecovery(func(cause error) {
+		outErr = cause
+		conn = nil
+	})
+
+	params, err := paramsbuilder.Apply(parameters{}, opts)
+	if err != nil {
+		return nil, err
+	}
+
+	httpClient := params.Client.Caller
+	conn = &Connector{
+		Client: &common.JSONHTTPClient{
+			HTTPClient: httpClient,
+		},
+		Workspace: params.Workspace.Name,
+	}
+
+	providerInfo, err := providers.ReadInfo(conn.Provider())
+	if err != nil {
+		return nil, err
+	}
+
+	// connector and its client must mirror base url and provide its own error parser
+	conn.setBaseURL(providerInfo.BaseURL)
+	conn.Client.HTTPClient.ErrorHandler = interpreter.ErrorHandler{
+		JSON: conn.interpretJSONError,
+	}.Handle
+
+	return conn, nil
+}
+
+func (c *Connector) Provider() providers.Provider {
+	return providers.Pipeliner
+}
+
+func (c *Connector) String() string {
+	return fmt.Sprintf("%s.Connector", c.Provider())
+}
+
+func (c *Connector) getURL(parts ...string) (*urlbuilder.URL, error) {
+	return constructURL(c.BaseURL, append([]string{
+		"api/v100/rest/spaces/", c.Workspace, "/entities",
+	}, parts...)...)
+}
+
+func (c *Connector) setBaseURL(newURL string) {
+	c.BaseURL = newURL
+	c.Client.HTTPClient.Base = newURL
+}
diff --git a/pipeliner/delete.go b/pipeliner/delete.go
new file mode 100644
index 00000000..60bd52cd
--- /dev/null
+++ b/pipeliner/delete.go
@@ -0,0 +1,34 @@
+package pipeliner
+
+import (
+	"context"
+
+	"github.com/amp-labs/connectors/common"
+)
+
+func (c *Connector) Delete(ctx context.Context, config common.DeleteParams) (*common.DeleteResult, error) {
+	if len(config.ObjectName) == 0 {
+		return nil, common.ErrMissingObjects
+	}
+
+	if len(config.RecordId) == 0 {
+		return nil, common.ErrMissingRecordID
+	}
+
+	url, err := c.getURL(config.ObjectName)
+	if err != nil {
+		return nil, err
+	}
+
+	url.AddPath(config.RecordId)
+
+	// 200 OK is expected
+	_, err = c.Client.Delete(ctx, url.String())
+	if err != nil {
+		return nil, err
+	}
+
+	return &common.DeleteResult{
+		Success: true,
+	}, nil
+}
diff --git a/pipeliner/errors.go b/pipeliner/errors.go
new file mode 100644
index 00000000..c6aa8cc0
--- /dev/null
+++ b/pipeliner/errors.go
@@ -0,0 +1,95 @@
+package pipeliner
+
+import (
+	"encoding/json"
+	"fmt"
+	"net/http"
+
+	"github.com/amp-labs/connectors/common"
+	"github.com/amp-labs/connectors/common/interpreter"
+)
+
+func (*Connector) interpretJSONError(res *http.Response, body []byte) error { //nolint:cyclop
+	payload := make(map[string]any)
+	if err := json.Unmarshal(body, &payload); err != nil {
+		return fmt.Errorf("interpretJSONError general: %w %w", interpreter.ErrUnmarshal, err)
+	}
+
+	// now we can choose which error response Schema we expect
+	var schema common.ErrorDescriptor
+
+	if _, ok := payload["code"]; ok {
+		apiError := &ResponseWithCodeError{}
+		if err := json.Unmarshal(body, &apiError); err != nil {
+			return fmt.Errorf("interpretJSONError ResponseWithCodeError: %w %w", interpreter.ErrUnmarshal, err)
+		}
+
+		schema = apiError
+	} else {
+		// default to simple response
+		apiError := &ResponseSimpleError{}
+		if err := json.Unmarshal(body, &apiError); err != nil {
+			return fmt.Errorf("interpretJSONError ResponseSimpleError: %w %w", interpreter.ErrUnmarshal, err)
+		}
+
+		schema = apiError
+	}
+
+	return schema.CombineErr(statusCodeMapping(res, body))
+}
+
+func statusCodeMapping(res *http.Response, body []byte) error {
+	if res.StatusCode == http.StatusUnprocessableEntity {
+		return common.ErrBadRequest
+	}
+
+	return interpreter.DefaultStatusCodeMappingToErr(res, body)
+}
+
+// ResponseSimpleError occurs for Read method, invalid URL.
+type ResponseSimpleError struct {
+	Status    int    `json:"status"`
+	Message   string `json:"message"`
+	ErrorCode any    `json:"errorcode"`
+	Traceback any    `json:"traceback"`
+}
+
+func (r ResponseSimpleError) CombineErr(base error) error {
+	return fmt.Errorf("%w: %v", base, r.Message)
+}
+
+// ResponseWithCodeError extended error format, happens during invalid Create/Update.
+// nolint:tagliatelle
+type ResponseWithCodeError struct {
+	Code         int    `json:"code"`
+	Name         string `json:"name"`
+	Message      string `json:"message"`
+	EntityId     string `json:"entity_id"`
+	EntityName   string `json:"entity_name"`
+	EntityErrors []struct {
+		Code    int    `json:"code"`
+		Name    string `json:"name"`
+		Message string `json:"message"`
+	} `json:"entity_errors"`
+	FieldErrors []struct {
+		FieldId   string `json:"field_id"`
+		FieldName string `json:"field_name"`
+		Name      string `json:"name"`
+		Code      int    `json:"code"`
+		Errors    []struct {
+			Code      int    `json:"code"`
+			Name      string `json:"name"`
+			Message   string `json:"message"`
+			FieldId   string `json:"field_id"`
+			FieldName string `json:"field_name"`
+		} `json:"errors"`
+	} `json:"field_errors"`
+	StepChecklistErrors []interface{} `json:"step_checklist_errors"`
+	EntityIndex         interface{}   `json:"entity_index"`
+	HTTPStatus          int           `json:"http_status"`
+	Success             bool          `json:"success"`
+}
+
+func (r ResponseWithCodeError) CombineErr(base error) error {
+	return fmt.Errorf("%w: %v", base, r.Message)
+}
diff --git a/pipeliner/params.go b/pipeliner/params.go
new file mode 100644
index 00000000..19472535
--- /dev/null
+++ b/pipeliner/params.go
@@ -0,0 +1,51 @@
+package pipeliner
+
+import (
+	"context"
+	"errors"
+	"net/http"
+
+	"github.com/amp-labs/connectors/common"
+	"github.com/amp-labs/connectors/common/paramsbuilder"
+)
+
+const (
+	// DefaultPageSize is number of elements per page.
+	DefaultPageSize = 100
+)
+
+// Option is a function which mutates the connector configuration.
+type Option = func(params *parameters)
+
+// parameters surface options by delegation.
+type parameters struct {
+	paramsbuilder.Client
+	paramsbuilder.Workspace
+}
+
+func (p parameters) ValidateParams() error {
+	return errors.Join(
+		p.Client.ValidateParams(),
+		p.Workspace.ValidateParams(),
+	)
+}
+
+func WithClient(ctx context.Context, client *http.Client,
+	user, pass string, opts ...common.HeaderAuthClientOption,
+) Option {
+	return func(params *parameters) {
+		params.WithBasicClient(ctx, client, user, pass, opts...)
+	}
+}
+
+func WithAuthenticatedClient(client common.AuthenticatedHTTPClient) Option {
+	return func(params *parameters) {
+		params.WithAuthenticatedClient(client)
+	}
+}
+
+func WithWorkspace(workspaceRef string) Option {
+	return func(params *parameters) {
+		params.WithWorkspace(workspaceRef)
+	}
+}
diff --git a/pipeliner/parse.go b/pipeliner/parse.go
new file mode 100644
index 00000000..71cdea87
--- /dev/null
+++ b/pipeliner/parse.go
@@ -0,0 +1,37 @@
+package pipeliner
+
+import (
+	"github.com/amp-labs/connectors/common"
+	"github.com/amp-labs/connectors/common/jsonquery"
+	"github.com/spyzhov/ajson"
+)
+
+func getTotalSize(node *ajson.Node) (int64, error) {
+	return jsonquery.New(node).ArraySize("data")
+}
+
+func getRecords(node *ajson.Node) ([]map[string]any, error) {
+	arr, err := jsonquery.New(node).Array("data", false)
+	if err != nil {
+		return nil, err
+	}
+
+	return jsonquery.Convertor.ArrayToMap(arr)
+}
+
+func getNextRecordsURL(node *ajson.Node) (string, error) {
+	return jsonquery.New(node, "page_info").StrWithDefault("end_cursor", "")
+}
+
+func getMarshaledData(records []map[string]interface{}, fields []string) ([]common.ReadResultRow, error) {
+	data := make([]common.ReadResultRow, len(records))
+
+	for i, record := range records {
+		data[i] = common.ReadResultRow{
+			Fields: common.ExtractLowercaseFieldsFromRaw(fields, record),
+			Raw:    record,
+		}
+	}
+
+	return data, nil
+}
diff --git a/pipeliner/read.go b/pipeliner/read.go
new file mode 100644
index 00000000..26d48f71
--- /dev/null
+++ b/pipeliner/read.go
@@ -0,0 +1,46 @@
+package pipeliner
+
+import (
+	"context"
+	"strconv"
+
+	"github.com/amp-labs/connectors/common"
+	"github.com/amp-labs/connectors/common/urlbuilder"
+)
+
+func (c *Connector) Read(ctx context.Context, config common.ReadParams) (*common.ReadResult, error) {
+	link, err := c.buildReadURL(config)
+	if err != nil {
+		return nil, err
+	}
+
+	rsp, err := c.Client.Get(ctx, link.String())
+	if err != nil {
+		return nil, err
+	}
+
+	return common.ParseResult(
+		rsp,
+		getTotalSize,
+		getRecords,
+		getNextRecordsURL,
+		getMarshaledData,
+		config.Fields,
+	)
+}
+
+func (c *Connector) buildReadURL(config common.ReadParams) (*urlbuilder.URL, error) {
+	link, err := c.getURL(config.ObjectName)
+	if err != nil {
+		return nil, err
+	}
+
+	link.WithQueryParam("first", strconv.Itoa(DefaultPageSize))
+
+	if len(config.NextPage) != 0 {
+		// Next page
+		link.WithQueryParam("after", config.NextPage.String())
+	}
+
+	return link, nil
+}
diff --git a/pipeliner/url.go b/pipeliner/url.go
new file mode 100644
index 00000000..03d6c1be
--- /dev/null
+++ b/pipeliner/url.go
@@ -0,0 +1,18 @@
+package pipeliner
+
+import "github.com/amp-labs/connectors/common/urlbuilder"
+
+var queryEncodingExceptions = map[string]string{ //nolint:gochecknoglobals
+	// none
+}
+
+func constructURL(base string, path ...string) (*urlbuilder.URL, error) {
+	link, err := urlbuilder.New(base, path...)
+	if err != nil {
+		return nil, err
+	}
+
+	link.AddEncodingExceptions(queryEncodingExceptions)
+
+	return link, nil
+}
diff --git a/pipeliner/write.go b/pipeliner/write.go
new file mode 100644
index 00000000..97793724
--- /dev/null
+++ b/pipeliner/write.go
@@ -0,0 +1,76 @@
+package pipeliner
+
+import (
+	"context"
+
+	"github.com/amp-labs/connectors/common"
+	"github.com/amp-labs/connectors/common/jsonquery"
+	"github.com/spyzhov/ajson"
+)
+
+func (c *Connector) Write(ctx context.Context, config common.WriteParams) (*common.WriteResult, error) {
+	if len(config.ObjectName) == 0 {
+		return nil, common.ErrMissingObjects
+	}
+
+	url, err := c.getURL(config.ObjectName)
+	if err != nil {
+		return nil, err
+	}
+
+	var write common.WriteMethod
+	if len(config.RecordId) == 0 {
+		// writing to the entity without id means
+		// that we are extending 'List' resource and creating a new record
+		write = c.Client.Post
+	} else {
+		// only put is supported for updating 'Single' resource
+		write = c.Client.Patch
+
+		url.AddPath(config.RecordId)
+	}
+
+	res, err := write(ctx, url.String(), config.RecordData)
+	if err != nil {
+		return nil, err
+	}
+
+	if res == nil || res.Body == nil {
+		// it is unlikely to have no payload
+		return &common.WriteResult{
+			Success: true,
+		}, nil
+	}
+
+	// write response was with payload
+	return constructWriteResult(res.Body)
+}
+
+func constructWriteResult(body *ajson.Node) (*common.WriteResult, error) {
+	success, err := jsonquery.New(body).Bool("success", false)
+	if err != nil {
+		return nil, err
+	}
+
+	nested, err := jsonquery.New(body).Object("data", false)
+	if err != nil {
+		return nil, err
+	}
+
+	recordID, err := jsonquery.New(nested).StrWithDefault("id", "")
+	if err != nil {
+		return nil, err
+	}
+
+	data, err := jsonquery.Convertor.ObjectToMap(nested)
+	if err != nil {
+		return nil, err
+	}
+
+	return &common.WriteResult{
+		Success:  *success,
+		RecordId: recordID,
+		Errors:   nil,
+		Data:     data,
+	}, nil
+}
diff --git a/providers/messageBird.go b/providers/bird.go
similarity index 79%
rename from providers/messageBird.go
rename to providers/bird.go
index 6b19f9d9..392f99ae 100644
--- a/providers/messageBird.go
+++ b/providers/bird.go
@@ -1,11 +1,11 @@
 package providers
 
-const MessageBird Provider = "messageBird"
+const Bird Provider = "bird"
 
 func init() {
-	// MessageBird configuration
-	SetInfo(MessageBird, ProviderInfo{
-		DisplayName: "MessageBird",
+	// Bird configuration
+	SetInfo(Bird, ProviderInfo{
+		DisplayName: "Bird (MessageBird)",
 		AuthType:    ApiKey,
 		BaseURL:     "https://api.bird.com",
 		ApiKeyOpts: &ApiKeyOpts{
diff --git a/providers/bynder.go b/providers/bynder.go
index 01aede64..6c417a8b 100644
--- a/providers/bynder.go
+++ b/providers/bynder.go
@@ -4,7 +4,7 @@ const Bynder Provider = "bynder"
 
 func init() {
 	SetInfo(Bynder, ProviderInfo{
-		DisplayName: "bynder",
+		DisplayName: "Bynder",
 		AuthType:    Oauth2,
 		BaseURL:     "https://{{.workspace}}.bynder.com/api",
 		Oauth2Opts: &Oauth2Opts{
diff --git a/providers/callRail.go b/providers/callRail.go
index 9c67449f..15301e96 100644
--- a/providers/callRail.go
+++ b/providers/callRail.go
@@ -5,8 +5,9 @@ const CallRail Provider = "callRail"
 func init() {
 	// CallRail Configuration
 	SetInfo(CallRail, ProviderInfo{
-		AuthType: ApiKey,
-		BaseURL:  "https://api.callrail.com",
+		DisplayName: "CallRail",
+		AuthType:    ApiKey,
+		BaseURL:     "https://api.callrail.com",
 		ApiKeyOpts: &ApiKeyOpts{
 			AttachmentType: Header,
 			Header: &ApiKeyOptsHeader{
diff --git a/providers/dynamics.go b/providers/dynamics.go
index 4bba019f..dcce2c96 100644
--- a/providers/dynamics.go
+++ b/providers/dynamics.go
@@ -60,9 +60,9 @@ func init() {
 				Delete: false,
 			},
 			Proxy:     true,
-			Read:      false,
+			Read:      true,
 			Subscribe: false,
-			Write:     false,
+			Write:     true,
 		},
 	})
 }
diff --git a/providers/gmail.go b/providers/gmail.go
deleted file mode 100644
index 4025c75f..00000000
--- a/providers/gmail.go
+++ /dev/null
@@ -1,34 +0,0 @@
-package providers
-
-const Gmail Provider = "gmail"
-
-func init() {
-	// GoogleMail Support Configuration
-	SetInfo(Gmail, ProviderInfo{
-		DisplayName: "Gmail",
-		AuthType:    Oauth2,
-		BaseURL:     "https://gmail.googleapis.com",
-		Oauth2Opts: &Oauth2Opts{
-			GrantType:                 AuthorizationCode,
-			AuthURL:                   "https://accounts.google.com/o/oauth2/v2/auth",
-			TokenURL:                  "https://oauth2.googleapis.com/token",
-			ExplicitScopesRequired:    true,
-			ExplicitWorkspaceRequired: false,
-			TokenMetadataFields: TokenMetadataFields{
-				ScopesField: "scope",
-			},
-		},
-		Support: Support{
-			BulkWrite: BulkWriteSupport{
-				Insert: false,
-				Update: false,
-				Upsert: false,
-				Delete: false,
-			},
-			Proxy:     true,
-			Read:      false,
-			Subscribe: false,
-			Write:     false,
-		},
-	})
-}
diff --git a/providers/google.go b/providers/google.go
index a104cc31..a13bfc24 100644
--- a/providers/google.go
+++ b/providers/google.go
@@ -8,7 +8,6 @@ const (
 
 //nolint:funlen
 func init() {
-	// Google Support Configuration
 	SetInfo(Google, ProviderInfo{
 		DisplayName: "Google",
 		AuthType:    Oauth2,
@@ -37,64 +36,4 @@ func init() {
 			Write:     false,
 		},
 	})
-
-	// GoogleContacts Support Configuration
-	SetInfo(GoogleContacts, ProviderInfo{
-		DisplayName: "Google Contacts",
-		AuthType:    Oauth2,
-		BaseURL:     "https://people.googleapis.com",
-		Oauth2Opts: &Oauth2Opts{
-			GrantType:                 AuthorizationCode,
-			AuthURL:                   "https://accounts.google.com/o/oauth2/v2/auth",
-			AuthURLParams:             map[string]string{"access_type": "offline"},
-			TokenURL:                  "https://oauth2.googleapis.com/token",
-			ExplicitScopesRequired:    true,
-			ExplicitWorkspaceRequired: false,
-			TokenMetadataFields: TokenMetadataFields{
-				ScopesField: "scope",
-			},
-		},
-		Support: Support{
-			BulkWrite: BulkWriteSupport{
-				Insert: false,
-				Update: false,
-				Upsert: false,
-				Delete: false,
-			},
-			Proxy:     true,
-			Read:      false,
-			Subscribe: false,
-			Write:     false,
-		},
-	})
-
-	// GoogleAds Support Configuration
-	SetInfo(GoogleAds, ProviderInfo{
-		DisplayName: "Google Ads",
-		AuthType:    Oauth2,
-		BaseURL:     "https://googleads.googleapis.com",
-		Oauth2Opts: &Oauth2Opts{
-			GrantType:                 AuthorizationCode,
-			AuthURL:                   "https://accounts.google.com/o/oauth2/v2/auth",
-			AuthURLParams:             map[string]string{"access_type": "offline"},
-			TokenURL:                  "https://oauth2.googleapis.com/token",
-			ExplicitScopesRequired:    true,
-			ExplicitWorkspaceRequired: false,
-			TokenMetadataFields: TokenMetadataFields{
-				ScopesField: "scope",
-			},
-		},
-		Support: Support{
-			BulkWrite: BulkWriteSupport{
-				Insert: false,
-				Update: false,
-				Upsert: false,
-				Delete: false,
-			},
-			Proxy:     true,
-			Read:      false,
-			Subscribe: false,
-			Write:     false,
-		},
-	})
 }
diff --git a/providers/microsoft.go b/providers/microsoft.go
index 0c8e492d..d290931c 100644
--- a/providers/microsoft.go
+++ b/providers/microsoft.go
@@ -3,12 +3,12 @@ package providers
 // Supported Microsoft Products includes OneDrive Outlook Excel
 // Edge Extensions Sharepoint OneNote Notifications Todos Teams Insights
 // Planner and Personal Contacts.
-const MicrosoftOffice365 Provider = "microsoftOffice365"
+const Microsoft Provider = "microsoft"
 
 func init() {
 	// Microsoft Office 365 Configuration
-	SetInfo(MicrosoftOffice365, ProviderInfo{
-		DisplayName: "Microsoft Office 365",
+	SetInfo(Microsoft, ProviderInfo{
+		DisplayName: "Microsoft",
 		AuthType:    Oauth2,
 		BaseURL:     "https://graph.microsoft.com",
 		Oauth2Opts: &Oauth2Opts{
diff --git a/providers/pipeliner.go b/providers/pipeliner.go
index 2b1ca4b3..eb8d0b99 100644
--- a/providers/pipeliner.go
+++ b/providers/pipeliner.go
@@ -5,6 +5,7 @@ const Pipeliner Provider = "pipeliner"
 func init() {
 	// Pipeliner API Key authentication
 	SetInfo(Pipeliner, ProviderInfo{
+		// TODO [ExplicitWorkspaceRequired: true]
 		DisplayName: "Pipeliner",
 		AuthType:    Basic,
 		BaseURL:     "https://eu-central.api.pipelinersales.com",
diff --git a/providers/powerBI.go b/providers/powerBI.go
deleted file mode 100644
index a05e9ee5..00000000
--- a/providers/powerBI.go
+++ /dev/null
@@ -1,31 +0,0 @@
-package providers
-
-const PowerBI Provider = "powerBI"
-
-func init() {
-	// PowerBI configuration
-	SetInfo(PowerBI, ProviderInfo{
-		DisplayName: "PowerBI",
-		AuthType:    Oauth2,
-		BaseURL:     "https://api.powerbi.com",
-		Oauth2Opts: &Oauth2Opts{
-			GrantType:                 AuthorizationCode,
-			AuthURL:                   "https://login.microsoftonline.com/common/oauth2/v2.0/authorize",
-			TokenURL:                  "https://login.microsoftonline.com/common/oauth2/v2.0/token",
-			ExplicitScopesRequired:    true,
-			ExplicitWorkspaceRequired: false,
-		},
-		Support: Support{
-			BulkWrite: BulkWriteSupport{
-				Insert: false,
-				Update: false,
-				Upsert: false,
-				Delete: false,
-			},
-			Proxy:     true,
-			Read:      false,
-			Subscribe: false,
-			Write:     false,
-		},
-	})
-}
diff --git a/providers/sharePoint.go b/providers/sharePoint.go
deleted file mode 100644
index 3aee9482..00000000
--- a/providers/sharePoint.go
+++ /dev/null
@@ -1,34 +0,0 @@
-package providers
-
-const SharePoint Provider = "sharePoint"
-
-func init() {
-	SetInfo(SharePoint, ProviderInfo{
-		DisplayName: "SharePoint",
-		AuthType:    Oauth2,
-		BaseURL:     "https://{{.workspace}}.sharepoint.com/_api",
-		Oauth2Opts: &Oauth2Opts{
-			GrantType:              AuthorizationCode,
-			AuthURL:                "https://login.microsoftonline.com/common/oauth2/v2.0/authorize",
-			TokenURL:               "https://login.microsoftonline.com/common/oauth2/v2.0/token",
-			ExplicitScopesRequired: true,
-			// TODO: Switch to post-auth metadata collection
-			ExplicitWorkspaceRequired: true,
-			TokenMetadataFields: TokenMetadataFields{
-				ScopesField: "scope",
-			},
-		},
-		Support: Support{
-			BulkWrite: BulkWriteSupport{
-				Insert: false,
-				Update: false,
-				Upsert: false,
-				Delete: false,
-			},
-			Proxy:     true,
-			Read:      false,
-			Subscribe: false,
-			Write:     false,
-		},
-	})
-}
diff --git a/providers/sugarcrm.go b/providers/sugarCRM.go
similarity index 100%
rename from providers/sugarcrm.go
rename to providers/sugarCRM.go
diff --git a/providers/types.gen.go b/providers/types.gen.go
index dd86323a..3fb4df7b 100644
--- a/providers/types.gen.go
+++ b/providers/types.gen.go
@@ -1,6 +1,6 @@
 // Package providers provides primitives to interact with the openapi HTTP API.
 //
-// Code generated by github.com/deepmap/oapi-codegen version v1.16.3 DO NOT EDIT.
+// Code generated by github.com/deepmap/oapi-codegen version v1.16.2 DO NOT EDIT.
 package providers
 
 // Defines values for ApiKeyOptsAttachmentType.
@@ -57,6 +57,12 @@ type ApiKeyOptsQuery struct {
 // AuthType defines model for AuthType.
 type AuthType string
 
+// BasicAuthOpts Configuration for Basic Auth. Optional.
+type BasicAuthOpts struct {
+	// DocsURL URL with more information about how to get or use an API key.
+	DocsURL string `json:"docsURL,omitempty"`
+}
+
 // BulkWriteSupport defines model for BulkWriteSupport.
 type BulkWriteSupport struct {
 	Delete bool `json:"delete"`
@@ -134,6 +140,9 @@ type ProviderInfo struct {
 	// BaseURL The base URL for making API requests.
 	BaseURL string `json:"baseURL" validate:"required"`
 
+	// BasicOpts Configuration for Basic Auth. Optional.
+	BasicOpts *BasicAuthOpts `json:"basicOpts,omitempty"`
+
 	// DisplayName The display name of the provider, if omitted, defaults to provider name.
 	DisplayName string `json:"displayName,omitempty"`
 	Media       *Media `json:"media,omitempty"`
diff --git a/providers/zohoCRM.go b/providers/zoho.go
similarity index 86%
rename from providers/zohoCRM.go
rename to providers/zoho.go
index 4578b975..2f939f20 100644
--- a/providers/zohoCRM.go
+++ b/providers/zoho.go
@@ -1,11 +1,11 @@
 package providers
 
-const ZohoCRM Provider = "zohoCRM"
+const Zoho Provider = "zoho"
 
 func init() {
-	// ZohoCRM configuration
-	SetInfo(ZohoCRM, ProviderInfo{
-		DisplayName: "Zoho CRM",
+	// Zoho configuration
+	SetInfo(Zoho, ProviderInfo{
+		DisplayName: "Zoho",
 		AuthType:    Oauth2,
 		BaseURL:     "https://www.zohoapis.com",
 		Oauth2Opts: &Oauth2Opts{
diff --git a/tools/fileconv/files.go b/tools/fileconv/files.go
new file mode 100644
index 00000000..421566cc
--- /dev/null
+++ b/tools/fileconv/files.go
@@ -0,0 +1,8 @@
+package fileconv
+
+// FileLocator provides an absolute path to the file.
+// This is useful for writing data to that file.
+// Loading data from file should be done via go embed.
+type FileLocator interface {
+	AbsPathTo(filename string) string
+}
diff --git a/tools/scrapper/files.go b/tools/scrapper/files.go
index 763bbc0c..161c8d4e 100644
--- a/tools/scrapper/files.go
+++ b/tools/scrapper/files.go
@@ -1,6 +1,10 @@
 package scrapper
 
-import "encoding/json"
+import (
+	"encoding/json"
+
+	"github.com/amp-labs/connectors/tools/fileconv"
+)
 
 const (
 	IndexFile           = "index.json"
@@ -8,18 +12,12 @@ const (
 	QueryParamStatsFile = "queryParamStats.json"
 )
 
-// MetadataFileLocator locates index and schema files.
-// Every module stores these files in its own place.
-type MetadataFileLocator interface {
-	AbsPathTo(filename string) string
-}
-
 type MetadataFileManager struct {
 	schemas []byte
-	locator MetadataFileLocator
+	locator fileconv.FileLocator
 }
 
-func NewMetadataFileManager(schemas []byte, locator MetadataFileLocator) *MetadataFileManager {
+func NewMetadataFileManager(schemas []byte, locator fileconv.FileLocator) *MetadataFileManager {
 	return &MetadataFileManager{
 		schemas: schemas,
 		locator: locator,
diff --git a/utils/credentials.go b/utils/credentials.go
index 634fcfd2..25491867 100644
--- a/utils/credentials.go
+++ b/utils/credentials.go
@@ -18,6 +18,9 @@ var (
 	ClientSecret = "clientSecret"
 	WorkspaceRef = "workspaceRef"
 	Provider     = "provider"
+	Username     = "username"
+	Password     = "password"
+	Region       = "region"
 )
 
 func SalesforceOAuthConfigFromRegistry(registry scanning.Registry) *oauth2.Config {


Test patch:
diff --git a/pipeliner/delete_test.go b/pipeliner/delete_test.go
new file mode 100644
index 00000000..6f101b60
--- /dev/null
+++ b/pipeliner/delete_test.go
@@ -0,0 +1,115 @@
+package pipeliner
+
+import (
+	"context"
+	"errors"
+	"net/http"
+	"net/http/httptest"
+	"reflect"
+	"strings"
+	"testing"
+
+	"github.com/amp-labs/connectors/common"
+	"github.com/amp-labs/connectors/common/interpreter"
+	"github.com/amp-labs/connectors/test/utils/mockutils"
+	"github.com/amp-labs/connectors/test/utils/testutils"
+	"github.com/go-test/deep"
+)
+
+func TestDelete(t *testing.T) { // nolint:funlen,cyclop
+	t.Parallel()
+
+	responseRemoveNote := testutils.DataFromFile(t, "delete-note.json")
+
+	tests := []struct {
+		name         string
+		input        common.DeleteParams
+		server       *httptest.Server
+		connector    Connector
+		expected     *common.DeleteResult
+		expectedErrs []error
+	}{
+		{
+			name: "Write object must be included",
+			server: httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+				w.WriteHeader(http.StatusTeapot)
+			})),
+			expectedErrs: []error{common.ErrMissingObjects},
+		},
+		{
+			name:  "Write object and its ID must be included",
+			input: common.DeleteParams{ObjectName: "quotes"},
+			server: httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+				w.WriteHeader(http.StatusTeapot)
+			})),
+			expectedErrs: []error{common.ErrMissingRecordID},
+		},
+		{
+			name:  "Mime response header expected",
+			input: common.DeleteParams{ObjectName: "quotes", RecordId: "019097b8-a5f4-ca93-62c5-5a25c58afa63"},
+			server: httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+				w.WriteHeader(http.StatusTeapot)
+			})),
+			expectedErrs: []error{interpreter.ErrMissingContentType},
+		},
+		{
+			name:  "Successful delete",
+			input: common.DeleteParams{ObjectName: "quotes", RecordId: "019097b8-a5f4-ca93-62c5-5a25c58afa63"},
+			server: httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+				w.Header().Set("Content-Type", "application/json")
+				mockutils.RespondToMethod(w, r, "DELETE", func() {
+					w.WriteHeader(http.StatusOK)
+					// response body is ignored by connector implementation
+					// but this serves as documentation as response
+					_, _ = w.Write(responseRemoveNote)
+				})
+			})),
+			expected:     &common.DeleteResult{Success: true},
+			expectedErrs: nil,
+		},
+	}
+
+	for _, tt := range tests { // nolint:dupl
+		// nolint:varnamelen
+		tt := tt // rebind, omit loop side effects for parallel goroutine
+		t.Run(tt.name, func(t *testing.T) {
+			t.Parallel()
+
+			defer tt.server.Close()
+
+			ctx := context.Background()
+
+			connector, err := NewConnector(
+				WithAuthenticatedClient(http.DefaultClient),
+				WithWorkspace("test-workspace"),
+			)
+			if err != nil {
+				t.Fatalf("%s: error in test while constructing connector %v", tt.name, err)
+			}
+
+			// for testing we want to redirect calls to our server
+			connector.setBaseURL(tt.server.URL)
+
+			// start of tests
+			output, err := connector.Delete(ctx, tt.input)
+			if len(tt.expectedErrs) == 0 && err != nil {
+				t.Fatalf("%s: expected no errors, got: (%v)", tt.name, err)
+			}
+
+			if len(tt.expectedErrs) != 0 && err == nil {
+				t.Fatalf("%s: expected errors (%v), but got nothing", tt.name, tt.expectedErrs)
+			}
+
+			for _, expectedErr := range tt.expectedErrs {
+				if !errors.Is(err, expectedErr) && !strings.Contains(err.Error(), expectedErr.Error()) {
+					t.Fatalf("%s: expected Error: (%v), got: (%v)", tt.name, expectedErr, err)
+				}
+			}
+
+			if !reflect.DeepEqual(output, tt.expected) {
+				diff := deep.Equal(output, tt.expected)
+				t.Fatalf("%s:, \nexpected: (%v), \ngot: (%v), \ndiff: (%v)", tt.name, tt.expected, output, diff)
+			}
+		})
+	}
+}
diff --git a/pipeliner/read_test.go b/pipeliner/read_test.go
new file mode 100644
index 00000000..706e00ea
--- /dev/null
+++ b/pipeliner/read_test.go
@@ -0,0 +1,232 @@
+package pipeliner
+
+import (
+	"context"
+	"errors"
+	"net/http"
+	"net/http/httptest"
+	"reflect"
+	"strings"
+	"testing"
+
+	"github.com/amp-labs/connectors/common"
+	"github.com/amp-labs/connectors/common/interpreter"
+	"github.com/amp-labs/connectors/common/jsonquery"
+	"github.com/amp-labs/connectors/test/utils/mockutils"
+	"github.com/amp-labs/connectors/test/utils/testutils"
+	"github.com/go-test/deep"
+)
+
+func TestRead(t *testing.T) { //nolint:funlen,gocognit,cyclop,maintidx
+	t.Parallel()
+
+	responseNotFound := testutils.DataFromFile(t, "resource-not-found.json")
+	responseProfilesFirstPage := testutils.DataFromFile(t, "read-profiles-1-first-page.json")
+	responseProfilesSecondPage := testutils.DataFromFile(t, "read-profiles-2-second-page.json")
+	responseProfilesLastPage := testutils.DataFromFile(t, "read-profiles-3-last-page.json")
+
+	tests := []struct {
+		name         string
+		input        common.ReadParams
+		server       *httptest.Server
+		connector    Connector
+		comparator   func(serverURL string, actual, expected *common.ReadResult) bool // custom comparison
+		expected     *common.ReadResult
+		expectedErrs []error
+	}{
+		{
+			name: "Mime response header expected",
+			server: httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+				w.WriteHeader(http.StatusTeapot)
+			})),
+			expectedErrs: []error{interpreter.ErrMissingContentType},
+		},
+		{
+			name:  "Correct error message is understood from JSON response",
+			input: common.ReadParams{ObjectName: "articles"},
+			server: httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+				w.Header().Set("Content-Type", "application/json")
+				w.WriteHeader(http.StatusNotFound)
+				_, _ = w.Write(responseNotFound)
+			})),
+			expectedErrs: []error{
+				common.ErrBadRequest,
+				errors.New("The requested URL was not found on the server"), // nolint:goerr113
+			},
+		},
+		{
+			name: "Incorrect key in payload",
+			server: httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+				w.Header().Set("Content-Type", "application/json")
+				w.WriteHeader(http.StatusOK)
+				mockutils.WriteBody(w, `{
+					"garbage": {}
+				}`)
+			})),
+			expectedErrs: []error{jsonquery.ErrKeyNotFound},
+		},
+		{
+			name: "Incorrect data type in payload",
+			server: httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+				w.Header().Set("Content-Type", "application/json")
+				w.WriteHeader(http.StatusOK)
+				mockutils.WriteBody(w, `{
+					"data": {}
+				}`)
+			})),
+			expectedErrs: []error{jsonquery.ErrNotArray},
+		},
+		{
+			name: "Next page cursor may be missing in payload",
+			server: httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+				w.Header().Set("Content-Type", "application/json")
+				w.WriteHeader(http.StatusOK)
+				mockutils.WriteBody(w, `
+				{
+				  "success": true,
+				  "total": 0,
+				  "data": []
+				}`)
+			})),
+			expected: &common.ReadResult{
+				Data: []common.ReadResultRow{},
+				Done: true,
+			},
+			expectedErrs: nil,
+		},
+		{
+			name: "Next page URL is inferred, when provided with an object",
+			server: httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+				w.Header().Set("Content-Type", "application/json")
+				w.WriteHeader(http.StatusOK)
+				_, _ = w.Write(responseProfilesFirstPage)
+			})),
+			comparator: func(baseURL string, actual, expected *common.ReadResult) bool {
+				return actual.NextPage.String() == expected.NextPage.String() // nolint:nlreturn
+			},
+			expected: &common.ReadResult{
+				NextPage: "WyIwMDAwMDAwMC0wMDAwLTAwMDEtMDAwMS0wMDAwMDAwMDhlOTciXQ==",
+			},
+			expectedErrs: nil,
+		},
+		{
+			name: "Next page URL is empty, when provided with null object",
+			server: httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+				w.Header().Set("Content-Type", "application/json")
+				w.WriteHeader(http.StatusOK)
+				_, _ = w.Write(responseProfilesLastPage)
+			})),
+			comparator: func(baseURL string, actual, expected *common.ReadResult) bool {
+				return actual.NextPage.String() == expected.NextPage.String() &&
+					actual.Done == expected.Done
+			},
+			expected:     &common.ReadResult{NextPage: "", Done: true},
+			expectedErrs: nil,
+		},
+		{
+			name: "Successful read with chosen fields",
+			input: common.ReadParams{
+				Fields: []string{"name", "owner_id"},
+			},
+			server: httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+				w.Header().Set("Content-Type", "application/json")
+				w.WriteHeader(http.StatusOK)
+				_, _ = w.Write(responseProfilesSecondPage)
+			})),
+			comparator: func(baseURL string, actual, expected *common.ReadResult) bool {
+				// custom comparison focuses on subset of fields to keep the test short
+				return mockutils.ReadResultComparator.SubsetFields(actual, expected) &&
+					mockutils.ReadResultComparator.SubsetRaw(actual, expected) &&
+					actual.NextPage.String() == expected.NextPage.String() &&
+					actual.Done == expected.Done
+			},
+			expected: &common.ReadResult{
+				Data: []common.ReadResultRow{{
+					Fields: map[string]any{
+						"name":     "Lang_DefaultProfileAllUsers",
+						"owner_id": "00000000-0000-0000-0000-000000008e97",
+					},
+					Raw: map[string]any{
+						"name":       "Lang_DefaultProfileAllUsers",
+						"owner_id":   "00000000-0000-0000-0000-000000008e97",
+						"use_lang":   true,
+						"entity":     float64(3),
+						"is_deleted": false,
+					},
+				}, {
+					Fields: map[string]any{
+						"name":     "Lang_DefaultProfileMy",
+						"owner_id": "00000000-0000-0000-0000-000000008e97",
+					},
+					Raw: map[string]any{
+						"name":       "Lang_DefaultProfileMy",
+						"owner_id":   "00000000-0000-0000-0000-000000008e97",
+						"use_lang":   true,
+						"entity":     float64(3),
+						"is_deleted": false,
+					},
+				}},
+				NextPage: "WyIwMDAwMDAwMC0wMDAwLTAwMDMtMDAwMS0wMDAwMDAwMDhlOTciXQ==",
+				Done:     false,
+			},
+			expectedErrs: nil,
+		},
+	}
+
+	for _, tt := range tests {
+		// nolint:varnamelen
+		tt := tt // rebind, omit loop side effects for parallel goroutine
+		t.Run(tt.name, func(t *testing.T) {
+			t.Parallel()
+
+			defer tt.server.Close()
+
+			ctx := context.Background()
+
+			connector, err := NewConnector(
+				WithAuthenticatedClient(http.DefaultClient),
+				WithWorkspace("test-workspace"),
+			)
+			if err != nil {
+				t.Fatalf("%s: error in test while constructing connector %v", tt.name, err)
+			}
+
+			// for testing we want to redirect calls to our mock server
+			connector.setBaseURL(tt.server.URL)
+
+			// start of tests
+			output, err := connector.Read(ctx, tt.input)
+			if err != nil {
+				if len(tt.expectedErrs) == 0 {
+					t.Fatalf("%s: expected no errors, got: (%v)", tt.name, err)
+				}
+			} else {
+				// check that missing error is what is expected
+				if len(tt.expectedErrs) != 0 {
+					t.Fatalf("%s: expected errors (%v), but got nothing", tt.name, tt.expectedErrs)
+				}
+			}
+
+			// check every error
+			for _, expectedErr := range tt.expectedErrs {
+				if !errors.Is(err, expectedErr) && !strings.Contains(err.Error(), expectedErr.Error()) {
+					t.Fatalf("%s: expected Error: (%v), got: (%v)", tt.name, expectedErr, err)
+				}
+			}
+
+			// compare desired output
+			var ok bool
+			if tt.comparator == nil {
+				// default comparison is concerned about all fields
+				ok = reflect.DeepEqual(output, tt.expected)
+			} else {
+				ok = tt.comparator(tt.server.URL, output, tt.expected)
+			}
+
+			if !ok {
+				diff := deep.Equal(output, tt.expected)
+				t.Fatalf("%s:, \nexpected: (%v), \ngot: (%v), \ndiff: (%v)", tt.name, tt.expected, output, diff)
+			}
+		})
+	}
+}
diff --git a/pipeliner/test/create-entity-validation.json b/pipeliner/test/create-entity-validation.json
new file mode 100644
index 00000000..6242af88
--- /dev/null
+++ b/pipeliner/test/create-entity-validation.json
@@ -0,0 +1,42 @@
+{
+  "code": 40000,
+  "name": "ERROR_ENTITY_VALIDATION",
+  "message": "\nNon-null field 'Note'[01909781-5963-26bc-28ff-747e10a79a52].owner' is null or empty.\nNon-null field 'note' is null or empty.\nNon-null field 'Note'[01909781-5963-26bc-28ff-747e10a79a52].owner_id' is null or empty.",
+  "entity_id": "01909781-5963-26bc-28ff-747e10a79a52",
+  "entity_name": "Note",
+  "entity_errors": [
+    {
+      "code": 119,
+      "name": "ERROR_PARAMETER_MISSING",
+      "message": "Non-null field 'note' is null or empty."
+    }
+  ],
+  "field_errors": [
+    {
+      "field_id": "200398aa-3921-0557-9bda-bb8f3e529a57",
+      "field_name": "owner_id",
+      "name": "ERROR_FIELD_VALIDATION",
+      "code": 40002,
+      "errors": [
+        {
+          "code": 119,
+          "name": "ERROR_PARAMETER_MISSING",
+          "message": "Non-null field 'Note'[01909781-5963-26bc-28ff-747e10a79a52].owner' is null or empty.",
+          "field_id": "200398aa-3921-0557-9bda-bb8f3e529a57",
+          "field_name": "owner_id"
+        },
+        {
+          "code": 119,
+          "name": "ERROR_PARAMETER_MISSING",
+          "message": "Non-null field 'Note'[01909781-5963-26bc-28ff-747e10a79a52].owner_id' is null or empty.",
+          "field_id": "200398aa-3921-0557-9bda-bb8f3e529a57",
+          "field_name": "owner_id"
+        }
+      ]
+    }
+  ],
+  "step_checklist_errors": [],
+  "entity_index": null,
+  "http_status": 422,
+  "success": false
+}
diff --git a/pipeliner/test/create-invalid-body.json b/pipeliner/test/create-invalid-body.json
new file mode 100644
index 00000000..04337e7d
--- /dev/null
+++ b/pipeliner/test/create-invalid-body.json
@@ -0,0 +1,7 @@
+{
+  "code": 117,
+  "name": "ERROR_PARAMETER_INVALID",
+  "message": "Missing or invalid JSON data.",
+  "http_status": 400,
+  "success": false
+}
diff --git a/pipeliner/test/create-note.json b/pipeliner/test/create-note.json
new file mode 100644
index 00000000..26ceeb97
--- /dev/null
+++ b/pipeliner/test/create-note.json
@@ -0,0 +1,27 @@
+{
+  "success": true,
+  "data": {
+    "is_delete_protected": false,
+    "id": "0190978c-d6d1-de35-3f6d-7cf0a0e264db",
+    "is_deleted": false,
+    "modified": "2024-07-09 12:51:48.050073+00:00",
+    "created": "2024-07-09 12:51:48.050108+00:00",
+    "account": null,
+    "contact": "https://eu-central.api.pipelinersales.com/api/v100/rest/spaces/fr_Myself/entities/Contacts/0a31d4fd-1289-4326-ad1a-7dfa40c3ab48",
+    "custom_entity": null,
+    "lead": null,
+    "oppty": null,
+    "owner": "https://eu-central.api.pipelinersales.com/api/v100/rest/spaces/fr_Myself/entities/Clients/00000000-0000-0000-0000-000000008e97",
+    "project": null,
+    "quote": null,
+    "account_id": null,
+    "contact_id": "0a31d4fd-1289-4326-ad1a-7dfa40c3ab48",
+    "custom_entity_id": null,
+    "lead_oppty_id": null,
+    "note": "important issue to resolve due 19th of July",
+    "owner_id": "00000000-0000-0000-0000-000000008e97",
+    "project_id": null,
+    "quote_id": null,
+    "revision": 1791
+  }
+}
diff --git a/pipeliner/test/delete-note.json b/pipeliner/test/delete-note.json
new file mode 100644
index 00000000..2e99caf6
--- /dev/null
+++ b/pipeliner/test/delete-note.json
@@ -0,0 +1,4 @@
+{
+  "success": true,
+  "data": "0190978c-d6d1-de35-3f6d-7cf0a0e264db"
+}
diff --git a/pipeliner/test/read-profiles-1-first-page.json b/pipeliner/test/read-profiles-1-first-page.json
new file mode 100644
index 00000000..5f4e0eb0
--- /dev/null
+++ b/pipeliner/test/read-profiles-1-first-page.json
@@ -0,0 +1,217 @@
+{
+  "success": true,
+  "total": 42,
+  "page_info": {
+    "start_cursor": "WyIwMDAwMDAwMC0wMDAwLTAwMDEtMDAwMC0wMDAwMDAwMDhlOTciXQ==",
+    "end_cursor": "WyIwMDAwMDAwMC0wMDAwLTAwMDEtMDAwMS0wMDAwMDAwMDhlOTciXQ==",
+    "has_previous_page": false,
+    "has_next_page": true
+  },
+  "data": [
+    {
+      "is_delete_protected": false,
+      "id": "00000000-0000-0001-0000-000000008e97",
+      "is_deleted": false,
+      "modified": "2023-03-23 14:20:54.529536+00:00",
+      "created": "2018-09-05 11:33:14.913457+00:00",
+      "owner": "https://eu-central.api.pipelinersales.com/api/v100/rest/spaces/fr_Myself/entities/Clients/00000000-0000-0000-0000-000000008e97",
+      "entity": 1,
+      "entity_api_name": null,
+      "name": "Lang_DefaultProfileAllUsers",
+      "owner_id": "00000000-0000-0000-0000-000000008e97",
+      "settings": {
+        "role": {
+          "show_my_items": true,
+          "show_my_shared_items": true,
+          "show_managing_unit_items": true
+        },
+        "view": {
+          "sort_by": "992f3eee-2bb5-0118-a9f4-2f20a9e9c908",
+          "group_by": "Account",
+          "sort_order": "Asc",
+          "grid_columns": [
+            {
+              "width": 1.12,
+              "frozen": true,
+              "pixels": false,
+              "field_id": "992f3eee-2bb5-0118-a9f4-2f20a9e9c908"
+            },
+            {
+              "width": 0.4,
+              "frozen": false,
+              "pixels": false,
+              "field_id": "3cb37831-f5ec-0346-7320-ce274046c16a"
+            },
+            {
+              "width": 1.12,
+              "frozen": false,
+              "pixels": false,
+              "field_id": "02626789-b040-011d-2257-c76ca967c633"
+            },
+            {
+              "width": 1.12,
+              "frozen": false,
+              "pixels": false,
+              "field_id": "80037c9c-d34a-0a26-88c7-b2c146634db1"
+            },
+            {
+              "width": 1.12,
+              "frozen": false,
+              "pixels": false,
+              "field_id": "6cd0d888-60cd-0917-ad07-7a2f23dfbea0"
+            },
+            {
+              "width": 1.12,
+              "frozen": false,
+              "pixels": false,
+              "field_id": "7fe1cd99-9698-091f-7a8f-8930ccb559d4"
+            }
+          ],
+          "show_card_value": true,
+          "show_card_labels": true,
+          "show_card_fitness": true,
+          "show_card_ranking": true,
+          "show_card_velocity": true,
+          "show_excluded_items": true,
+          "show_outside_target": true,
+          "show_unassigned_lead": true,
+          "bubble_chart_size_calculated_by": "UnweightedValue"
+        },
+        "filter": {
+          "operator": "And",
+          "is_custom": false,
+          "is_enabled": false,
+          "filter_main_box": {
+            "id": "4fd24d74-1e2b-4bd1-b6ba-6c8a4f895bb5",
+            "entity": "LeadOppty",
+            "filter_fields": []
+          },
+          "filter_sibling_boxes": []
+        },
+        "target": {
+          "goal": 1000000.0,
+          "target_source": "All",
+          "target_definition": null,
+          "target_value_type": "Weighted",
+          "show_target_on_top": true,
+          "target_period_compare": {
+            "period": "PreviousYear",
+            "period_custom_to": null,
+            "period_custom_from": null
+          },
+          "target_period_current": {
+            "period": "YearCurrent",
+            "period_custom_to": null,
+            "period_custom_from": null
+          },
+          "target_value_field_id": "6da56d81-0d6b-0c3c-301e-6dded539d3b9"
+        },
+        "sales_pipeline": [
+          "98baf008-2c96-0831-cb6d-0fa7a5660225"
+        ]
+      },
+      "share_mode": 1,
+      "use_lang": true,
+      "revision": 1521,
+      "pipelines": [
+        "98baf008-2c96-0831-cb6d-0fa7a5660225"
+      ]
+    },
+    {
+      "is_delete_protected": false,
+      "id": "00000000-0000-0001-0001-000000008e97",
+      "is_deleted": false,
+      "modified": "2023-03-09 09:33:51.509445+00:00",
+      "created": "2018-09-05 11:33:14.922086+00:00",
+      "owner": "https://eu-central.api.pipelinersales.com/api/v100/rest/spaces/fr_Myself/entities/Clients/00000000-0000-0000-0000-000000008e97",
+      "entity": 1,
+      "entity_api_name": null,
+      "name": "Lang_DefaultProfileMy",
+      "owner_id": "00000000-0000-0000-0000-000000008e97",
+      "settings": {
+        "role": {
+          "show_my_items": true,
+          "show_my_shared_items": false,
+          "show_managing_unit_items": false
+        },
+        "view": {
+          "sort_by": "992f3eee-2bb5-0118-a9f4-2f20a9e9c908",
+          "group_by": "Account",
+          "sort_order": "Asc",
+          "grid_columns": [
+            {
+              "width": 1.12,
+              "frozen": true,
+              "field_id": "992f3eee-2bb5-0118-a9f4-2f20a9e9c908"
+            },
+            {
+              "width": 0.4,
+              "field_id": "3cb37831-f5ec-0346-7320-ce274046c16a"
+            },
+            {
+              "width": 1.12,
+              "field_id": "02626789-b040-011d-2257-c76ca967c633"
+            },
+            {
+              "width": 1.12,
+              "field_id": "80037c9c-d34a-0a26-88c7-b2c146634db1"
+            },
+            {
+              "width": 1.12,
+              "field_id": "6cd0d888-60cd-0917-ad07-7a2f23dfbea0"
+            },
+            {
+              "width": 1.12,
+              "field_id": "7fe1cd99-9698-091f-7a8f-8930ccb559d4"
+            }
+          ],
+          "show_card_value": true,
+          "show_card_labels": false,
+          "show_card_fitness": false,
+          "show_card_ranking": false,
+          "show_card_velocity": false,
+          "show_excluded_items": true,
+          "show_outside_target": true,
+          "show_unassigned_lead": false,
+          "bubble_chart_size_calculated_by": "UnweightedValue"
+        },
+        "filter": {
+          "operator": "And",
+          "is_custom": false,
+          "is_enabled": false,
+          "filter_main_box": {
+            "id": "48c14a2a-a991-4437-91f8-7bfad6455c8d",
+            "entity": "LeadOppty",
+            "filter_fields": []
+          },
+          "filter_sibling_boxes": []
+        },
+        "target": {
+          "goal": 0,
+          "target_source": "All",
+          "target_value_type": "Weighted",
+          "target_period_compare": {
+            "period": "PreviousYear",
+            "period_custom_to": null,
+            "period_custom_from": null
+          },
+          "target_period_current": {
+            "period": "YearCurrent",
+            "period_custom_to": null,
+            "period_custom_from": null
+          },
+          "target_value_field_id": "6da56d81-0d6b-0c3c-301e-6dded539d3b9"
+        },
+        "sales_pipeline": [
+          "98baf008-2c96-0831-cb6d-0fa7a5660225"
+        ]
+      },
+      "share_mode": 1,
+      "use_lang": true,
+      "revision": 1242,
+      "pipelines": [
+        "98baf008-2c96-0831-cb6d-0fa7a5660225"
+      ]
+    }
+  ]
+}
diff --git a/pipeliner/test/read-profiles-2-second-page.json b/pipeliner/test/read-profiles-2-second-page.json
new file mode 100644
index 00000000..742608ba
--- /dev/null
+++ b/pipeliner/test/read-profiles-2-second-page.json
@@ -0,0 +1,190 @@
+{
+  "success": true,
+  "total": 42,
+  "page_info": {
+    "start_cursor": "WyIwMDAwMDAwMC0wMDAwLTAwMDMtMDAwMC0wMDAwMDAwMDhlOTciXQ==",
+    "end_cursor": "WyIwMDAwMDAwMC0wMDAwLTAwMDMtMDAwMS0wMDAwMDAwMDhlOTciXQ==",
+    "has_previous_page": true,
+    "has_next_page": true
+  },
+  "data": [
+    {
+      "is_delete_protected": false,
+      "id": "00000000-0000-0003-0000-000000008e97",
+      "is_deleted": false,
+      "modified": "2023-03-09 09:33:51.509445+00:00",
+      "created": "2018-09-05 11:33:15.041204+00:00",
+      "owner": "https://eu-central.api.pipelinersales.com/api/v100/rest/spaces/fr_Myself/entities/Clients/00000000-0000-0000-0000-000000008e97",
+      "entity": 3,
+      "entity_api_name": null,
+      "name": "Lang_DefaultProfileAllUsers",
+      "owner_id": "00000000-0000-0000-0000-000000008e97",
+      "settings": {
+        "role": {
+          "show_my_items": true,
+          "show_my_shared_items": true,
+          "show_managing_unit_items": true
+        },
+        "view": {
+          "sort_by": "992f3eee-2bb5-0118-a9f4-2f20a9e9c908",
+          "group_by": "Account",
+          "sort_order": "Asc",
+          "grid_columns": [
+            {
+              "width": 1,
+              "frozen": true,
+              "field_id": "992f3eee-2bb5-0118-a9f4-2f20a9e9c908"
+            },
+            {
+              "width": 1,
+              "field_id": "3cb37831-f5ec-0346-7320-ce274046c16a"
+            },
+            {
+              "width": 1,
+              "field_id": "02626789-b040-011d-2257-c76ca967c633"
+            },
+            {
+              "width": 1,
+              "field_id": "80037c9c-d34a-0a26-88c7-b2c146634db1"
+            },
+            {
+              "width": 1,
+              "field_id": "6cd0d888-60cd-0917-ad07-7a2f23dfbea0"
+            },
+            {
+              "width": 1,
+              "field_id": "7fe1cd99-9698-091f-7a8f-8930ccb559d4"
+            }
+          ],
+          "show_card_value": true,
+          "show_card_labels": false,
+          "show_card_fitness": false,
+          "show_card_ranking": false
+        },
+        "filter": {
+          "operator": "And",
+          "is_custom": false,
+          "is_enabled": false,
+          "filter_main_box": {
+            "id": "5a465038-93d5-4250-a95a-78f783071f25",
+            "entity": "LeadOppty",
+            "filter_fields": []
+          },
+          "filter_sibling_boxes": []
+        },
+        "target": {
+          "target_source": "All",
+          "target_period_compare": {
+            "period": "PreviousYear",
+            "period_custom_to": null,
+            "period_custom_from": null
+          },
+          "target_period_current": {
+            "period": "YearCurrent",
+            "period_custom_to": null,
+            "period_custom_from": null
+          },
+          "target_value_field_id": "6da56d81-0d6b-0c3c-301e-6dded539d3b9"
+        },
+        "sales_pipeline": [
+          "98baf008-2c96-0831-cb6d-0fa7a5660225"
+        ]
+      },
+      "share_mode": 1,
+      "use_lang": true,
+      "revision": 1242,
+      "pipelines": [
+        "98baf008-2c96-0831-cb6d-0fa7a5660225"
+      ]
+    },
+    {
+      "is_delete_protected": false,
+      "id": "00000000-0000-0003-0001-000000008e97",
+      "is_deleted": false,
+      "modified": "2023-03-09 09:33:51.509445+00:00",
+      "created": "2018-09-05 11:33:15.057711+00:00",
+      "owner": "https://eu-central.api.pipelinersales.com/api/v100/rest/spaces/fr_Myself/entities/Clients/00000000-0000-0000-0000-000000008e97",
+      "entity": 3,
+      "entity_api_name": null,
+      "name": "Lang_DefaultProfileMy",
+      "owner_id": "00000000-0000-0000-0000-000000008e97",
+      "settings": {
+        "role": {
+          "show_my_items": true,
+          "show_my_shared_items": false,
+          "show_managing_unit_items": false
+        },
+        "view": {
+          "sort_by": "992f3eee-2bb5-0118-a9f4-2f20a9e9c908",
+          "group_by": "Account",
+          "sort_order": "Asc",
+          "grid_columns": [
+            {
+              "width": 1,
+              "frozen": true,
+              "field_id": "992f3eee-2bb5-0118-a9f4-2f20a9e9c908"
+            },
+            {
+              "width": 1,
+              "field_id": "3cb37831-f5ec-0346-7320-ce274046c16a"
+            },
+            {
+              "width": 1,
+              "field_id": "02626789-b040-011d-2257-c76ca967c633"
+            },
+            {
+              "width": 1,
+              "field_id": "80037c9c-d34a-0a26-88c7-b2c146634db1"
+            },
+            {
+              "width": 1,
+              "field_id": "6cd0d888-60cd-0917-ad07-7a2f23dfbea0"
+            },
+            {
+              "width": 1,
+              "field_id": "7fe1cd99-9698-091f-7a8f-8930ccb559d4"
+            }
+          ],
+          "show_card_value": true,
+          "show_card_labels": false,
+          "show_card_fitness": false,
+          "show_card_ranking": false
+        },
+        "filter": {
+          "operator": "And",
+          "is_custom": false,
+          "is_enabled": false,
+          "filter_main_box": {
+            "id": "ece55745-2a91-435e-bd2a-d05eb02473cb",
+            "entity": "LeadOppty",
+            "filter_fields": []
+          },
+          "filter_sibling_boxes": []
+        },
+        "target": {
+          "target_source": "All",
+          "target_period_compare": {
+            "period": "PreviousYear",
+            "period_custom_to": null,
+            "period_custom_from": null
+          },
+          "target_period_current": {
+            "period": "YearCurrent",
+            "period_custom_to": null,
+            "period_custom_from": null
+          },
+          "target_value_field_id": "6da56d81-0d6b-0c3c-301e-6dded539d3b9"
+        },
+        "sales_pipeline": [
+          "98baf008-2c96-0831-cb6d-0fa7a5660225"
+        ]
+      },
+      "share_mode": 1,
+      "use_lang": true,
+      "revision": 1242,
+      "pipelines": [
+        "98baf008-2c96-0831-cb6d-0fa7a5660225"
+      ]
+    }
+  ]
+}
diff --git a/pipeliner/test/read-profiles-3-last-page.json b/pipeliner/test/read-profiles-3-last-page.json
new file mode 100644
index 00000000..5d16bde6
--- /dev/null
+++ b/pipeliner/test/read-profiles-3-last-page.json
@@ -0,0 +1,11 @@
+{
+  "success": true,
+  "total": 42,
+  "page_info": {
+    "start_cursor": null,
+    "end_cursor": null,
+    "has_previous_page": false,
+    "has_next_page": false
+  },
+  "data": []
+}
diff --git a/pipeliner/test/resource-not-found.json b/pipeliner/test/resource-not-found.json
new file mode 100644
index 00000000..9e2020c7
--- /dev/null
+++ b/pipeliner/test/resource-not-found.json
@@ -0,0 +1,6 @@
+{
+  "status": 404,
+  "message": "The requested URL was not found on the server. If you entered the URL manually please check your spelling and try again.",
+  "errorcode": null,
+  "traceback": null
+}
diff --git a/pipeliner/test/unknown-entity.json b/pipeliner/test/unknown-entity.json
new file mode 100644
index 00000000..c899edba
--- /dev/null
+++ b/pipeliner/test/unknown-entity.json
@@ -0,0 +1,7 @@
+{
+  "code": 2006,
+  "name": "ERROR_UNKNOWN_TYPE",
+  "message": "cannot determine entity type from Contact",
+  "http_status": 404,
+  "success": false
+}
diff --git a/pipeliner/test/update-note.json b/pipeliner/test/update-note.json
new file mode 100644
index 00000000..173e1138
--- /dev/null
+++ b/pipeliner/test/update-note.json
@@ -0,0 +1,27 @@
+{
+  "success": true,
+  "data": {
+    "is_delete_protected": false,
+    "id": "0190978c-d6d1-de35-3f6d-7cf0a0e264db",
+    "is_deleted": false,
+    "modified": "2024-07-09 12:52:46.570569+00:00",
+    "created": "2024-07-09 12:51:48.050108+00:00",
+    "account": null,
+    "contact": "https://eu-central.api.pipelinersales.com/api/v100/rest/spaces/fr_Myself/entities/Contacts/0a31d4fd-1289-4326-ad1a-7dfa40c3ab48",
+    "custom_entity": null,
+    "lead": null,
+    "oppty": null,
+    "owner": "https://eu-central.api.pipelinersales.com/api/v100/rest/spaces/fr_Myself/entities/Clients/00000000-0000-0000-0000-000000008e97",
+    "project": null,
+    "quote": null,
+    "account_id": null,
+    "contact_id": "0a31d4fd-1289-4326-ad1a-7dfa40c3ab48",
+    "custom_entity_id": null,
+    "lead_oppty_id": null,
+    "note": "Task due 19th of July",
+    "owner_id": "00000000-0000-0000-0000-000000008e97",
+    "project_id": null,
+    "quote_id": null,
+    "revision": 1794
+  }
+}
diff --git a/pipeliner/write_test.go b/pipeliner/write_test.go
new file mode 100644
index 00000000..476e6af0
--- /dev/null
+++ b/pipeliner/write_test.go
@@ -0,0 +1,207 @@
+package pipeliner
+
+import (
+	"context"
+	"errors"
+	"net/http"
+	"net/http/httptest"
+	"reflect"
+	"strings"
+	"testing"
+
+	"github.com/amp-labs/connectors/common"
+	"github.com/amp-labs/connectors/common/interpreter"
+	"github.com/amp-labs/connectors/test/utils/mockutils"
+	"github.com/amp-labs/connectors/test/utils/testutils"
+	"github.com/go-test/deep"
+)
+
+func TestWrite(t *testing.T) { // nolint:funlen,cyclop
+	t.Parallel()
+
+	responseCreateFailedValidation := testutils.DataFromFile(t, "create-entity-validation.json")
+	responseCreateInvalidBody := testutils.DataFromFile(t, "create-invalid-body.json")
+	responseCreateNote := testutils.DataFromFile(t, "create-note.json")
+	responseUpdateNote := testutils.DataFromFile(t, "update-note.json")
+
+	tests := []struct {
+		name         string
+		input        common.WriteParams
+		server       *httptest.Server
+		connector    Connector
+		comparator   func(actual, expected *common.WriteResult) bool // custom comparison
+		expected     *common.WriteResult
+		expectedErrs []error
+	}{
+		{
+			name: "Write object must be included",
+			server: httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+				w.WriteHeader(http.StatusTeapot)
+			})),
+			expectedErrs: []error{common.ErrMissingObjects},
+		},
+		{
+			name:  "Mime response header expected",
+			input: common.WriteParams{ObjectName: "notes"},
+			server: httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+				w.WriteHeader(http.StatusTeapot)
+			})),
+			expectedErrs: []error{interpreter.ErrMissingContentType},
+		},
+		{
+			name:  "Error on failed entity validation",
+			input: common.WriteParams{ObjectName: "notes", RecordId: "019097b8-a5f4-ca93-62c5-5a25c58afa63"},
+			server: httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+				w.Header().Set("Content-Type", "application/json")
+				w.WriteHeader(http.StatusUnprocessableEntity)
+				_, _ = w.Write(responseCreateFailedValidation)
+			})),
+			expectedErrs: []error{
+				common.ErrBadRequest,
+				errors.New( // nolint:goerr113
+					"Non-null field 'Note'[01909781-5963-26bc-28ff-747e10a79a52].owner' is null or empty.",
+				),
+			},
+		},
+		{
+			name:  "Error on invalid json body",
+			input: common.WriteParams{ObjectName: "notes", RecordId: "019097b8-a5f4-ca93-62c5-5a25c58afa63"},
+			server: httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+				w.Header().Set("Content-Type", "application/json")
+				w.WriteHeader(http.StatusBadRequest)
+				_, _ = w.Write(responseCreateInvalidBody)
+			})),
+			expectedErrs: []error{
+				common.ErrBadRequest,
+				errors.New("Missing or invalid JSON data."), // nolint:goerr113
+			},
+		},
+		{
+			name:  "Write must act as a Create",
+			input: common.WriteParams{ObjectName: "notes"},
+			server: httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+				w.Header().Set("Content-Type", "application/json")
+				mockutils.RespondToMethod(w, r, "POST", func() {
+					w.WriteHeader(http.StatusOK)
+				})
+			})),
+			expected:     &common.WriteResult{Success: true},
+			expectedErrs: nil,
+		},
+		{
+			name:  "Write must act as an Update",
+			input: common.WriteParams{ObjectName: "notes", RecordId: "019097b8-a5f4-ca93-62c5-5a25c58afa63"},
+			server: httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+				w.Header().Set("Content-Type", "application/json")
+				mockutils.RespondToMethod(w, r, "PATCH", func() {
+					w.WriteHeader(http.StatusOK)
+				})
+			})),
+			expected:     &common.WriteResult{Success: true},
+			expectedErrs: nil,
+		},
+		{
+			name:  "Valid creation of a note",
+			input: common.WriteParams{ObjectName: "notes"},
+			server: httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+				w.Header().Set("Content-Type", "application/json")
+				mockutils.RespondToMethod(w, r, "POST", func() {
+					w.WriteHeader(http.StatusOK)
+					_, _ = w.Write(responseCreateNote)
+				})
+			})),
+			comparator: func(actual, expected *common.WriteResult) bool {
+				return mockutils.WriteResultComparator.SubsetData(actual, expected)
+			},
+			expected: &common.WriteResult{
+				Success:  true,
+				RecordId: "0190978c-d6d1-de35-3f6d-7cf0a0e264db",
+				Errors:   nil,
+				Data: map[string]any{
+					"id":         "0190978c-d6d1-de35-3f6d-7cf0a0e264db",
+					"contact_id": "0a31d4fd-1289-4326-ad1a-7dfa40c3ab48",
+					"note":       "important issue to resolve due 19th of July",
+				},
+			},
+			expectedErrs: nil,
+		},
+		{
+			name:  "Valid update of a note",
+			input: common.WriteParams{ObjectName: "notes", RecordId: "019097b8-a5f4-ca93-62c5-5a25c58afa63"},
+			server: httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+				w.Header().Set("Content-Type", "application/json")
+				mockutils.RespondToMethod(w, r, "PATCH", func() {
+					w.WriteHeader(http.StatusOK)
+					_, _ = w.Write(responseUpdateNote)
+				})
+			})),
+			comparator: func(actual, expected *common.WriteResult) bool {
+				return mockutils.WriteResultComparator.SubsetData(actual, expected)
+			},
+			expected: &common.WriteResult{
+				Success:  true,
+				RecordId: "0190978c-d6d1-de35-3f6d-7cf0a0e264db",
+				Errors:   nil,
+				Data: map[string]any{
+					"id":         "0190978c-d6d1-de35-3f6d-7cf0a0e264db",
+					"contact_id": "0a31d4fd-1289-4326-ad1a-7dfa40c3ab48",
+					"note":       "Task due 19th of July",
+				},
+			},
+			expectedErrs: nil,
+		},
+	}
+
+	for _, tt := range tests { // nolint:dupl
+		// nolint:varnamelen
+		tt := tt // rebind, omit loop side effects for parallel goroutine
+		t.Run(tt.name, func(t *testing.T) {
+			t.Parallel()
+
+			defer tt.server.Close()
+
+			ctx := context.Background()
+
+			connector, err := NewConnector(
+				WithAuthenticatedClient(http.DefaultClient),
+				WithWorkspace("test-workspace"),
+			)
+			if err != nil {
+				t.Fatalf("%s: error in test while constructing connector %v", tt.name, err)
+			}
+
+			// for testing we want to redirect calls to our server
+			connector.setBaseURL(tt.server.URL)
+
+			// start of tests
+			output, err := connector.Write(ctx, tt.input)
+			if len(tt.expectedErrs) == 0 && err != nil {
+				t.Fatalf("%s: expected no errors, got: (%v)", tt.name, err)
+			}
+
+			if len(tt.expectedErrs) != 0 && err == nil {
+				t.Fatalf("%s: expected errors (%v), but got nothing", tt.name, tt.expectedErrs)
+			}
+
+			for _, expectedErr := range tt.expectedErrs {
+				if !errors.Is(err, expectedErr) && !strings.Contains(err.Error(), expectedErr.Error()) {
+					t.Fatalf("%s: expected Error: (%v), got: (%v)", tt.name, expectedErr, err)
+				}
+			}
+
+			// compare desired output
+			var ok bool
+			if tt.comparator == nil {
+				// default comparison is concerned about all fields
+				ok = reflect.DeepEqual(output, tt.expected)
+			} else {
+				ok = tt.comparator(output, tt.expected)
+			}
+
+			if !ok {
+				diff := deep.Equal(output, tt.expected)
+				t.Fatalf("%s:, \nexpected: (%v), \ngot: (%v), \ndiff: (%v)", tt.name, tt.expected, output, diff)
+			}
+		})
+	}
+}
diff --git a/test/dynamicscrm/write-delete/main.go b/test/dynamicscrm/write-delete/main.go
index 03ac1df1..f9df4574 100644
--- a/test/dynamicscrm/write-delete/main.go
+++ b/test/dynamicscrm/write-delete/main.go
@@ -7,6 +7,7 @@ import (
 	"syscall"
 
 	"github.com/amp-labs/connectors/common"
+	"github.com/amp-labs/connectors/common/handy"
 	"github.com/amp-labs/connectors/dynamicscrm"
 	connTest "github.com/amp-labs/connectors/test/dynamicscrm"
 	"github.com/amp-labs/connectors/test/utils"
@@ -61,8 +62,8 @@ func main() {
 	leadID := fmt.Sprintf("%v", lead["leadid"])
 	fmt.Println("Updating some lead properties")
 	updateLead(ctx, conn, leadID, &LeadUploadPayload{
-		LastName:  mockutils.Pointers.Str(""),
-		FirstName: mockutils.Pointers.Str("Squidward"),
+		LastName:  handy.Pointers.Str(""),
+		FirstName: handy.Pointers.Str("Squidward"),
 	})
 	fmt.Println("View that lead has changed accordingly")
 
diff --git a/test/pipeliner/connector.go b/test/pipeliner/connector.go
new file mode 100644
index 00000000..e8c2d0e4
--- /dev/null
+++ b/test/pipeliner/connector.go
@@ -0,0 +1,29 @@
+package pipeliner
+
+import (
+	"context"
+	"net/http"
+
+	"github.com/amp-labs/connectors/common/scanning/credscanning"
+	"github.com/amp-labs/connectors/pipeliner"
+	"github.com/amp-labs/connectors/providers"
+	"github.com/amp-labs/connectors/test/utils"
+)
+
+func GetPipelinerConnector(ctx context.Context) *pipeliner.Connector {
+	filePath := credscanning.LoadPath(providers.Pipeliner)
+	reader := utils.MustCreateProvCredJSON(filePath, false, true)
+
+	conn, err := pipeliner.NewConnector(
+		pipeliner.WithClient(ctx, http.DefaultClient,
+			reader.Get(credscanning.Fields.Username),
+			reader.Get(credscanning.Fields.Password),
+		),
+		pipeliner.WithWorkspace(reader.Get(credscanning.Fields.Workspace)),
+	)
+	if err != nil {
+		utils.Fail("error creating connector", "error", err)
+	}
+
+	return conn
+}
diff --git a/test/pipeliner/read/main.go b/test/pipeliner/read/main.go
new file mode 100644
index 00000000..f82251c6
--- /dev/null
+++ b/test/pipeliner/read/main.go
@@ -0,0 +1,47 @@
+package main
+
+import (
+	"context"
+	"fmt"
+	"os"
+	"os/signal"
+	"syscall"
+
+	"github.com/amp-labs/connectors/common"
+	"github.com/amp-labs/connectors/pipeliner"
+	connTest "github.com/amp-labs/connectors/test/pipeliner"
+	"github.com/amp-labs/connectors/test/utils"
+)
+
+var (
+	objectName = "Contacts" // nolint: gochecknoglobals
+)
+
+func main() {
+	// Handle Ctrl-C gracefully.
+	ctx, done := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM)
+	defer done()
+
+	// Set up slog logging.
+	utils.SetupLogging()
+
+	conn := connTest.GetPipelinerConnector(ctx)
+	defer utils.Close(conn)
+
+	res, err := conn.Read(ctx, common.ReadParams{
+		ObjectName: objectName,
+		Fields: []string{
+			"id", "formatted_name", "account_position",
+		},
+	})
+	if err != nil {
+		utils.Fail("error reading from Pipeliner", "error", err)
+	}
+
+	fmt.Println("Reading Contacts..")
+	utils.DumpJSON(res, os.Stdout)
+
+	if res.Rows > pipeliner.DefaultPageSize {
+		utils.Fail(fmt.Sprintf("expected max %v rows", pipeliner.DefaultPageSize))
+	}
+}
diff --git a/test/pipeliner/write-delete/main.go b/test/pipeliner/write-delete/main.go
new file mode 100644
index 00000000..3b51eac7
--- /dev/null
+++ b/test/pipeliner/write-delete/main.go
@@ -0,0 +1,174 @@
+package main
+
+import (
+	"context"
+	"fmt"
+	"os/signal"
+	"syscall"
+
+	"github.com/amp-labs/connectors/common"
+	"github.com/amp-labs/connectors/pipeliner"
+	connTest "github.com/amp-labs/connectors/test/pipeliner"
+	"github.com/amp-labs/connectors/test/utils"
+	"github.com/amp-labs/connectors/test/utils/mockutils"
+)
+
+type NotesPayload struct {
+	Note      string `json:"note"`
+	OwnerId   string `json:"owner_id"`
+	ContactId string `json:"contact_id"`
+}
+
+var (
+	objectName = "Notes" // nolint: gochecknoglobals
+)
+
+func main() {
+	// Handle Ctrl-C gracefully.
+	ctx, done := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM)
+	defer done()
+
+	// Set up slog logging.
+	utils.SetupLogging()
+
+	conn := connTest.GetPipelinerConnector(ctx)
+	defer utils.Close(conn)
+
+	fmt.Println("> TEST Create/Update/Delete Notes")
+	fmt.Println("Creating Notes")
+
+	ownerID := getFirstObjectID(ctx, conn, "Clients")
+	contactID := getFirstObjectID(ctx, conn, "Contacts")
+	view := createNotes(ctx, conn, &NotesPayload{
+		Note:      "important issue to resolve due 19th of July",
+		OwnerId:   ownerID,
+		ContactId: contactID,
+	})
+
+	fmt.Println("Updating some Notes properties")
+	updateNotes(ctx, conn, view.RecordId, &NotesPayload{
+		Note:      "Task due 19th of July",
+		OwnerId:   ownerID,
+		ContactId: contactID,
+	})
+
+	fmt.Println("View that Notes has changed accordingly")
+
+	res := readNotes(ctx, conn)
+
+	updatedView := searchNotes(res, "id", view.RecordId)
+	for k, v := range map[string]string{
+		"note":       "Task due 19th of July",
+		"owner_id":   ownerID,
+		"contact_id": contactID,
+	} {
+		if !mockutils.DoesObjectCorrespondToString(updatedView[k], v) {
+			utils.Fail("error updated properties do not match", k, v, updatedView[k])
+		}
+	}
+
+	fmt.Println("Removing this Notes")
+	removeNotes(ctx, conn, view.RecordId)
+	fmt.Println("> Successful test completion")
+}
+
+func searchNotes(res *common.ReadResult, key, value string) map[string]any {
+	for _, data := range res.Data {
+		if mockutils.DoesObjectCorrespondToString(data.Fields[key], value) {
+			return data.Raw
+		}
+	}
+
+	utils.Fail("error finding Notes")
+
+	return nil
+}
+
+func readNotes(ctx context.Context, conn *pipeliner.Connector) *common.ReadResult {
+	res, err := conn.Read(ctx, common.ReadParams{
+		ObjectName: objectName,
+		Fields: []string{
+			"id", "view", "name",
+		},
+	})
+	if err != nil {
+		utils.Fail("error reading from Pipeliner", "error", err)
+	}
+
+	return res
+}
+
+func getFirstObjectID(ctx context.Context, conn *pipeliner.Connector, name string) string {
+	res, err := conn.Read(ctx, common.ReadParams{
+		ObjectName: name,
+		Fields:     []string{"id"},
+	})
+	if err != nil {
+		utils.Fail("error reading from Pipeliner", "error", err)
+	}
+
+	data := res.Data
+	if len(data) == 0 {
+		utils.Fail("error Pipeliner has no objects", "error", err)
+	}
+
+	ownerID, found := data[0].Fields["id"]
+	if !found {
+		utils.Fail("error Pipeliner object has no id")
+	}
+
+	result, ok := ownerID.(string)
+	if !ok {
+		utils.Fail("error Pipeliner object id is not a string")
+	}
+
+	return result
+}
+
+func createNotes(ctx context.Context, conn *pipeliner.Connector, payload *NotesPayload) *common.WriteResult {
+	res, err := conn.Write(ctx, common.WriteParams{
+		ObjectName: objectName,
+		RecordId:   "",
+		RecordData: payload,
+	})
+	if err != nil {
+		utils.Fail("error writing to Pipeliner", "error", err)
+	}
+
+	if !res.Success {
+		utils.Fail("failed to create a Notes")
+	}
+
+	return res
+}
+
+func updateNotes(ctx context.Context, conn *pipeliner.Connector, viewID string, payload *NotesPayload) *common.WriteResult {
+	res, err := conn.Write(ctx, common.WriteParams{
+		ObjectName: objectName,
+		RecordId:   viewID,
+		RecordData: payload,
+	})
+	if err != nil {
+		utils.Fail("error writing to Pipeliner", "error", err)
+	}
+
+	if !res.Success {
+		utils.Fail("failed to update a Notes")
+	}
+
+	return res
+}
+
+func removeNotes(ctx context.Context, conn *pipeliner.Connector, viewID string) {
+	res, err := conn.Delete(ctx, common.DeleteParams{
+		ObjectName: objectName,
+		RecordId:   viewID,
+	})
+	if err != nil {
+		utils.Fail("error deleting for Pipeliner", "error", err)
+	}
+
+	if !res.Success {
+		utils.Fail("failed to remove a Notes")
+	}
+}
diff --git a/test/utils/mockutils/pointers.go b/test/utils/mockutils/pointers.go
deleted file mode 100644
index 0c9e4d1b..00000000
--- a/test/utils/mockutils/pointers.go
+++ /dev/null
@@ -1,13 +0,0 @@
-package mockutils
-
-var Pointers = pointers{}
-
-type pointers struct{}
-
-func (pointers) Str(input string) *string {
-	return &input
-}
-
-func (pointers) Bool(input bool) *bool {
-	return &input
-}