From cdb1238a5ef586c882347f78b4e896cd7bb02a95 Mon Sep 17 00:00:00 2001
From: Joe Bell <jbfbell@gmail.com>
Date: Wed, 24 Jan 2024 12:59:18 -0800
Subject: [PATCH 01/96] ...

---
 .../base/TypingAndDedupingFlag.java           |  4 ++
 .../src/main/resources/version.properties     |  2 +-
 .../airbyte-cdk/db-destinations/build.gradle  |  3 +
 .../jdbc/AbstractJdbcDestination.java         |  3 +-
 .../typing_deduping/RawOnlySqlGenerator.kt    | 60 ++++++++++++++++
 .../typing_deduping/NoOpSqlGenerator.java     | 69 +++++++++++++++++++
 .../destination-clickhouse/build.gradle       |  6 +-
 .../clickhouse/ClickhouseDestination.java     |  8 ++-
 .../clickhouse/ClickhouseSqlOperations.java   | 10 ++-
 .../src/main/resources/spec.json              | 13 ++++
 10 files changed, 170 insertions(+), 8 deletions(-)
 create mode 100644 airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/typing_deduping/RawOnlySqlGenerator.kt
 create mode 100644 airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/NoOpSqlGenerator.java

diff --git a/airbyte-cdk/java/airbyte-cdk/core/src/main/java/io/airbyte/cdk/integrations/base/TypingAndDedupingFlag.java b/airbyte-cdk/java/airbyte-cdk/core/src/main/java/io/airbyte/cdk/integrations/base/TypingAndDedupingFlag.java
index b59e757b62c4a..c15e5d85362ad 100644
--- a/airbyte-cdk/java/airbyte-cdk/core/src/main/java/io/airbyte/cdk/integrations/base/TypingAndDedupingFlag.java
+++ b/airbyte-cdk/java/airbyte-cdk/core/src/main/java/io/airbyte/cdk/integrations/base/TypingAndDedupingFlag.java
@@ -21,4 +21,8 @@ public static Optional<String> getRawNamespaceOverride(String option) {
     }
   }
 
+  public static boolean isUsingV2RawTable() {
+    return isDestinationV2() || DestinationConfig.getInstance().getBooleanValue("use_v2_raw_table");
+  }
+
 }
diff --git a/airbyte-cdk/java/airbyte-cdk/core/src/main/resources/version.properties b/airbyte-cdk/java/airbyte-cdk/core/src/main/resources/version.properties
index b18dfa7feb695..a4868348559c6 100644
--- a/airbyte-cdk/java/airbyte-cdk/core/src/main/resources/version.properties
+++ b/airbyte-cdk/java/airbyte-cdk/core/src/main/resources/version.properties
@@ -1 +1 @@
-version=0.13.2
+version=0.13.3
diff --git a/airbyte-cdk/java/airbyte-cdk/db-destinations/build.gradle b/airbyte-cdk/java/airbyte-cdk/db-destinations/build.gradle
index 4668be6e7ccac..b83efde9dde33 100644
--- a/airbyte-cdk/java/airbyte-cdk/db-destinations/build.gradle
+++ b/airbyte-cdk/java/airbyte-cdk/db-destinations/build.gradle
@@ -1,3 +1,6 @@
+plugins {
+    id "org.jetbrains.kotlin.jvm" version "1.9.22"
+}
 
 java {
     compileJava {
diff --git a/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/AbstractJdbcDestination.java b/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/AbstractJdbcDestination.java
index d25b6ecb4296b..0741f441287f9 100644
--- a/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/AbstractJdbcDestination.java
+++ b/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/AbstractJdbcDestination.java
@@ -288,6 +288,7 @@ public SerializedAirbyteMessageConsumer getSerializedMessageConsumer(final JsonN
         }
       }
       final JdbcSqlGenerator sqlGenerator = getSqlGenerator();
+      // SqlGenerator should be ok here because the catalog parser just uses "buildStreamid"
       final ParsedCatalog parsedCatalog = TypingAndDedupingFlag.getRawNamespaceOverride(RAW_SCHEMA_OVERRIDE)
           .map(override -> new CatalogParser(sqlGenerator, override))
           .orElse(new CatalogParser(sqlGenerator))
@@ -296,7 +297,7 @@ public SerializedAirbyteMessageConsumer getSerializedMessageConsumer(final JsonN
       final var migrator = new JdbcV1V2Migrator(namingResolver, database, databaseName);
       final NoopV2TableMigrator v2TableMigrator = new NoopV2TableMigrator();
       final DestinationHandler<TableDefinition> destinationHandler = getDestinationHandler(databaseName, database);
-      final boolean disableTypeDedupe = config.has(DISABLE_TYPE_DEDUPE) && config.get(DISABLE_TYPE_DEDUPE).asBoolean(false);
+      final boolean disableTypeDedupe = !config.has(DISABLE_TYPE_DEDUPE) || config.get(DISABLE_TYPE_DEDUPE).asBoolean(false);
       final TyperDeduper typerDeduper;
       if (disableTypeDedupe) {
         typerDeduper = new NoOpTyperDeduperWithV1V2Migrations<>(sqlGenerator, destinationHandler, parsedCatalog, migrator, v2TableMigrator,
diff --git a/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/typing_deduping/RawOnlySqlGenerator.kt b/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/typing_deduping/RawOnlySqlGenerator.kt
new file mode 100644
index 0000000000000..7994a22e29239
--- /dev/null
+++ b/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/typing_deduping/RawOnlySqlGenerator.kt
@@ -0,0 +1,60 @@
+package io.airbyte.cdk.integrations.destination.jdbc.typing_deduping
+
+import io.airbyte.cdk.integrations.destination.NamingConventionTransformer
+import io.airbyte.cdk.integrations.destination.jdbc.TableDefinition
+import io.airbyte.integrations.base.destination.typing_deduping.AirbyteType
+import io.airbyte.integrations.base.destination.typing_deduping.ColumnId
+import io.airbyte.integrations.base.destination.typing_deduping.StreamConfig
+import org.jooq.Condition
+import org.jooq.DataType
+import org.jooq.Field
+import org.jooq.SQLDialect
+import java.util.*
+
+class RawOnlySqlGenerator(namingTransformer: NamingConventionTransformer?) :
+    JdbcSqlGenerator(namingTransformer) {
+    override fun getStructType(): DataType<*>? {
+        return null
+    }
+
+    override fun getArrayType(): DataType<*>? {
+        return null
+    }
+
+    override fun getWidestType(): DataType<*>? {
+        return null
+    }
+
+    override fun getDialect(): SQLDialect? {
+        return null
+    }
+
+    override fun extractRawDataFields(
+        columns: LinkedHashMap<ColumnId, AirbyteType>,
+        useExpensiveSaferCasting: Boolean
+    ): List<Field<*>>? {
+        return null
+    }
+
+    override fun buildAirbyteMetaColumn(columns: LinkedHashMap<ColumnId, AirbyteType>): Field<*>? {
+        return null
+    }
+
+    override fun cdcDeletedAtNotNullCondition(): Condition? {
+        return null
+    }
+
+    override fun getRowNumber(
+        primaryKey: List<ColumnId>,
+        cursorField: Optional<ColumnId>
+    ): Field<Int>? {
+        return null
+    }
+
+    override fun existingSchemaMatchesStreamConfig(
+        stream: StreamConfig,
+        existingTable: TableDefinition
+    ): Boolean {
+        return false
+    }
+}
diff --git a/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/NoOpSqlGenerator.java b/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/NoOpSqlGenerator.java
new file mode 100644
index 0000000000000..6a423fcb018ce
--- /dev/null
+++ b/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/NoOpSqlGenerator.java
@@ -0,0 +1,69 @@
+package io.airbyte.integrations.base.destination.typing_deduping;
+
+import java.util.Optional;
+import lombok.NoArgsConstructor;
+
+@NoArgsConstructor
+public class NoOpSqlGenerator implements SqlGenerator {
+
+  @Override
+  public StreamId buildStreamId(final String namespace, final String name, final String rawNamespaceOverride) {
+    return null;
+  }
+
+  @Override
+  public ColumnId buildColumnId(final String name) {
+    return SqlGenerator.super.buildColumnId(name);
+  }
+
+  @Override
+  public ColumnId buildColumnId(final String name, final String suffix) {
+    return null;
+  }
+
+  @Override
+  public Sql createTable(final StreamConfig stream, final String suffix, final boolean force) {
+    return null;
+  }
+
+  @Override
+  public Sql createSchema(final String schema) {
+    return null;
+  }
+
+  @Override
+  public boolean existingSchemaMatchesStreamConfig(final StreamConfig stream, final Object existingTable) {
+    return false;
+  }
+
+  @Override
+  public Sql updateTable(final StreamConfig stream, final String finalSuffix, final Optional minRawTimestamp,
+                         final boolean useExpensiveSaferCasting) {
+    return null;
+  }
+
+  @Override
+  public Sql overwriteFinalTable(final StreamId stream, final String finalSuffix) {
+    return null;
+  }
+
+  @Override
+  public Sql migrateFromV1toV2(final StreamId streamId, final String namespace, final String tableName) {
+    return null;
+  }
+
+  @Override
+  public Sql prepareTablesForSoftReset(final StreamConfig stream) {
+    return SqlGenerator.super.prepareTablesForSoftReset(stream);
+  }
+
+  @Override
+  public Sql clearLoadedAt(final StreamId streamId) {
+    return null;
+  }
+
+  @Override
+  public boolean shouldRetry(final Exception e) {
+    return SqlGenerator.super.shouldRetry(e);
+  }
+}
diff --git a/airbyte-integrations/connectors/destination-clickhouse/build.gradle b/airbyte-integrations/connectors/destination-clickhouse/build.gradle
index 0386841d5f453..292ed964ecdc5 100644
--- a/airbyte-integrations/connectors/destination-clickhouse/build.gradle
+++ b/airbyte-integrations/connectors/destination-clickhouse/build.gradle
@@ -4,9 +4,9 @@ plugins {
 }
 
 airbyteJavaConnector {
-    cdkVersionRequired = '0.2.0'
-    features = ['db-destinations']
-    useLocalCdk = false
+    cdkVersionRequired = '0.13.3'
+    features = ['db-destinations', 's3-destinations', 'typing-deduping']
+    useLocalCdk = true
 }
 
 //remove once upgrading the CDK version to 0.4.x or later
diff --git a/airbyte-integrations/connectors/destination-clickhouse/src/main/java/io/airbyte/integrations/destination/clickhouse/ClickhouseDestination.java b/airbyte-integrations/connectors/destination-clickhouse/src/main/java/io/airbyte/integrations/destination/clickhouse/ClickhouseDestination.java
index 45a9d7cc8f088..fc641e3b12a29 100644
--- a/airbyte-integrations/connectors/destination-clickhouse/src/main/java/io/airbyte/integrations/destination/clickhouse/ClickhouseDestination.java
+++ b/airbyte-integrations/connectors/destination-clickhouse/src/main/java/io/airbyte/integrations/destination/clickhouse/ClickhouseDestination.java
@@ -16,6 +16,8 @@
 import io.airbyte.cdk.integrations.base.ssh.SshWrappedDestination;
 import io.airbyte.cdk.integrations.destination.NamingConventionTransformer;
 import io.airbyte.cdk.integrations.destination.jdbc.AbstractJdbcDestination;
+import io.airbyte.cdk.integrations.destination.jdbc.typing_deduping.JdbcSqlGenerator;
+import io.airbyte.cdk.integrations.destination.jdbc.typing_deduping.RawOnlySqlGenerator;
 import io.airbyte.commons.json.Jsons;
 import io.airbyte.protocol.models.v0.AirbyteConnectionStatus;
 import io.airbyte.protocol.models.v0.AirbyteConnectionStatus.Status;
@@ -87,7 +89,7 @@ public AirbyteConnectionStatus check(final JsonNode config) {
       final JdbcDatabase database = getDatabase(dataSource);
       final NamingConventionTransformer namingResolver = getNamingResolver();
       final String outputSchema = namingResolver.getIdentifier(config.get(JdbcUtils.DATABASE_KEY).asText());
-      attemptSQLCreateAndDropTableOperations(outputSchema, database, namingResolver, getSqlOperations());
+      attemptTableOperations(outputSchema, database, namingResolver, getSqlOperations(), false);
       return new AirbyteConnectionStatus().withStatus(Status.SUCCEEDED);
     } catch (final Exception e) {
       LOGGER.error("Exception while checking connection: ", e);
@@ -115,4 +117,8 @@ public static void main(final String[] args) throws Exception {
     LOGGER.info("completed destination: {}", ClickhouseDestination.class);
   }
 
+  @Override
+  protected JdbcSqlGenerator getSqlGenerator() {
+    return new RawOnlySqlGenerator(new ClickhouseSQLNameTransformer());
+  }
 }
diff --git a/airbyte-integrations/connectors/destination-clickhouse/src/main/java/io/airbyte/integrations/destination/clickhouse/ClickhouseSqlOperations.java b/airbyte-integrations/connectors/destination-clickhouse/src/main/java/io/airbyte/integrations/destination/clickhouse/ClickhouseSqlOperations.java
index 76d2fa56af898..478143f0c9b3f 100644
--- a/airbyte-integrations/connectors/destination-clickhouse/src/main/java/io/airbyte/integrations/destination/clickhouse/ClickhouseSqlOperations.java
+++ b/airbyte-integrations/connectors/destination-clickhouse/src/main/java/io/airbyte/integrations/destination/clickhouse/ClickhouseSqlOperations.java
@@ -10,7 +10,7 @@
 import io.airbyte.cdk.db.jdbc.JdbcDatabase;
 import io.airbyte.cdk.integrations.base.JavaBaseConstants;
 import io.airbyte.cdk.integrations.destination.jdbc.JdbcSqlOperations;
-import io.airbyte.protocol.models.v0.AirbyteRecordMessage;
+import io.airbyte.cdk.integrations.destination_async.partial_messages.PartialAirbyteMessage;
 import java.io.File;
 import java.io.IOException;
 import java.nio.file.Files;
@@ -60,7 +60,7 @@ public void executeTransaction(final JdbcDatabase database, final List<String> q
 
   @Override
   public void insertRecordsInternal(final JdbcDatabase database,
-                                    final List<AirbyteRecordMessage> records,
+                                    final List<PartialAirbyteMessage> records,
                                     final String schemaName,
                                     final String tmpTableName)
       throws SQLException {
@@ -102,4 +102,10 @@ public void insertRecordsInternal(final JdbcDatabase database,
     });
   }
 
+  @Override
+  protected void insertRecordsInternalV2(final JdbcDatabase database, final List<PartialAirbyteMessage> records, final String schemaName,
+                                         final String tableName)
+      throws Exception {
+
+  }
 }
diff --git a/airbyte-integrations/connectors/destination-clickhouse/src/main/resources/spec.json b/airbyte-integrations/connectors/destination-clickhouse/src/main/resources/spec.json
index 4f3c51333f8a1..01da3d569796f 100644
--- a/airbyte-integrations/connectors/destination-clickhouse/src/main/resources/spec.json
+++ b/airbyte-integrations/connectors/destination-clickhouse/src/main/resources/spec.json
@@ -58,6 +58,19 @@
         "type": "boolean",
         "default": false,
         "order": 6
+      },
+      "raw_data_schema": {
+        "type": "string",
+        "description": "The schema to write raw tables into (default: airbyte_internal)",
+        "title": "Raw Table Schema Name",
+        "order": 7
+      },
+      "use_v2_raw_table": {
+        "type": "boolean",
+        "description": "(For internal use.) Declares this uses the v2 raw table schema",
+        "title": "(Internal) Use V2 Raw Table Schema",
+        "airbyte_hidden": true,
+        "default": true
       }
     }
   }

From 08f0173e1fb1e05dfcede946494cd4b7c4f22d1c Mon Sep 17 00:00:00 2001
From: Joe Bell <jbfbell@gmail.com>
Date: Thu, 25 Jan 2024 15:15:34 -0800
Subject: [PATCH 02/96] all sorts of stuff

---
 .../java/airbyte-cdk/core/build.gradle        |  7 ++
 .../util/ConfiguredCatalogUtil.kt             | 18 +++++
 .../src/main/resources/version.properties     |  2 +-
 .../jdbc/AbstractJdbcDestination.java         | 76 +++++++++----------
 .../typing_deduping/JdbcV1V2Migrator.java     |  2 +-
 .../typing_deduping/RawOnlySqlGenerator.kt    |  8 +-
 .../airbyte-cdk/typing-deduping/build.gradle  |  1 +
 .../typing_deduping/DefaultTyperDeduper.java  | 12 +--
 .../typing_deduping/LoggingUtil.kt            |  8 ++
 .../NoMigrationNoFinalTableTyperDeduper.kt    | 55 ++++++++++++++
 .../typing_deduping/NoOpRawTableTDLock.kt     | 27 +++++++
 .../NoOpTyperDeduperWithV1V2Migrations.java   | 51 +------------
 .../typing_deduping/TyperDeduperUtil.kt       | 17 +++++
 .../destination-clickhouse/build.gradle       |  2 +-
 .../clickhouse/ClickhouseDestination.java     |  5 ++
 .../clickhouse/ClickhouseSqlOperations.java   | 24 +++---
 16 files changed, 198 insertions(+), 117 deletions(-)
 create mode 100644 airbyte-cdk/java/airbyte-cdk/core/src/main/java/io/airbyte/cdk/integrations/util/ConfiguredCatalogUtil.kt
 create mode 100644 airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/LoggingUtil.kt
 create mode 100644 airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/NoMigrationNoFinalTableTyperDeduper.kt
 create mode 100644 airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/NoOpRawTableTDLock.kt
 create mode 100644 airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/TyperDeduperUtil.kt

diff --git a/airbyte-cdk/java/airbyte-cdk/core/build.gradle b/airbyte-cdk/java/airbyte-cdk/core/build.gradle
index cfef9562cbbe1..69c13d5fc92ba 100644
--- a/airbyte-cdk/java/airbyte-cdk/core/build.gradle
+++ b/airbyte-cdk/java/airbyte-cdk/core/build.gradle
@@ -1,3 +1,6 @@
+plugins {
+    id 'org.jetbrains.kotlin.jvm' version '1.9.22'
+}
 
 java {
     compileJava {
@@ -103,4 +106,8 @@ dependencies {
     testImplementation 'org.apache.commons:commons-lang3:3.11'
     testImplementation 'org.xerial.snappy:snappy-java:1.1.8.4'
     testImplementation 'org.mockito:mockito-core:4.6.1'
+    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
 }
+
+compileKotlin {}
+compileTestKotlin {}
diff --git a/airbyte-cdk/java/airbyte-cdk/core/src/main/java/io/airbyte/cdk/integrations/util/ConfiguredCatalogUtil.kt b/airbyte-cdk/java/airbyte-cdk/core/src/main/java/io/airbyte/cdk/integrations/util/ConfiguredCatalogUtil.kt
new file mode 100644
index 0000000000000..77b1b431505d6
--- /dev/null
+++ b/airbyte-cdk/java/airbyte-cdk/core/src/main/java/io/airbyte/cdk/integrations/util/ConfiguredCatalogUtil.kt
@@ -0,0 +1,18 @@
+package io.airbyte.cdk.integrations.util
+
+import io.airbyte.protocol.models.v0.ConfiguredAirbyteCatalog
+import org.apache.commons.lang3.StringUtils
+
+/**
+ * For streams in [catalog] which do not have a namespace specified, explicitly set their namespace
+ * to the [defaultNamespace]
+ */
+ fun addDefaultNamespaceToStreams(catalog: ConfiguredAirbyteCatalog, defaultNamespace: String) {
+    // TODO: This logic exists in all V2 destinations.
+    // This is sad that if we forget to add this, there will be a null pointer during parseCatalog
+    for (stream in catalog.streams) {
+        if (StringUtils.isEmpty(stream.stream.namespace)) {
+            stream.stream.namespace = defaultNamespace
+        }
+    }
+}
diff --git a/airbyte-cdk/java/airbyte-cdk/core/src/main/resources/version.properties b/airbyte-cdk/java/airbyte-cdk/core/src/main/resources/version.properties
index e701908e301c0..e32751579c90f 100644
--- a/airbyte-cdk/java/airbyte-cdk/core/src/main/resources/version.properties
+++ b/airbyte-cdk/java/airbyte-cdk/core/src/main/resources/version.properties
@@ -1 +1 @@
-version=0.14.1
+version=0.15.0
diff --git a/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/AbstractJdbcDestination.java b/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/AbstractJdbcDestination.java
index 0741f441287f9..f444d98887179 100644
--- a/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/AbstractJdbcDestination.java
+++ b/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/AbstractJdbcDestination.java
@@ -5,6 +5,7 @@
 package io.airbyte.cdk.integrations.destination.jdbc;
 
 import static io.airbyte.cdk.integrations.base.errors.messages.ErrorMessage.getErrorMessage;
+import static io.airbyte.cdk.integrations.util.ConfiguredCatalogUtilKt.addDefaultNamespaceToStreams;
 
 import com.fasterxml.jackson.databind.JsonNode;
 import com.google.common.annotations.VisibleForTesting;
@@ -40,7 +41,6 @@
 import io.airbyte.protocol.models.v0.AirbyteConnectionStatus.Status;
 import io.airbyte.protocol.models.v0.AirbyteMessage;
 import io.airbyte.protocol.models.v0.ConfiguredAirbyteCatalog;
-import io.airbyte.protocol.models.v0.ConfiguredAirbyteStream;
 import java.sql.SQLException;
 import java.util.List;
 import java.util.Map;
@@ -49,7 +49,6 @@
 import java.util.function.Consumer;
 import javax.sql.DataSource;
 import org.apache.commons.lang3.NotImplementedException;
-import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -276,45 +275,16 @@ public SerializedAirbyteMessageConsumer getSerializedMessageConsumer(final JsonN
                                                                        final ConfiguredAirbyteCatalog catalog,
                                                                        final Consumer<AirbyteMessage> outputRecordCollector)
       throws Exception {
-    final DataSource dataSource = getDataSource(config);
-    final JdbcDatabase database = getDatabase(dataSource);
+    final JdbcDatabase database = getDatabase(getDataSource(config));
+    final String defaultNamespace;
+    final TyperDeduper typerDeduper;
     if (TypingAndDedupingFlag.isDestinationV2()) {
-      // TODO: This logic exists in all V2 destinations.
-      // This is sad that if we forget to add this, there will be a null pointer during parseCatalog
-      final String defaultNamespace = config.get("schema").asText();
-      for (final ConfiguredAirbyteStream stream : catalog.getStreams()) {
-        if (StringUtils.isEmpty(stream.getStream().getNamespace())) {
-          stream.getStream().setNamespace(defaultNamespace);
-        }
-      }
-      final JdbcSqlGenerator sqlGenerator = getSqlGenerator();
-      // SqlGenerator should be ok here because the catalog parser just uses "buildStreamid"
-      final ParsedCatalog parsedCatalog = TypingAndDedupingFlag.getRawNamespaceOverride(RAW_SCHEMA_OVERRIDE)
-          .map(override -> new CatalogParser(sqlGenerator, override))
-          .orElse(new CatalogParser(sqlGenerator))
-          .parseCatalog(catalog);
-      final String databaseName = getDatabaseName(config);
-      final var migrator = new JdbcV1V2Migrator(namingResolver, database, databaseName);
-      final NoopV2TableMigrator v2TableMigrator = new NoopV2TableMigrator();
-      final DestinationHandler<TableDefinition> destinationHandler = getDestinationHandler(databaseName, database);
-      final boolean disableTypeDedupe = !config.has(DISABLE_TYPE_DEDUPE) || config.get(DISABLE_TYPE_DEDUPE).asBoolean(false);
-      final TyperDeduper typerDeduper;
-      if (disableTypeDedupe) {
-        typerDeduper = new NoOpTyperDeduperWithV1V2Migrations<>(sqlGenerator, destinationHandler, parsedCatalog, migrator, v2TableMigrator,
-            8);
-      } else {
-        typerDeduper =
-            new DefaultTyperDeduper<>(sqlGenerator, destinationHandler, parsedCatalog, migrator, v2TableMigrator, 8);
-      }
-      return JdbcBufferedConsumerFactory.createAsync(
-          outputRecordCollector,
-          database,
-          sqlOperations,
-          namingResolver,
-          config,
-          catalog,
-          defaultNamespace,
-          typerDeduper);
+      defaultNamespace = config.get("schema").asText();
+      addDefaultNamespaceToStreams(catalog, defaultNamespace);
+      typerDeduper = getV2TyperDeduper(config, catalog, database);
+    } else {
+      defaultNamespace = null;
+      typerDeduper = new NoopTyperDeduper();
     }
     return JdbcBufferedConsumerFactory.createAsync(
         outputRecordCollector,
@@ -323,8 +293,30 @@ public SerializedAirbyteMessageConsumer getSerializedMessageConsumer(final JsonN
         namingResolver,
         config,
         catalog,
-        null,
-        new NoopTyperDeduper());
+        defaultNamespace,
+        typerDeduper);
+  }
+
+  private TyperDeduper getV2TyperDeduper(final JsonNode config, final ConfiguredAirbyteCatalog catalog, final JdbcDatabase database) {
+    final JdbcSqlGenerator sqlGenerator = getSqlGenerator();
+    final ParsedCatalog parsedCatalog = TypingAndDedupingFlag.getRawNamespaceOverride(RAW_SCHEMA_OVERRIDE)
+                                                             .map(override -> new CatalogParser(sqlGenerator, override))
+                                                             .orElse(new CatalogParser(sqlGenerator))
+                                                             .parseCatalog(catalog);
+    final String databaseName = getDatabaseName(config);
+    final var migrator = new JdbcV1V2Migrator(namingResolver, database, databaseName);
+    final NoopV2TableMigrator v2TableMigrator = new NoopV2TableMigrator();
+    final DestinationHandler<TableDefinition> destinationHandler = getDestinationHandler(databaseName, database);
+    final boolean disableTypeDedupe = !config.has(DISABLE_TYPE_DEDUPE) || config.get(DISABLE_TYPE_DEDUPE).asBoolean(false);
+    final TyperDeduper typerDeduper;
+    if (disableTypeDedupe) {
+      typerDeduper = new NoOpTyperDeduperWithV1V2Migrations<>(sqlGenerator, destinationHandler, parsedCatalog, migrator, v2TableMigrator,
+                                                              8);
+    } else {
+      typerDeduper =
+          new DefaultTyperDeduper<>(sqlGenerator, destinationHandler, parsedCatalog, migrator, v2TableMigrator, 8);
+    }
+    return typerDeduper;
   }
 
 }
diff --git a/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/typing_deduping/JdbcV1V2Migrator.java b/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/typing_deduping/JdbcV1V2Migrator.java
index d5374140fc3e9..1bf0c66d6b7f7 100644
--- a/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/typing_deduping/JdbcV1V2Migrator.java
+++ b/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/typing_deduping/JdbcV1V2Migrator.java
@@ -37,7 +37,7 @@ protected boolean doesAirbyteInternalNamespaceExist(final StreamConfig streamCon
     String retrievedSchema = "";
     try (ResultSet columns = database.getMetaData().getSchemas(databaseName, streamConfig.id().rawNamespace())) {
       while (columns.next()) {
-        retrievedSchema = columns.getString("TABLE_SCHEM");
+        retrievedSchema = columns.getString("TABLE_SCHEMA");
         // Catalog can be null, so don't do anything with it.
         String catalog = columns.getString("TABLE_CATALOG");
       }
diff --git a/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/typing_deduping/RawOnlySqlGenerator.kt b/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/typing_deduping/RawOnlySqlGenerator.kt
index 7994a22e29239..9b7f378b70a55 100644
--- a/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/typing_deduping/RawOnlySqlGenerator.kt
+++ b/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/typing_deduping/RawOnlySqlGenerator.kt
@@ -14,19 +14,19 @@ import java.util.*
 class RawOnlySqlGenerator(namingTransformer: NamingConventionTransformer?) :
     JdbcSqlGenerator(namingTransformer) {
     override fun getStructType(): DataType<*>? {
-        return null
+        throw NotImplementedError("This Destination Does not support typing")
     }
 
     override fun getArrayType(): DataType<*>? {
-        return null
+        throw NotImplementedError("This Destination Does not support typing")
     }
 
     override fun getWidestType(): DataType<*>? {
-        return null
+        throw NotImplementedError("This Destination Does not support typing")
     }
 
     override fun getDialect(): SQLDialect? {
-        return null
+        throw NotImplementedError("This Destination Does not support typing")
     }
 
     override fun extractRawDataFields(
diff --git a/airbyte-cdk/java/airbyte-cdk/typing-deduping/build.gradle b/airbyte-cdk/java/airbyte-cdk/typing-deduping/build.gradle
index fc3ba8f061e83..a2bc6649f80cd 100644
--- a/airbyte-cdk/java/airbyte-cdk/typing-deduping/build.gradle
+++ b/airbyte-cdk/java/airbyte-cdk/typing-deduping/build.gradle
@@ -1,5 +1,6 @@
 plugins {
     id 'java-library'
+    id 'org.jetbrains.kotlin.jvm' version '1.9.22'
 }
 
 dependencies {
diff --git a/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/DefaultTyperDeduper.java b/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/DefaultTyperDeduper.java
index d01f47060ba44..2678500a271b6 100644
--- a/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/DefaultTyperDeduper.java
+++ b/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/DefaultTyperDeduper.java
@@ -7,15 +7,14 @@
 import static io.airbyte.cdk.integrations.base.IntegrationRunner.TYPE_AND_DEDUPE_THREAD_NAME;
 import static io.airbyte.integrations.base.destination.typing_deduping.FutureUtils.countOfTypingDedupingThreads;
 import static io.airbyte.integrations.base.destination.typing_deduping.FutureUtils.reduceExceptions;
+import static io.airbyte.integrations.base.destination.typing_deduping.TyperDeduperUtilKt.prepareAllSchemas;
 import static java.util.Collections.singleton;
 
-import com.google.common.collect.Streams;
 import io.airbyte.cdk.integrations.destination.StreamSyncSummary;
 import io.airbyte.protocol.models.v0.DestinationSyncMode;
 import io.airbyte.protocol.models.v0.StreamDescriptor;
 import java.util.HashSet;
 import java.util.Map;
-import java.util.Objects;
 import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.CompletableFuture;
@@ -104,14 +103,7 @@ public DefaultTyperDeduper(
   }
 
   private void prepareSchemas(final ParsedCatalog parsedCatalog) throws Exception {
-    final var rawSchema = parsedCatalog.streams().stream().map(stream -> stream.id().rawNamespace());
-    final var finalSchema = parsedCatalog.streams().stream().map(stream -> stream.id().finalNamespace());
-    final var createAllSchemasSql = Streams.concat(rawSchema, finalSchema)
-        .filter(Objects::nonNull)
-        .distinct()
-        .map(sqlGenerator::createSchema)
-        .toList();
-    destinationHandler.execute(Sql.concat(createAllSchemasSql));
+    prepareAllSchemas(parsedCatalog, sqlGenerator, destinationHandler);
   }
 
   @Override
diff --git a/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/LoggingUtil.kt b/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/LoggingUtil.kt
new file mode 100644
index 0000000000000..ccd73acdc59fa
--- /dev/null
+++ b/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/LoggingUtil.kt
@@ -0,0 +1,8 @@
+package io.airbyte.integrations.base.destination.typing_deduping
+
+import org.slf4j.Logger
+import org.slf4j.LoggerFactory
+
+fun <R: Any> R.logger(): Lazy<Logger> {
+    return lazy { LoggerFactory.getLogger(this.javaClass) }
+}
diff --git a/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/NoMigrationNoFinalTableTyperDeduper.kt b/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/NoMigrationNoFinalTableTyperDeduper.kt
new file mode 100644
index 0000000000000..4ad9715320108
--- /dev/null
+++ b/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/NoMigrationNoFinalTableTyperDeduper.kt
@@ -0,0 +1,55 @@
+package io.airbyte.integrations.base.destination.typing_deduping
+
+import io.airbyte.cdk.integrations.base.IntegrationRunner
+import io.airbyte.cdk.integrations.destination.StreamSyncSummary
+import io.airbyte.protocol.models.v0.StreamDescriptor
+import org.apache.commons.lang3.concurrent.BasicThreadFactory
+import org.slf4j.Logger
+import java.util.concurrent.ExecutorService
+import java.util.concurrent.Executors
+import java.util.concurrent.locks.Lock
+
+class NoMigrationNoFinalTableTyperDeduper<DialectTableDefinition>(
+    private val sqlGenerator: SqlGenerator<DialectTableDefinition>,
+    private val destinationHandler: DestinationHandler<DialectTableDefinition>,
+    private val parsedCatalog: ParsedCatalog,
+    ): TyperDeduper {
+
+    private val executorService: ExecutorService = Executors.newFixedThreadPool(
+        FutureUtils.countOfTypingDedupingThreads(8),
+        BasicThreadFactory.Builder().namingPattern(IntegrationRunner.TYPE_AND_DEDUPE_THREAD_NAME)
+            .build()
+    );
+
+    private val logger: Logger by logger()
+
+
+    override fun prepareTables() {
+        prepareAllSchemas(parsedCatalog, sqlGenerator, destinationHandler)
+    }
+
+    override fun typeAndDedupe(
+        originalNamespace: String?,
+        originalName: String?,
+        mustRun: Boolean
+    ) {
+        logger.info("Destination Does not support Typing and Deduping, Skipping")
+    }
+
+    override fun getRawTableInsertLock(originalNamespace: String?, originalName: String?): Lock {
+        return NoOpRawTableTDLock();
+    }
+
+    override fun typeAndDedupe(streamSyncSummaries: MutableMap<StreamDescriptor, StreamSyncSummary>?) {
+        logger.info("Destination Does not support Typing and Deduping, Skipping 'typeAndDedupe'")
+    }
+
+    override fun commitFinalTables() {
+        logger.info("Destination does not support final tables, Skipping 'commitFinalTables'")
+    }
+
+    override fun cleanup() {
+        logger.info("Shutting down type and dedupe threads")
+        executorService.shutdown()
+    }
+}
diff --git a/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/NoOpRawTableTDLock.kt b/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/NoOpRawTableTDLock.kt
new file mode 100644
index 0000000000000..3cc88d70fdd55
--- /dev/null
+++ b/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/NoOpRawTableTDLock.kt
@@ -0,0 +1,27 @@
+package io.airbyte.integrations.base.destination.typing_deduping
+
+import java.util.concurrent.TimeUnit
+import java.util.concurrent.locks.Condition
+import java.util.concurrent.locks.Lock
+
+class NoOpRawTableTDLock: Lock {
+    override fun lock() {}
+
+    override fun lockInterruptibly() {}
+
+    override fun tryLock(): Boolean {
+        // To mimic NoOp behavior always return true that lock is acquired
+        return true
+    }
+
+    override fun tryLock(time: Long, unit: TimeUnit): Boolean {
+        return tryLock()
+    }
+
+    override fun unlock() {}
+
+    override fun newCondition(): Condition {
+        // Always throw exception to avoid callers from using this path
+        throw UnsupportedOperationException("This lock implementation does not support retrieving a Condition")
+    }
+}
diff --git a/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/NoOpTyperDeduperWithV1V2Migrations.java b/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/NoOpTyperDeduperWithV1V2Migrations.java
index f35d1a92356d0..dd33e4fb3bde0 100644
--- a/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/NoOpTyperDeduperWithV1V2Migrations.java
+++ b/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/NoOpTyperDeduperWithV1V2Migrations.java
@@ -7,20 +7,17 @@
 import static io.airbyte.cdk.integrations.base.IntegrationRunner.TYPE_AND_DEDUPE_THREAD_NAME;
 import static io.airbyte.integrations.base.destination.typing_deduping.FutureUtils.countOfTypingDedupingThreads;
 import static io.airbyte.integrations.base.destination.typing_deduping.FutureUtils.reduceExceptions;
+import static io.airbyte.integrations.base.destination.typing_deduping.TyperDeduperUtilKt.prepareAllSchemas;
 
-import com.google.common.collect.Streams;
 import io.airbyte.cdk.integrations.destination.StreamSyncSummary;
 import io.airbyte.protocol.models.v0.StreamDescriptor;
 import java.util.HashSet;
 import java.util.Map;
-import java.util.Objects;
 import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.locks.Condition;
 import java.util.concurrent.locks.Lock;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.concurrent.BasicThreadFactory;
@@ -56,14 +53,7 @@ public NoOpTyperDeduperWithV1V2Migrations(final SqlGenerator<DialectTableDefinit
   }
 
   private void prepareSchemas(final ParsedCatalog parsedCatalog) throws Exception {
-    final var rawSchema = parsedCatalog.streams().stream().map(stream -> stream.id().rawNamespace());
-    final var finalSchema = parsedCatalog.streams().stream().map(stream -> stream.id().finalNamespace());
-    final var createAllSchemasSql = Streams.concat(rawSchema, finalSchema)
-        .filter(Objects::nonNull)
-        .distinct()
-        .map(sqlGenerator::createSchema)
-        .toList();
-    destinationHandler.execute(Sql.concat(createAllSchemasSql));
+    prepareAllSchemas(parsedCatalog, sqlGenerator, destinationHandler);
   }
 
   @Override
@@ -96,42 +86,7 @@ public void typeAndDedupe(final String originalNamespace, final String originalN
 
   @Override
   public Lock getRawTableInsertLock(final String originalNamespace, final String originalName) {
-    return new Lock() {
-
-      @Override
-      public void lock() {
-
-      }
-
-      @Override
-      public void lockInterruptibly() {
-
-      }
-
-      @Override
-      public boolean tryLock() {
-        // To mimic NoOp behavior always return true that lock is acquired
-        return true;
-      }
-
-      @Override
-      public boolean tryLock(final long time, final TimeUnit unit) {
-        // To mimic NoOp behavior always return true that lock is acquired
-        return true;
-      }
-
-      @Override
-      public void unlock() {
-
-      }
-
-      @Override
-      public Condition newCondition() {
-        // Always throw exception to avoid callers from using this path
-        throw new UnsupportedOperationException("This lock implementation does not support retrieving a Condition");
-      }
-
-    };
+    return new NoOpRawTableTDLock();
   }
 
   @Override
diff --git a/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/TyperDeduperUtil.kt b/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/TyperDeduperUtil.kt
new file mode 100644
index 0000000000000..833b63df1e772
--- /dev/null
+++ b/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/TyperDeduperUtil.kt
@@ -0,0 +1,17 @@
+package io.airbyte.integrations.base.destination.typing_deduping
+
+import com.google.common.collect.Streams
+import java.util.*
+
+fun <T> prepareAllSchemas(parsedCatalog: ParsedCatalog, sqlGenerator: SqlGenerator<T>, destinationHandler: DestinationHandler<T>) {
+    val rawSchema =
+        parsedCatalog.streams.stream().map { stream: StreamConfig -> stream.id.rawNamespace }
+    val finalSchema =
+        parsedCatalog.streams.stream().map { stream: StreamConfig -> stream.id.finalNamespace }
+    val createAllSchemasSql = Streams.concat(rawSchema, finalSchema)
+        .filter { obj: String? -> Objects.nonNull(obj) }
+        .distinct()
+        .map { schema: String? -> sqlGenerator.createSchema(schema) }
+        .toList()
+    destinationHandler.execute(Sql.concat(createAllSchemasSql))
+}
diff --git a/airbyte-integrations/connectors/destination-clickhouse/build.gradle b/airbyte-integrations/connectors/destination-clickhouse/build.gradle
index 292ed964ecdc5..feb110ecd7a6e 100644
--- a/airbyte-integrations/connectors/destination-clickhouse/build.gradle
+++ b/airbyte-integrations/connectors/destination-clickhouse/build.gradle
@@ -4,7 +4,7 @@ plugins {
 }
 
 airbyteJavaConnector {
-    cdkVersionRequired = '0.13.3'
+    cdkVersionRequired = '0.15.0'
     features = ['db-destinations', 's3-destinations', 'typing-deduping']
     useLocalCdk = true
 }
diff --git a/airbyte-integrations/connectors/destination-clickhouse/src/main/java/io/airbyte/integrations/destination/clickhouse/ClickhouseDestination.java b/airbyte-integrations/connectors/destination-clickhouse/src/main/java/io/airbyte/integrations/destination/clickhouse/ClickhouseDestination.java
index fc641e3b12a29..1cb1b37fc3f07 100644
--- a/airbyte-integrations/connectors/destination-clickhouse/src/main/java/io/airbyte/integrations/destination/clickhouse/ClickhouseDestination.java
+++ b/airbyte-integrations/connectors/destination-clickhouse/src/main/java/io/airbyte/integrations/destination/clickhouse/ClickhouseDestination.java
@@ -121,4 +121,9 @@ public static void main(final String[] args) throws Exception {
   protected JdbcSqlGenerator getSqlGenerator() {
     return new RawOnlySqlGenerator(new ClickhouseSQLNameTransformer());
   }
+
+  @Override
+  public boolean isV2Destination() {
+    return true;
+  }
 }
diff --git a/airbyte-integrations/connectors/destination-clickhouse/src/main/java/io/airbyte/integrations/destination/clickhouse/ClickhouseSqlOperations.java b/airbyte-integrations/connectors/destination-clickhouse/src/main/java/io/airbyte/integrations/destination/clickhouse/ClickhouseSqlOperations.java
index 478143f0c9b3f..780eef6d9224c 100644
--- a/airbyte-integrations/connectors/destination-clickhouse/src/main/java/io/airbyte/integrations/destination/clickhouse/ClickhouseSqlOperations.java
+++ b/airbyte-integrations/connectors/destination-clickhouse/src/main/java/io/airbyte/integrations/destination/clickhouse/ClickhouseSqlOperations.java
@@ -36,18 +36,22 @@ public boolean isSchemaRequired() {
   @Override
   public String createTableQuery(final JdbcDatabase database, final String schemaName, final String tableName) {
     return String.format(
-        "CREATE TABLE IF NOT EXISTS %s.%s ( \n"
-            + "%s String,\n"
-            + "%s String,\n"
-            + "%s DateTime64(3, 'GMT') DEFAULT now(),\n"
-            + "PRIMARY KEY(%s)\n"
-            + ")\n"
-            + "ENGINE = MergeTree;\n",
+        """
+            CREATE TABLE IF NOT EXISTS %s.%s (
+            %s String,
+            %s JSON,
+            %s DateTime64(3, 'GMT') DEFAULT now(),
+            %s DateTime64(3, 'GMT') DEFAULT now(),
+            PRIMARY KEY(%s)
+            )
+            ENGINE = MergeTree;
+            """,
         schemaName, tableName,
-        JavaBaseConstants.COLUMN_NAME_AB_ID,
+        JavaBaseConstants.COLUMN_NAME_AB_RAW_ID,
         JavaBaseConstants.COLUMN_NAME_DATA,
-        JavaBaseConstants.COLUMN_NAME_EMITTED_AT,
-        JavaBaseConstants.COLUMN_NAME_AB_ID);
+        JavaBaseConstants.COLUMN_NAME_AB_EXTRACTED_AT,
+        JavaBaseConstants.COLUMN_NAME_AB_LOADED_AT,
+        JavaBaseConstants.COLUMN_NAME_AB_RAW_ID);
   }
 
   @Override

From d2cb631075880cc34d60a736307390305f14002a Mon Sep 17 00:00:00 2001
From: Joe Bell <jbfbell@gmail.com>
Date: Fri, 26 Jan 2024 17:33:16 -0800
Subject: [PATCH 03/96] working sync

---
 .../integrations/base/DestinationConfig.java  |  1 +
 .../base/ssh/SshWrappedDestination.java       | 12 +++++-
 .../util/ConfiguredCatalogUtil.kt             |  5 ++-
 .../airbyte-cdk/db-destinations/build.gradle  |  3 ++
 .../jdbc/AbstractJdbcDestination.java         |  6 ++-
 .../typing_deduping/JdbcV1V2Migrator.java     |  2 +-
 .../typing_deduping/RawOnlySqlGenerator.kt    |  2 +-
 .../airbyte-cdk/typing-deduping/build.gradle  |  3 ++
 .../NoOpTyperDeduperWithV1V2Migrations.java   | 42 +++++++++++--------
 .../clickhouse/ClickhouseDestination.java     |  5 +++
 .../clickhouse/ClickhouseSqlOperations.java   |  4 +-
 docs/integrations/destinations/clickhouse.md  | 12 ++++++
 12 files changed, 72 insertions(+), 25 deletions(-)

diff --git a/airbyte-cdk/java/airbyte-cdk/core/src/main/java/io/airbyte/cdk/integrations/base/DestinationConfig.java b/airbyte-cdk/java/airbyte-cdk/core/src/main/java/io/airbyte/cdk/integrations/base/DestinationConfig.java
index 300a13d6a4016..03802a32ac221 100644
--- a/airbyte-cdk/java/airbyte-cdk/core/src/main/java/io/airbyte/cdk/integrations/base/DestinationConfig.java
+++ b/airbyte-cdk/java/airbyte-cdk/core/src/main/java/io/airbyte/cdk/integrations/base/DestinationConfig.java
@@ -41,6 +41,7 @@ public static void initialize(final JsonNode root, final boolean isV2Destination
       config = new DestinationConfig();
       config.root = root;
       config.isV2Destination = isV2Destination;
+      LOGGER.info("Initializing Destination: is " + (isV2Destination ? "": "not" + " a V2 Destination" ));
     } else {
       LOGGER.warn("Singleton was already initialized.");
     }
diff --git a/airbyte-cdk/java/airbyte-cdk/core/src/main/java/io/airbyte/cdk/integrations/base/ssh/SshWrappedDestination.java b/airbyte-cdk/java/airbyte-cdk/core/src/main/java/io/airbyte/cdk/integrations/base/ssh/SshWrappedDestination.java
index 08f4d794d92b3..e732251d6dfb7 100644
--- a/airbyte-cdk/java/airbyte-cdk/core/src/main/java/io/airbyte/cdk/integrations/base/ssh/SshWrappedDestination.java
+++ b/airbyte-cdk/java/airbyte-cdk/core/src/main/java/io/airbyte/cdk/integrations/base/ssh/SshWrappedDestination.java
@@ -4,7 +4,13 @@
 
 package io.airbyte.cdk.integrations.base.ssh;
 
-import static io.airbyte.cdk.integrations.base.ssh.SshTunnel.*;
+import static io.airbyte.cdk.integrations.base.ssh.SshTunnel.CONNECTION_OPTIONS_KEY;
+import static io.airbyte.cdk.integrations.base.ssh.SshTunnel.GLOBAL_HEARTBEAT_INTERVAL_DEFAULT_IN_MILLIS;
+import static io.airbyte.cdk.integrations.base.ssh.SshTunnel.GLOBAL_HEARTBEAT_INTERVAL_KEY;
+import static io.airbyte.cdk.integrations.base.ssh.SshTunnel.SESSION_HEARTBEAT_INTERVAL_DEFAULT_IN_MILLIS;
+import static io.airbyte.cdk.integrations.base.ssh.SshTunnel.SESSION_HEARTBEAT_INTERVAL_KEY;
+import static io.airbyte.cdk.integrations.base.ssh.SshTunnel.getInstance;
+import static io.airbyte.cdk.integrations.base.ssh.SshTunnel.sshWrap;
 
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
@@ -129,4 +135,8 @@ protected SshTunnel getTunnelInstance(final JsonNode config) throws Exception {
         : getInstance(config, hostKey, portKey);
   }
 
+  @Override
+  public boolean isV2Destination() {
+    return this.delegate.isV2Destination();
+  }
 }
diff --git a/airbyte-cdk/java/airbyte-cdk/core/src/main/java/io/airbyte/cdk/integrations/util/ConfiguredCatalogUtil.kt b/airbyte-cdk/java/airbyte-cdk/core/src/main/java/io/airbyte/cdk/integrations/util/ConfiguredCatalogUtil.kt
index 77b1b431505d6..44d8245effd6b 100644
--- a/airbyte-cdk/java/airbyte-cdk/core/src/main/java/io/airbyte/cdk/integrations/util/ConfiguredCatalogUtil.kt
+++ b/airbyte-cdk/java/airbyte-cdk/core/src/main/java/io/airbyte/cdk/integrations/util/ConfiguredCatalogUtil.kt
@@ -7,7 +7,10 @@ import org.apache.commons.lang3.StringUtils
  * For streams in [catalog] which do not have a namespace specified, explicitly set their namespace
  * to the [defaultNamespace]
  */
- fun addDefaultNamespaceToStreams(catalog: ConfiguredAirbyteCatalog, defaultNamespace: String) {
+ fun addDefaultNamespaceToStreams(catalog: ConfiguredAirbyteCatalog, defaultNamespace: String?) {
+     if (defaultNamespace == null) {
+         return
+     }
     // TODO: This logic exists in all V2 destinations.
     // This is sad that if we forget to add this, there will be a null pointer during parseCatalog
     for (stream in catalog.streams) {
diff --git a/airbyte-cdk/java/airbyte-cdk/db-destinations/build.gradle b/airbyte-cdk/java/airbyte-cdk/db-destinations/build.gradle
index b83efde9dde33..d2dbd1790440b 100644
--- a/airbyte-cdk/java/airbyte-cdk/db-destinations/build.gradle
+++ b/airbyte-cdk/java/airbyte-cdk/db-destinations/build.gradle
@@ -96,3 +96,6 @@ dependencies {
 
     testImplementation libs.junit.jupiter.system.stubs
 }
+
+compileKotlin {}
+compileTestKotlin {}
diff --git a/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/AbstractJdbcDestination.java b/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/AbstractJdbcDestination.java
index f444d98887179..3a2c52a23af94 100644
--- a/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/AbstractJdbcDestination.java
+++ b/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/AbstractJdbcDestination.java
@@ -71,6 +71,10 @@ protected SqlOperations getSqlOperations() {
     return sqlOperations;
   }
 
+  protected String getConfigSchemaKey() {
+    return "schema";
+  }
+
   public AbstractJdbcDestination(final String driverClass,
                                  final NamingConventionTransformer namingResolver,
                                  final SqlOperations sqlOperations) {
@@ -279,7 +283,7 @@ public SerializedAirbyteMessageConsumer getSerializedMessageConsumer(final JsonN
     final String defaultNamespace;
     final TyperDeduper typerDeduper;
     if (TypingAndDedupingFlag.isDestinationV2()) {
-      defaultNamespace = config.get("schema").asText();
+      defaultNamespace = config.get(getConfigSchemaKey()).asText();
       addDefaultNamespaceToStreams(catalog, defaultNamespace);
       typerDeduper = getV2TyperDeduper(config, catalog, database);
     } else {
diff --git a/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/typing_deduping/JdbcV1V2Migrator.java b/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/typing_deduping/JdbcV1V2Migrator.java
index 1bf0c66d6b7f7..d5374140fc3e9 100644
--- a/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/typing_deduping/JdbcV1V2Migrator.java
+++ b/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/typing_deduping/JdbcV1V2Migrator.java
@@ -37,7 +37,7 @@ protected boolean doesAirbyteInternalNamespaceExist(final StreamConfig streamCon
     String retrievedSchema = "";
     try (ResultSet columns = database.getMetaData().getSchemas(databaseName, streamConfig.id().rawNamespace())) {
       while (columns.next()) {
-        retrievedSchema = columns.getString("TABLE_SCHEMA");
+        retrievedSchema = columns.getString("TABLE_SCHEM");
         // Catalog can be null, so don't do anything with it.
         String catalog = columns.getString("TABLE_CATALOG");
       }
diff --git a/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/typing_deduping/RawOnlySqlGenerator.kt b/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/typing_deduping/RawOnlySqlGenerator.kt
index 9b7f378b70a55..834e9d409befa 100644
--- a/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/typing_deduping/RawOnlySqlGenerator.kt
+++ b/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/typing_deduping/RawOnlySqlGenerator.kt
@@ -11,7 +11,7 @@ import org.jooq.Field
 import org.jooq.SQLDialect
 import java.util.*
 
-class RawOnlySqlGenerator(namingTransformer: NamingConventionTransformer?) :
+class RawOnlySqlGenerator(private val namingTransformer: NamingConventionTransformer) :
     JdbcSqlGenerator(namingTransformer) {
     override fun getStructType(): DataType<*>? {
         throw NotImplementedError("This Destination Does not support typing")
diff --git a/airbyte-cdk/java/airbyte-cdk/typing-deduping/build.gradle b/airbyte-cdk/java/airbyte-cdk/typing-deduping/build.gradle
index a2bc6649f80cd..4160813789d68 100644
--- a/airbyte-cdk/java/airbyte-cdk/typing-deduping/build.gradle
+++ b/airbyte-cdk/java/airbyte-cdk/typing-deduping/build.gradle
@@ -25,3 +25,6 @@ java {
         options.compilerArgs.remove("-Werror")
     }
 }
+
+compileKotlin {}
+compileTestKotlin {}
diff --git a/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/NoOpTyperDeduperWithV1V2Migrations.java b/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/NoOpTyperDeduperWithV1V2Migrations.java
index dd33e4fb3bde0..3bbc53fae3b50 100644
--- a/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/NoOpTyperDeduperWithV1V2Migrations.java
+++ b/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/NoOpTyperDeduperWithV1V2Migrations.java
@@ -19,7 +19,9 @@
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.locks.Lock;
+import kotlin.NotImplementedError;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.NotImplementedException;
 import org.apache.commons.lang3.concurrent.BasicThreadFactory;
 
 /**
@@ -58,25 +60,29 @@ private void prepareSchemas(final ParsedCatalog parsedCatalog) throws Exception
 
   @Override
   public void prepareTables() throws Exception {
-    log.info("ensuring schemas exist for prepareTables with V1V2 migrations");
-    prepareSchemas(parsedCatalog);
-    final Set<CompletableFuture<Optional<Exception>>> prepareTablesTasks = new HashSet<>();
-    for (final StreamConfig stream : parsedCatalog.streams()) {
-      prepareTablesTasks.add(CompletableFuture.supplyAsync(() -> {
-        // Migrate the Raw Tables if this is the first v2 sync after a v1 sync
-        try {
-          log.info("Migrating V1->V2 for stream {}", stream.id());
-          v1V2Migrator.migrateIfNecessary(sqlGenerator, destinationHandler, stream);
-          log.info("Migrating V2 legacy for stream {}", stream.id());
-          v2TableMigrator.migrateIfNecessary(stream);
-          return Optional.empty();
-        } catch (final Exception e) {
-          return Optional.of(e);
-        }
-      }, executorService));
+    try {
+      log.info("ensuring schemas exist for prepareTables with V1V2 migrations");
+      prepareSchemas(parsedCatalog);
+      final Set<CompletableFuture<Optional<Exception>>> prepareTablesTasks = new HashSet<>();
+      for (final StreamConfig stream : parsedCatalog.streams()) {
+        prepareTablesTasks.add(CompletableFuture.supplyAsync(() -> {
+          // Migrate the Raw Tables if this is the first v2 sync after a v1 sync
+          try {
+            log.info("Migrating V1->V2 for stream {}", stream.id());
+            v1V2Migrator.migrateIfNecessary(sqlGenerator, destinationHandler, stream);
+            log.info("Migrating V2 legacy for stream {}", stream.id());
+            v2TableMigrator.migrateIfNecessary(stream);
+            return Optional.empty();
+          } catch (final Exception e) {
+            return Optional.of(e);
+          }
+        }, executorService));
+      }
+      CompletableFuture.allOf(prepareTablesTasks.toArray(CompletableFuture[]::new)).join();
+      reduceExceptions(prepareTablesTasks, "The following exceptions were thrown attempting to prepare tables:\n");
+    } catch (NotImplementedError | NotImplementedException e) {
+      log.warn("Could not prepare schemas or tables because components are not implemented, this should not be required for this destination to succeed");
     }
-    CompletableFuture.allOf(prepareTablesTasks.toArray(CompletableFuture[]::new)).join();
-    reduceExceptions(prepareTablesTasks, "The following exceptions were thrown attempting to prepare tables:\n");
   }
 
   @Override
diff --git a/airbyte-integrations/connectors/destination-clickhouse/src/main/java/io/airbyte/integrations/destination/clickhouse/ClickhouseDestination.java b/airbyte-integrations/connectors/destination-clickhouse/src/main/java/io/airbyte/integrations/destination/clickhouse/ClickhouseDestination.java
index 1cb1b37fc3f07..ab53950f686d3 100644
--- a/airbyte-integrations/connectors/destination-clickhouse/src/main/java/io/airbyte/integrations/destination/clickhouse/ClickhouseDestination.java
+++ b/airbyte-integrations/connectors/destination-clickhouse/src/main/java/io/airbyte/integrations/destination/clickhouse/ClickhouseDestination.java
@@ -126,4 +126,9 @@ protected JdbcSqlGenerator getSqlGenerator() {
   public boolean isV2Destination() {
     return true;
   }
+
+  @Override
+  protected String getConfigSchemaKey() {
+    return "database";
+  }
 }
diff --git a/airbyte-integrations/connectors/destination-clickhouse/src/main/java/io/airbyte/integrations/destination/clickhouse/ClickhouseSqlOperations.java b/airbyte-integrations/connectors/destination-clickhouse/src/main/java/io/airbyte/integrations/destination/clickhouse/ClickhouseSqlOperations.java
index 780eef6d9224c..6ff7f462a8ef4 100644
--- a/airbyte-integrations/connectors/destination-clickhouse/src/main/java/io/airbyte/integrations/destination/clickhouse/ClickhouseSqlOperations.java
+++ b/airbyte-integrations/connectors/destination-clickhouse/src/main/java/io/airbyte/integrations/destination/clickhouse/ClickhouseSqlOperations.java
@@ -39,7 +39,7 @@ public String createTableQuery(final JdbcDatabase database, final String schemaN
         """
             CREATE TABLE IF NOT EXISTS %s.%s (
             %s String,
-            %s JSON,
+            %s String,
             %s DateTime64(3, 'GMT') DEFAULT now(),
             %s DateTime64(3, 'GMT') DEFAULT now(),
             PRIMARY KEY(%s)
@@ -110,6 +110,6 @@ public void insertRecordsInternal(final JdbcDatabase database,
   protected void insertRecordsInternalV2(final JdbcDatabase database, final List<PartialAirbyteMessage> records, final String schemaName,
                                          final String tableName)
       throws Exception {
-
+    insertRecordsInternal(database, records, schemaName, tableName);
   }
 }
diff --git a/docs/integrations/destinations/clickhouse.md b/docs/integrations/destinations/clickhouse.md
index 02446ba825f65..eccadec298021 100644
--- a/docs/integrations/destinations/clickhouse.md
+++ b/docs/integrations/destinations/clickhouse.md
@@ -44,6 +44,18 @@ You can create such a user by running:
 
 ```
 GRANT CREATE ON * TO airbyte_user;
+GRANT CREATE ON default * TO airbyte_user
+
+GRANT DROP ON * TO airbyte_user
+GRANT TRUNCATE ON * TO airbyte_user
+GRANT INSERT ON * TO airbyte_user
+GRANT SELECT ON * TO airbyte_user
+GRANT CREATE DATABASE ON airbyte_internal.* TO airbyte_user
+GRANT CREATE TABLE ON airbyte_internal.* TO airbyte_user
+GRANT DROP ON airbyte_internal.* TO airbyte_user
+GRANT TRUNCATE ON airbyte_internal.* TO airbyte_user
+GRANT INSERT ON airbyte_internal.* TO airbyte_user
+GRANT SELECT ON airbyte_internal.* TO airbyte_user
 ```
 
 You can also use a pre-existing user but we highly recommend creating a dedicated user for Airbyte.

From 35c349318c6f90994fea400106511b2e38e056a1 Mon Sep 17 00:00:00 2001
From: Joe Bell <jbfbell@gmail.com>
Date: Mon, 29 Jan 2024 15:06:59 -0800
Subject: [PATCH 04/96] add breaking change metadata

---
 .../destination-clickhouse/metadata.yaml          | 15 ++++++++++-----
 1 file changed, 10 insertions(+), 5 deletions(-)

diff --git a/airbyte-integrations/connectors/destination-clickhouse/metadata.yaml b/airbyte-integrations/connectors/destination-clickhouse/metadata.yaml
index cf10ca7aa667f..00065e12efe08 100644
--- a/airbyte-integrations/connectors/destination-clickhouse/metadata.yaml
+++ b/airbyte-integrations/connectors/destination-clickhouse/metadata.yaml
@@ -2,22 +2,27 @@ data:
   connectorSubtype: database
   connectorType: destination
   definitionId: ce0d828e-1dc4-496c-b122-2da42e637e48
-  dockerImageTag: 0.2.5
+  dockerImageTag: 1.0.0
   dockerRepository: airbyte/destination-clickhouse
   githubIssueLabel: destination-clickhouse
   icon: clickhouse.svg
   license: MIT
   name: Clickhouse
-  normalizationConfig:
-    normalizationIntegrationType: clickhouse
-    normalizationRepository: airbyte/normalization-clickhouse
-    normalizationTag: 0.4.3
   registries:
     cloud:
       dockerRepository: airbyte/destination-clickhouse-strict-encrypt
       enabled: true
     oss:
       enabled: true
+  releases:
+    breakingChanges:
+      1.0.0:
+        message: >
+          This version removes the option to use "normalization" with clickhouse. It also changes
+          the schema and database of Airbyte's "raw" tables to be compatible with the new
+          [Destinations V2](https://docs.airbyte.com/release_notes/upgrading_to_destinations_v2/#what-is-destinations-v2)
+          format. These changes will likely require updates to downstream dbt / SQL models.
+          Selecting `Upgrade` will upgrade **all** connections using this destination at their next sync. 
   releaseStage: alpha
   documentationUrl: https://docs.airbyte.com/integrations/destinations/clickhouse
   supportsDbt: false

From 8004b508530f8fa58127a5c15a0994e3cf69c27c Mon Sep 17 00:00:00 2001
From: Joe Bell <jbfbell@gmail.com>
Date: Mon, 29 Jan 2024 15:12:11 -0800
Subject: [PATCH 05/96] formatting

---
 .../integrations/base/DestinationConfig.java  |  2 +-
 .../base/ssh/SshWrappedDestination.java       |  1 +
 .../jdbc/AbstractJdbcDestination.java         |  8 +++----
 .../typing_deduping/NoOpSqlGenerator.java     |  9 +++++++-
 .../NoOpTyperDeduperWithV1V2Migrations.java   |  3 ++-
 .../destination-clickhouse/metadata.yaml      |  2 +-
 .../clickhouse/ClickhouseDestination.java     |  1 +
 .../clickhouse/ClickhouseSqlOperations.java   | 23 +++++++++++--------
 8 files changed, 31 insertions(+), 18 deletions(-)

diff --git a/airbyte-cdk/java/airbyte-cdk/core/src/main/java/io/airbyte/cdk/integrations/base/DestinationConfig.java b/airbyte-cdk/java/airbyte-cdk/core/src/main/java/io/airbyte/cdk/integrations/base/DestinationConfig.java
index ebfde0df46126..9a7288ee46380 100644
--- a/airbyte-cdk/java/airbyte-cdk/core/src/main/java/io/airbyte/cdk/integrations/base/DestinationConfig.java
+++ b/airbyte-cdk/java/airbyte-cdk/core/src/main/java/io/airbyte/cdk/integrations/base/DestinationConfig.java
@@ -39,7 +39,7 @@ public static void initialize(final JsonNode root, final boolean isV2Destination
       config = new DestinationConfig();
       config.root = root;
       config.isV2Destination = isV2Destination;
-      LOGGER.info("Initializing Destination: is " + (isV2Destination ? "": "not" + " a V2 Destination" ));
+      LOGGER.info("Initializing Destination: is " + (isV2Destination ? "" : "not" + " a V2 Destination"));
     } else {
       LOGGER.warn("Singleton was already initialized.");
     }
diff --git a/airbyte-cdk/java/airbyte-cdk/core/src/main/java/io/airbyte/cdk/integrations/base/ssh/SshWrappedDestination.java b/airbyte-cdk/java/airbyte-cdk/core/src/main/java/io/airbyte/cdk/integrations/base/ssh/SshWrappedDestination.java
index e732251d6dfb7..8513e2cda29a4 100644
--- a/airbyte-cdk/java/airbyte-cdk/core/src/main/java/io/airbyte/cdk/integrations/base/ssh/SshWrappedDestination.java
+++ b/airbyte-cdk/java/airbyte-cdk/core/src/main/java/io/airbyte/cdk/integrations/base/ssh/SshWrappedDestination.java
@@ -139,4 +139,5 @@ protected SshTunnel getTunnelInstance(final JsonNode config) throws Exception {
   public boolean isV2Destination() {
     return this.delegate.isV2Destination();
   }
+
 }
diff --git a/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/AbstractJdbcDestination.java b/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/AbstractJdbcDestination.java
index 3a2c52a23af94..1032eb242ad57 100644
--- a/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/AbstractJdbcDestination.java
+++ b/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/AbstractJdbcDestination.java
@@ -304,9 +304,9 @@ public SerializedAirbyteMessageConsumer getSerializedMessageConsumer(final JsonN
   private TyperDeduper getV2TyperDeduper(final JsonNode config, final ConfiguredAirbyteCatalog catalog, final JdbcDatabase database) {
     final JdbcSqlGenerator sqlGenerator = getSqlGenerator();
     final ParsedCatalog parsedCatalog = TypingAndDedupingFlag.getRawNamespaceOverride(RAW_SCHEMA_OVERRIDE)
-                                                             .map(override -> new CatalogParser(sqlGenerator, override))
-                                                             .orElse(new CatalogParser(sqlGenerator))
-                                                             .parseCatalog(catalog);
+        .map(override -> new CatalogParser(sqlGenerator, override))
+        .orElse(new CatalogParser(sqlGenerator))
+        .parseCatalog(catalog);
     final String databaseName = getDatabaseName(config);
     final var migrator = new JdbcV1V2Migrator(namingResolver, database, databaseName);
     final NoopV2TableMigrator v2TableMigrator = new NoopV2TableMigrator();
@@ -315,7 +315,7 @@ private TyperDeduper getV2TyperDeduper(final JsonNode config, final ConfiguredAi
     final TyperDeduper typerDeduper;
     if (disableTypeDedupe) {
       typerDeduper = new NoOpTyperDeduperWithV1V2Migrations<>(sqlGenerator, destinationHandler, parsedCatalog, migrator, v2TableMigrator,
-                                                              8);
+          8);
     } else {
       typerDeduper =
           new DefaultTyperDeduper<>(sqlGenerator, destinationHandler, parsedCatalog, migrator, v2TableMigrator, 8);
diff --git a/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/NoOpSqlGenerator.java b/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/NoOpSqlGenerator.java
index 6a423fcb018ce..fab0f4b952372 100644
--- a/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/NoOpSqlGenerator.java
+++ b/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/NoOpSqlGenerator.java
@@ -1,3 +1,7 @@
+/*
+ * Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+ */
+
 package io.airbyte.integrations.base.destination.typing_deduping;
 
 import java.util.Optional;
@@ -37,7 +41,9 @@ public boolean existingSchemaMatchesStreamConfig(final StreamConfig stream, fina
   }
 
   @Override
-  public Sql updateTable(final StreamConfig stream, final String finalSuffix, final Optional minRawTimestamp,
+  public Sql updateTable(final StreamConfig stream,
+                         final String finalSuffix,
+                         final Optional minRawTimestamp,
                          final boolean useExpensiveSaferCasting) {
     return null;
   }
@@ -66,4 +72,5 @@ public Sql clearLoadedAt(final StreamId streamId) {
   public boolean shouldRetry(final Exception e) {
     return SqlGenerator.super.shouldRetry(e);
   }
+
 }
diff --git a/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/NoOpTyperDeduperWithV1V2Migrations.java b/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/NoOpTyperDeduperWithV1V2Migrations.java
index 3bbc53fae3b50..a70daaef62ccd 100644
--- a/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/NoOpTyperDeduperWithV1V2Migrations.java
+++ b/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/NoOpTyperDeduperWithV1V2Migrations.java
@@ -81,7 +81,8 @@ public void prepareTables() throws Exception {
       CompletableFuture.allOf(prepareTablesTasks.toArray(CompletableFuture[]::new)).join();
       reduceExceptions(prepareTablesTasks, "The following exceptions were thrown attempting to prepare tables:\n");
     } catch (NotImplementedError | NotImplementedException e) {
-      log.warn("Could not prepare schemas or tables because components are not implemented, this should not be required for this destination to succeed");
+      log.warn(
+          "Could not prepare schemas or tables because components are not implemented, this should not be required for this destination to succeed");
     }
   }
 
diff --git a/airbyte-integrations/connectors/destination-clickhouse/metadata.yaml b/airbyte-integrations/connectors/destination-clickhouse/metadata.yaml
index 00065e12efe08..e0775a1f33513 100644
--- a/airbyte-integrations/connectors/destination-clickhouse/metadata.yaml
+++ b/airbyte-integrations/connectors/destination-clickhouse/metadata.yaml
@@ -22,7 +22,7 @@ data:
           the schema and database of Airbyte's "raw" tables to be compatible with the new
           [Destinations V2](https://docs.airbyte.com/release_notes/upgrading_to_destinations_v2/#what-is-destinations-v2)
           format. These changes will likely require updates to downstream dbt / SQL models.
-          Selecting `Upgrade` will upgrade **all** connections using this destination at their next sync. 
+          Selecting `Upgrade` will upgrade **all** connections using this destination at their next sync.
   releaseStage: alpha
   documentationUrl: https://docs.airbyte.com/integrations/destinations/clickhouse
   supportsDbt: false
diff --git a/airbyte-integrations/connectors/destination-clickhouse/src/main/java/io/airbyte/integrations/destination/clickhouse/ClickhouseDestination.java b/airbyte-integrations/connectors/destination-clickhouse/src/main/java/io/airbyte/integrations/destination/clickhouse/ClickhouseDestination.java
index ab53950f686d3..77b3347944ca9 100644
--- a/airbyte-integrations/connectors/destination-clickhouse/src/main/java/io/airbyte/integrations/destination/clickhouse/ClickhouseDestination.java
+++ b/airbyte-integrations/connectors/destination-clickhouse/src/main/java/io/airbyte/integrations/destination/clickhouse/ClickhouseDestination.java
@@ -131,4 +131,5 @@ public boolean isV2Destination() {
   protected String getConfigSchemaKey() {
     return "database";
   }
+
 }
diff --git a/airbyte-integrations/connectors/destination-clickhouse/src/main/java/io/airbyte/integrations/destination/clickhouse/ClickhouseSqlOperations.java b/airbyte-integrations/connectors/destination-clickhouse/src/main/java/io/airbyte/integrations/destination/clickhouse/ClickhouseSqlOperations.java
index 6ff7f462a8ef4..66c7dcf023c09 100644
--- a/airbyte-integrations/connectors/destination-clickhouse/src/main/java/io/airbyte/integrations/destination/clickhouse/ClickhouseSqlOperations.java
+++ b/airbyte-integrations/connectors/destination-clickhouse/src/main/java/io/airbyte/integrations/destination/clickhouse/ClickhouseSqlOperations.java
@@ -37,15 +37,15 @@ public boolean isSchemaRequired() {
   public String createTableQuery(final JdbcDatabase database, final String schemaName, final String tableName) {
     return String.format(
         """
-            CREATE TABLE IF NOT EXISTS %s.%s (
-            %s String,
-            %s String,
-            %s DateTime64(3, 'GMT') DEFAULT now(),
-            %s DateTime64(3, 'GMT') DEFAULT now(),
-            PRIMARY KEY(%s)
-            )
-            ENGINE = MergeTree;
-            """,
+        CREATE TABLE IF NOT EXISTS %s.%s (
+        %s String,
+        %s String,
+        %s DateTime64(3, 'GMT') DEFAULT now(),
+        %s DateTime64(3, 'GMT') DEFAULT now(),
+        PRIMARY KEY(%s)
+        )
+        ENGINE = MergeTree;
+        """,
         schemaName, tableName,
         JavaBaseConstants.COLUMN_NAME_AB_RAW_ID,
         JavaBaseConstants.COLUMN_NAME_DATA,
@@ -107,9 +107,12 @@ public void insertRecordsInternal(final JdbcDatabase database,
   }
 
   @Override
-  protected void insertRecordsInternalV2(final JdbcDatabase database, final List<PartialAirbyteMessage> records, final String schemaName,
+  protected void insertRecordsInternalV2(final JdbcDatabase database,
+                                         final List<PartialAirbyteMessage> records,
+                                         final String schemaName,
                                          final String tableName)
       throws Exception {
     insertRecordsInternal(database, records, schemaName, tableName);
   }
+
 }

From ecaf881adc35555d90eb5f4099e9d2376f10fc40 Mon Sep 17 00:00:00 2001
From: Joe Bell <jbfbell@gmail.com>
Date: Mon, 29 Jan 2024 15:51:33 -0800
Subject: [PATCH 06/96] pr self review

---
 .../integrations/base/DestinationConfig.java  |  1 -
 .../base/TypingAndDedupingFlag.java           |  4 -
 .../jdbc/AbstractJdbcDestination.java         |  7 ++
 .../typing_deduping/RawOnlySqlGenerator.kt    | 18 ++---
 .../typing_deduping/LoggingUtil.kt            |  3 +
 .../NoMigrationNoFinalTableTyperDeduper.kt    | 55 --------------
 .../typing_deduping/NoOpSqlGenerator.java     | 76 -------------------
 .../NoOpTyperDeduperWithV1V2Migrations.java   |  7 +-
 .../typing_deduping/TyperDeduperUtil.kt       |  4 +
 .../destination-clickhouse/build.gradle       |  2 +-
 .../clickhouse/ClickhouseSqlOperations.java   |  2 +-
 .../src/main/resources/spec.json              |  7 --
 docs/integrations/destinations/clickhouse.md  | 23 +++---
 13 files changed, 38 insertions(+), 171 deletions(-)
 delete mode 100644 airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/NoMigrationNoFinalTableTyperDeduper.kt
 delete mode 100644 airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/NoOpSqlGenerator.java

diff --git a/airbyte-cdk/java/airbyte-cdk/core/src/main/java/io/airbyte/cdk/integrations/base/DestinationConfig.java b/airbyte-cdk/java/airbyte-cdk/core/src/main/java/io/airbyte/cdk/integrations/base/DestinationConfig.java
index 9a7288ee46380..b2f9221253351 100644
--- a/airbyte-cdk/java/airbyte-cdk/core/src/main/java/io/airbyte/cdk/integrations/base/DestinationConfig.java
+++ b/airbyte-cdk/java/airbyte-cdk/core/src/main/java/io/airbyte/cdk/integrations/base/DestinationConfig.java
@@ -39,7 +39,6 @@ public static void initialize(final JsonNode root, final boolean isV2Destination
       config = new DestinationConfig();
       config.root = root;
       config.isV2Destination = isV2Destination;
-      LOGGER.info("Initializing Destination: is " + (isV2Destination ? "" : "not" + " a V2 Destination"));
     } else {
       LOGGER.warn("Singleton was already initialized.");
     }
diff --git a/airbyte-cdk/java/airbyte-cdk/core/src/main/java/io/airbyte/cdk/integrations/base/TypingAndDedupingFlag.java b/airbyte-cdk/java/airbyte-cdk/core/src/main/java/io/airbyte/cdk/integrations/base/TypingAndDedupingFlag.java
index 5a3e257ae4294..8820b1d7017f9 100644
--- a/airbyte-cdk/java/airbyte-cdk/core/src/main/java/io/airbyte/cdk/integrations/base/TypingAndDedupingFlag.java
+++ b/airbyte-cdk/java/airbyte-cdk/core/src/main/java/io/airbyte/cdk/integrations/base/TypingAndDedupingFlag.java
@@ -22,8 +22,4 @@ public static Optional<String> getRawNamespaceOverride(final String option) {
     }
   }
 
-  public static boolean isUsingV2RawTable() {
-    return isDestinationV2() || DestinationConfig.getInstance().getBooleanValue("use_v2_raw_table");
-  }
-
 }
diff --git a/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/AbstractJdbcDestination.java b/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/AbstractJdbcDestination.java
index 1032eb242ad57..763277771ff5f 100644
--- a/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/AbstractJdbcDestination.java
+++ b/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/AbstractJdbcDestination.java
@@ -301,6 +301,13 @@ public SerializedAirbyteMessageConsumer getSerializedMessageConsumer(final JsonN
         typerDeduper);
   }
 
+  /**
+   * Creates the appropriate TyperDeduper class for the jdbc destination and the user's configuration
+   * @param config the configuration for the connection
+   * @param catalog the catalog for the connection
+   * @param database a database instance
+   * @return the appropriate TyperDeduper instance for this connection.
+   */
   private TyperDeduper getV2TyperDeduper(final JsonNode config, final ConfiguredAirbyteCatalog catalog, final JdbcDatabase database) {
     final JdbcSqlGenerator sqlGenerator = getSqlGenerator();
     final ParsedCatalog parsedCatalog = TypingAndDedupingFlag.getRawNamespaceOverride(RAW_SCHEMA_OVERRIDE)
diff --git a/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/typing_deduping/RawOnlySqlGenerator.kt b/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/typing_deduping/RawOnlySqlGenerator.kt
index 834e9d409befa..7a8eb52499e62 100644
--- a/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/typing_deduping/RawOnlySqlGenerator.kt
+++ b/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/typing_deduping/RawOnlySqlGenerator.kt
@@ -14,47 +14,47 @@ import java.util.*
 class RawOnlySqlGenerator(private val namingTransformer: NamingConventionTransformer) :
     JdbcSqlGenerator(namingTransformer) {
     override fun getStructType(): DataType<*>? {
-        throw NotImplementedError("This Destination Does not support typing")
+        throw NotImplementedError("This Destination Does not support final tables")
     }
 
     override fun getArrayType(): DataType<*>? {
-        throw NotImplementedError("This Destination Does not support typing")
+        throw NotImplementedError("This Destination Does not support final tables")
     }
 
     override fun getWidestType(): DataType<*>? {
-        throw NotImplementedError("This Destination Does not support typing")
+        throw NotImplementedError("This Destination Does not support final tables")
     }
 
     override fun getDialect(): SQLDialect? {
-        throw NotImplementedError("This Destination Does not support typing")
+        throw NotImplementedError("This Destination Does not support final tables")
     }
 
     override fun extractRawDataFields(
         columns: LinkedHashMap<ColumnId, AirbyteType>,
         useExpensiveSaferCasting: Boolean
     ): List<Field<*>>? {
-        return null
+        throw NotImplementedError("This Destination Does not support final tables")
     }
 
     override fun buildAirbyteMetaColumn(columns: LinkedHashMap<ColumnId, AirbyteType>): Field<*>? {
-        return null
+        throw NotImplementedError("This Destination Does not support final tables")
     }
 
     override fun cdcDeletedAtNotNullCondition(): Condition? {
-        return null
+        throw NotImplementedError("This Destination Does not support final tables")
     }
 
     override fun getRowNumber(
         primaryKey: List<ColumnId>,
         cursorField: Optional<ColumnId>
     ): Field<Int>? {
-        return null
+        throw NotImplementedError("This Destination Does not support final tables")
     }
 
     override fun existingSchemaMatchesStreamConfig(
         stream: StreamConfig,
         existingTable: TableDefinition
     ): Boolean {
-        return false
+        throw NotImplementedError("This Destination Does not support final tables")
     }
 }
diff --git a/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/LoggingUtil.kt b/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/LoggingUtil.kt
index ccd73acdc59fa..ed3552b0ff706 100644
--- a/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/LoggingUtil.kt
+++ b/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/LoggingUtil.kt
@@ -3,6 +3,9 @@ package io.airbyte.integrations.base.destination.typing_deduping
 import org.slf4j.Logger
 import org.slf4j.LoggerFactory
 
+/**
+ * Extends all classes to lazily initialize a Slf4j [Logger]
+ */
 fun <R: Any> R.logger(): Lazy<Logger> {
     return lazy { LoggerFactory.getLogger(this.javaClass) }
 }
diff --git a/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/NoMigrationNoFinalTableTyperDeduper.kt b/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/NoMigrationNoFinalTableTyperDeduper.kt
deleted file mode 100644
index 4ad9715320108..0000000000000
--- a/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/NoMigrationNoFinalTableTyperDeduper.kt
+++ /dev/null
@@ -1,55 +0,0 @@
-package io.airbyte.integrations.base.destination.typing_deduping
-
-import io.airbyte.cdk.integrations.base.IntegrationRunner
-import io.airbyte.cdk.integrations.destination.StreamSyncSummary
-import io.airbyte.protocol.models.v0.StreamDescriptor
-import org.apache.commons.lang3.concurrent.BasicThreadFactory
-import org.slf4j.Logger
-import java.util.concurrent.ExecutorService
-import java.util.concurrent.Executors
-import java.util.concurrent.locks.Lock
-
-class NoMigrationNoFinalTableTyperDeduper<DialectTableDefinition>(
-    private val sqlGenerator: SqlGenerator<DialectTableDefinition>,
-    private val destinationHandler: DestinationHandler<DialectTableDefinition>,
-    private val parsedCatalog: ParsedCatalog,
-    ): TyperDeduper {
-
-    private val executorService: ExecutorService = Executors.newFixedThreadPool(
-        FutureUtils.countOfTypingDedupingThreads(8),
-        BasicThreadFactory.Builder().namingPattern(IntegrationRunner.TYPE_AND_DEDUPE_THREAD_NAME)
-            .build()
-    );
-
-    private val logger: Logger by logger()
-
-
-    override fun prepareTables() {
-        prepareAllSchemas(parsedCatalog, sqlGenerator, destinationHandler)
-    }
-
-    override fun typeAndDedupe(
-        originalNamespace: String?,
-        originalName: String?,
-        mustRun: Boolean
-    ) {
-        logger.info("Destination Does not support Typing and Deduping, Skipping")
-    }
-
-    override fun getRawTableInsertLock(originalNamespace: String?, originalName: String?): Lock {
-        return NoOpRawTableTDLock();
-    }
-
-    override fun typeAndDedupe(streamSyncSummaries: MutableMap<StreamDescriptor, StreamSyncSummary>?) {
-        logger.info("Destination Does not support Typing and Deduping, Skipping 'typeAndDedupe'")
-    }
-
-    override fun commitFinalTables() {
-        logger.info("Destination does not support final tables, Skipping 'commitFinalTables'")
-    }
-
-    override fun cleanup() {
-        logger.info("Shutting down type and dedupe threads")
-        executorService.shutdown()
-    }
-}
diff --git a/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/NoOpSqlGenerator.java b/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/NoOpSqlGenerator.java
deleted file mode 100644
index fab0f4b952372..0000000000000
--- a/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/NoOpSqlGenerator.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright (c) 2023 Airbyte, Inc., all rights reserved.
- */
-
-package io.airbyte.integrations.base.destination.typing_deduping;
-
-import java.util.Optional;
-import lombok.NoArgsConstructor;
-
-@NoArgsConstructor
-public class NoOpSqlGenerator implements SqlGenerator {
-
-  @Override
-  public StreamId buildStreamId(final String namespace, final String name, final String rawNamespaceOverride) {
-    return null;
-  }
-
-  @Override
-  public ColumnId buildColumnId(final String name) {
-    return SqlGenerator.super.buildColumnId(name);
-  }
-
-  @Override
-  public ColumnId buildColumnId(final String name, final String suffix) {
-    return null;
-  }
-
-  @Override
-  public Sql createTable(final StreamConfig stream, final String suffix, final boolean force) {
-    return null;
-  }
-
-  @Override
-  public Sql createSchema(final String schema) {
-    return null;
-  }
-
-  @Override
-  public boolean existingSchemaMatchesStreamConfig(final StreamConfig stream, final Object existingTable) {
-    return false;
-  }
-
-  @Override
-  public Sql updateTable(final StreamConfig stream,
-                         final String finalSuffix,
-                         final Optional minRawTimestamp,
-                         final boolean useExpensiveSaferCasting) {
-    return null;
-  }
-
-  @Override
-  public Sql overwriteFinalTable(final StreamId stream, final String finalSuffix) {
-    return null;
-  }
-
-  @Override
-  public Sql migrateFromV1toV2(final StreamId streamId, final String namespace, final String tableName) {
-    return null;
-  }
-
-  @Override
-  public Sql prepareTablesForSoftReset(final StreamConfig stream) {
-    return SqlGenerator.super.prepareTablesForSoftReset(stream);
-  }
-
-  @Override
-  public Sql clearLoadedAt(final StreamId streamId) {
-    return null;
-  }
-
-  @Override
-  public boolean shouldRetry(final Exception e) {
-    return SqlGenerator.super.shouldRetry(e);
-  }
-
-}
diff --git a/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/NoOpTyperDeduperWithV1V2Migrations.java b/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/NoOpTyperDeduperWithV1V2Migrations.java
index a70daaef62ccd..6e37951202eda 100644
--- a/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/NoOpTyperDeduperWithV1V2Migrations.java
+++ b/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/NoOpTyperDeduperWithV1V2Migrations.java
@@ -54,15 +54,12 @@ public NoOpTyperDeduperWithV1V2Migrations(final SqlGenerator<DialectTableDefinit
         new BasicThreadFactory.Builder().namingPattern(TYPE_AND_DEDUPE_THREAD_NAME).build());
   }
 
-  private void prepareSchemas(final ParsedCatalog parsedCatalog) throws Exception {
-    prepareAllSchemas(parsedCatalog, sqlGenerator, destinationHandler);
-  }
 
   @Override
   public void prepareTables() throws Exception {
     try {
       log.info("ensuring schemas exist for prepareTables with V1V2 migrations");
-      prepareSchemas(parsedCatalog);
+      prepareAllSchemas(parsedCatalog, sqlGenerator, destinationHandler);
       final Set<CompletableFuture<Optional<Exception>>> prepareTablesTasks = new HashSet<>();
       for (final StreamConfig stream : parsedCatalog.streams()) {
         prepareTablesTasks.add(CompletableFuture.supplyAsync(() -> {
@@ -82,7 +79,7 @@ public void prepareTables() throws Exception {
       reduceExceptions(prepareTablesTasks, "The following exceptions were thrown attempting to prepare tables:\n");
     } catch (NotImplementedError | NotImplementedException e) {
       log.warn(
-          "Could not prepare schemas or tables because components are not implemented, this should not be required for this destination to succeed");
+          "Could not prepare schemas or tables because this is not implemented for this destination, this should not be required for this destination to succeed");
     }
   }
 
diff --git a/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/TyperDeduperUtil.kt b/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/TyperDeduperUtil.kt
index 833b63df1e772..f1ed3d1ba38a7 100644
--- a/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/TyperDeduperUtil.kt
+++ b/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/TyperDeduperUtil.kt
@@ -3,6 +3,10 @@ package io.airbyte.integrations.base.destination.typing_deduping
 import com.google.common.collect.Streams
 import java.util.*
 
+/**
+ * Extracts all the "raw" and "final" schemas identified in the [parsedCatalog] and ensures they
+ * exist in the Destination Database.
+ */
 fun <T> prepareAllSchemas(parsedCatalog: ParsedCatalog, sqlGenerator: SqlGenerator<T>, destinationHandler: DestinationHandler<T>) {
     val rawSchema =
         parsedCatalog.streams.stream().map { stream: StreamConfig -> stream.id.rawNamespace }
diff --git a/airbyte-integrations/connectors/destination-clickhouse/build.gradle b/airbyte-integrations/connectors/destination-clickhouse/build.gradle
index feb110ecd7a6e..daf34f9f933a0 100644
--- a/airbyte-integrations/connectors/destination-clickhouse/build.gradle
+++ b/airbyte-integrations/connectors/destination-clickhouse/build.gradle
@@ -4,7 +4,7 @@ plugins {
 }
 
 airbyteJavaConnector {
-    cdkVersionRequired = '0.15.0'
+    cdkVersionRequired = '0.17.0'
     features = ['db-destinations', 's3-destinations', 'typing-deduping']
     useLocalCdk = true
 }
diff --git a/airbyte-integrations/connectors/destination-clickhouse/src/main/java/io/airbyte/integrations/destination/clickhouse/ClickhouseSqlOperations.java b/airbyte-integrations/connectors/destination-clickhouse/src/main/java/io/airbyte/integrations/destination/clickhouse/ClickhouseSqlOperations.java
index 66c7dcf023c09..80f13c47c7a2e 100644
--- a/airbyte-integrations/connectors/destination-clickhouse/src/main/java/io/airbyte/integrations/destination/clickhouse/ClickhouseSqlOperations.java
+++ b/airbyte-integrations/connectors/destination-clickhouse/src/main/java/io/airbyte/integrations/destination/clickhouse/ClickhouseSqlOperations.java
@@ -41,7 +41,7 @@ public String createTableQuery(final JdbcDatabase database, final String schemaN
         %s String,
         %s String,
         %s DateTime64(3, 'GMT') DEFAULT now(),
-        %s DateTime64(3, 'GMT') DEFAULT now(),
+        %s DateTime64(3, 'GMT') NULL,
         PRIMARY KEY(%s)
         )
         ENGINE = MergeTree;
diff --git a/airbyte-integrations/connectors/destination-clickhouse/src/main/resources/spec.json b/airbyte-integrations/connectors/destination-clickhouse/src/main/resources/spec.json
index 01da3d569796f..26b6fb7013812 100644
--- a/airbyte-integrations/connectors/destination-clickhouse/src/main/resources/spec.json
+++ b/airbyte-integrations/connectors/destination-clickhouse/src/main/resources/spec.json
@@ -64,13 +64,6 @@
         "description": "The schema to write raw tables into (default: airbyte_internal)",
         "title": "Raw Table Schema Name",
         "order": 7
-      },
-      "use_v2_raw_table": {
-        "type": "boolean",
-        "description": "(For internal use.) Declares this uses the v2 raw table schema",
-        "title": "(Internal) Use V2 Raw Table Schema",
-        "airbyte_hidden": true,
-        "default": true
       }
     }
   }
diff --git a/docs/integrations/destinations/clickhouse.md b/docs/integrations/destinations/clickhouse.md
index eccadec298021..64c3da36f6b8b 100644
--- a/docs/integrations/destinations/clickhouse.md
+++ b/docs/integrations/destinations/clickhouse.md
@@ -44,18 +44,17 @@ You can create such a user by running:
 
 ```
 GRANT CREATE ON * TO airbyte_user;
-GRANT CREATE ON default * TO airbyte_user
-
-GRANT DROP ON * TO airbyte_user
-GRANT TRUNCATE ON * TO airbyte_user
-GRANT INSERT ON * TO airbyte_user
-GRANT SELECT ON * TO airbyte_user
-GRANT CREATE DATABASE ON airbyte_internal.* TO airbyte_user
-GRANT CREATE TABLE ON airbyte_internal.* TO airbyte_user
-GRANT DROP ON airbyte_internal.* TO airbyte_user
-GRANT TRUNCATE ON airbyte_internal.* TO airbyte_user
-GRANT INSERT ON airbyte_internal.* TO airbyte_user
-GRANT SELECT ON airbyte_internal.* TO airbyte_user
+GRANT CREATE ON default * TO airbyte_user;
+GRANT DROP ON * TO airbyte_user;
+GRANT TRUNCATE ON * TO airbyte_user;
+GRANT INSERT ON * TO airbyte_user;
+GRANT SELECT ON * TO airbyte_user;
+GRANT CREATE DATABASE ON airbyte_internal.* TO airbyte_user;
+GRANT CREATE TABLE ON airbyte_internal.* TO airbyte_user;
+GRANT DROP ON airbyte_internal.* TO airbyte_user;
+GRANT TRUNCATE ON airbyte_internal.* TO airbyte_user;
+GRANT INSERT ON airbyte_internal.* TO airbyte_user;
+GRANT SELECT ON airbyte_internal.* TO airbyte_user;
 ```
 
 You can also use a pre-existing user but we highly recommend creating a dedicated user for Airbyte.

From e5cfdf4913a5f8b1cc224a3d39ac905d708e20fc Mon Sep 17 00:00:00 2001
From: Joe Bell <jbfbell@gmail.com>
Date: Mon, 29 Jan 2024 15:57:33 -0800
Subject: [PATCH 07/96] formatting

---
 .../integrations/destination/jdbc/AbstractJdbcDestination.java   | 1 +
 .../typing_deduping/NoOpTyperDeduperWithV1V2Migrations.java      | 1 -
 2 files changed, 1 insertion(+), 1 deletion(-)

diff --git a/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/AbstractJdbcDestination.java b/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/AbstractJdbcDestination.java
index 763277771ff5f..89b837408e55b 100644
--- a/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/AbstractJdbcDestination.java
+++ b/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/AbstractJdbcDestination.java
@@ -303,6 +303,7 @@ public SerializedAirbyteMessageConsumer getSerializedMessageConsumer(final JsonN
 
   /**
    * Creates the appropriate TyperDeduper class for the jdbc destination and the user's configuration
+   *
    * @param config the configuration for the connection
    * @param catalog the catalog for the connection
    * @param database a database instance
diff --git a/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/NoOpTyperDeduperWithV1V2Migrations.java b/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/NoOpTyperDeduperWithV1V2Migrations.java
index 6e37951202eda..703b8446711ae 100644
--- a/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/NoOpTyperDeduperWithV1V2Migrations.java
+++ b/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/NoOpTyperDeduperWithV1V2Migrations.java
@@ -54,7 +54,6 @@ public NoOpTyperDeduperWithV1V2Migrations(final SqlGenerator<DialectTableDefinit
         new BasicThreadFactory.Builder().namingPattern(TYPE_AND_DEDUPE_THREAD_NAME).build());
   }
 
-
   @Override
   public void prepareTables() throws Exception {
     try {

From 3a005d711cc9f6a4964bc48a70e1922e4f674054 Mon Sep 17 00:00:00 2001
From: "Aaron (\"AJ\") Steers" <aj@airbyte.io>
Date: Mon, 29 Jan 2024 22:07:21 -0800
Subject: [PATCH 08/96] AirbyteLib: Installation improvements and improved
 error handling (#34572)

---
 airbyte-lib/airbyte_lib/_executor.py          | 310 +++++++++++++-----
 .../_factories/connector_factories.py         |  76 +++--
 airbyte-lib/airbyte_lib/exceptions.py         |  12 +-
 airbyte-lib/airbyte_lib/registry.py           |  73 +++--
 airbyte-lib/airbyte_lib/source.py             |  81 ++++-
 airbyte-lib/airbyte_lib/validate.py           |  10 +-
 airbyte-lib/docs/generated/airbyte_lib.html   |  46 ++-
 .../source-test/source_test/__init__.py       |   0
 .../tests/integration_tests/test_install.py   |  23 ++
 .../integration_tests/test_integration.py     | 167 +++++++---
 10 files changed, 609 insertions(+), 189 deletions(-)
 create mode 100644 airbyte-lib/tests/integration_tests/fixtures/source-test/source_test/__init__.py
 create mode 100644 airbyte-lib/tests/integration_tests/test_install.py

diff --git a/airbyte-lib/airbyte_lib/_executor.py b/airbyte-lib/airbyte_lib/_executor.py
index 20899f892006c..a43d56249163d 100644
--- a/airbyte-lib/airbyte_lib/_executor.py
+++ b/airbyte-lib/airbyte_lib/_executor.py
@@ -1,22 +1,23 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 from __future__ import annotations
 
+import shlex
 import subprocess
 import sys
 from abc import ABC, abstractmethod
-from contextlib import contextmanager
+from contextlib import contextmanager, suppress
 from pathlib import Path
-from typing import IO, TYPE_CHECKING, Any, NoReturn
+from shutil import rmtree
+from typing import IO, TYPE_CHECKING, Any, NoReturn, cast
 
 from airbyte_lib import exceptions as exc
+from airbyte_lib.registry import ConnectorMetadata
 from airbyte_lib.telemetry import SourceTelemetryInfo, SourceType
 
 
 if TYPE_CHECKING:
     from collections.abc import Generator, Iterable, Iterator
 
-    from airbyte_lib.registry import ConnectorMetadata
-
 
 _LATEST_VERSION = "latest"
 
@@ -24,22 +25,37 @@
 class Executor(ABC):
     def __init__(
         self,
-        metadata: ConnectorMetadata,
+        *,
+        name: str | None = None,
+        metadata: ConnectorMetadata | None = None,
         target_version: str | None = None,
     ) -> None:
-        self.metadata = metadata
-        self.enforce_version = target_version is not None
-        if target_version is None or target_version == _LATEST_VERSION:
-            self.target_version = metadata.latest_available_version
-        else:
-            self.target_version = target_version
+        """Initialize a connector executor.
+
+        The 'name' param is required if 'metadata' is None.
+        """
+        if not name and not metadata:
+            raise exc.AirbyteLibInternalError(message="Either name or metadata must be provided.")
+
+        self.name: str = name or cast(ConnectorMetadata, metadata).name  # metadata is not None here
+        self.metadata: ConnectorMetadata | None = metadata
+        self.enforce_version: bool = target_version is not None
+
+        self.reported_version: str | None = None
+        self.target_version: str | None = None
+        if target_version:
+            if metadata and target_version == _LATEST_VERSION:
+                self.target_version = metadata.latest_available_version
+            else:
+                self.target_version = target_version
 
     @abstractmethod
     def execute(self, args: list[str]) -> Iterator[str]:
         pass
 
     @abstractmethod
-    def ensure_installation(self) -> None:
+    def ensure_installation(self, *, auto_fix: bool = True) -> None:
+        _ = auto_fix
         pass
 
     @abstractmethod
@@ -101,71 +117,150 @@ def _stream_from_file(file: IO[str]) -> Generator[str, Any, None]:
 
         # If the exit code is not 0 or -15 (SIGTERM), raise an exception
         if exit_code not in (0, -15):
-            raise exc.AirbyteSubprocessFailedError(exit_code=exit_code)
+            raise exc.AirbyteSubprocessFailedError(
+                run_args=args,
+                exit_code=exit_code,
+            )
 
 
 class VenvExecutor(Executor):
     def __init__(
         self,
-        metadata: ConnectorMetadata,
+        name: str | None = None,
+        *,
+        metadata: ConnectorMetadata | None = None,
         target_version: str | None = None,
         pip_url: str | None = None,
-        *,
-        install_if_missing: bool = False,
+        install_root: Path | None = None,
     ) -> None:
-        super().__init__(metadata, target_version)
-        self.install_if_missing = install_if_missing
+        """Initialize a connector executor that runs a connector in a virtual environment.
+
+        Args:
+            name: The name of the connector.
+            metadata: (Optional.) The metadata of the connector.
+            target_version: (Optional.) The version of the connector to install.
+            pip_url: (Optional.) The pip URL of the connector to install.
+            install_root: (Optional.) The root directory where the virtual environment will be
+                created. If not provided, the current working directory will be used.
+        """
+        super().__init__(name=name, metadata=metadata, target_version=target_version)
 
         # This is a temporary install path that will be replaced with a proper package
         # name once they are published.
-        # TODO: Replace with `f"airbyte-{self.metadata.name}"`
-        self.pip_url = pip_url or f"../airbyte-integrations/connectors/{self.metadata.name}"
+        # TODO: Replace with `f"airbyte-{self.name}"`
+        self.pip_url = pip_url or f"../airbyte-integrations/connectors/{self.name}"
+        self.install_root = install_root or Path.cwd()
 
     def _get_venv_name(self) -> str:
-        return f".venv-{self.metadata.name}"
+        return f".venv-{self.name}"
+
+    def _get_venv_path(self) -> Path:
+        return self.install_root / self._get_venv_name()
 
     def _get_connector_path(self) -> Path:
-        return Path(self._get_venv_name(), "bin", self.metadata.name)
+        return self._get_venv_path() / "bin" / self.name
 
     def _run_subprocess_and_raise_on_failure(self, args: list[str]) -> None:
-        result = subprocess.run(args, check=False)
+        result = subprocess.run(
+            args,
+            check=False,
+            stderr=subprocess.PIPE,
+        )
         if result.returncode != 0:
-            raise exc.AirbyteConnectorInstallationError from exc.AirbyteSubprocessFailedError(
-                exit_code=result.returncode
+            raise exc.AirbyteSubprocessFailedError(
+                run_args=args,
+                exit_code=result.returncode,
+                log_text=result.stderr.decode("utf-8"),
             )
 
     def uninstall(self) -> None:
-        venv_name = self._get_venv_name()
-        if Path(venv_name).exists():
-            self._run_subprocess_and_raise_on_failure(["rm", "-rf", venv_name])
+        if self._get_venv_path().exists():
+            rmtree(str(self._get_venv_path()))
+
+        self.reported_version = None  # Reset the reported version from the previous installation
 
     def install(self) -> None:
-        venv_name = self._get_venv_name()
-        self._run_subprocess_and_raise_on_failure([sys.executable, "-m", "venv", venv_name])
+        """Install the connector in a virtual environment.
+
+        After installation, the installed version will be stored in self.reported_version.
+        """
+        self._run_subprocess_and_raise_on_failure(
+            [sys.executable, "-m", "venv", str(self._get_venv_path())]
+        )
 
-        pip_path = str(Path(venv_name) / "bin" / "pip")
+        pip_path = str(self._get_venv_path() / "bin" / "pip")
 
-        self._run_subprocess_and_raise_on_failure([pip_path, "install", "-e", self.pip_url])
+        try:
+            self._run_subprocess_and_raise_on_failure(
+                args=[pip_path, "install", *shlex.split(self.pip_url)]
+            )
+        except exc.AirbyteSubprocessFailedError as ex:
+            # If the installation failed, remove the virtual environment
+            # Otherwise, the connector will be considered as installed and the user may not be able
+            # to retry the installation.
+            with suppress(exc.AirbyteSubprocessFailedError):
+                self.uninstall()
 
-    def _get_installed_version(self) -> str:
+            raise exc.AirbyteConnectorInstallationError from ex
+
+        # Assuming the installation succeeded, store the installed version
+        self.reported_version = self._get_installed_version(raise_on_error=False, recheck=True)
+
+    def _get_installed_version(
+        self,
+        *,
+        raise_on_error: bool = False,
+        recheck: bool = False,
+    ) -> str | None:
         """Detect the version of the connector installed.
 
+        Returns the version string if it can be detected, otherwise None.
+
+        If raise_on_error is True, raise an exception if the version cannot be detected.
+
+        If recheck if False and the version has already been detected, return the cached value.
+
         In the venv, we run the following:
         > python -c "from importlib.metadata import version; print(version('<connector-name>'))"
         """
-        venv_name = self._get_venv_name()
-        connector_name = self.metadata.name
-        return subprocess.check_output(
-            [
-                Path(venv_name) / "bin" / "python",
-                "-c",
-                f"from importlib.metadata import version; print(version('{connector_name}'))",
-            ],
-            universal_newlines=True,
-        ).strip()
+        if not recheck and self.reported_version:
+            return self.reported_version
+
+        connector_name = self.name
+        if not self.interpreter_path.exists():
+            # No point in trying to detect the version if the interpreter does not exist
+            if raise_on_error:
+                raise exc.AirbyteLibInternalError(
+                    message="Connector's virtual environment interpreter could not be found.",
+                    context={
+                        "interpreter_path": self.interpreter_path,
+                    },
+                )
+            return None
+
+        try:
+            return subprocess.check_output(
+                [
+                    self.interpreter_path,
+                    "-c",
+                    f"from importlib.metadata import version; print(version('{connector_name}'))",
+                ],
+                universal_newlines=True,
+            ).strip()
+        except Exception:
+            if raise_on_error:
+                raise
+
+            return None
+
+    @property
+    def interpreter_path(self) -> Path:
+        return self._get_venv_path() / "bin" / "python"
 
     def ensure_installation(
         self,
+        *,
+        auto_fix: bool = True,
     ) -> None:
         """Ensure that the connector is installed in a virtual environment.
 
@@ -176,48 +271,77 @@ def ensure_installation(
         Note: Version verification is not supported for connectors installed from a
         local path.
         """
-        venv_name = f".venv-{self.metadata.name}"
-        venv_path = Path(venv_name)
-        if not venv_path.exists():
-            if not self.install_if_missing:
-                raise exc.AirbyteConnectorNotFoundError(
-                    message="Connector not available and venv does not exist.",
-                    guidance=(
-                        "Please ensure the connector is pre-installed or consider enabling "
-                        "`install_if_missing=True`."
-                    ),
+        # Store the installed version (or None if not installed)
+        if not self.reported_version:
+            self.reported_version = self._get_installed_version()
+
+        original_installed_version = self.reported_version
+
+        reinstalled = False
+        venv_name = f".venv-{self.name}"
+        if not self._get_venv_path().exists():
+            if not auto_fix:
+                raise exc.AirbyteConnectorInstallationError(
+                    message="Virtual environment does not exist.",
+                    connector_name=self.name,
+                    context={
+                        "venv_path": self._get_venv_path(),
+                    },
+                )
+
+            # If the venv path does not exist, install.
+            self.install()
+            reinstalled = True
+
+        elif not self._get_connector_path().exists():
+            if not auto_fix:
+                raise exc.AirbyteConnectorInstallationError(
+                    message="Could not locate connector executable within the virtual environment.",
+                    connector_name=self.name,
                     context={
-                        "connector_name": self.metadata.name,
-                        "venv_name": venv_name,
+                        "connector_path": self._get_connector_path(),
                     },
                 )
+
+            # If the connector path does not exist, uninstall and re-install.
+            # This is sometimes caused by a failed or partial installation.
+            self.uninstall()
             self.install()
+            reinstalled = True
+
+        # By now, everything should be installed. Raise an exception if not.
 
         connector_path = self._get_connector_path()
         if not connector_path.exists():
-            raise exc.AirbyteConnectorNotFoundError(
-                connector_name=self.metadata.name,
+            raise exc.AirbyteConnectorInstallationError(
+                message="Connector's executable could not be found within the virtual environment.",
+                connector_name=self.name,
                 context={
-                    "venv_name": venv_name,
+                    "connector_path": self._get_connector_path(),
                 },
             ) from FileNotFoundError(connector_path)
 
         if self.enforce_version:
-            installed_version = self._get_installed_version()
-            if installed_version != self.target_version:
-                # If the version doesn't match, reinstall
-                self.install()
+            version_after_reinstall: str | None = None
+            if self.reported_version != self.target_version:
+                if auto_fix and not reinstalled:
+                    # If we haven't already reinstalled above, reinstall now.
+                    self.install()
+                    reinstalled = True
+
+                if reinstalled:
+                    version_after_reinstall = self.reported_version
 
                 # Check the version again
-                version_after_install = self._get_installed_version()
-                if version_after_install != self.target_version:
+                if self.reported_version != self.target_version:
                     raise exc.AirbyteConnectorInstallationError(
-                        connector_name=self.metadata.name,
+                        message="Connector's reported version does not match the target version.",
+                        connector_name=self.name,
                         context={
                             "venv_name": venv_name,
                             "target_version": self.target_version,
-                            "installed_version": installed_version,
-                            "version_after_install": version_after_install,
+                            "original_installed_version": original_installed_version,
+                            "version_after_reinstall": version_after_reinstall,
                         },
                     )
 
@@ -228,33 +352,69 @@ def execute(self, args: list[str]) -> Iterator[str]:
             yield from stream
 
     def get_telemetry_info(self) -> SourceTelemetryInfo:
-        return SourceTelemetryInfo(self.metadata.name, SourceType.VENV, self.target_version)
+        return SourceTelemetryInfo(
+            name=self.name,
+            type=SourceType.VENV,
+            version=self.reported_version,
+        )
 
 
 class PathExecutor(Executor):
-    def ensure_installation(self) -> None:
+    def __init__(
+        self,
+        name: str | None = None,
+        *,
+        path: Path,
+        target_version: str | None = None,
+    ) -> None:
+        """Initialize a connector executor that runs a connector from a local path.
+
+        If path is simply the name of the connector, it will be expected to exist in the current
+        PATH or in the current working directory.
+        """
+        self.path: Path = path
+        name = name or path.name
+        super().__init__(name=name, target_version=target_version)
+
+    def ensure_installation(
+        self,
+        *,
+        auto_fix: bool = True,
+    ) -> None:
+        """Ensure that the connector executable can be found.
+
+        The auto_fix parameter is ignored for this executor type.
+        """
+        _ = auto_fix
         try:
             self.execute(["spec"])
         except Exception as e:
-            raise exc.AirbyteConnectorNotFoundError(
-                connector_name=self.metadata.name,
+            # TODO: Improve error handling. We should try to distinguish between
+            #       a connector that is not installed and a connector that is not
+            #       working properly.
+            raise exc.AirbyteConnectorExecutableNotFoundError(
+                connector_name=self.name,
             ) from e
 
     def install(self) -> NoReturn:
         raise exc.AirbyteConnectorInstallationError(
             message="Connector cannot be installed because it is not managed by airbyte-lib.",
-            connector_name=self.metadata.name,
+            connector_name=self.name,
         )
 
     def uninstall(self) -> NoReturn:
         raise exc.AirbyteConnectorInstallationError(
             message="Connector cannot be uninstalled because it is not managed by airbyte-lib.",
-            connector_name=self.metadata.name,
+            connector_name=self.name,
         )
 
     def execute(self, args: list[str]) -> Iterator[str]:
-        with _stream_from_subprocess([self.metadata.name, *args]) as stream:
+        with _stream_from_subprocess([str(self.path), *args]) as stream:
             yield from stream
 
     def get_telemetry_info(self) -> SourceTelemetryInfo:
-        return SourceTelemetryInfo(self.metadata.name, SourceType.LOCAL_INSTALL, version=None)
+        return SourceTelemetryInfo(
+            str(self.name),
+            SourceType.LOCAL_INSTALL,
+            version=self.reported_version,
+        )
diff --git a/airbyte-lib/airbyte_lib/_factories/connector_factories.py b/airbyte-lib/airbyte_lib/_factories/connector_factories.py
index 4dbe8c6f41f06..197ed61142c69 100644
--- a/airbyte-lib/airbyte_lib/_factories/connector_factories.py
+++ b/airbyte-lib/airbyte_lib/_factories/connector_factories.py
@@ -1,11 +1,13 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 from __future__ import annotations
 
+import shutil
+from pathlib import Path
 from typing import Any
 
-from airbyte_lib._executor import Executor, PathExecutor, VenvExecutor
-from airbyte_lib.exceptions import AirbyteLibInputError
-from airbyte_lib.registry import get_connector_metadata
+from airbyte_lib import exceptions as exc
+from airbyte_lib._executor import PathExecutor, VenvExecutor
+from airbyte_lib.registry import ConnectorMetadata, get_connector_metadata
 from airbyte_lib.source import Source
 
 
@@ -15,7 +17,7 @@ def get_connector(
     pip_url: str | None = None,
     config: dict[str, Any] | None = None,
     *,
-    use_local_install: bool = False,
+    local_executable: Path | str | None = None,
     install_if_missing: bool = True,
 ) -> Source:
     """Get a connector by name and version.
@@ -29,34 +31,58 @@ def get_connector(
             connector name.
         config: connector config - if not provided, you need to set it later via the set_config
             method.
-        use_local_install: whether to use a virtual environment to run the connector. If True, the
-            connector is expected to be available on the path (e.g. installed via pip). If False,
-            the connector will be installed automatically in a virtual environment.
-        install_if_missing: whether to install the connector if it is not available locally. This
-            parameter is ignored if use_local_install is True.
+        local_executable: If set, the connector will be assumed to already be installed and will be
+            executed using this path or executable name. Otherwise, the connector will be installed
+            automatically in a virtual environment.
+        install_if_missing: Whether to install the connector if it is not available locally. This
+            parameter is ignored when local_executable is set.
     """
-    metadata = get_connector_metadata(name)
-    if use_local_install:
+    if local_executable:
         if pip_url:
-            raise AirbyteLibInputError(
-                message="Param 'pip_url' is not supported when 'use_local_install' is True."
+            raise exc.AirbyteLibInputError(
+                message="Param 'pip_url' is not supported when 'local_executable' is set."
             )
         if version:
-            raise AirbyteLibInputError(
-                message="Param 'version' is not supported when 'use_local_install' is True."
+            raise exc.AirbyteLibInputError(
+                message="Param 'version' is not supported when 'local_executable' is set."
             )
-        executor: Executor = PathExecutor(
-            metadata=metadata,
-            target_version=version,
-        )
 
-    else:
-        executor = VenvExecutor(
-            metadata=metadata,
-            target_version=version,
-            install_if_missing=install_if_missing,
-            pip_url=pip_url,
+        if isinstance(local_executable, str):
+            if "/" in local_executable or "\\" in local_executable:
+                # Assume this is a path
+                local_executable = Path(local_executable).absolute()
+            else:
+                which_executable = shutil.which(local_executable)
+                if which_executable is None:
+                    raise FileNotFoundError(local_executable)
+                local_executable = Path(which_executable).absolute()
+
+        return Source(
+            name=name,
+            config=config,
+            executor=PathExecutor(
+                name=name,
+                path=local_executable,
+            ),
         )
+
+    metadata: ConnectorMetadata | None = None
+    try:
+        metadata = get_connector_metadata(name)
+    except exc.AirbyteConnectorNotRegisteredError:
+        if not pip_url:
+            # We don't have a pip url or registry entry, so we can't install the connector
+            raise
+
+    executor = VenvExecutor(
+        name=name,
+        metadata=metadata,
+        target_version=version,
+        pip_url=pip_url,
+    )
+    if install_if_missing:
+        executor.ensure_installation()
+
     return Source(
         executor=executor,
         name=name,
diff --git a/airbyte-lib/airbyte_lib/exceptions.py b/airbyte-lib/airbyte_lib/exceptions.py
index 3c6336d031033..934e936d4d489 100644
--- a/airbyte-lib/airbyte_lib/exceptions.py
+++ b/airbyte-lib/airbyte_lib/exceptions.py
@@ -174,6 +174,14 @@ class AirbyteConnectorRegistryError(AirbyteError):
     """Error when accessing the connector registry."""
 
 
+@dataclass
+class AirbyteConnectorNotRegisteredError(AirbyteConnectorRegistryError):
+    """Connector not found in registry."""
+
+    connector_name: str | None = None
+    guidance = "Please double check the connector name."
+
+
 # Connector Errors
 
 
@@ -184,8 +192,8 @@ class AirbyteConnectorError(AirbyteError):
     connector_name: str | None = None
 
 
-class AirbyteConnectorNotFoundError(AirbyteConnectorError):
-    """Connector not found."""
+class AirbyteConnectorExecutableNotFoundError(AirbyteConnectorError):
+    """Connector executable not found."""
 
 
 class AirbyteConnectorInstallationError(AirbyteConnectorError):
diff --git a/airbyte-lib/airbyte_lib/registry.py b/airbyte-lib/airbyte_lib/registry.py
index bd030a867ff00..a7faf64eb9195 100644
--- a/airbyte-lib/airbyte_lib/registry.py
+++ b/airbyte-lib/airbyte_lib/registry.py
@@ -3,6 +3,7 @@
 
 import json
 import os
+from copy import copy
 from dataclasses import dataclass
 from pathlib import Path
 
@@ -12,32 +13,60 @@
 from airbyte_lib.version import get_version
 
 
+__cache: dict[str, ConnectorMetadata] | None = None
+
+
+REGISTRY_ENV_VAR = "AIRBYTE_LOCAL_REGISTRY"
+REGISTRY_URL = "https://connectors.airbyte.com/files/registries/v0/oss_registry.json"
+
+
 @dataclass
 class ConnectorMetadata:
     name: str
     latest_available_version: str
 
 
-_cache: dict[str, ConnectorMetadata] | None = None
+def _get_registry_url() -> str:
+    if REGISTRY_ENV_VAR in os.environ:
+        return str(os.environ.get(REGISTRY_ENV_VAR))
 
-REGISTRY_URL = "https://connectors.airbyte.com/files/registries/v0/oss_registry.json"
+    return REGISTRY_URL
 
 
-def _update_cache() -> None:
-    global _cache
-    if os.environ.get("AIRBYTE_LOCAL_REGISTRY"):
-        with Path(str(os.environ.get("AIRBYTE_LOCAL_REGISTRY"))).open() as f:
-            data = json.load(f)
-    else:
+def _get_registry_cache(*, force_refresh: bool = False) -> dict[str, ConnectorMetadata]:
+    """Return the registry cache."""
+    global __cache
+    if __cache and not force_refresh:
+        return __cache
+
+    registry_url = _get_registry_url()
+    if registry_url.startswith("http"):
         response = requests.get(
-            REGISTRY_URL, headers={"User-Agent": f"airbyte-lib-{get_version()}"}
+            registry_url, headers={"User-Agent": f"airbyte-lib-{get_version()}"}
         )
         response.raise_for_status()
         data = response.json()
-    _cache = {}
+    else:
+        # Assume local file
+        with Path(registry_url).open() as f:
+            data = json.load(f)
+
+    new_cache: dict[str, ConnectorMetadata] = {}
+
     for connector in data["sources"]:
         name = connector["dockerRepository"].replace("airbyte/", "")
-        _cache[name] = ConnectorMetadata(name, connector["dockerImageTag"])
+        new_cache[name] = ConnectorMetadata(name, connector["dockerImageTag"])
+
+    if len(new_cache) == 0:
+        raise exc.AirbyteLibInternalError(
+            message="Connector registry is empty.",
+            context={
+                "registry_url": _get_registry_url(),
+            },
+        )
+
+    __cache = new_cache
+    return __cache
 
 
 def get_connector_metadata(name: str) -> ConnectorMetadata:
@@ -45,14 +74,20 @@ def get_connector_metadata(name: str) -> ConnectorMetadata:
 
     If the cache is empty, populate by calling update_cache.
     """
-    if not _cache:
-        _update_cache()
-    if not _cache or name not in _cache:
-        raise exc.AirbyteLibInputError(
-            message="Connector name not found in registry.",
-            guidance="Please double check the connector name.",
+    cache = copy(_get_registry_cache())
+    if not cache:
+        raise exc.AirbyteLibInternalError(
+            message="Connector registry could not be loaded.",
+            context={
+                "registry_url": _get_registry_url(),
+            },
+        )
+    if name not in cache:
+        raise exc.AirbyteConnectorNotRegisteredError(
+            connector_name=name,
             context={
-                "connector_name": name,
+                "registry_url": _get_registry_url(),
+                "available_connectors": sorted(cache.keys()),
             },
         )
-    return _cache[name]
+    return cache[name]
diff --git a/airbyte-lib/airbyte_lib/source.py b/airbyte-lib/airbyte_lib/source.py
index ec37e11791dd1..4db25b3afae09 100644
--- a/airbyte-lib/airbyte_lib/source.py
+++ b/airbyte-lib/airbyte_lib/source.py
@@ -7,6 +7,7 @@
 from typing import TYPE_CHECKING, Any
 
 import jsonschema
+import yaml
 
 from airbyte_protocol.models import (
     AirbyteCatalog,
@@ -68,7 +69,13 @@ def __init__(
         name: str,
         config: dict[str, Any] | None = None,
         streams: list[str] | None = None,
+        *,
+        validate: bool = False,
     ) -> None:
+        """Initialize the source.
+
+        If config is provided, it will be validated against the spec if validate is True.
+        """
         self._processed_records = 0
         self.executor = executor
         self.name = name
@@ -79,7 +86,7 @@ def __init__(
         self._spec: ConnectorSpecification | None = None
         self._selected_stream_names: list[str] | None = None
         if config is not None:
-            self.set_config(config)
+            self.set_config(config, validate=validate)
         if streams is not None:
             self.set_streams(streams)
 
@@ -102,8 +109,22 @@ def set_streams(self, streams: list[str]) -> None:
                 )
         self._selected_stream_names = streams
 
-    def set_config(self, config: dict[str, Any]) -> None:
-        self._validate_config(config)
+    def set_config(
+        self,
+        config: dict[str, Any],
+        *,
+        validate: bool = False,
+    ) -> None:
+        """Set the config for the connector.
+
+        If validate is True, raise an exception if the config fails validation.
+
+        If validate is False, validation will be deferred until check() or validate_config()
+        is called.
+        """
+        if validate:
+            self.validate_config(config)
+
         self._config_dict = config
 
     @property
@@ -131,9 +152,13 @@ def _discover(self) -> AirbyteCatalog:
                 log_text=self._last_log_messages,
             )
 
-    def _validate_config(self, config: dict[str, Any]) -> None:
-        """Validate the config against the spec."""
+    def validate_config(self, config: dict[str, Any] | None = None) -> None:
+        """Validate the config against the spec.
+
+        If config is not provided, the already-set config will be validated.
+        """
         spec = self._get_spec(force_refresh=False)
+        config = self._config if config is None else config
         jsonschema.validate(config, spec.connectionSpecification)
 
     def get_available_streams(self) -> list[str]:
@@ -161,6 +186,21 @@ def _get_spec(self, *, force_refresh: bool = False) -> ConnectorSpecification:
             log_text=self._last_log_messages,
         )
 
+    @property
+    def _yaml_spec(self) -> str:
+        """Get the spec as a yaml string.
+
+        For now, the primary use case is for writing and debugging a valid config for a source.
+
+        This is private for now because we probably want better polish before exposing this
+        as a stable interface. This will also get easier when we have docs links with this info
+        for each connector.
+        """
+        spec_obj: ConnectorSpecification = self._get_spec()
+        spec_dict = spec_obj.dict(exclude_unset=True)
+        # convert to a yaml string
+        return yaml.dump(spec_dict)
+
     @property
     def discovered_catalog(self) -> AirbyteCatalog:
         """Get the raw catalog for the given streams.
@@ -248,17 +288,23 @@ def check(self) -> None:
         * Make sure the subprocess is killed when the function returns.
         """
         with as_temp_files([self._config]) as [config_file]:
-            for msg in self._execute(["check", "--config", config_file]):
-                if msg.type == Type.CONNECTION_STATUS and msg.connectionStatus:
-                    if msg.connectionStatus.status != Status.FAILED:
-                        return  # Success!
-
-                    raise exc.AirbyteConnectorCheckFailedError(
-                        context={
-                            "message": msg.connectionStatus.message,
-                        }
-                    )
-            raise exc.AirbyteConnectorCheckFailedError(log_text=self._last_log_messages)
+            try:
+                for msg in self._execute(["check", "--config", config_file]):
+                    if msg.type == Type.CONNECTION_STATUS and msg.connectionStatus:
+                        if msg.connectionStatus.status != Status.FAILED:
+                            return  # Success!
+
+                        raise exc.AirbyteConnectorCheckFailedError(
+                            context={
+                                "message": msg.connectionStatus.message,
+                            }
+                        )
+                raise exc.AirbyteConnectorCheckFailedError(log_text=self._last_log_messages)
+            except exc.AirbyteConnectorReadError as ex:
+                raise exc.AirbyteConnectorCheckFailedError(
+                    message="The connector failed to check the connection.",
+                    log_text=ex.log_text,
+                ) from ex
 
     def install(self) -> None:
         """Install the connector if it is not yet installed."""
@@ -338,7 +384,8 @@ def _execute(self, args: list[str]) -> Iterator[AirbyteMessage]:
         * Read the output line by line of the subprocess and serialize them AirbyteMessage objects.
           Drop if not valid.
         """
-        self.executor.ensure_installation()
+        # Fail early if the connector is not installed.
+        self.executor.ensure_installation(auto_fix=False)
 
         try:
             self._last_log_messages = []
diff --git a/airbyte-lib/airbyte_lib/validate.py b/airbyte-lib/airbyte_lib/validate.py
index 75eab7e3fd394..551960ed5250d 100644
--- a/airbyte-lib/airbyte_lib/validate.py
+++ b/airbyte-lib/airbyte_lib/validate.py
@@ -42,11 +42,16 @@ def _parse_args() -> argparse.Namespace:
 
 
 def _run_subprocess_and_raise_on_failure(args: list[str]) -> None:
-    result = subprocess.run(args, check=False)
+    result = subprocess.run(
+        args,
+        check=False,
+        stderr=subprocess.PIPE,
+    )
     if result.returncode != 0:
         raise exc.AirbyteSubprocessFailedError(
             run_args=args,
             exit_code=result.returncode,
+            log_text=result.stderr.decode("utf-8"),
         )
 
 
@@ -55,7 +60,8 @@ def full_tests(connector_name: str, sample_config: str) -> None:
     source = ab.get_connector(
         # TODO: FIXME: noqa: SIM115, PTH123
         connector_name,
-        config=json.load(open(sample_config)),  # noqa: SIM115, PTH123
+        config=json.load(open(sample_config)),  # noqa: SIM115, PTH123,
+        install_if_missing=False,
     )
 
     print("Running check...")
diff --git a/airbyte-lib/docs/generated/airbyte_lib.html b/airbyte-lib/docs/generated/airbyte_lib.html
index c8d9f47128ea3..ba7c11e54e3d9 100644
--- a/airbyte-lib/docs/generated/airbyte_lib.html
+++ b/airbyte-lib/docs/generated/airbyte_lib.html
@@ -254,7 +254,7 @@ <h5>Inherited Members</h5>
                     <div class="attr function">
             
         <span class="def">def</span>
-        <span class="name">get_connector</span><span class="signature pdoc-code multiline">(<span class="param">	<span class="n">name</span><span class="p">:</span> <span class="nb">str</span>,</span><span class="param">	<span class="n">version</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param">	<span class="n">pip_url</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param">	<span class="n">config</span><span class="p">:</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">typing</span><span class="o">.</span><span class="n">Any</span><span class="p">]</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param">	<span class="o">*</span>,</span><span class="param">	<span class="n">use_local_install</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span>,</span><span class="param">	<span class="n">install_if_missing</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span></span><span class="return-annotation">) -> <span class="n"><a href="#Source">Source</a></span>:</span></span>
+        <span class="name">get_connector</span><span class="signature pdoc-code multiline">(<span class="param">	<span class="n">name</span><span class="p">:</span> <span class="nb">str</span>,</span><span class="param">	<span class="n">version</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param">	<span class="n">pip_url</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param">	<span class="n">config</span><span class="p">:</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">typing</span><span class="o">.</span><span class="n">Any</span><span class="p">]</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param">	<span class="o">*</span>,</span><span class="param">	<span class="n">local_executable</span><span class="p">:</span> <span class="n">pathlib</span><span class="o">.</span><span class="n">Path</span> <span class="o">|</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param">	<span class="n">install_if_missing</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span></span><span class="return-annotation">) -> <span class="n"><a href="#Source">Source</a></span>:</span></span>
 
         
     </div>
@@ -271,11 +271,11 @@ <h5>Inherited Members</h5>
         connector name.
     config: connector config - if not provided, you need to set it later via the set_config
         method.
-    use_local_install: whether to use a virtual environment to run the connector. If True, the
-        connector is expected to be available on the path (e.g. installed via pip). If False,
-        the connector will be installed automatically in a virtual environment.
-    install_if_missing: whether to install the connector if it is not available locally. This
-        parameter is ignored if use_local_install is True.</p>
+    local_executable: If set, the connector will be assumed to already be installed and will be
+        executed using this path or executable name. Otherwise, the connector will be installed
+        automatically in a virtual environment.
+    install_if_missing: Whether to install the connector if it is not available locally. This
+        parameter is ignored when local_executable is set.</p>
 </div>
 
 
@@ -409,13 +409,17 @@ <h5>Inherited Members</h5>
                             <div id="Source.__init__" class="classattr">
                                 <div class="attr function">
             
-        <span class="name">Source</span><span class="signature pdoc-code multiline">(<span class="param">	<span class="n">executor</span><span class="p">:</span> <span class="n">airbyte_lib</span><span class="o">.</span><span class="n">_executor</span><span class="o">.</span><span class="n">Executor</span>,</span><span class="param">	<span class="n">name</span><span class="p">:</span> <span class="nb">str</span>,</span><span class="param">	<span class="n">config</span><span class="p">:</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">typing</span><span class="o">.</span><span class="n">Any</span><span class="p">]</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param">	<span class="n">streams</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span></span>)</span>
+        <span class="name">Source</span><span class="signature pdoc-code multiline">(<span class="param">	<span class="n">executor</span><span class="p">:</span> <span class="n">airbyte_lib</span><span class="o">.</span><span class="n">_executor</span><span class="o">.</span><span class="n">Executor</span>,</span><span class="param">	<span class="n">name</span><span class="p">:</span> <span class="nb">str</span>,</span><span class="param">	<span class="n">config</span><span class="p">:</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">typing</span><span class="o">.</span><span class="n">Any</span><span class="p">]</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param">	<span class="n">streams</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param">	<span class="o">*</span>,</span><span class="param">	<span class="n">validate</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span></span>)</span>
 
         
     </div>
     <a class="headerlink" href="#Source.__init__"></a>
     
-    
+            <div class="docstring"><p>Initialize the source.</p>
+
+<p>If config is provided, it will be validated against the spec if validate is True.</p>
+</div>
+
 
                             </div>
                             <div id="Source.executor" class="classattr">
@@ -465,13 +469,37 @@ <h5>Inherited Members</h5>
                                 <div class="attr function">
             
         <span class="def">def</span>
-        <span class="name">set_config</span><span class="signature pdoc-code condensed">(<span class="param"><span class="bp">self</span>, </span><span class="param"><span class="n">config</span><span class="p">:</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">typing</span><span class="o">.</span><span class="n">Any</span><span class="p">]</span></span><span class="return-annotation">) -> <span class="kc">None</span>:</span></span>
+        <span class="name">set_config</span><span class="signature pdoc-code condensed">(<span class="param"><span class="bp">self</span>, </span><span class="param"><span class="n">config</span><span class="p">:</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">typing</span><span class="o">.</span><span class="n">Any</span><span class="p">]</span>, </span><span class="param"><span class="o">*</span>, </span><span class="param"><span class="n">validate</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span></span><span class="return-annotation">) -> <span class="kc">None</span>:</span></span>
 
         
     </div>
     <a class="headerlink" href="#Source.set_config"></a>
     
+            <div class="docstring"><p>Set the config for the connector.</p>
+
+<p>If validate is True, raise an exception if the config fails validation.</p>
+
+<p>If validate is False, validation will be deferred until check() or validate_config()
+is called.</p>
+</div>
+
+
+                            </div>
+                            <div id="Source.validate_config" class="classattr">
+                                <div class="attr function">
+            
+        <span class="def">def</span>
+        <span class="name">validate_config</span><span class="signature pdoc-code condensed">(<span class="param"><span class="bp">self</span>, </span><span class="param"><span class="n">config</span><span class="p">:</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">typing</span><span class="o">.</span><span class="n">Any</span><span class="p">]</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span></span><span class="return-annotation">) -> <span class="kc">None</span>:</span></span>
+
+        
+    </div>
+    <a class="headerlink" href="#Source.validate_config"></a>
     
+            <div class="docstring"><p>Validate the config against the spec.</p>
+
+<p>If config is not provided, the already-set config will be validated.</p>
+</div>
+
 
                             </div>
                             <div id="Source.get_available_streams" class="classattr">
diff --git a/airbyte-lib/tests/integration_tests/fixtures/source-test/source_test/__init__.py b/airbyte-lib/tests/integration_tests/fixtures/source-test/source_test/__init__.py
new file mode 100644
index 0000000000000..e69de29bb2d1d
diff --git a/airbyte-lib/tests/integration_tests/test_install.py b/airbyte-lib/tests/integration_tests/test_install.py
new file mode 100644
index 0000000000000..c93801489f376
--- /dev/null
+++ b/airbyte-lib/tests/integration_tests/test_install.py
@@ -0,0 +1,23 @@
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+
+from gettext import install
+import pytest
+
+from airbyte_lib._factories.connector_factories import get_connector
+from airbyte_lib import exceptions as exc
+
+
+def test_install_failure_log_pypi():
+    """Test that the install log is created and contains the expected content."""
+    with pytest.raises(exc.AirbyteConnectorNotRegisteredError):
+        source = get_connector("source-not-found")
+
+    with pytest.raises(exc.AirbyteConnectorInstallationError) as exc_info:
+        source = get_connector(
+            "source-not-found",
+            pip_url="https://pypi.org/project/airbyte-not-found",
+            install_if_missing=True,
+        )
+
+    # Check that the stderr log contains the expected content from a failed pip install
+    assert 'Could not install requirement' in str(exc_info.value.__cause__.log_text)
diff --git a/airbyte-lib/tests/integration_tests/test_integration.py b/airbyte-lib/tests/integration_tests/test_integration.py
index 5dcd1f54e649b..5d55861975776 100644
--- a/airbyte-lib/tests/integration_tests/test_integration.py
+++ b/airbyte-lib/tests/integration_tests/test_integration.py
@@ -3,6 +3,7 @@
 from collections.abc import Mapping
 import os
 import shutil
+import subprocess
 from typing import Any
 from unittest.mock import Mock, call, patch
 import tempfile
@@ -17,7 +18,7 @@
 import pytest
 
 from airbyte_lib.caches import PostgresCache, PostgresCacheConfig
-from airbyte_lib.registry import _update_cache
+from airbyte_lib import registry
 from airbyte_lib.version import get_version
 from airbyte_lib.results import ReadResult
 from airbyte_lib.datasets import CachedDataset, LazyDataset, SQLDataset
@@ -28,24 +29,32 @@
 import ulid
 
 
-@pytest.fixture(scope="module", autouse=True)
+LOCAL_TEST_REGISTRY_URL = "./tests/integration_tests/fixtures/registry.json"
+
+
+@pytest.fixture(scope="package", autouse=True)
 def prepare_test_env():
     """
     Prepare test environment. This will pre-install the test source from the fixtures array and set the environment variable to use the local json file as registry.
     """
-    if os.path.exists(".venv-source-test"):
-        shutil.rmtree(".venv-source-test")
+    venv_dir = ".venv-source-test"
+    if os.path.exists(venv_dir):
+        shutil.rmtree(venv_dir)
 
-    os.system("python -m venv .venv-source-test")
-    os.system(".venv-source-test/bin/pip install -e ./tests/integration_tests/fixtures/source-test")
+    subprocess.run(["python", "-m", "venv", venv_dir], check=True)
+    subprocess.run([f"{venv_dir}/bin/pip", "install", "-e", "./tests/integration_tests/fixtures/source-test"], check=True)
 
-    os.environ["AIRBYTE_LOCAL_REGISTRY"] = "./tests/integration_tests/fixtures/registry.json"
+    os.environ["AIRBYTE_LOCAL_REGISTRY"] = LOCAL_TEST_REGISTRY_URL
     os.environ["DO_NOT_TRACK"] = "true"
 
+    # Force-refresh the registry cache
+    _ = registry._get_registry_cache(force_refresh=True)
+
     yield
 
     shutil.rmtree(".venv-source-test")
 
+
 @pytest.fixture
 def expected_test_stream_data() -> dict[str, list[dict[str, str | int]]]:
     return {
@@ -58,15 +67,50 @@ def expected_test_stream_data() -> dict[str, list[dict[str, str | int]]]:
         ],
     }
 
-def test_list_streams(expected_test_stream_data: dict[str, list[dict[str, str | int]]]):
-    source = ab.get_connector("source-test", config={"apiKey": "test"})
+def test_registry_get():
+    assert registry._get_registry_url() == LOCAL_TEST_REGISTRY_URL
 
+    metadata = registry.get_connector_metadata("source-test")
+    assert metadata.name == "source-test"
+    assert metadata.latest_available_version == "0.0.1"
+
+
+def test_list_streams(expected_test_stream_data: dict[str, list[dict[str, str | int]]]):
+    source = ab.get_connector(
+        "source-test", config={"apiKey": "test"}, install_if_missing=False
+    )
     assert source.get_available_streams() == list(expected_test_stream_data.keys())
 
 
 def test_invalid_config():
-    with pytest.raises(Exception):
-        ab.get_connector("source-test", config={"apiKey": 1234})
+    source = ab.get_connector(
+        "source-test", config={"apiKey": 1234}, install_if_missing=False
+    )
+    with pytest.raises(exc.AirbyteConnectorCheckFailedError):
+        source.check()
+
+
+def test_ensure_installation_detection():
+    """Assert that install isn't called, since the connector is already installed by the fixture."""
+    with patch("airbyte_lib._executor.VenvExecutor.install") as mock_venv_install, \
+         patch("airbyte_lib.source.Source.install") as mock_source_install, \
+         patch("airbyte_lib._executor.VenvExecutor.ensure_installation") as mock_ensure_installed:
+        source = ab.get_connector(
+            "source-test",
+            config={"apiKey": 1234},
+            pip_url="https://pypi.org/project/airbyte-not-found",
+            install_if_missing=True,
+        )
+        assert mock_ensure_installed.call_count == 1
+        assert not mock_venv_install.called
+        assert not mock_source_install.called
+
+
+def test_source_yaml_spec():
+    source = ab.get_connector(
+        "source-test", config={"apiKey": 1234}, install_if_missing=False
+    )
+    assert source._yaml_spec.startswith("connectionSpecification:\n  $schema:")
 
 
 def test_non_existing_connector():
@@ -93,22 +137,35 @@ def test_version_enforcement(raises, latest_available_version, requested_version
 
     In this test, the actually installed version is 0.0.1
     """
-    _update_cache()
-    from airbyte_lib.registry import _cache
-    _cache["source-test"].latest_available_version = latest_available_version
-    if raises:
-        with pytest.raises(Exception):
-            ab.get_connector("source-test", version=requested_version, config={"apiKey": "abc"})
-    else:
-        ab.get_connector("source-test", version=requested_version, config={"apiKey": "abc"})
-
-    # reset
-    _cache["source-test"].latest_available_version = "0.0.1"
+    patched_entry = registry.ConnectorMetadata(
+        name="source-test", latest_available_version=latest_available_version
+    )
+    with patch.dict("airbyte_lib.registry.__cache", {"source-test": patched_entry}, clear=False):
+        if raises:
+            with pytest.raises(Exception):
+                source = ab.get_connector(
+                    "source-test",
+                    version=requested_version,
+                    config={"apiKey": "abc"},
+                    install_if_missing=False,
+                )
+                source.executor.ensure_installation(auto_fix=False)
+        else:
+            source = ab.get_connector(
+                "source-test",
+                version=requested_version,
+                config={"apiKey": "abc"},
+                install_if_missing=False,
+            )
+            source.executor.ensure_installation(auto_fix=False)
 
 
 def test_check():
-    source = ab.get_connector("source-test", config={"apiKey": "test"})
-
+    source = ab.get_connector(
+        "source-test",
+        config={"apiKey": "test"},
+        install_if_missing=False,
+    )
     source.check()
 
 
@@ -141,7 +198,7 @@ def assert_cache_data(expected_test_stream_data: dict[str, list[dict[str, str |
             pd.DataFrame(expected_test_stream_data[stream_name]),
             check_dtype=False,
         )
-    
+
     # validate that the cache doesn't contain any other streams
     if streams:
         assert len(list(cache.__iter__())) == len(streams)
@@ -459,6 +516,15 @@ def test_sync_with_merge_to_postgres(new_pg_cache_config: PostgresCacheConfig, e
             check_dtype=False,
         )
 
+
+def test_airbyte_lib_version() -> None:
+    assert get_version()
+    assert isinstance(get_version(), str)
+
+    # Ensure the version is a valid semantic version (x.y.z or x.y.z.alpha0)
+    assert 3 <= len(get_version().split(".")) <= 4
+
+
 @patch.dict('os.environ', {'DO_NOT_TRACK': ''})
 @patch('airbyte_lib.telemetry.requests')
 @patch('airbyte_lib.telemetry.datetime')
@@ -601,27 +667,48 @@ def test_failing_path_connector():
         ab.get_connector("source-test", config={"apiKey": "test"}, use_local_install=True)
 
 def test_succeeding_path_connector():
-    old_path = os.environ["PATH"]
+    new_path = f"{os.path.abspath('.venv-source-test/bin')}:{os.environ['PATH']}"
+
+    # Patch the PATH env var to include the test venv bin folder
+    with patch.dict(os.environ, {"PATH": new_path}):
+        source = ab.get_connector(
+            "source-test",
+            config={"apiKey": "test"},
+            local_executable="source-test",
+        )
+        source.check()
 
-    # set path to include the test venv bin folder
-    os.environ["PATH"] = f"{os.path.abspath('.venv-source-test/bin')}:{os.environ['PATH']}"
-    source = ab.get_connector("source-test", config={"apiKey": "test"}, use_local_install=True)
-    source.check()
+def test_install_uninstall():
+    with tempfile.TemporaryDirectory() as temp_dir:
+        source = ab.get_connector(
+            "source-test",
+            pip_url="./tests/integration_tests/fixtures/source-test",
+            config={"apiKey": "test"},
+            install_if_missing=False,
+        )
 
-    os.environ["PATH"] = old_path
+        # Override the install root to avoid conflicts with the test fixture
+        install_root = Path(temp_dir)
+        source.executor.install_root = install_root
 
-def test_install_uninstall():
-    source = ab.get_connector("source-test", pip_url="./tests/integration_tests/fixtures/source-test", config={"apiKey": "test"}, install_if_missing=False)
+        # assert that the venv is gone
+        assert not os.path.exists(install_root / ".venv-source-test")
 
-    source.uninstall()
+        # use which to check if the executable is available
+        assert shutil.which("source-test") is None
 
-    # assert that the venv is gone
-    assert not os.path.exists(".venv-source-test")
+        # assert that the connector is not available
+        with pytest.raises(Exception):
+            source.check()
+
+        source.install()
+
+        assert os.path.exists(install_root / ".venv-source-test")
+        assert os.path.exists(install_root / ".venv-source-test/bin/source-test")
 
-    # assert that the connector is not available
-    with pytest.raises(Exception):
         source.check()
 
-    source.install()
+        source.uninstall()
 
-    source.check()
+        assert not os.path.exists(install_root / ".venv-source-test")
+        assert not os.path.exists(install_root / ".venv-source-test/bin/source-test")

From 98d760f6f133e0abd82a2edce95f80db339fd237 Mon Sep 17 00:00:00 2001
From: Joe Bell <joseph.bell@airbyte.io>
Date: Mon, 29 Jan 2024 22:18:29 -0800
Subject: [PATCH 09/96] Revert Default Cloud Version (#34646)

---
 .../connectors/destination-postgres-strict-encrypt/metadata.yaml | 1 +
 .../connectors/destination-postgres/metadata.yaml                | 1 +
 2 files changed, 2 insertions(+)

diff --git a/airbyte-integrations/connectors/destination-postgres-strict-encrypt/metadata.yaml b/airbyte-integrations/connectors/destination-postgres-strict-encrypt/metadata.yaml
index c9136954c393d..6403177cee3ad 100644
--- a/airbyte-integrations/connectors/destination-postgres-strict-encrypt/metadata.yaml
+++ b/airbyte-integrations/connectors/destination-postgres-strict-encrypt/metadata.yaml
@@ -16,6 +16,7 @@ data:
   registries:
     cloud:
       enabled: false
+      dockerImageTag: 0.6.0
     oss:
       enabled: false
   releaseStage: alpha
diff --git a/airbyte-integrations/connectors/destination-postgres/metadata.yaml b/airbyte-integrations/connectors/destination-postgres/metadata.yaml
index 26b08f6fb1b35..730c511df3b83 100644
--- a/airbyte-integrations/connectors/destination-postgres/metadata.yaml
+++ b/airbyte-integrations/connectors/destination-postgres/metadata.yaml
@@ -19,6 +19,7 @@ data:
   registries:
     cloud:
       dockerRepository: airbyte/destination-postgres-strict-encrypt
+      dockerImageTag: 0.6.0
       enabled: true
     oss:
       enabled: true

From 6408023b6f3c56ce6ec3d984117901b02dc9c7df Mon Sep 17 00:00:00 2001
From: "Aaron (\"AJ\") Steers" <aj@airbyte.io>
Date: Mon, 29 Jan 2024 22:39:26 -0800
Subject: [PATCH 10/96] AirbyteLib: Progress Printer (#34588)

---
 airbyte-lib/airbyte_lib/_processors.py        |  17 +-
 airbyte-lib/airbyte_lib/progress.py           | 320 ++++++++++++++++++
 airbyte-lib/airbyte_lib/source.py             |   5 +-
 .../docs/generated/airbyte_lib/caches.html    |   2 +-
 airbyte-lib/examples/run_faker.py             |  31 ++
 airbyte-lib/poetry.lock                       |  69 +++-
 airbyte-lib/pyproject.toml                    |   2 +
 airbyte-lib/tests/conftest.py                 |  28 ++
 airbyte-lib/tests/unit_tests/test_progress.py | 174 ++++++++++
 9 files changed, 640 insertions(+), 8 deletions(-)
 create mode 100644 airbyte-lib/airbyte_lib/progress.py
 create mode 100644 airbyte-lib/examples/run_faker.py
 create mode 100644 airbyte-lib/tests/unit_tests/test_progress.py

diff --git a/airbyte-lib/airbyte_lib/_processors.py b/airbyte-lib/airbyte_lib/_processors.py
index d5eba9f2c00f1..4418463a8a1d9 100644
--- a/airbyte-lib/airbyte_lib/_processors.py
+++ b/airbyte-lib/airbyte_lib/_processors.py
@@ -32,6 +32,7 @@
 
 from airbyte_lib import exceptions as exc
 from airbyte_lib._util import protocol_util  # Internal utility functions
+from airbyte_lib.progress import progress
 
 
 if TYPE_CHECKING:
@@ -40,7 +41,7 @@
     from airbyte_lib.config import CacheConfigBase
 
 
-DEFAULT_BATCH_SIZE = 10000
+DEFAULT_BATCH_SIZE = 10_000
 
 
 class BatchHandle:
@@ -95,7 +96,7 @@ def register_source(
         For now, only one source at a time is supported.
         If this method is called multiple times, the last call will overwrite the previous one.
 
-        TODO: Expand this to handle mutliple sources.
+        TODO: Expand this to handle multiple sources.
         """
         _ = source_name
         self.source_catalog = incoming_source_catalog
@@ -157,6 +158,7 @@ def process_airbyte_messages(
                 if len(stream_batch) >= max_batch_size:
                     record_batch = pa.Table.from_pylist(stream_batch)
                     self._process_batch(stream_name, record_batch)
+                    progress.log_batch_written(stream_name, len(stream_batch))
                     stream_batch.clear()
 
             elif message.type is Type.STATE:
@@ -180,14 +182,16 @@ def process_airbyte_messages(
                 )
 
         # We are at the end of the stream. Process whatever else is queued.
-        for stream_name, batch in stream_batches.items():
-            if batch:
-                record_batch = pa.Table.from_pylist(batch)
+        for stream_name, stream_batch in stream_batches.items():
+            if stream_batch:
+                record_batch = pa.Table.from_pylist(stream_batch)
                 self._process_batch(stream_name, record_batch)
+                progress.log_batch_written(stream_name, len(stream_batch))
 
         # Finalize any pending batches
         for stream_name in list(self._pending_batches.keys()):
             self._finalize_batches(stream_name)
+            progress.log_stream_finalized(stream_name)
 
     @final
     def _process_batch(
@@ -287,7 +291,10 @@ def _finalizing_batches(
         state_messages_to_finalize = self._pending_state_messages[stream_name].copy()
         self._pending_batches[stream_name].clear()
         self._pending_state_messages[stream_name].clear()
+
+        progress.log_batches_finalizing(stream_name, len(batches_to_finalize))
         yield batches_to_finalize
+        progress.log_batches_finalized(stream_name, len(batches_to_finalize))
 
         self._finalized_batches[stream_name].update(batches_to_finalize)
         self._finalized_state_messages[stream_name] += state_messages_to_finalize
diff --git a/airbyte-lib/airbyte_lib/progress.py b/airbyte-lib/airbyte_lib/progress.py
new file mode 100644
index 0000000000000..d1b7c5355fe1d
--- /dev/null
+++ b/airbyte-lib/airbyte_lib/progress.py
@@ -0,0 +1,320 @@
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+
+"""A simple progress bar for the command line and IPython notebooks."""
+from __future__ import annotations
+
+import datetime
+import math
+import time
+from contextlib import suppress
+from typing import cast
+
+from rich.errors import LiveError
+from rich.live import Live as RichLive
+from rich.markdown import Markdown as RichMarkdown
+
+
+try:
+    IS_NOTEBOOK = True
+    from IPython import display as ipy_display
+
+except ImportError:
+    ipy_display = None
+    IS_NOTEBOOK = False
+
+
+MAX_UPDATE_FREQUENCY = 1000
+"""The max number of records to read before updating the progress bar."""
+
+
+def _to_time_str(timestamp: float) -> str:
+    """Convert a timestamp float to a local time string.
+
+    For now, we'll just use UTC to avoid breaking tests. In the future, we should
+    return a local time string.
+    """
+    datetime_obj = datetime.datetime.fromtimestamp(timestamp, tz=datetime.timezone.utc)
+    # TODO: Uncomment this line when we can get tests to properly account for local timezones.
+    #       For now, we'll just use UTC to avoid breaking tests.
+    # datetime_obj = datetime_obj.astimezone()
+    return datetime_obj.strftime("%H:%M:%S")
+
+
+def _get_elapsed_time_str(seconds: int) -> str:
+    """Return duration as a string.
+
+    Seconds are included until 10 minutes is exceeded.
+    Minutes are always included after 1 minute elapsed.
+    Hours are always included after 1 hour elapsed.
+    """
+    if seconds <= 60:  # noqa: PLR2004  # Magic numbers OK here.
+        return f"{seconds} seconds"
+
+    if seconds < 60 * 10:
+        minutes = seconds // 60
+        seconds = seconds % 60
+        return f"{minutes}min {seconds}s"
+
+    if seconds < 60 * 60:
+        minutes = seconds // 60
+        seconds = seconds % 60
+        return f"{minutes}min"
+
+    hours = seconds // (60 * 60)
+    minutes = (seconds % (60 * 60)) // 60
+    return f"{hours}hr {minutes}min"
+
+
+class ReadProgress:
+    """A simple progress bar for the command line and IPython notebooks."""
+
+    def __init__(self) -> None:
+        """Initialize the progress tracker."""
+        # Streams expected (for progress bar)
+        self.num_streams_expected = 0
+
+        # Reads
+        self.read_start_time = time.time()
+        self.read_end_time: float | None = None
+        self.total_records_read = 0
+
+        # Writes
+        self.total_records_written = 0
+        self.total_batches_written = 0
+        self.written_stream_names: set[str] = set()
+
+        # Finalization
+        self.finalize_start_time: float | None = None
+        self.finalize_end_time: float | None = None
+        self.total_records_finalized = 0
+        self.total_batches_finalized = 0
+        self.finalized_stream_names: set[str] = set()
+
+        self.last_update_time: float | None = None
+
+        self.rich_view: RichLive | None = None
+        if not IS_NOTEBOOK:
+            # If we're in a terminal, use a Rich view to display the progress updates.
+            self.rich_view = RichLive()
+            try:
+                self.rich_view.start()
+            except LiveError:
+                self.rich_view = None
+
+    def __del__(self) -> None:
+        """Close the Rich view."""
+        if self.rich_view:
+            with suppress(Exception):
+                self.rich_view.stop()
+
+    def log_success(self) -> None:
+        """Log success and stop tracking progress."""
+        if self.finalize_end_time is None:
+            # If we haven't already finalized, do so now.
+
+            self.finalize_end_time = time.time()
+
+            self.update_display(force_refresh=True)
+            if self.rich_view:
+                with suppress(Exception):
+                    self.rich_view.stop()
+
+    def reset(self, num_streams_expected: int) -> None:
+        """Reset the progress tracker."""
+        # Streams expected (for progress bar)
+        self.num_streams_expected = num_streams_expected
+
+        # Reads
+        self.read_start_time = time.time()
+        self.read_end_time = None
+        self.total_records_read = 0
+
+        # Writes
+        self.total_records_written = 0
+        self.total_batches_written = 0
+        self.written_stream_names = set()
+
+        # Finalization
+        self.finalize_start_time = None
+        self.finalize_end_time = None
+        self.total_records_finalized = 0
+        self.total_batches_finalized = 0
+        self.finalized_stream_names = set()
+
+    @property
+    def elapsed_seconds(self) -> int:
+        """Return the number of seconds elapsed since the read operation started."""
+        if self.finalize_end_time:
+            return int(self.finalize_end_time - self.read_start_time)
+
+        return int(time.time() - self.read_start_time)
+
+    @property
+    def elapsed_time_string(self) -> str:
+        """Return duration as a string."""
+        return _get_elapsed_time_str(self.elapsed_seconds)
+
+    @property
+    def elapsed_seconds_since_last_update(self) -> float | None:
+        """Return the number of seconds elapsed since the last update."""
+        if self.last_update_time is None:
+            return None
+
+        return time.time() - self.last_update_time
+
+    @property
+    def elapsed_read_seconds(self) -> int:
+        """Return the number of seconds elapsed since the read operation started."""
+        if self.read_end_time is None:
+            return int(time.time() - self.read_start_time)
+
+        return int(self.read_end_time - self.read_start_time)
+
+    @property
+    def elapsed_read_time_string(self) -> str:
+        """Return duration as a string."""
+        return _get_elapsed_time_str(self.elapsed_read_seconds)
+
+    @property
+    def elapsed_finalization_seconds(self) -> int:
+        """Return the number of seconds elapsed since the read operation started."""
+        if self.finalize_start_time is None:
+            return 0
+        if self.finalize_end_time is None:
+            return int(time.time() - self.finalize_start_time)
+        return int(self.finalize_end_time - self.finalize_start_time)
+
+    @property
+    def elapsed_finalization_time_str(self) -> str:
+        """Return duration as a string."""
+        return _get_elapsed_time_str(self.elapsed_finalization_seconds)
+
+    def log_records_read(self, new_total_count: int) -> None:
+        """Load a number of records read."""
+        self.total_records_read = new_total_count
+
+        # This is some math to make updates adaptive to the scale of records read.
+        # We want to update the display more often when the count is low, and less
+        # often when the count is high.
+        updated_period = min(
+            MAX_UPDATE_FREQUENCY, 10 ** math.floor(math.log10(self.total_records_read) / 4)
+        )
+        if self.total_records_read % updated_period != 0:
+            return
+
+        self.update_display()
+
+    def log_batch_written(self, stream_name: str, batch_size: int) -> None:
+        """Log that a batch has been written.
+
+        Args:
+            stream_name: The name of the stream.
+            batch_size: The number of records in the batch.
+        """
+        self.total_records_written += batch_size
+        self.total_batches_written += 1
+        self.written_stream_names.add(stream_name)
+        self.update_display()
+
+    def log_batches_finalizing(self, stream_name: str, num_batches: int) -> None:
+        """Log that batch are ready to be finalized.
+
+        In our current implementation, we ignore the stream name and number of batches.
+        We just use this as a signal that we're finished reading and have begun to
+        finalize any accumulated batches.
+        """
+        _ = stream_name, num_batches  # unused for now
+        if self.finalize_start_time is None:
+            self.read_end_time = time.time()
+            self.finalize_start_time = self.read_end_time
+
+        self.update_display(force_refresh=True)
+
+    def log_batches_finalized(self, stream_name: str, num_batches: int) -> None:
+        """Log that a batch has been finalized."""
+        _ = stream_name  # unused for now
+        self.total_batches_finalized += num_batches
+        self.update_display(force_refresh=True)
+
+    def log_stream_finalized(self, stream_name: str) -> None:
+        """Log that a stream has been finalized."""
+        self.finalized_stream_names.add(stream_name)
+        if len(self.finalized_stream_names) == self.num_streams_expected:
+            self.log_success()
+
+        self.update_display(force_refresh=True)
+
+    def update_display(self, *, force_refresh: bool = False) -> None:
+        """Update the display."""
+        # Don't update more than twice per second unless force_refresh is True.
+        if (
+            not force_refresh
+            and self.last_update_time  # if not set, then we definitely need to update
+            and cast(float, self.elapsed_seconds_since_last_update) < 0.5  # noqa: PLR2004
+        ):
+            return
+
+        status_message = self._get_status_message()
+
+        if IS_NOTEBOOK:
+            # We're in a notebook so use the IPython display.
+            ipy_display.clear_output(wait=True)
+            ipy_display.display(ipy_display.Markdown(status_message))
+
+        elif self.rich_view is not None:
+            self.rich_view.update(RichMarkdown(status_message))
+
+        self.last_update_time = time.time()
+
+    def _get_status_message(self) -> str:
+        """Compile and return a status message."""
+        # Format start time as a friendly string in local timezone:
+        start_time_str = _to_time_str(self.read_start_time)
+        records_per_second: float = 0.0
+        if self.elapsed_read_seconds > 0:
+            records_per_second = round(self.total_records_read / self.elapsed_read_seconds, 1)
+        status_message = (
+            f"## Read Progress\n\n"
+            f"Started reading at {start_time_str}.\n\n"
+            f"Read **{self.total_records_read:,}** records "
+            f"over **{self.elapsed_read_time_string}** "
+            f"({records_per_second:,} records / second).\n\n"
+        )
+        if self.total_records_written > 0:
+            status_message += (
+                f"Wrote **{self.total_records_written:,}** records "
+                f"over {self.total_batches_written:,} batches.\n\n"
+            )
+        if self.read_end_time is not None:
+            read_end_time_str = _to_time_str(self.read_end_time)
+            status_message += f"Finished reading at {read_end_time_str}.\n\n"
+        if self.finalize_start_time is not None:
+            finalize_start_time_str = _to_time_str(self.finalize_start_time)
+            status_message += f"Started finalizing streams at {finalize_start_time_str}.\n\n"
+            status_message += (
+                f"Finalized **{self.total_batches_finalized}** batches "
+                f"over {self.elapsed_finalization_time_str}.\n\n"
+            )
+        if self.finalized_stream_names:
+            status_message += (
+                f"Completed {len(self.finalized_stream_names)} "
+                + (f"out of {self.num_streams_expected} " if self.num_streams_expected else "")
+                + "streams:\n\n"
+            )
+            for stream_name in self.finalized_stream_names:
+                status_message += f"  - {stream_name}\n"
+
+        status_message += "\n\n"
+
+        if self.finalize_end_time is not None:
+            completion_time_str = _to_time_str(self.finalize_end_time)
+            status_message += (
+                f"Completed writing at {completion_time_str}. "
+                f"Total time elapsed: {self.elapsed_time_string}\n\n"
+            )
+        status_message += "\n------------------------------------------------\n"
+
+        return status_message
+
+
+progress = ReadProgress()
diff --git a/airbyte-lib/airbyte_lib/source.py b/airbyte-lib/airbyte_lib/source.py
index 4db25b3afae09..120d25adba05e 100644
--- a/airbyte-lib/airbyte_lib/source.py
+++ b/airbyte-lib/airbyte_lib/source.py
@@ -26,6 +26,7 @@
 from airbyte_lib._factories.cache_factories import get_default_cache
 from airbyte_lib._util import protocol_util  # Internal utility functions
 from airbyte_lib.datasets._lazy import LazyDataset
+from airbyte_lib.progress import progress
 from airbyte_lib.results import ReadResult
 from airbyte_lib.telemetry import (
     CacheTelemetryInfo,
@@ -76,7 +77,6 @@ def __init__(
 
         If config is provided, it will be validated against the spec if validate is True.
         """
-        self._processed_records = 0
         self.executor = executor
         self.name = name
         self._processed_records = 0
@@ -408,9 +408,12 @@ def _tally_records(
     ) -> Generator[AirbyteRecordMessage, Any, None]:
         """This method simply tallies the number of records processed and yields the messages."""
         self._processed_records = 0  # Reset the counter before we start
+        progress.reset(len(self._selected_stream_names or []))
+
         for message in messages:
             self._processed_records += 1
             yield message
+            progress.log_records_read(self._processed_records)
 
     def read(self, cache: SQLCacheBase | None = None) -> ReadResult:
         if cache is None:
diff --git a/airbyte-lib/docs/generated/airbyte_lib/caches.html b/airbyte-lib/docs/generated/airbyte_lib/caches.html
index bbebc9ac9f467..b39a5230e6582 100644
--- a/airbyte-lib/docs/generated/airbyte_lib/caches.html
+++ b/airbyte-lib/docs/generated/airbyte_lib/caches.html
@@ -679,7 +679,7 @@ <h5>Inherited Members</h5>
 <p>For now, only one source at a time is supported.
 If this method is called multiple times, the last call will overwrite the previous one.</p>
 
-<p>TODO: Expand this to handle mutliple sources.</p>
+<p>TODO: Expand this to handle multiple sources.</p>
 </div>
 
 
diff --git a/airbyte-lib/examples/run_faker.py b/airbyte-lib/examples/run_faker.py
new file mode 100644
index 0000000000000..3583a370000d0
--- /dev/null
+++ b/airbyte-lib/examples/run_faker.py
@@ -0,0 +1,31 @@
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+"""A simple test of AirbyteLib, using the Faker source connector.
+
+Usage (from airbyte-lib root directory):
+> poetry run python ./examples/run_faker.py
+
+No setup is needed, but you may need to delete the .venv-source-faker folder
+if your installation gets interrupted or corrupted.
+"""
+from __future__ import annotations
+
+import airbyte_lib as ab
+
+
+SCALE = 1_000_000  # Number of records to generate between users and purchases.
+
+
+source = ab.get_connector(
+    "source-faker",
+    pip_url="-e ../airbyte-integrations/connectors/source-faker",
+    config={"count": SCALE / 2},
+    install_if_missing=True,
+)
+source.check()
+source.set_streams(["products", "users", "purchases"])
+
+cache = ab.new_local_cache()
+result = source.read(cache)
+
+for name, records in result.cache.streams.items():
+    print(f"Stream {name}: {len(list(records))} records")
diff --git a/airbyte-lib/poetry.lock b/airbyte-lib/poetry.lock
index 5dafb19e798a1..5ac62115d29d8 100644
--- a/airbyte-lib/poetry.lock
+++ b/airbyte-lib/poetry.lock
@@ -525,6 +525,20 @@ docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1
 testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"]
 typing = ["typing-extensions (>=4.8)"]
 
+[[package]]
+name = "freezegun"
+version = "1.4.0"
+description = "Let your Python tests travel through time"
+optional = false
+python-versions = ">=3.7"
+files = [
+    {file = "freezegun-1.4.0-py3-none-any.whl", hash = "sha256:55e0fc3c84ebf0a96a5aa23ff8b53d70246479e9a68863f1fcac5a3e52f19dd6"},
+    {file = "freezegun-1.4.0.tar.gz", hash = "sha256:10939b0ba0ff5adaecf3b06a5c2f73071d9678e507c5eaedb23c761d56ac774b"},
+]
+
+[package.dependencies]
+python-dateutil = ">=2.7"
+
 [[package]]
 name = "genson"
 version = "1.2.2"
@@ -877,6 +891,30 @@ six = ">=1.11.0"
 format = ["idna", "jsonpointer (>1.13)", "rfc3987", "strict-rfc3339", "webcolors"]
 format-nongpl = ["idna", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "webcolors"]
 
+[[package]]
+name = "markdown-it-py"
+version = "3.0.0"
+description = "Python port of markdown-it. Markdown parsing, done right!"
+optional = false
+python-versions = ">=3.8"
+files = [
+    {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"},
+    {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"},
+]
+
+[package.dependencies]
+mdurl = ">=0.1,<1.0"
+
+[package.extras]
+benchmarking = ["psutil", "pytest", "pytest-benchmark"]
+code-style = ["pre-commit (>=3.0,<4.0)"]
+compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"]
+linkify = ["linkify-it-py (>=1,<3)"]
+plugins = ["mdit-py-plugins"]
+profiling = ["gprof2dot"]
+rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"]
+testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"]
+
 [[package]]
 name = "markupsafe"
 version = "2.1.4"
@@ -946,6 +984,17 @@ files = [
     {file = "MarkupSafe-2.1.4.tar.gz", hash = "sha256:3aae9af4cac263007fd6309c64c6ab4506dd2b79382d9d19a1994f9240b8db4f"},
 ]
 
+[[package]]
+name = "mdurl"
+version = "0.1.2"
+description = "Markdown URL utilities"
+optional = false
+python-versions = ">=3.7"
+files = [
+    {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"},
+    {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"},
+]
+
 [[package]]
 name = "mypy"
 version = "1.8.0"
@@ -1915,6 +1964,24 @@ redis = ["redis (>=3)"]
 security = ["itsdangerous (>=2.0)"]
 yaml = ["pyyaml (>=5.4)"]
 
+[[package]]
+name = "rich"
+version = "13.7.0"
+description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal"
+optional = false
+python-versions = ">=3.7.0"
+files = [
+    {file = "rich-13.7.0-py3-none-any.whl", hash = "sha256:6da14c108c4866ee9520bbffa71f6fe3962e193b7da68720583850cd4548e235"},
+    {file = "rich-13.7.0.tar.gz", hash = "sha256:5cb5123b5cf9ee70584244246816e9114227e0b98ad9176eede6ad54bf5403fa"},
+]
+
+[package.dependencies]
+markdown-it-py = ">=2.2.0"
+pygments = ">=2.13.0,<3.0.0"
+
+[package.extras]
+jupyter = ["ipywidgets (>=7.5.1,<9)"]
+
 [[package]]
 name = "rpds-py"
 version = "0.17.1"
@@ -2494,4 +2561,4 @@ files = [
 [metadata]
 lock-version = "2.0"
 python-versions = "^3.9"
-content-hash = "5eba75179b62f56be141db82121ca9e1c623944306172d7bdacaf5388e6f3384"
+content-hash = "7ed61ca7eaed73dbd7e0800aa87fcd5b2583739048d53e9e564fe2a6defa483f"
diff --git a/airbyte-lib/pyproject.toml b/airbyte-lib/pyproject.toml
index a4749bbd750bb..4625e688dc411 100644
--- a/airbyte-lib/pyproject.toml
+++ b/airbyte-lib/pyproject.toml
@@ -28,6 +28,7 @@ pyarrow = "^14.0.2"
 
 # Psycopg3 is not supported in SQLAlchemy 1.x:
 # psycopg = {extras = ["binary", "pool"], version = "^3.1.16"}
+rich = "^13.7.0"
 
 
 [tool.poetry.group.dev.dependencies]
@@ -44,6 +45,7 @@ ruff = "^0.1.11"
 types-jsonschema = "^4.20.0.0"
 google-cloud-secret-manager = "^2.17.0"
 types-requests = "2.31.0.4"
+freezegun = "^1.4.0"
 
 [build-system]
 requires = ["poetry-core"]
diff --git a/airbyte-lib/tests/conftest.py b/airbyte-lib/tests/conftest.py
index caabe34cfed53..17009133a89d2 100644
--- a/airbyte-lib/tests/conftest.py
+++ b/airbyte-lib/tests/conftest.py
@@ -12,6 +12,7 @@
 import docker
 import psycopg2 as psycopg
 import pytest
+from _pytest.nodes import Item
 from google.cloud import secretmanager
 from pytest_docker.plugin import get_docker_ip
 
@@ -25,6 +26,32 @@
 PYTEST_POSTGRES_PORT = 5432
 
 
+def pytest_collection_modifyitems(items: list[Item]) -> None:
+    """Override default pytest behavior, sorting our tests in a sensible execution order.
+
+    In general, we want faster tests to run first, so that we can get feedback faster.
+
+    Running lint tests first is helpful because they are fast and can catch typos and other errors.
+
+    Otherwise tests are run based on an alpha-based natural sort, where 'unit' tests run after
+    'integration' tests because 'u' comes after 'i' alphabetically.
+    """
+    def test_priority(item: Item) -> int:
+        if 'lint_tests' in str(item.fspath):
+            return 1  # lint tests have high priority
+        elif 'unit_tests' in str(item.fspath):
+            return 2  # unit tests have highest priority
+        elif 'docs_tests' in str(item.fspath):
+            return 3  # doc tests have medium priority
+        elif 'integration_tests' in str(item.fspath):
+            return 4  # integration tests have the lowest priority
+        else:
+            return 5  # all other tests have lower priority
+
+    # Sort the items list in-place based on the test_priority function
+    items.sort(key=test_priority)
+
+
 def is_port_in_use(port):
     with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
         return s.connect_ex(("localhost", port)) == 0
@@ -128,6 +155,7 @@ def new_pg_cache_config(pg_dsn):
     )
     yield config
 
+
 @pytest.fixture
 def snowflake_config():
     if "GCP_GSM_CREDENTIALS" not in os.environ:
diff --git a/airbyte-lib/tests/unit_tests/test_progress.py b/airbyte-lib/tests/unit_tests/test_progress.py
new file mode 100644
index 0000000000000..377df860bb57a
--- /dev/null
+++ b/airbyte-lib/tests/unit_tests/test_progress.py
@@ -0,0 +1,174 @@
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+
+import datetime
+from textwrap import dedent
+import time
+import pytest
+from freezegun import freeze_time
+from airbyte_lib.progress import ReadProgress, _get_elapsed_time_str, _to_time_str
+from dateutil.tz import tzlocal
+
+# Calculate the offset from UTC in hours
+tz_offset_hrs = int(datetime.datetime.now(tzlocal()).utcoffset().total_seconds() / 3600)
+
+
+@freeze_time("2022-01-01")
+def test_read_progress_initialization():
+    progress = ReadProgress()
+    assert progress.num_streams_expected == 0
+    assert progress.read_start_time == 1640995200.0  # Unix timestamp for 2022-01-01
+    assert progress.total_records_read == 0
+    assert progress.total_records_written == 0
+    assert progress.total_batches_written == 0
+    assert progress.written_stream_names == set()
+    assert progress.finalize_start_time is None
+    assert progress.finalize_end_time is None
+    assert progress.total_records_finalized == 0
+    assert progress.total_batches_finalized == 0
+    assert progress.finalized_stream_names == set()
+    assert progress.last_update_time is None
+
+
+@freeze_time("2022-01-01")
+def test_read_progress_reset():
+    progress = ReadProgress()
+    progress.reset(5)
+    assert progress.num_streams_expected == 5
+    assert progress.read_start_time == 1640995200.0
+    assert progress.total_records_read == 0
+    assert progress.total_records_written == 0
+    assert progress.total_batches_written == 0
+    assert progress.written_stream_names == set()
+    assert progress.finalize_start_time is None
+    assert progress.finalize_end_time is None
+    assert progress.total_records_finalized == 0
+    assert progress.total_batches_finalized == 0
+    assert progress.finalized_stream_names == set()
+
+@freeze_time("2022-01-01")
+def test_read_progress_log_records_read():
+    progress = ReadProgress()
+    progress.log_records_read(100)
+    assert progress.total_records_read == 100
+
+@freeze_time("2022-01-01")
+def test_read_progress_log_batch_written():
+    progress = ReadProgress()
+    progress.log_batch_written("stream1", 50)
+    assert progress.total_records_written == 50
+    assert progress.total_batches_written == 1
+    assert progress.written_stream_names == {"stream1"}
+
+@freeze_time("2022-01-01")
+def test_read_progress_log_batches_finalizing():
+    progress = ReadProgress()
+    progress.log_batches_finalizing("stream1", 1)
+    assert progress.finalize_start_time == 1640995200.0
+
+@freeze_time("2022-01-01")
+def test_read_progress_log_batches_finalized():
+    progress = ReadProgress()
+    progress.log_batches_finalized("stream1", 1)
+    assert progress.total_batches_finalized == 1
+
+@freeze_time("2022-01-01")
+def test_read_progress_log_stream_finalized():
+    progress = ReadProgress()
+    progress.log_stream_finalized("stream1")
+    assert progress.finalized_stream_names == {"stream1"}
+
+
+def test_get_elapsed_time_str():
+    assert _get_elapsed_time_str(30) == "30 seconds"
+    assert _get_elapsed_time_str(90) == "1min 30s"
+    assert _get_elapsed_time_str(600) == "10min"
+    assert _get_elapsed_time_str(3600) == "1hr 0min"
+
+
+@freeze_time("2022-01-01 0:00:00")
+def test_get_time_str():
+    assert _to_time_str(time.time()) == "00:00:00"
+
+
+def _assert_lines(expected_lines, actual_lines: list[str] | str):
+    if isinstance(actual_lines, list):
+        actual_lines = "\n".join(actual_lines)
+    for line in expected_lines:
+        assert line in actual_lines, f"Missing line: {line}"
+
+def test_get_status_message_after_finalizing_records():
+
+    # Test that we can render the initial status message before starting to read
+    with freeze_time("2022-01-01 00:00:00"):
+        progress = ReadProgress()
+        expected_lines = [
+            "Started reading at 00:00:00.",
+            "Read **0** records over **0 seconds** (0.0 records / second).",
+        ]
+        _assert_lines(expected_lines, progress._get_status_message())
+
+    # Test after reading some records
+    with freeze_time("2022-01-01 00:01:00"):
+        progress.log_records_read(100)
+        expected_lines = [
+            "Started reading at 00:00:00.",
+            "Read **100** records over **60 seconds** (1.7 records / second).",
+        ]
+        _assert_lines(expected_lines, progress._get_status_message())
+
+    # Advance the day and reset the progress
+    with freeze_time("2022-01-02 00:00:00"):
+        progress = ReadProgress()
+        progress.reset(1)
+        expected_lines = [
+            "Started reading at 00:00:00.",
+            "Read **0** records over **0 seconds** (0.0 records / second).",
+        ]
+        _assert_lines(expected_lines, progress._get_status_message())
+
+    # Test after writing some records and starting to finalize
+    with freeze_time("2022-01-02 00:01:00"):
+        progress.log_records_read(100)
+        progress.log_batch_written("stream1", 50)
+        progress.log_batches_finalizing("stream1", 1)
+        expected_lines = [
+            "## Read Progress",
+            "Started reading at 00:00:00.",
+            "Read **100** records over **60 seconds** (1.7 records / second).",
+            "Wrote **50** records over 1 batches.",
+            "Finished reading at 00:01:00.",
+            "Started finalizing streams at 00:01:00.",
+        ]
+        _assert_lines(expected_lines, progress._get_status_message())
+
+    # Test after finalizing some records
+    with freeze_time("2022-01-02 00:02:00"):
+        progress.log_batches_finalized("stream1", 1)
+        expected_lines = [
+            "## Read Progress",
+            "Started reading at 00:00:00.",
+            "Read **100** records over **60 seconds** (1.7 records / second).",
+            "Wrote **50** records over 1 batches.",
+            "Finished reading at 00:01:00.",
+            "Started finalizing streams at 00:01:00.",
+            "Finalized **1** batches over 60 seconds.",
+        ]
+        _assert_lines(expected_lines, progress._get_status_message())
+
+    # Test after finalizing all records
+    with freeze_time("2022-01-02 00:02:00"):
+        progress.log_stream_finalized("stream1")
+        message = progress._get_status_message()
+        expected_lines = [
+            "## Read Progress",
+            "Started reading at 00:00:00.",
+            "Read **100** records over **60 seconds** (1.7 records / second).",
+            "Wrote **50** records over 1 batches.",
+            "Finished reading at 00:01:00.",
+            "Started finalizing streams at 00:01:00.",
+            "Finalized **1** batches over 60 seconds.",
+            "Completed 1 out of 1 streams:",
+            "- stream1",
+            "Total time elapsed: 2min 0s",
+        ]
+        _assert_lines(expected_lines, message)

From a4738b93da0215a95a92110b03840ee88158a815 Mon Sep 17 00:00:00 2001
From: "Aaron (\"AJ\") Steers" <aj@airbyte.io>
Date: Mon, 29 Jan 2024 22:56:24 -0800
Subject: [PATCH 11/96] AirbyteLib: DuckDB Perf Boost (#34589)

---
 airbyte-lib/airbyte_lib/caches/duckdb.py | 24 ++++++++++++++++++++++--
 airbyte-lib/examples/run_faker.py        |  2 +-
 2 files changed, 23 insertions(+), 3 deletions(-)

diff --git a/airbyte-lib/airbyte_lib/caches/duckdb.py b/airbyte-lib/airbyte_lib/caches/duckdb.py
index 0cdb8b28c99b1..76f79968a5033 100644
--- a/airbyte-lib/airbyte_lib/caches/duckdb.py
+++ b/airbyte-lib/airbyte_lib/caches/duckdb.py
@@ -5,6 +5,7 @@
 from __future__ import annotations
 
 from pathlib import Path
+from textwrap import dedent
 from typing import cast
 
 from overrides import overrides
@@ -158,6 +159,25 @@ def _write_files_to_new_table(
     ) -> str:
         """Write a file(s) to a new table.
 
-        TODO: Optimize this for DuckDB instead of calling the base implementation.
+        We use DuckDB's `read_parquet` function to efficiently read the files and insert
+        them into the table in a single operation.
+
+        Note: This implementation is fragile in regards to column ordering. However, since
+        we are inserting into a temp table we have just created, there should be no
+        drift between the table schema and the file schema.
         """
-        return super()._write_files_to_new_table(files, stream_name, batch_id)
+        temp_table_name = self._create_table_for_loading(
+            stream_name=stream_name,
+            batch_id=batch_id,
+        )
+        files_list = ", ".join([f"'{f!s}'" for f in files])
+        insert_statement = dedent(
+            f"""
+            INSERT INTO {self.config.schema_name}.{temp_table_name}
+            SELECT * FROM read_parquet(
+                [{files_list}]
+            )
+            """
+        )
+        self._execute_sql(insert_statement)
+        return temp_table_name
diff --git a/airbyte-lib/examples/run_faker.py b/airbyte-lib/examples/run_faker.py
index 3583a370000d0..c9f0db1e6ba01 100644
--- a/airbyte-lib/examples/run_faker.py
+++ b/airbyte-lib/examples/run_faker.py
@@ -12,7 +12,7 @@
 import airbyte_lib as ab
 
 
-SCALE = 1_000_000  # Number of records to generate between users and purchases.
+SCALE = 5_000_000  # Number of records to generate between users and purchases.
 
 
 source = ab.get_connector(

From 923fcc50c2a1c0840699fe538c9c09e61a2aea23 Mon Sep 17 00:00:00 2001
From: Joe Reuter <joe@airbyte.io>
Date: Tue, 30 Jan 2024 09:49:50 +0100
Subject: [PATCH 12/96] airbyte-ci: Switch to prod pypi (#34606)

---
 .github/actions/run-airbyte-ci/action.yml     |  5 ++
 .../publish-airbyte-lib-command-manually.yml  |  4 +-
 airbyte-ci/connectors/pipelines/README.md     | 47 ++++++++++++-------
 .../airbyte_ci/connectors/publish/commands.py | 19 +++++++-
 .../airbyte_ci/connectors/publish/context.py  |  4 ++
 .../airbyte_ci/connectors/publish/pipeline.py | 10 ++++
 .../airbyte_ci/poetry/publish/commands.py     |  7 +--
 .../airbyte_ci/steps/python_registry.py       |  8 +++-
 .../connectors/pipelines/pipelines/consts.py  |  2 +-
 .../contexts/python_registry_publish.py       |  5 +-
 .../connectors/pipelines/pyproject.toml       |  2 +-
 .../pipelines/tests/test_publish.py           | 22 +++++----
 12 files changed, 95 insertions(+), 40 deletions(-)

diff --git a/.github/actions/run-airbyte-ci/action.yml b/.github/actions/run-airbyte-ci/action.yml
index 45e8262a5837e..753c041727e71 100644
--- a/.github/actions/run-airbyte-ci/action.yml
+++ b/.github/actions/run-airbyte-ci/action.yml
@@ -79,6 +79,10 @@ inputs:
   python_registry_token:
     description: "Python registry API token to publish python package"
     required: false
+  python_registry_url:
+    description: "Python registry URL to publish python package"
+    default: "https://upload.pypi.org/legacy/"
+    required: false
 
 runs:
   using: "composite"
@@ -135,6 +139,7 @@ runs:
         PRODUCTION: ${{ inputs.production }}
         PULL_REQUEST_NUMBER: ${{ github.event.pull_request.number }}
         PYTHON_REGISTRY_TOKEN: ${{ inputs.python_registry_token }}
+        PYTHON_REGISTRY_URL: ${{ inputs.python_registry_url }}
         S3_BUILD_CACHE_ACCESS_KEY_ID: ${{ inputs.s3_build_cache_access_key_id }}
         S3_BUILD_CACHE_SECRET_KEY: ${{ inputs.s3_build_cache_secret_key }}
         SENTRY_DSN: ${{ inputs.sentry_dsn }}
diff --git a/.github/workflows/publish-airbyte-lib-command-manually.yml b/.github/workflows/publish-airbyte-lib-command-manually.yml
index a4fbfbc814954..e596444414d31 100644
--- a/.github/workflows/publish-airbyte-lib-command-manually.yml
+++ b/.github/workflows/publish-airbyte-lib-command-manually.yml
@@ -37,7 +37,7 @@ jobs:
         uses: actions/checkout@v3
       - name: Publish
         id: publish-airbyte-lib
-        uses: ./.github/actions/run-dagger-pipeline
+        uses: ./.github/actions/run-airbyte-ci
         with:
           context: "manual"
           dagger_cloud_token: ${{ secrets.DAGGER_CLOUD_TOKEN }}
@@ -53,5 +53,5 @@ jobs:
           s3_build_cache_access_key_id: ${{ secrets.SELF_RUNNER_AWS_ACCESS_KEY_ID }}
           s3_build_cache_secret_key: ${{ secrets.SELF_RUNNER_AWS_SECRET_ACCESS_KEY }}
           tailscale_auth_key: ${{ secrets.TAILSCALE_AUTH_KEY }}
-          subcommand: 'poetry --package-path=airbyte-lib publish --registry-url="https://test.pypi.org/legacy/"'
+          subcommand: "poetry --package-path=airbyte-lib publish"
           python_registry_token: ${{ secrets.PYPI_TOKEN }}
diff --git a/airbyte-ci/connectors/pipelines/README.md b/airbyte-ci/connectors/pipelines/README.md
index 263333e3f15e6..3e8ccd0745800 100644
--- a/airbyte-ci/connectors/pipelines/README.md
+++ b/airbyte-ci/connectors/pipelines/README.md
@@ -385,16 +385,18 @@ Publish all connectors modified in the head commit: `airbyte-ci connectors --mod
 
 ### Options
 
-| Option                               | Required | Default         | Mapped environment variable        | Description                                                                                                                                                                               |
-| ------------------------------------ | -------- | --------------- | ---------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| `--pre-release/--main-release`       | False    | `--pre-release` |                                    | Whether to publish the pre-release or the main release version of a connector. Defaults to pre-release. For main release you have to set the credentials to interact with the GCS bucket. |
-| `--spec-cache-gcs-credentials`       | False    |                 | `SPEC_CACHE_GCS_CREDENTIALS`       | The service account key to upload files to the GCS bucket hosting spec cache.                                                                                                             |
-| `--spec-cache-bucket-name`           | False    |                 | `SPEC_CACHE_BUCKET_NAME`           | The name of the GCS bucket where specs will be cached.                                                                                                                                    |
-| `--metadata-service-gcs-credentials` | False    |                 | `METADATA_SERVICE_GCS_CREDENTIALS` | The service account key to upload files to the GCS bucket hosting the metadata files.                                                                                                     |
-| `--metadata-service-bucket-name`     | False    |                 | `METADATA_SERVICE_BUCKET_NAME`     | The name of the GCS bucket where metadata files will be uploaded.                                                                                                                         |
-| `--slack-webhook`                    | False    |                 | `SLACK_WEBHOOK`                    | The Slack webhook URL to send notifications to.                                                                                                                                           |
-| `--slack-channel`                    | False    |                 | `SLACK_CHANNEL`                    | The Slack channel name to send notifications to.                                                                                                                                          |
-| `--ci-requirements`                  | False    |                 |                                    | Output the CI requirements as a JSON payload. It is used to determine the CI runner to use.                                                                                               |
+| Option                               | Required | Default                         | Mapped environment variable        | Description                                                                                                                                                                               |
+| ------------------------------------ | -------- | ------------------------------- | ---------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `--pre-release/--main-release`       | False    | `--pre-release`                 |                                    | Whether to publish the pre-release or the main release version of a connector. Defaults to pre-release. For main release you have to set the credentials to interact with the GCS bucket. |
+| `--spec-cache-gcs-credentials`       | False    |                                 | `SPEC_CACHE_GCS_CREDENTIALS`       | The service account key to upload files to the GCS bucket hosting spec cache.                                                                                                             |
+| `--spec-cache-bucket-name`           | False    |                                 | `SPEC_CACHE_BUCKET_NAME`           | The name of the GCS bucket where specs will be cached.                                                                                                                                    |
+| `--metadata-service-gcs-credentials` | False    |                                 | `METADATA_SERVICE_GCS_CREDENTIALS` | The service account key to upload files to the GCS bucket hosting the metadata files.                                                                                                     |
+| `--metadata-service-bucket-name`     | False    |                                 | `METADATA_SERVICE_BUCKET_NAME`     | The name of the GCS bucket where metadata files will be uploaded.                                                                                                                         |
+| `--slack-webhook`                    | False    |                                 | `SLACK_WEBHOOK`                    | The Slack webhook URL to send notifications to.                                                                                                                                           |
+| `--slack-channel`                    | False    |                                 | `SLACK_CHANNEL`                    | The Slack channel name to send notifications to.                                                                                                                                          |
+| `--ci-requirements`                  | False    |                                 |                                    | Output the CI requirements as a JSON payload. It is used to determine the CI runner to use.                                                                                               |
+| `--python-registry-token`            | False    |                                 | `PYTHON_REGISTRY_TOKEN`            | The API token to authenticate with the registry. For pypi, the `pypi-` prefix needs to be specified      |
+| `--python-registry-url`              | False    | https://upload.pypi.org/legacy/ | `PYTHON_REGISTRY_URL`              | The python registry to publish to. Defaults to main pypi                                                 |
 
 
 I've added an empty "Default" column, and you can fill in the default values as needed.
@@ -406,14 +408,24 @@ flowchart TD
     validate[Validate the metadata file]
     check[Check if the connector image already exists]
     build[Build the connector image for all platform variants]
+    publish_to_python_registry[Push the connector image to the python registry if enabled]
     upload_spec[Upload connector spec to the spec cache bucket]
     push[Push the connector image from DockerHub, with platform variants]
     pull[Pull the connector image from DockerHub to check SPEC can be run and the image layers are healthy]
     upload_metadata[Upload its metadata file to the metadata service bucket]
 
-    validate-->check-->build-->upload_spec-->push-->pull-->upload_metadata
+    validate-->check-->build-->upload_spec-->publish_to_python_registry-->push-->pull-->upload_metadata
 ```
 
+#### Python registry publishing
+
+If `remoteRegistries.pypi.enabled` in the connector metadata is set to `true`, the connector will be published to the python registry.
+To do so, the `--python-registry-token` and `--python-registry-url` options are used to authenticate with the registry and publish the connector.
+If the current version of the connector is already published to the registry, the publish will be skipped.
+
+On a pre-release, the connector will be published as a `.dev<N>` version.
+
+
 ### <a id="connectors-bump_version"></a>`connectors bump_version` command
 
 Bump the version of the selected connectors.
@@ -534,12 +546,12 @@ For poetry packages, the package name and version can be taken from the `pyproje
 
 #### Options
 
-| Option                    | Required | Default                 | Mapped environment variable | Description                                                                                              |
-| ------------------------- | -------- | ----------------------- | --------------------------- | -------------------------------------------------------------------------------------------------------- |
-| `--publish-name`          | False    |                         |                             | The name of the package. Not required for poetry packages that define it in the `pyproject.toml` file    |
-| `--publish-version`       | False    |                         |                             | The version of the package. Not required for poetry packages that define it in the `pyproject.toml` file |
-| `--python-registry-token` | True     |                         | PYTHON_REGISTRY_TOKEN       | The API token to authenticate with the registry. For pypi, the `pypi-` prefix needs to be specified      |
-| `--registry-url`          | False    | https://pypi.org/simple |                             | The python registry to publish to. Defaults to main pypi                                                 |
+| Option                    | Required | Default                         | Mapped environment variable | Description                                                                                              |
+| ------------------------- | -------- | ------------------------------- | --------------------------- | -------------------------------------------------------------------------------------------------------- |
+| `--publish-name`          | False    |                                 |                             | The name of the package. Not required for poetry packages that define it in the `pyproject.toml` file    |
+| `--publish-version`       | False    |                                 |                             | The version of the package. Not required for poetry packages that define it in the `pyproject.toml` file |
+| `--python-registry-token` | True     |                                 | PYTHON_REGISTRY_TOKEN       | The API token to authenticate with the registry. For pypi, the `pypi-` prefix needs to be specified      |
+| `--python-registry-url`   | False    | https://upload.pypi.org/legacy/ | PYTHON_REGISTRY_URL         | The python registry to publish to. Defaults to main pypi                                                 |
 
 ### <a id="metadata-validate-command-subgroup"></a>`metadata` command subgroup
 
@@ -597,6 +609,7 @@ E.G.: running `pytest` on a specific test folder:
 
 | Version | PR                                                         | Description                                                                                                                |
 | ------- | ---------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- |
+| 3.9.0   | [#34606](https://github.com/airbytehq/airbyte/pull/34606)  | Allow configuration of python registry URL via environment variable.                                                       |
 | 3.8.1   | [#34607](https://github.com/airbytehq/airbyte/pull/34607)  | Improve gradle dependency cache volume protection.                                                                         |
 | 3.8.0   | [#34316](https://github.com/airbytehq/airbyte/pull/34316)  | Expose Dagger engine image name in `--ci-requirements` and add `--ci-requirements` to the `airbyte-ci` root command group. |
 | 3.7.3   | [#34560](https://github.com/airbytehq/airbyte/pull/34560)  | Simplify Gradle task execution framework by removing local maven repo support.                                             |
diff --git a/airbyte-ci/connectors/pipelines/pipelines/airbyte_ci/connectors/publish/commands.py b/airbyte-ci/connectors/pipelines/pipelines/airbyte_ci/connectors/publish/commands.py
index 0de1d7a2032fa..c5fbfc4144866 100644
--- a/airbyte-ci/connectors/pipelines/pipelines/airbyte_ci/connectors/publish/commands.py
+++ b/airbyte-ci/connectors/pipelines/pipelines/airbyte_ci/connectors/publish/commands.py
@@ -11,7 +11,7 @@
 from pipelines.cli.click_decorators import click_ci_requirements_option
 from pipelines.cli.confirm_prompt import confirm
 from pipelines.cli.dagger_pipeline_command import DaggerPipelineCommand
-from pipelines.consts import ContextState
+from pipelines.consts import DEFAULT_PYTHON_PACKAGE_REGISTRY_URL, ContextState
 from pipelines.helpers.utils import fail_if_missing_docker_hub_creds
 
 
@@ -59,6 +59,19 @@
     envvar="SLACK_CHANNEL",
     default="#connector-publish-updates",
 )
+@click.option(
+    "--python-registry-token",
+    help="Access token for python registry",
+    type=click.STRING,
+    envvar="PYTHON_REGISTRY_TOKEN",
+)
+@click.option(
+    "--python-registry-url",
+    help="Which python registry registry to publish to. If not set, the default pypi is used. For test pypi, use https://test.pypi.org/legacy/",
+    type=click.STRING,
+    default=DEFAULT_PYTHON_PACKAGE_REGISTRY_URL,
+    envvar="PYTHON_REGISTRY_URL",
+)
 @click.pass_context
 async def publish(
     ctx: click.Context,
@@ -69,6 +82,8 @@ async def publish(
     metadata_service_gcs_credentials: str,
     slack_webhook: str,
     slack_channel: str,
+    python_registry_token: str,
+    python_registry_url: str,
 ) -> bool:
     ctx.obj["spec_cache_gcs_credentials"] = spec_cache_gcs_credentials
     ctx.obj["spec_cache_bucket_name"] = spec_cache_bucket_name
@@ -109,6 +124,8 @@ async def publish(
                 s3_build_cache_access_key_id=ctx.obj.get("s3_build_cache_access_key_id"),
                 s3_build_cache_secret_key=ctx.obj.get("s3_build_cache_secret_key"),
                 use_local_cdk=ctx.obj.get("use_local_cdk"),
+                python_registry_token=python_registry_token,
+                python_registry_url=python_registry_url,
             )
             for connector in ctx.obj["selected_connectors_with_modified_files"]
         ]
diff --git a/airbyte-ci/connectors/pipelines/pipelines/airbyte_ci/connectors/publish/context.py b/airbyte-ci/connectors/pipelines/pipelines/airbyte_ci/connectors/publish/context.py
index 829ab07b4e0a0..55136809d8cee 100644
--- a/airbyte-ci/connectors/pipelines/pipelines/airbyte_ci/connectors/publish/context.py
+++ b/airbyte-ci/connectors/pipelines/pipelines/airbyte_ci/connectors/publish/context.py
@@ -46,12 +46,16 @@ def __init__(
         s3_build_cache_access_key_id: Optional[str] = None,
         s3_build_cache_secret_key: Optional[str] = None,
         use_local_cdk: bool = False,
+        python_registry_token: Optional[str] = None,
+        python_registry_url: Optional[str] = None,
     ) -> None:
         self.pre_release = pre_release
         self.spec_cache_bucket_name = spec_cache_bucket_name
         self.metadata_bucket_name = metadata_bucket_name
         self.spec_cache_gcs_credentials = sanitize_gcs_credentials(spec_cache_gcs_credentials)
         self.metadata_service_gcs_credentials = sanitize_gcs_credentials(metadata_service_gcs_credentials)
+        self.python_registry_token = python_registry_token
+        self.python_registry_url = python_registry_url
         pipeline_name = f"Publish {connector.technical_name}"
         pipeline_name = pipeline_name + " (pre-release)" if pre_release else pipeline_name
 
diff --git a/airbyte-ci/connectors/pipelines/pipelines/airbyte_ci/connectors/publish/pipeline.py b/airbyte-ci/connectors/pipelines/pipelines/airbyte_ci/connectors/publish/pipeline.py
index c6e4002829c33..ac7514439cb0c 100644
--- a/airbyte-ci/connectors/pipelines/pipelines/airbyte_ci/connectors/publish/pipeline.py
+++ b/airbyte-ci/connectors/pipelines/pipelines/airbyte_ci/connectors/publish/pipeline.py
@@ -352,6 +352,16 @@ async def _run_python_registry_publish_pipeline(context: PublishConnectorContext
     if not python_registry_context:
         return results, False
 
+    if not context.python_registry_token or not context.python_registry_url:
+        # If the python registry token or url are not set, we can't publish to the python registry - stop the pipeline.
+        return [
+            StepResult(
+                PublishToPythonRegistry(python_registry_context),
+                status=StepStatus.FAILURE,
+                stderr="Pypi publishing is enabled, but python registry token or url are not set.",
+            )
+        ], True
+
     check_python_registry_package_exists_results = await CheckPythonRegistryPackageDoesNotExist(python_registry_context).run()
     results.append(check_python_registry_package_exists_results)
     if check_python_registry_package_exists_results.status is StepStatus.SKIPPED:
diff --git a/airbyte-ci/connectors/pipelines/pipelines/airbyte_ci/poetry/publish/commands.py b/airbyte-ci/connectors/pipelines/pipelines/airbyte_ci/poetry/publish/commands.py
index 29785f8312661..16bded0b0c340 100644
--- a/airbyte-ci/connectors/pipelines/pipelines/airbyte_ci/poetry/publish/commands.py
+++ b/airbyte-ci/connectors/pipelines/pipelines/airbyte_ci/poetry/publish/commands.py
@@ -47,10 +47,11 @@ def _validate_python_version(_ctx: dict, _param: dict, value: Optional[str]) ->
     envvar="PYTHON_REGISTRY_TOKEN",
 )
 @click.option(
-    "--registry-url",
+    "--python-registry-url",
     help="Which registry to publish to. If not set, the default pypi is used. For test pypi, use https://test.pypi.org/legacy/",
     type=click.STRING,
     default=DEFAULT_PYTHON_PACKAGE_REGISTRY_URL,
+    envvar="PYTHON_REGISTRY_URL",
 )
 @click.option(
     "--publish-name",
@@ -69,7 +70,7 @@ async def publish(
     ctx: click.Context,
     click_pipeline_context: ClickPipelineContext,
     python_registry_token: str,
-    registry_url: str,
+    python_registry_url: str,
     publish_name: Optional[str],
     publish_version: Optional[str],
 ) -> bool:
@@ -85,7 +86,7 @@ async def publish(
         ci_context=ctx.obj.get("ci_context"),
         ci_gcs_credentials=ctx.obj["ci_gcs_credentials"],
         python_registry_token=python_registry_token,
-        registry=registry_url,
+        registry=python_registry_url,
         package_path=ctx.obj["package_path"],
         package_name=publish_name,
         version=publish_version,
diff --git a/airbyte-ci/connectors/pipelines/pipelines/airbyte_ci/steps/python_registry.py b/airbyte-ci/connectors/pipelines/pipelines/airbyte_ci/steps/python_registry.py
index aec2e30bb3da2..2bfebec127b5a 100644
--- a/airbyte-ci/connectors/pipelines/pipelines/airbyte_ci/steps/python_registry.py
+++ b/airbyte-ci/connectors/pipelines/pipelines/airbyte_ci/steps/python_registry.py
@@ -116,9 +116,11 @@ async def _poetry_publish(self, package_dir_to_publish: Directory) -> StepResult
             .with_directory("package", package_dir_to_publish)
             .with_workdir("package")
             .with_new_file(PYPROJECT_TOML_FILE_PATH, contents=tomli_w.dumps(contents))
+            # Make sure these steps are always executed and not cached as they are triggering a side-effect (calling the registry)
+            # Env var setting needs to be in this block as well to make sure a change of the env var will be propagated correctly
+            .with_env_variable("CACHEBUSTER", str(uuid.uuid4()))
             .with_exec(["poetry", "config", "repositories.mypypi", self.context.registry])
             .with_exec(sh_dash_c(["poetry config pypi-token.mypypi $PYTHON_REGISTRY_TOKEN"]))
-            .with_env_variable("CACHEBUSTER", str(uuid.uuid4()))
             .with_exec(sh_dash_c(["poetry publish --build --repository mypypi -vvv --no-interaction"]))
         )
 
@@ -156,9 +158,11 @@ async def _pip_publish(self, package_dir_to_publish: Directory) -> StepResult:
             .with_new_file("setup.cfg", contents=setup_cfg)
             .with_exec(["pip", "install", "--upgrade", "setuptools", "wheel"])
             .with_exec(["python", SETUP_PY_FILE_PATH, "sdist", "bdist_wheel"])
+            # Make sure these steps are always executed and not cached as they are triggering a side-effect (calling the registry)
+            # Env var setting needs to be in this block as well to make sure a change of the env var will be propagated correctly
+            .with_env_variable("CACHEBUSTER", str(uuid.uuid4()))
             .with_secret_variable("TWINE_USERNAME", pypi_username)
             .with_secret_variable("TWINE_PASSWORD", pypi_password)
-            .with_env_variable("CACHEBUSTER", str(uuid.uuid4()))
             .with_exec(["twine", "upload", "--verbose", "--repository-url", self.context.registry, "dist/*"])
         )
 
diff --git a/airbyte-ci/connectors/pipelines/pipelines/consts.py b/airbyte-ci/connectors/pipelines/pipelines/consts.py
index 203b320bb6fcc..966c484b15f15 100644
--- a/airbyte-ci/connectors/pipelines/pipelines/consts.py
+++ b/airbyte-ci/connectors/pipelines/pipelines/consts.py
@@ -60,7 +60,7 @@
 POETRY_CACHE_PATH = "/root/.cache/pypoetry"
 STORAGE_DRIVER = "fuse-overlayfs"
 SETUP_PY_FILE_PATH = "setup.py"
-DEFAULT_PYTHON_PACKAGE_REGISTRY_URL = "https://pypi.org/simple"
+DEFAULT_PYTHON_PACKAGE_REGISTRY_URL = "https://upload.pypi.org/legacy/"
 
 
 class CIContext(str, Enum):
diff --git a/airbyte-ci/connectors/pipelines/pipelines/models/contexts/python_registry_publish.py b/airbyte-ci/connectors/pipelines/pipelines/models/contexts/python_registry_publish.py
index ee45760d2f9d9..a189b476b8921 100644
--- a/airbyte-ci/connectors/pipelines/pipelines/models/contexts/python_registry_publish.py
+++ b/airbyte-ci/connectors/pipelines/pipelines/models/contexts/python_registry_publish.py
@@ -2,7 +2,6 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-import os
 from dataclasses import dataclass
 from datetime import datetime
 from typing import Optional, Type
@@ -86,8 +85,8 @@ async def from_publish_connector_context(
             version = f"{version}.dev{release_candidate_tag}"
 
         pypi_context = cls(
-            python_registry_token=os.environ["PYTHON_REGISTRY_TOKEN"],
-            registry="https://test.pypi.org/legacy/",  # TODO: go live
+            python_registry_token=str(connector_context.python_registry_token),
+            registry=str(connector_context.python_registry_url),
             package_path=str(connector_context.connector.code_directory),
             package_name=current_metadata["remoteRegistries"]["pypi"]["packageName"],
             version=version,
diff --git a/airbyte-ci/connectors/pipelines/pyproject.toml b/airbyte-ci/connectors/pipelines/pyproject.toml
index d3dca0a54f601..8828208d99dd3 100644
--- a/airbyte-ci/connectors/pipelines/pyproject.toml
+++ b/airbyte-ci/connectors/pipelines/pyproject.toml
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
 
 [tool.poetry]
 name = "pipelines"
-version = "3.8.1"
+version = "3.9.0"
 description = "Packaged maintained by the connector operations team to perform CI for connectors' pipelines"
 authors = ["Airbyte <contact@airbyte.io>"]
 
diff --git a/airbyte-ci/connectors/pipelines/tests/test_publish.py b/airbyte-ci/connectors/pipelines/tests/test_publish.py
index ce8913e648abd..471c89ae6ece2 100644
--- a/airbyte-ci/connectors/pipelines/tests/test_publish.py
+++ b/airbyte-ci/connectors/pipelines/tests/test_publish.py
@@ -5,7 +5,6 @@
 import os
 import random
 from typing import List
-from unittest.mock import patch
 
 import anyio
 import pytest
@@ -339,13 +338,14 @@ async def test_run_connector_publish_pipeline_when_image_does_not_exist(
 
 
 @pytest.mark.parametrize(
-    "pypi_enabled, pypi_package_does_not_exist_status, publish_step_status, expect_publish_to_pypi_called, expect_build_connector_called",
+    "pypi_enabled, pypi_package_does_not_exist_status, publish_step_status, expect_publish_to_pypi_called, expect_build_connector_called,api_token",
     [
-        pytest.param(True, StepStatus.SUCCESS, StepStatus.SUCCESS, True, True, id="happy_path"),
-        pytest.param(False, StepStatus.SUCCESS, StepStatus.SUCCESS, False, True, id="pypi_disabled, skip all pypi steps"),
-        pytest.param(True, StepStatus.SKIPPED, StepStatus.SUCCESS, False, True, id="pypi_package_exists, skip publish_to_pypi"),
-        pytest.param(True, StepStatus.SUCCESS, StepStatus.FAILURE, True, False, id="publish_step_fails, abort"),
-        pytest.param(True, StepStatus.FAILURE, StepStatus.FAILURE, False, False, id="pypi_package_does_not_exist_fails, abort"),
+        pytest.param(True, StepStatus.SUCCESS, StepStatus.SUCCESS, True, True, "test", id="happy_path"),
+        pytest.param(False, StepStatus.SUCCESS, StepStatus.SUCCESS, False, True, "test", id="pypi_disabled, skip all pypi steps"),
+        pytest.param(True, StepStatus.SKIPPED, StepStatus.SUCCESS, False, True, "test", id="pypi_package_exists, skip publish_to_pypi"),
+        pytest.param(True, StepStatus.SUCCESS, StepStatus.FAILURE, True, False, "test", id="publish_step_fails, abort"),
+        pytest.param(True, StepStatus.FAILURE, StepStatus.FAILURE, False, False, "test", id="pypi_package_does_not_exist_fails, abort"),
+        pytest.param(True, StepStatus.SUCCESS, StepStatus.SUCCESS, False, False, None, id="no_api_token, abort"),
     ],
 )
 async def test_run_connector_python_registry_publish_pipeline(
@@ -355,6 +355,7 @@ async def test_run_connector_python_registry_publish_pipeline(
     publish_step_status,
     expect_publish_to_pypi_called,
     expect_build_connector_called,
+    api_token,
 ):
 
     for module, to_mock in STEPS_TO_PATCH:
@@ -389,14 +390,15 @@ async def test_run_connector_python_registry_publish_pipeline(
             code_directory="path/to/connector",
             metadata={"dockerImageTag": "1.2.3", "remoteRegistries": {"pypi": {"enabled": pypi_enabled, "packageName": "test"}}},
         ),
+        python_registry_token=api_token,
+        python_registry_url="https://test.pypi.org/legacy/",
     )
     semaphore = anyio.Semaphore(1)
-    with patch.dict(os.environ, {"PYTHON_REGISTRY_TOKEN": "test"}):
-        await publish_pipeline.run_connector_publish_pipeline(context, semaphore)
+    await publish_pipeline.run_connector_publish_pipeline(context, semaphore)
     if expect_publish_to_pypi_called:
         mocked_publish_to_python_registry.return_value.run.assert_called_once()
         # assert that the first argument passed to mocked_publish_to_pypi contains the things from the context
-        assert mocked_publish_to_python_registry.call_args.args[0].python_registry_token == "test"
+        assert mocked_publish_to_python_registry.call_args.args[0].python_registry_token == api_token
         assert mocked_publish_to_python_registry.call_args.args[0].package_metadata.name == "test"
         assert mocked_publish_to_python_registry.call_args.args[0].package_metadata.version == "1.2.3"
         assert mocked_publish_to_python_registry.call_args.args[0].registry == "https://test.pypi.org/legacy/"

From 8f727208ee637c7335faccc0515679cab48bf242 Mon Sep 17 00:00:00 2001
From: Joe Reuter <joe@airbyte.io>
Date: Tue, 30 Jan 2024 10:22:13 +0100
Subject: [PATCH 13/96] airbyte-lib: Refactor connectors (#34552)

---
 .../connectors/source-activecampaign/main.py  |  9 ++---
 .../connectors/source-activecampaign/setup.py | 19 +++++++++-
 .../source_activecampaign/run.py              | 14 ++++++++
 .../connectors/source-adjust/main.py          |  9 ++---
 .../connectors/source-adjust/setup.py         | 19 +++++++++-
 .../source-adjust/source_adjust/run.py        | 14 ++++++++
 .../connectors/source-aha/main.py             |  9 ++---
 .../connectors/source-aha/setup.py            | 19 +++++++++-
 .../connectors/source-aha/source_aha/run.py   | 14 ++++++++
 .../connectors/source-aircall/main.py         |  9 ++---
 .../connectors/source-aircall/setup.py        | 19 +++++++++-
 .../source-aircall/source_aircall/run.py      | 14 ++++++++
 .../connectors/source-airtable/main.py        |  9 ++---
 .../connectors/source-airtable/setup.py       |  5 +++
 .../source-airtable/source_airtable/run.py    | 14 ++++++++
 .../connectors/source-alpha-vantage/main.py   |  9 ++---
 .../connectors/source-alpha-vantage/setup.py  | 19 +++++++++-
 .../source_alpha_vantage/run.py               | 14 ++++++++
 .../connectors/source-amazon-ads/main.py      | 11 ++----
 .../connectors/source-amazon-ads/setup.py     |  5 +++
 .../source_amazon_ads/run.py                  | 16 +++++++++
 .../source-amazon-seller-partner/main.py      | 12 ++-----
 .../source-amazon-seller-partner/setup.py     |  5 +++
 .../source_amazon_seller_partner/run.py       | 17 +++++++++
 .../connectors/source-amazon-sqs/main.py      |  9 ++---
 .../connectors/source-amazon-sqs/setup.py     |  5 +++
 .../source_amazon_sqs/run.py                  | 14 ++++++++
 .../connectors/source-amplitude/main.py       |  9 ++---
 .../connectors/source-amplitude/setup.py      | 19 +++++++++-
 .../source-amplitude/source_amplitude/run.py  | 14 ++++++++
 .../connectors/source-apify-dataset/setup.py  | 14 +++++++-
 .../connectors/source-appfollow/main.py       |  9 ++---
 .../connectors/source-appfollow/setup.py      | 19 +++++++++-
 .../source-appfollow/source_appfollow/run.py  | 14 ++++++++
 .../source-apple-search-ads/main.py           |  9 ++---
 .../source-apple-search-ads/setup.py          | 19 +++++++++-
 .../source_apple_search_ads/run.py            | 14 ++++++++
 .../connectors/source-appsflyer/main.py       |  9 ++---
 .../connectors/source-appsflyer/setup.py      |  5 +++
 .../source-appsflyer/source_appsflyer/run.py  | 14 ++++++++
 .../connectors/source-appstore-singer/main.py |  9 ++---
 .../source-appstore-singer/setup.py           |  5 +++
 .../source_appstore_singer/run.py             | 14 ++++++++
 .../connectors/source-asana/main.py           |  9 ++---
 .../connectors/source-asana/setup.py          |  5 +++
 .../source-asana/source_asana/run.py          | 14 ++++++++
 .../connectors/source-ashby/main.py           |  9 ++---
 .../connectors/source-ashby/setup.py          | 19 +++++++++-
 .../source-ashby/source_ashby/run.py          | 14 ++++++++
 .../connectors/source-auth0/main.py           |  9 ++---
 .../connectors/source-auth0/setup.py          | 19 +++++++++-
 .../source-auth0/source_auth0/run.py          | 14 ++++++++
 .../connectors/source-aws-cloudtrail/main.py  |  9 ++---
 .../connectors/source-aws-cloudtrail/setup.py |  5 +++
 .../source_aws_cloudtrail/run.py              | 14 ++++++++
 .../source-azure-blob-storage/main.py         | 29 ++-------------
 .../source-azure-blob-storage/setup.py        |  5 +++
 .../source_azure_blob_storage/run.py          | 34 ++++++++++++++++++
 .../connectors/source-azure-table/main.py     |  9 ++---
 .../connectors/source-azure-table/setup.py    |  5 +++
 .../source_azure_table/run.py                 | 14 ++++++++
 .../connectors/source-babelforce/main.py      |  9 ++---
 .../connectors/source-babelforce/setup.py     | 19 +++++++++-
 .../source_babelforce/run.py                  | 14 ++++++++
 .../connectors/source-bamboo-hr/main.py       |  9 ++---
 .../connectors/source-bamboo-hr/setup.py      |  5 +++
 .../source-bamboo-hr/source_bamboo_hr/run.py  | 14 ++++++++
 .../connectors/source-bigcommerce/main.py     |  9 ++---
 .../connectors/source-bigcommerce/setup.py    | 19 +++++++++-
 .../source_bigcommerce/run.py                 | 14 ++++++++
 .../connectors/source-bing-ads/main.py        |  9 ++---
 .../connectors/source-bing-ads/setup.py       |  5 +++
 .../source-bing-ads/source_bing_ads/run.py    | 14 ++++++++
 .../connectors/source-braintree/main.py       |  9 ++---
 .../connectors/source-braintree/setup.py      | 19 +++++++++-
 .../source-braintree/source_braintree/run.py  | 14 ++++++++
 .../connectors/source-braze/main.py           |  9 ++---
 .../connectors/source-braze/setup.py          | 19 +++++++++-
 .../source-braze/source_braze/run.py          | 14 ++++++++
 .../connectors/source-breezometer/main.py     |  9 ++---
 .../connectors/source-breezometer/setup.py    | 19 +++++++++-
 .../source_breezometer/run.py                 | 14 ++++++++
 .../connectors/source-callrail/main.py        |  9 ++---
 .../connectors/source-callrail/setup.py       | 19 +++++++++-
 .../source-callrail/source_callrail/run.py    | 14 ++++++++
 .../connectors/source-captain-data/main.py    |  9 ++---
 .../connectors/source-captain-data/setup.py   | 19 +++++++++-
 .../source_captain_data/run.py                | 14 ++++++++
 .../connectors/source-cart/main.py            |  9 ++---
 .../connectors/source-cart/setup.py           |  5 +++
 .../connectors/source-cart/source_cart/run.py | 14 ++++++++
 .../connectors/source-chargebee/main.py       |  9 ++---
 .../connectors/source-chargebee/setup.py      | 19 +++++++++-
 .../source-chargebee/source_chargebee/run.py  | 14 ++++++++
 .../connectors/source-chargify/main.py        |  9 ++---
 .../connectors/source-chargify/setup.py       | 19 +++++++++-
 .../source-chargify/source_chargify/run.py    | 14 ++++++++
 .../connectors/source-chartmogul/main.py      |  9 ++---
 .../connectors/source-chartmogul/setup.py     |  5 +++
 .../source_chartmogul/run.py                  | 14 ++++++++
 .../connectors/source-clickup-api/main.py     |  9 ++---
 .../connectors/source-clickup-api/setup.py    | 19 +++++++++-
 .../source_clickup_api/run.py                 | 14 ++++++++
 .../connectors/source-clockify/main.py        |  9 ++---
 .../connectors/source-clockify/setup.py       | 19 +++++++++-
 .../source-clockify/source_clockify/run.py    | 14 ++++++++
 .../connectors/source-close-com/main.py       |  9 ++---
 .../connectors/source-close-com/setup.py      |  5 +++
 .../source-close-com/source_close_com/run.py  | 14 ++++++++
 .../connectors/source-coda/main.py            |  9 ++---
 .../connectors/source-coda/setup.py           | 19 +++++++++-
 .../connectors/source-coda/source_coda/run.py | 14 ++++++++
 .../connectors/source-coin-api/main.py        |  9 ++---
 .../connectors/source-coin-api/setup.py       | 19 +++++++++-
 .../source-coin-api/source_coin_api/run.py    | 14 ++++++++
 .../connectors/source-coingecko-coins/main.py |  9 ++---
 .../source-coingecko-coins/setup.py           | 19 +++++++++-
 .../source_coingecko_coins/run.py             | 14 ++++++++
 .../connectors/source-coinmarketcap/main.py   |  9 ++---
 .../connectors/source-coinmarketcap/setup.py  | 19 +++++++++-
 .../source_coinmarketcap/run.py               | 14 ++++++++
 .../connectors/source-commcare/main.py        |  9 ++---
 .../connectors/source-commcare/setup.py       | 19 +++++++++-
 .../source-commcare/source_commcare/run.py    | 14 ++++++++
 .../connectors/source-commercetools/main.py   |  9 ++---
 .../connectors/source-commercetools/setup.py  | 19 +++++++++-
 .../source_commercetools/run.py               | 14 ++++++++
 .../connectors/source-configcat/main.py       |  9 ++---
 .../connectors/source-configcat/setup.py      | 19 +++++++++-
 .../source-configcat/source_configcat/run.py  | 14 ++++++++
 .../connectors/source-confluence/main.py      |  9 ++---
 .../connectors/source-confluence/setup.py     | 19 +++++++++-
 .../source_confluence/run.py                  | 14 ++++++++
 .../connectors/source-convertkit/main.py      |  9 ++---
 .../connectors/source-convertkit/setup.py     | 19 +++++++++-
 .../source_convertkit/run.py                  | 14 ++++++++
 .../connectors/source-convex/main.py          |  9 ++---
 .../connectors/source-convex/setup.py         | 19 +++++++++-
 .../source-convex/source_convex/run.py        | 14 ++++++++
 .../connectors/source-copper/main.py          |  9 ++---
 .../connectors/source-copper/setup.py         | 19 +++++++++-
 .../source-copper/source_copper/run.py        | 14 ++++++++
 .../connectors/source-courier/main.py         |  9 ++---
 .../connectors/source-courier/setup.py        | 19 +++++++++-
 .../source-courier/source_courier/run.py      | 14 ++++++++
 .../connectors/source-customer-io/main.py     |  9 ++---
 .../connectors/source-customer-io/setup.py    | 19 +++++++++-
 .../source_customer_io/run.py                 | 14 ++++++++
 .../connectors/source-datadog/main.py         |  9 ++---
 .../connectors/source-datadog/setup.py        | 19 +++++++++-
 .../source-datadog/source_datadog/run.py      | 14 ++++++++
 .../connectors/source-datascope/main.py       |  9 ++---
 .../connectors/source-datascope/setup.py      | 19 +++++++++-
 .../source-datascope/source_datascope/run.py  | 14 ++++++++
 .../connectors/source-delighted/main.py       | 31 ++--------------
 .../connectors/source-delighted/setup.py      |  5 +++
 .../source-delighted/source_delighted/run.py  | 36 +++++++++++++++++++
 .../connectors/source-dixa/main.py            |  9 ++---
 .../connectors/source-dixa/setup.py           | 19 +++++++++-
 .../connectors/source-dixa/source_dixa/run.py | 14 ++++++++
 .../connectors/source-dockerhub/main.py       |  9 ++---
 .../connectors/source-dockerhub/setup.py      | 19 +++++++++-
 .../source-dockerhub/source_dockerhub/run.py  | 14 ++++++++
 .../connectors/source-dremio/main.py          |  9 ++---
 .../connectors/source-dremio/setup.py         | 19 +++++++++-
 .../source-dremio/source_dremio/run.py        | 14 ++++++++
 .../connectors/source-drift/main.py           |  9 ++---
 .../connectors/source-drift/setup.py          | 19 +++++++++-
 .../source-drift/source_drift/run.py          | 14 ++++++++
 .../connectors/source-dv-360/main.py          |  9 ++---
 .../connectors/source-dv-360/setup.py         |  5 +++
 .../source-dv-360/source_dv_360/run.py        | 14 ++++++++
 .../connectors/source-emailoctopus/main.py    |  9 ++---
 .../connectors/source-emailoctopus/setup.py   | 19 +++++++++-
 .../source_emailoctopus/run.py                | 14 ++++++++
 .../connectors/source-everhour/main.py        |  9 ++---
 .../connectors/source-everhour/setup.py       | 19 +++++++++-
 .../source-everhour/source_everhour/run.py    | 14 ++++++++
 .../connectors/source-exchange-rates/main.py  |  9 ++---
 .../connectors/source-exchange-rates/setup.py | 19 +++++++++-
 .../source_exchange_rates/run.py              | 14 ++++++++
 .../connectors/source-facebook-pages/main.py  |  9 ++---
 .../connectors/source-facebook-pages/setup.py | 19 +++++++++-
 .../source_facebook_pages/run.py              | 14 ++++++++
 .../connectors/source-fastbill/main.py        |  9 ++---
 .../connectors/source-fastbill/setup.py       | 19 +++++++++-
 .../source-fastbill/source_fastbill/run.py    | 14 ++++++++
 .../connectors/source-fauna/main.py           |  9 ++---
 .../connectors/source-fauna/setup.py          |  5 +++
 .../source-fauna/source_fauna/run.py          | 14 ++++++++
 .../connectors/source-file/main.py            |  9 ++---
 .../connectors/source-file/setup.py           |  5 +++
 .../connectors/source-file/source_file/run.py | 14 ++++++++
 .../source-firebase-realtime-database/main.py |  9 ++---
 .../setup.py                                  |  5 +++
 .../source_firebase_realtime_database/run.py  | 14 ++++++++
 .../connectors/source-firebolt/main.py        |  9 ++---
 .../connectors/source-firebolt/setup.py       |  5 +++
 .../source-firebolt/source_firebolt/run.py    | 14 ++++++++
 .../connectors/source-flexport/main.py        |  9 ++---
 .../connectors/source-flexport/setup.py       | 19 +++++++++-
 .../source-flexport/source_flexport/run.py    | 14 ++++++++
 .../connectors/source-freshcaller/main.py     |  9 ++---
 .../connectors/source-freshcaller/setup.py    | 19 +++++++++-
 .../source_freshcaller/run.py                 | 14 ++++++++
 .../connectors/source-freshsales/main.py      |  9 ++---
 .../connectors/source-freshsales/setup.py     | 19 +++++++++-
 .../source_freshsales/run.py                  | 14 ++++++++
 .../connectors/source-freshservice/main.py    |  9 ++---
 .../connectors/source-freshservice/setup.py   | 19 +++++++++-
 .../source_freshservice/run.py                | 14 ++++++++
 .../connectors/source-fullstory/main.py       |  9 ++---
 .../connectors/source-fullstory/setup.py      | 19 +++++++++-
 .../source-fullstory/source_fullstory/run.py  | 14 ++++++++
 .../connectors/source-gainsight-px/main.py    |  9 ++---
 .../connectors/source-gainsight-px/setup.py   | 19 +++++++++-
 .../source_gainsight_px/run.py                | 14 ++++++++
 .../connectors/source-gcs/main.py             | 11 ++----
 .../connectors/source-gcs/setup.py            |  5 +++
 .../connectors/source-gcs/source_gcs/run.py   | 16 +++++++++
 .../connectors/source-genesys/main.py         |  9 ++---
 .../connectors/source-genesys/setup.py        | 19 +++++++++-
 .../source-genesys/source_genesys/run.py      | 14 ++++++++
 .../connectors/source-getlago/main.py         |  9 ++---
 .../connectors/source-getlago/setup.py        | 19 +++++++++-
 .../source-getlago/source_getlago/run.py      | 14 ++++++++
 .../connectors/source-github/main.py          | 12 ++-----
 .../connectors/source-github/setup.py         |  5 +++
 .../source-github/source_github/run.py        | 17 +++++++++
 .../connectors/source-glassfrog/main.py       |  9 ++---
 .../connectors/source-glassfrog/setup.py      | 19 +++++++++-
 .../source-glassfrog/source_glassfrog/run.py  | 14 ++++++++
 .../connectors/source-gnews/main.py           |  9 ++---
 .../connectors/source-gnews/setup.py          | 19 +++++++++-
 .../source-gnews/source_gnews/run.py          | 14 ++++++++
 .../connectors/source-gocardless/main.py      |  9 ++---
 .../connectors/source-gocardless/setup.py     | 19 +++++++++-
 .../source_gocardless/run.py                  | 14 ++++++++
 .../connectors/source-gong/main.py            |  9 ++---
 .../connectors/source-gong/setup.py           | 19 +++++++++-
 .../connectors/source-gong/source_gong/run.py | 14 ++++++++
 .../source-google-analytics-v4/main.py        |  9 ++---
 .../source-google-analytics-v4/setup.py       |  5 +++
 .../source_google_analytics_v4/run.py         | 14 ++++++++
 .../source-google-directory/main.py           |  9 ++---
 .../source-google-directory/setup.py          |  5 +++
 .../source_google_directory/run.py            | 14 ++++++++
 .../source-google-pagespeed-insights/main.py  |  9 ++---
 .../source-google-pagespeed-insights/setup.py | 19 +++++++++-
 .../source_google_pagespeed_insights/run.py   | 14 ++++++++
 .../source-google-search-console/main.py      | 13 ++-----
 .../source-google-search-console/setup.py     |  5 +++
 .../source_google_search_console/run.py       | 18 ++++++++++
 .../connectors/source-google-sheets/setup.py  | 14 +++++++-
 .../connectors/source-google-webfonts/main.py |  9 ++---
 .../source-google-webfonts/setup.py           | 19 +++++++++-
 .../source_google_webfonts/run.py             | 14 ++++++++
 .../main.py                                   |  9 ++---
 .../setup.py                                  |  5 +++
 .../run.py                                    | 14 ++++++++
 .../connectors/source-greenhouse/main.py      |  9 ++---
 .../connectors/source-greenhouse/setup.py     |  5 +++
 .../source_greenhouse/run.py                  | 14 ++++++++
 .../connectors/source-gridly/main.py          |  9 ++---
 .../connectors/source-gridly/setup.py         | 19 +++++++++-
 .../source-gridly/source_gridly/run.py        | 14 ++++++++
 .../connectors/source-gutendex/main.py        |  9 ++---
 .../connectors/source-gutendex/setup.py       | 19 +++++++++-
 .../source-gutendex/source_gutendex/run.py    | 14 ++++++++
 .../connectors/source-harness/main.py         |  9 ++---
 .../connectors/source-harness/setup.py        | 19 +++++++++-
 .../source-harness/source_harness/run.py      | 14 ++++++++
 .../connectors/source-harvest/main.py         |  9 ++---
 .../connectors/source-harvest/setup.py        |  5 +++
 .../source-harvest/source_harvest/run.py      | 14 ++++++++
 .../connectors/source-hellobaton/main.py      |  9 ++---
 .../connectors/source-hellobaton/setup.py     | 19 +++++++++-
 .../source_hellobaton/run.py                  | 14 ++++++++
 .../connectors/source-hubplanner/main.py      |  9 ++---
 .../connectors/source-hubplanner/setup.py     | 19 +++++++++-
 .../source_hubplanner/run.py                  | 14 ++++++++
 .../connectors/source-hubspot/main.py         |  9 ++---
 .../connectors/source-hubspot/setup.py        |  5 +++
 .../source-hubspot/source_hubspot/run.py      | 14 ++++++++
 .../connectors/source-insightly/main.py       |  9 ++---
 .../connectors/source-insightly/setup.py      | 19 +++++++++-
 .../source-insightly/source_insightly/run.py  | 14 ++++++++
 .../connectors/source-instatus/main.py        |  9 ++---
 .../connectors/source-instatus/setup.py       | 19 +++++++++-
 .../source-instatus/source_instatus/run.py    | 14 ++++++++
 .../connectors/source-intercom/main.py        |  9 ++---
 .../connectors/source-intercom/setup.py       | 19 +++++++++-
 .../source-intercom/source_intercom/run.py    | 14 ++++++++
 .../connectors/source-intruder/main.py        |  9 ++---
 .../connectors/source-intruder/setup.py       | 19 +++++++++-
 .../source-intruder/source_intruder/run.py    | 14 ++++++++
 .../connectors/source-ip2whois/main.py        |  9 ++---
 .../connectors/source-ip2whois/setup.py       | 19 +++++++++-
 .../source-ip2whois/source_ip2whois/run.py    | 14 ++++++++
 .../connectors/source-jira/main.py            |  9 ++---
 .../connectors/source-jira/setup.py           |  5 +++
 .../connectors/source-jira/source_jira/run.py | 14 ++++++++
 .../connectors/source-k6-cloud/main.py        |  9 ++---
 .../connectors/source-k6-cloud/setup.py       | 19 +++++++++-
 .../source-k6-cloud/source_k6_cloud/run.py    | 14 ++++++++
 .../connectors/source-klarna/main.py          |  9 ++---
 .../connectors/source-klarna/setup.py         | 19 +++++++++-
 .../source-klarna/source_klarna/run.py        | 14 ++++++++
 .../connectors/source-klaus-api/main.py       |  9 ++---
 .../connectors/source-klaus-api/setup.py      | 19 +++++++++-
 .../source-klaus-api/source_klaus_api/run.py  | 14 ++++++++
 .../connectors/source-klaviyo/main.py         |  9 ++---
 .../connectors/source-klaviyo/setup.py        |  5 +++
 .../source-klaviyo/source_klaviyo/run.py      | 14 ++++++++
 .../connectors/source-kustomer-singer/main.py |  8 ++---
 .../source-kustomer-singer/setup.py           |  5 +++
 .../source_kustomer_singer/run.py             | 13 +++++++
 .../connectors/source-kyriba/main.py          |  9 ++---
 .../connectors/source-kyriba/setup.py         |  5 +++
 .../source-kyriba/source_kyriba/run.py        | 14 ++++++++
 .../connectors/source-kyve/main.py            |  9 ++---
 .../connectors/source-kyve/setup.py           |  5 +++
 .../connectors/source-kyve/source_kyve/run.py | 14 ++++++++
 .../connectors/source-launchdarkly/main.py    |  9 ++---
 .../connectors/source-launchdarkly/setup.py   | 19 +++++++++-
 .../source_launchdarkly/run.py                | 14 ++++++++
 .../connectors/source-lemlist/main.py         |  9 ++---
 .../connectors/source-lemlist/setup.py        | 19 +++++++++-
 .../source-lemlist/source_lemlist/run.py      | 14 ++++++++
 .../connectors/source-lever-hiring/main.py    |  9 ++---
 .../connectors/source-lever-hiring/setup.py   |  5 +++
 .../source_lever_hiring/run.py                | 14 ++++++++
 .../connectors/source-linkedin-pages/main.py  |  9 ++---
 .../connectors/source-linkedin-pages/setup.py |  5 +++
 .../source_linkedin_pages/run.py              | 14 ++++++++
 .../connectors/source-linnworks/main.py       |  9 ++---
 .../connectors/source-linnworks/setup.py      |  5 +++
 .../source-linnworks/source_linnworks/run.py  | 14 ++++++++
 .../connectors/source-lokalise/main.py        |  9 ++---
 .../connectors/source-lokalise/setup.py       | 19 +++++++++-
 .../source-lokalise/source_lokalise/run.py    | 14 ++++++++
 .../connectors/source-looker/main.py          |  9 ++---
 .../connectors/source-looker/setup.py         |  5 +++
 .../source-looker/source_looker/run.py        | 14 ++++++++
 .../connectors/source-mailerlite/main.py      |  9 ++---
 .../connectors/source-mailerlite/setup.py     | 19 +++++++++-
 .../source_mailerlite/run.py                  | 14 ++++++++
 .../connectors/source-mailersend/main.py      |  9 ++---
 .../connectors/source-mailersend/setup.py     | 19 +++++++++-
 .../source_mailersend/run.py                  | 14 ++++++++
 .../connectors/source-mailgun/main.py         |  9 ++---
 .../connectors/source-mailgun/setup.py        | 19 +++++++++-
 .../source-mailgun/source_mailgun/run.py      | 14 ++++++++
 .../connectors/source-mailjet-mail/main.py    |  9 ++---
 .../connectors/source-mailjet-mail/setup.py   | 19 +++++++++-
 .../source_mailjet_mail/run.py                | 14 ++++++++
 .../connectors/source-mailjet-sms/main.py     |  9 ++---
 .../connectors/source-mailjet-sms/setup.py    | 19 +++++++++-
 .../source_mailjet_sms/run.py                 | 14 ++++++++
 .../connectors/source-merge/main.py           |  9 ++---
 .../connectors/source-merge/setup.py          | 19 +++++++++-
 .../source-merge/source_merge/run.py          | 14 ++++++++
 .../connectors/source-metabase/main.py        |  9 ++---
 .../connectors/source-metabase/setup.py       | 19 +++++++++-
 .../source-metabase/source_metabase/run.py    | 14 ++++++++
 .../source-microsoft-dataverse/main.py        |  9 ++---
 .../source-microsoft-dataverse/setup.py       | 19 +++++++++-
 .../source_microsoft_dataverse/run.py         | 14 ++++++++
 .../source-microsoft-onedrive/main.py         | 12 ++-----
 .../source-microsoft-onedrive/setup.py        | 19 +++++++++-
 .../source_microsoft_onedrive/run.py          | 17 +++++++++
 .../connectors/source-microsoft-teams/main.py |  9 ++---
 .../source-microsoft-teams/setup.py           |  5 +++
 .../source_microsoft_teams/run.py             | 14 ++++++++
 .../connectors/source-monday/main.py          |  9 ++---
 .../connectors/source-monday/setup.py         |  5 +++
 .../source-monday/source_monday/run.py        | 14 ++++++++
 .../connectors/source-my-hours/main.py        |  9 ++---
 .../connectors/source-my-hours/setup.py       |  5 +++
 .../source-my-hours/source_my_hours/run.py    | 14 ++++++++
 .../connectors/source-n8n/main.py             |  9 ++---
 .../connectors/source-n8n/setup.py            | 19 +++++++++-
 .../connectors/source-n8n/source_n8n/run.py   | 14 ++++++++
 .../connectors/source-nasa/main.py            |  9 ++---
 .../connectors/source-nasa/setup.py           | 19 +++++++++-
 .../connectors/source-nasa/source_nasa/run.py | 14 ++++++++
 .../connectors/source-netsuite/main.py        |  9 ++---
 .../connectors/source-netsuite/setup.py       | 19 +++++++++-
 .../source-netsuite/source_netsuite/run.py    | 14 ++++++++
 .../connectors/source-news-api/main.py        |  9 ++---
 .../connectors/source-news-api/setup.py       | 19 +++++++++-
 .../source-news-api/source_news_api/run.py    | 14 ++++++++
 .../connectors/source-newsdata/main.py        |  9 ++---
 .../connectors/source-newsdata/setup.py       | 19 +++++++++-
 .../source-newsdata/source_newsdata/run.py    | 14 ++++++++
 .../connectors/source-notion/main.py          |  9 ++---
 .../connectors/source-notion/setup.py         |  5 +++
 .../source-notion/source_notion/run.py        | 14 ++++++++
 .../connectors/source-nytimes/main.py         |  9 ++---
 .../connectors/source-nytimes/setup.py        | 19 +++++++++-
 .../source-nytimes/source_nytimes/run.py      | 14 ++++++++
 .../connectors/source-okta/main.py            |  9 ++---
 .../connectors/source-okta/setup.py           |  5 +++
 .../connectors/source-okta/source_okta/run.py | 14 ++++++++
 .../connectors/source-omnisend/main.py        |  9 ++---
 .../connectors/source-omnisend/setup.py       | 19 +++++++++-
 .../source-omnisend/source_omnisend/run.py    | 14 ++++++++
 .../connectors/source-onesignal/main.py       |  9 ++---
 .../connectors/source-onesignal/setup.py      | 19 +++++++++-
 .../source-onesignal/source_onesignal/run.py  | 14 ++++++++
 .../source-open-exchange-rates/main.py        |  9 ++---
 .../source-open-exchange-rates/setup.py       | 19 +++++++++-
 .../source_open_exchange_rates/run.py         | 14 ++++++++
 .../connectors/source-openweather/main.py     |  9 ++---
 .../connectors/source-openweather/setup.py    | 19 +++++++++-
 .../source_openweather/run.py                 | 14 ++++++++
 .../connectors/source-opsgenie/main.py        |  9 ++---
 .../connectors/source-opsgenie/setup.py       | 19 +++++++++-
 .../source-opsgenie/source_opsgenie/run.py    | 14 ++++++++
 .../connectors/source-orb/main.py             |  9 ++---
 .../connectors/source-orb/setup.py            |  5 +++
 .../connectors/source-orb/source_orb/run.py   | 14 ++++++++
 .../connectors/source-orbit/main.py           |  9 ++---
 .../connectors/source-orbit/setup.py          | 19 +++++++++-
 .../source-orbit/source_orbit/run.py          | 14 ++++++++
 .../connectors/source-oura/main.py            |  9 ++---
 .../connectors/source-oura/setup.py           | 19 +++++++++-
 .../connectors/source-oura/source_oura/run.py | 14 ++++++++
 .../source-outbrain-amplify/main.py           |  9 ++---
 .../source-outbrain-amplify/setup.py          | 19 +++++++++-
 .../source_outbrain_amplify/run.py            | 14 ++++++++
 .../connectors/source-outreach/main.py        |  9 ++---
 .../connectors/source-outreach/setup.py       |  5 +++
 .../source-outreach/source_outreach/run.py    | 14 ++++++++
 .../connectors/source-pagerduty/main.py       |  9 ++---
 .../connectors/source-pagerduty/setup.py      | 19 +++++++++-
 .../source-pagerduty/source_pagerduty/run.py  | 14 ++++++++
 .../connectors/source-pardot/main.py          |  9 ++---
 .../connectors/source-pardot/setup.py         |  5 +++
 .../source-pardot/source_pardot/run.py        | 14 ++++++++
 .../connectors/source-partnerstack/main.py    |  9 ++---
 .../connectors/source-partnerstack/setup.py   | 19 +++++++++-
 .../source_partnerstack/run.py                | 14 ++++++++
 .../source-paypal-transaction/setup.py        | 14 +++++++-
 .../connectors/source-paystack/main.py        |  9 ++---
 .../connectors/source-paystack/setup.py       |  5 +++
 .../source-paystack/source_paystack/run.py    | 14 ++++++++
 .../connectors/source-pendo/main.py           |  9 ++---
 .../connectors/source-pendo/setup.py          | 19 +++++++++-
 .../source-pendo/source_pendo/run.py          | 14 ++++++++
 .../connectors/source-persistiq/main.py       |  9 ++---
 .../connectors/source-persistiq/setup.py      | 19 +++++++++-
 .../source-persistiq/source_persistiq/run.py  | 14 ++++++++
 .../connectors/source-pexels-api/main.py      |  9 ++---
 .../connectors/source-pexels-api/setup.py     | 19 +++++++++-
 .../source_pexels_api/run.py                  | 14 ++++++++
 .../connectors/source-pinterest/main.py       |  9 ++---
 .../connectors/source-pinterest/setup.py      |  5 +++
 .../source-pinterest/source_pinterest/run.py  | 14 ++++++++
 .../connectors/source-pipedrive/setup.py      | 14 +++++++-
 .../connectors/source-pivotal-tracker/main.py |  9 ++---
 .../source-pivotal-tracker/setup.py           |  5 +++
 .../source_pivotal_tracker/run.py             | 14 ++++++++
 .../connectors/source-plaid/main.py           |  9 ++---
 .../connectors/source-plaid/setup.py          | 19 +++++++++-
 .../source-plaid/source_plaid/run.py          | 14 ++++++++
 .../connectors/source-plausible/main.py       |  9 ++---
 .../connectors/source-plausible/setup.py      | 19 +++++++++-
 .../source-plausible/source_plausible/run.py  | 14 ++++++++
 .../connectors/source-pocket/main.py          |  9 ++---
 .../connectors/source-pocket/setup.py         | 19 +++++++++-
 .../source-pocket/source_pocket/run.py        | 14 ++++++++
 .../connectors/source-pokeapi/main.py         |  8 ++---
 .../connectors/source-pokeapi/setup.py        | 19 +++++++++-
 .../source-pokeapi/source_pokeapi/run.py      | 13 +++++++
 .../source-polygon-stock-api/main.py          |  9 ++---
 .../source-polygon-stock-api/setup.py         | 19 +++++++++-
 .../source_polygon_stock_api/run.py           | 14 ++++++++
 .../connectors/source-posthog/main.py         |  9 ++---
 .../connectors/source-posthog/setup.py        |  5 +++
 .../source-posthog/source_posthog/run.py      | 14 ++++++++
 .../connectors/source-postmarkapp/main.py     |  9 ++---
 .../connectors/source-postmarkapp/setup.py    | 19 +++++++++-
 .../source_postmarkapp/run.py                 | 14 ++++++++
 .../connectors/source-prestashop/main.py      |  9 ++---
 .../connectors/source-prestashop/setup.py     | 19 +++++++++-
 .../source_prestashop/run.py                  | 14 ++++++++
 .../connectors/source-primetric/main.py       |  9 ++---
 .../connectors/source-primetric/setup.py      | 19 +++++++++-
 .../source-primetric/source_primetric/run.py  | 14 ++++++++
 .../connectors/source-public-apis/main.py     |  9 ++---
 .../connectors/source-public-apis/setup.py    | 19 +++++++++-
 .../source_public_apis/run.py                 | 14 ++++++++
 .../connectors/source-punk-api/main.py        |  9 ++---
 .../connectors/source-punk-api/setup.py       | 19 +++++++++-
 .../source-punk-api/source_punk_api/run.py    | 14 ++++++++
 .../connectors/source-pypi/main.py            |  9 ++---
 .../connectors/source-pypi/setup.py           | 19 +++++++++-
 .../connectors/source-pypi/source_pypi/run.py | 14 ++++++++
 .../source-python-http-tutorial/main.py       |  9 ++---
 .../source-python-http-tutorial/setup.py      |  5 +++
 .../source_python_http_tutorial/run.py        | 14 ++++++++
 .../connectors/source-qonto/main.py           |  9 ++---
 .../connectors/source-qonto/setup.py          | 19 +++++++++-
 .../source-qonto/source_qonto/run.py          | 14 ++++++++
 .../connectors/source-qualaroo/main.py        |  9 ++---
 .../connectors/source-qualaroo/setup.py       | 19 +++++++++-
 .../source-qualaroo/source_qualaroo/run.py    | 14 ++++++++
 .../connectors/source-quickbooks/main.py      |  9 ++---
 .../connectors/source-quickbooks/setup.py     | 19 +++++++++-
 .../source_quickbooks/run.py                  | 14 ++++++++
 .../connectors/source-railz/main.py           |  9 ++---
 .../connectors/source-railz/setup.py          | 19 +++++++++-
 .../source-railz/source_railz/run.py          | 14 ++++++++
 .../source-rd-station-marketing/main.py       |  9 ++---
 .../source-rd-station-marketing/setup.py      | 19 +++++++++-
 .../source_rd_station_marketing/run.py        | 14 ++++++++
 .../connectors/source-recharge/main.py        |  9 ++---
 .../connectors/source-recharge/setup.py       |  5 +++
 .../source-recharge/source_recharge/run.py    | 14 ++++++++
 .../connectors/source-recreation/main.py      |  9 ++---
 .../connectors/source-recreation/setup.py     | 19 +++++++++-
 .../source_recreation/run.py                  | 14 ++++++++
 .../connectors/source-recruitee/main.py       |  9 ++---
 .../connectors/source-recruitee/setup.py      | 19 +++++++++-
 .../source-recruitee/source_recruitee/run.py  | 14 ++++++++
 .../connectors/source-recurly/main.py         |  9 ++---
 .../connectors/source-recurly/setup.py        |  5 +++
 .../source-recurly/source_recurly/run.py      | 14 ++++++++
 .../connectors/source-reply-io/main.py        |  9 ++---
 .../connectors/source-reply-io/setup.py       | 19 +++++++++-
 .../source-reply-io/source_reply_io/run.py    | 14 ++++++++
 .../connectors/source-retently/main.py        |  9 ++---
 .../connectors/source-retently/setup.py       | 19 +++++++++-
 .../source-retently/source_retently/run.py    | 14 ++++++++
 .../connectors/source-ringcentral/main.py     |  9 ++---
 .../connectors/source-ringcentral/setup.py    | 19 +++++++++-
 .../source_ringcentral/run.py                 | 14 ++++++++
 .../connectors/source-rki-covid/main.py       |  9 ++---
 .../connectors/source-rki-covid/setup.py      |  5 +++
 .../source-rki-covid/source_rki_covid/run.py  | 14 ++++++++
 .../connectors/source-rocket-chat/main.py     |  9 ++---
 .../connectors/source-rocket-chat/setup.py    | 19 +++++++++-
 .../source_rocket_chat/run.py                 | 14 ++++++++
 .../connectors/source-rss/main.py             |  9 ++---
 .../connectors/source-rss/setup.py            | 19 +++++++++-
 .../connectors/source-rss/source_rss/run.py   | 14 ++++++++
 .../connectors/source-salesforce/setup.py     | 14 +++++++-
 .../connectors/source-salesloft/main.py       |  9 ++---
 .../connectors/source-salesloft/setup.py      |  5 +++
 .../source-salesloft/source_salesloft/run.py  | 14 ++++++++
 .../connectors/source-sap-fieldglass/main.py  |  9 ++---
 .../connectors/source-sap-fieldglass/setup.py | 19 +++++++++-
 .../source_sap_fieldglass/run.py              | 14 ++++++++
 .../source-scaffold-source-http/main.py       |  9 ++---
 .../source-scaffold-source-http/setup.py      | 19 +++++++++-
 .../source_scaffold_source_http/run.py        | 14 ++++++++
 .../source-scaffold-source-python/main.py     |  9 ++---
 .../source-scaffold-source-python/setup.py    |  5 +++
 .../source_scaffold_source_python/run.py      | 14 ++++++++
 .../connectors/source-search-metrics/main.py  |  9 ++---
 .../connectors/source-search-metrics/setup.py |  5 +++
 .../source_search_metrics/run.py              | 14 ++++++++
 .../connectors/source-secoda/main.py          |  9 ++---
 .../connectors/source-secoda/setup.py         | 19 +++++++++-
 .../source-secoda/source_secoda/run.py        | 14 ++++++++
 .../connectors/source-sendgrid/main.py        |  9 ++---
 .../connectors/source-sendgrid/setup.py       |  5 +++
 .../source-sendgrid/source_sendgrid/run.py    | 14 ++++++++
 .../connectors/source-sendinblue/main.py      |  9 ++---
 .../connectors/source-sendinblue/setup.py     | 19 +++++++++-
 .../source_sendinblue/run.py                  | 14 ++++++++
 .../connectors/source-senseforce/main.py      |  9 ++---
 .../connectors/source-senseforce/setup.py     | 19 +++++++++-
 .../source_senseforce/run.py                  | 14 ++++++++
 .../connectors/source-sentry/main.py          |  9 ++---
 .../connectors/source-sentry/setup.py         |  5 +++
 .../source-sentry/source_sentry/run.py        | 14 ++++++++
 .../connectors/source-serpstat/main.py        |  9 ++---
 .../connectors/source-serpstat/setup.py       | 19 +++++++++-
 .../source-serpstat/source_serpstat/run.py    | 14 ++++++++
 .../connectors/source-sftp-bulk/main.py       |  9 ++---
 .../connectors/source-sftp-bulk/setup.py      |  5 +++
 .../source-sftp-bulk/source_sftp_bulk/run.py  | 14 ++++++++
 .../connectors/source-shortio/main.py         |  9 ++---
 .../connectors/source-shortio/setup.py        | 19 +++++++++-
 .../source-shortio/source_shortio/run.py      | 14 ++++++++
 .../connectors/source-smaily/main.py          |  9 ++---
 .../connectors/source-smaily/setup.py         | 19 +++++++++-
 .../source-smaily/source_smaily/run.py        | 14 ++++++++
 .../connectors/source-smartengage/main.py     |  9 ++---
 .../connectors/source-smartengage/setup.py    | 19 +++++++++-
 .../source_smartengage/run.py                 | 14 ++++++++
 .../source-snapchat-marketing/main.py         |  9 ++---
 .../source-snapchat-marketing/setup.py        |  5 +++
 .../source_snapchat_marketing/run.py          | 14 ++++++++
 .../connectors/source-sonar-cloud/main.py     |  9 ++---
 .../connectors/source-sonar-cloud/setup.py    | 19 +++++++++-
 .../source_sonar_cloud/run.py                 | 14 ++++++++
 .../connectors/source-spacex-api/main.py      |  9 ++---
 .../connectors/source-spacex-api/setup.py     | 19 +++++++++-
 .../source_spacex_api/run.py                  | 14 ++++++++
 .../connectors/source-square/main.py          |  9 ++---
 .../connectors/source-square/setup.py         | 19 +++++++++-
 .../source-square/source_square/run.py        | 14 ++++++++
 .../connectors/source-statuspage/main.py      |  9 ++---
 .../connectors/source-statuspage/setup.py     | 19 +++++++++-
 .../source_statuspage/run.py                  | 14 ++++++++
 .../connectors/source-strava/main.py          |  9 ++---
 .../connectors/source-strava/setup.py         | 19 +++++++++-
 .../source-strava/source_strava/run.py        | 14 ++++++++
 .../connectors/source-stripe/setup.py         | 14 +++++++-
 .../connectors/source-survey-sparrow/main.py  |  9 ++---
 .../connectors/source-survey-sparrow/setup.py | 19 +++++++++-
 .../source_survey_sparrow/run.py              | 14 ++++++++
 .../connectors/source-surveycto/main.py       |  9 ++---
 .../connectors/source-surveycto/setup.py      | 19 +++++++++-
 .../source-surveycto/source_surveycto/run.py  | 14 ++++++++
 .../connectors/source-surveymonkey/main.py    |  9 ++---
 .../connectors/source-surveymonkey/setup.py   |  5 +++
 .../source_surveymonkey/run.py                | 14 ++++++++
 .../source-talkdesk-explore/main.py           |  9 ++---
 .../source-talkdesk-explore/setup.py          |  5 +++
 .../source_talkdesk_explore/run.py            | 14 ++++++++
 .../connectors/source-tempo/main.py           |  9 ++---
 .../connectors/source-tempo/setup.py          |  5 +++
 .../source-tempo/source_tempo/run.py          | 14 ++++++++
 .../source-the-guardian-api/main.py           |  9 ++---
 .../source-the-guardian-api/setup.py          | 19 +++++++++-
 .../source_the_guardian_api/run.py            | 14 ++++++++
 .../source-tiktok-marketing/main.py           |  9 ++---
 .../source-tiktok-marketing/setup.py          |  5 +++
 .../source_tiktok_marketing/run.py            | 14 ++++++++
 .../connectors/source-timely/main.py          |  9 ++---
 .../connectors/source-timely/setup.py         | 19 +++++++++-
 .../source-timely/source_timely/run.py        | 14 ++++++++
 .../connectors/source-tmdb/main.py            |  9 ++---
 .../connectors/source-tmdb/setup.py           | 19 +++++++++-
 .../connectors/source-tmdb/source_tmdb/run.py | 14 ++++++++
 .../connectors/source-todoist/main.py         |  9 ++---
 .../connectors/source-todoist/setup.py        | 19 +++++++++-
 .../source-todoist/source_todoist/run.py      | 14 ++++++++
 .../connectors/source-toggl/main.py           |  9 ++---
 .../connectors/source-toggl/setup.py          | 19 +++++++++-
 .../source-toggl/source_toggl/run.py          | 14 ++++++++
 .../connectors/source-tplcentral/main.py      |  9 ++---
 .../connectors/source-tplcentral/setup.py     |  5 +++
 .../source_tplcentral/run.py                  | 14 ++++++++
 .../connectors/source-trello/main.py          |  9 ++---
 .../connectors/source-trello/setup.py         | 19 +++++++++-
 .../source-trello/source_trello/run.py        | 14 ++++++++
 .../connectors/source-trustpilot/main.py      |  9 ++---
 .../connectors/source-trustpilot/setup.py     | 19 +++++++++-
 .../source_trustpilot/run.py                  | 14 ++++++++
 .../connectors/source-tvmaze-schedule/main.py |  9 ++---
 .../source-tvmaze-schedule/setup.py           | 19 +++++++++-
 .../source_tvmaze_schedule/run.py             | 14 ++++++++
 .../source-twilio-taskrouter/main.py          |  9 ++---
 .../source-twilio-taskrouter/setup.py         | 19 +++++++++-
 .../source_twilio_taskrouter/run.py           | 14 ++++++++
 .../connectors/source-twilio/main.py          |  9 ++---
 .../connectors/source-twilio/setup.py         |  5 +++
 .../source-twilio/source_twilio/run.py        | 14 ++++++++
 .../connectors/source-twitter/main.py         |  9 ++---
 .../connectors/source-twitter/setup.py        | 19 +++++++++-
 .../source-twitter/source_twitter/run.py      | 14 ++++++++
 .../connectors/source-tyntec-sms/main.py      |  9 ++---
 .../connectors/source-tyntec-sms/setup.py     | 19 +++++++++-
 .../source_tyntec_sms/run.py                  | 14 ++++++++
 .../connectors/source-typeform/setup.py       | 14 +++++++-
 .../connectors/source-unleash/main.py         |  9 ++---
 .../connectors/source-unleash/setup.py        | 19 +++++++++-
 .../source-unleash/source_unleash/run.py      | 14 ++++++++
 .../connectors/source-us-census/main.py       |  9 ++---
 .../connectors/source-us-census/setup.py      |  5 +++
 .../source-us-census/source_us_census/run.py  | 14 ++++++++
 .../connectors/source-vantage/main.py         |  9 ++---
 .../connectors/source-vantage/setup.py        | 19 +++++++++-
 .../source-vantage/source_vantage/run.py      | 14 ++++++++
 .../connectors/source-visma-economic/main.py  |  9 ++---
 .../connectors/source-visma-economic/setup.py | 19 +++++++++-
 .../source_visma_economic/run.py              | 14 ++++++++
 .../connectors/source-vitally/main.py         |  9 ++---
 .../connectors/source-vitally/setup.py        | 19 +++++++++-
 .../source-vitally/source_vitally/run.py      | 14 ++++++++
 .../connectors/source-waiteraid/main.py       |  9 ++---
 .../connectors/source-waiteraid/setup.py      | 19 +++++++++-
 .../source-waiteraid/source_waiteraid/run.py  | 14 ++++++++
 .../connectors/source-weatherstack/main.py    |  9 ++---
 .../connectors/source-weatherstack/setup.py   | 19 +++++++++-
 .../source_weatherstack/run.py                | 14 ++++++++
 .../connectors/source-webflow/main.py         |  9 ++---
 .../connectors/source-webflow/setup.py        | 19 +++++++++-
 .../source-webflow/source_webflow/run.py      | 14 ++++++++
 .../connectors/source-whisky-hunter/main.py   |  9 ++---
 .../connectors/source-whisky-hunter/setup.py  | 19 +++++++++-
 .../source_whisky_hunter/run.py               | 14 ++++++++
 .../source-wikipedia-pageviews/main.py        |  9 ++---
 .../source-wikipedia-pageviews/setup.py       | 19 +++++++++-
 .../source_wikipedia_pageviews/run.py         | 14 ++++++++
 .../connectors/source-woocommerce/main.py     |  9 ++---
 .../connectors/source-woocommerce/setup.py    | 19 +++++++++-
 .../source_woocommerce/run.py                 | 14 ++++++++
 .../connectors/source-workable/main.py        |  9 ++---
 .../connectors/source-workable/setup.py       | 19 +++++++++-
 .../source-workable/source_workable/run.py    | 14 ++++++++
 .../connectors/source-workramp/main.py        |  9 ++---
 .../connectors/source-workramp/setup.py       | 19 +++++++++-
 .../source-workramp/source_workramp/run.py    | 14 ++++++++
 .../connectors/source-wrike/main.py           |  9 ++---
 .../connectors/source-wrike/setup.py          | 19 +++++++++-
 .../source-wrike/source_wrike/run.py          | 14 ++++++++
 .../connectors/source-xero/setup.py           | 14 +++++++-
 .../connectors/source-xkcd/main.py            |  9 ++---
 .../connectors/source-xkcd/setup.py           | 19 +++++++++-
 .../connectors/source-xkcd/source_xkcd/run.py | 14 ++++++++
 .../source-yahoo-finance-price/main.py        |  9 ++---
 .../source-yahoo-finance-price/setup.py       | 19 +++++++++-
 .../source_yahoo_finance_price/run.py         | 14 ++++++++
 .../connectors/source-yandex-metrica/main.py  |  9 ++---
 .../connectors/source-yandex-metrica/setup.py | 19 +++++++++-
 .../source_yandex_metrica/run.py              | 14 ++++++++
 .../connectors/source-yotpo/main.py           |  9 ++---
 .../connectors/source-yotpo/setup.py          | 19 +++++++++-
 .../source-yotpo/source_yotpo/run.py          | 14 ++++++++
 .../connectors/source-younium/main.py         |  9 ++---
 .../connectors/source-younium/setup.py        | 19 +++++++++-
 .../source-younium/source_younium/run.py      | 14 ++++++++
 .../source-youtube-analytics/main.py          |  9 ++---
 .../source-youtube-analytics/setup.py         |  5 +++
 .../source_youtube_analytics/run.py           | 14 ++++++++
 .../source-zapier-supported-storage/main.py   |  9 ++---
 .../source-zapier-supported-storage/setup.py  | 19 +++++++++-
 .../source_zapier_supported_storage/run.py    | 14 ++++++++
 .../connectors/source-zendesk-sell/main.py    |  9 ++---
 .../connectors/source-zendesk-sell/setup.py   | 19 +++++++++-
 .../source_zendesk_sell/run.py                | 14 ++++++++
 .../source-zendesk-sunshine/main.py           |  9 ++---
 .../source-zendesk-sunshine/setup.py          | 19 +++++++++-
 .../source_zendesk_sunshine/run.py            | 14 ++++++++
 .../connectors/source-zenefits/main.py        |  9 ++---
 .../connectors/source-zenefits/setup.py       | 19 +++++++++-
 .../source-zenefits/source_zenefits/run.py    | 14 ++++++++
 .../connectors/source-zenloop/main.py         |  9 ++---
 .../connectors/source-zenloop/setup.py        |  5 +++
 .../source-zenloop/source_zenloop/run.py      | 14 ++++++++
 .../connectors/source-zoho-crm/main.py        |  9 ++---
 .../connectors/source-zoho-crm/setup.py       |  5 +++
 .../source-zoho-crm/source_zoho_crm/run.py    | 14 ++++++++
 .../connectors/source-zoom/main.py            |  9 ++---
 .../connectors/source-zoom/setup.py           | 19 +++++++++-
 .../connectors/source-zoom/source_zoom/run.py | 14 ++++++++
 .../connectors/source-zuora/main.py           |  9 ++---
 .../connectors/source-zuora/setup.py          |  5 +++
 .../source-zuora/source_zuora/run.py          | 14 ++++++++
 755 files changed, 7678 insertions(+), 1984 deletions(-)
 create mode 100644 airbyte-integrations/connectors/source-activecampaign/source_activecampaign/run.py
 create mode 100644 airbyte-integrations/connectors/source-adjust/source_adjust/run.py
 create mode 100644 airbyte-integrations/connectors/source-aha/source_aha/run.py
 create mode 100644 airbyte-integrations/connectors/source-aircall/source_aircall/run.py
 create mode 100644 airbyte-integrations/connectors/source-airtable/source_airtable/run.py
 create mode 100644 airbyte-integrations/connectors/source-alpha-vantage/source_alpha_vantage/run.py
 create mode 100644 airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/run.py
 create mode 100644 airbyte-integrations/connectors/source-amazon-seller-partner/source_amazon_seller_partner/run.py
 create mode 100644 airbyte-integrations/connectors/source-amazon-sqs/source_amazon_sqs/run.py
 create mode 100644 airbyte-integrations/connectors/source-amplitude/source_amplitude/run.py
 create mode 100644 airbyte-integrations/connectors/source-appfollow/source_appfollow/run.py
 create mode 100644 airbyte-integrations/connectors/source-apple-search-ads/source_apple_search_ads/run.py
 create mode 100644 airbyte-integrations/connectors/source-appsflyer/source_appsflyer/run.py
 create mode 100644 airbyte-integrations/connectors/source-appstore-singer/source_appstore_singer/run.py
 create mode 100644 airbyte-integrations/connectors/source-asana/source_asana/run.py
 create mode 100644 airbyte-integrations/connectors/source-ashby/source_ashby/run.py
 create mode 100644 airbyte-integrations/connectors/source-auth0/source_auth0/run.py
 create mode 100644 airbyte-integrations/connectors/source-aws-cloudtrail/source_aws_cloudtrail/run.py
 create mode 100644 airbyte-integrations/connectors/source-azure-blob-storage/source_azure_blob_storage/run.py
 create mode 100644 airbyte-integrations/connectors/source-azure-table/source_azure_table/run.py
 create mode 100644 airbyte-integrations/connectors/source-babelforce/source_babelforce/run.py
 create mode 100644 airbyte-integrations/connectors/source-bamboo-hr/source_bamboo_hr/run.py
 create mode 100644 airbyte-integrations/connectors/source-bigcommerce/source_bigcommerce/run.py
 create mode 100644 airbyte-integrations/connectors/source-bing-ads/source_bing_ads/run.py
 create mode 100644 airbyte-integrations/connectors/source-braintree/source_braintree/run.py
 create mode 100644 airbyte-integrations/connectors/source-braze/source_braze/run.py
 create mode 100644 airbyte-integrations/connectors/source-breezometer/source_breezometer/run.py
 create mode 100644 airbyte-integrations/connectors/source-callrail/source_callrail/run.py
 create mode 100644 airbyte-integrations/connectors/source-captain-data/source_captain_data/run.py
 create mode 100644 airbyte-integrations/connectors/source-cart/source_cart/run.py
 create mode 100644 airbyte-integrations/connectors/source-chargebee/source_chargebee/run.py
 create mode 100644 airbyte-integrations/connectors/source-chargify/source_chargify/run.py
 create mode 100644 airbyte-integrations/connectors/source-chartmogul/source_chartmogul/run.py
 create mode 100644 airbyte-integrations/connectors/source-clickup-api/source_clickup_api/run.py
 create mode 100644 airbyte-integrations/connectors/source-clockify/source_clockify/run.py
 create mode 100644 airbyte-integrations/connectors/source-close-com/source_close_com/run.py
 create mode 100644 airbyte-integrations/connectors/source-coda/source_coda/run.py
 create mode 100644 airbyte-integrations/connectors/source-coin-api/source_coin_api/run.py
 create mode 100644 airbyte-integrations/connectors/source-coingecko-coins/source_coingecko_coins/run.py
 create mode 100644 airbyte-integrations/connectors/source-coinmarketcap/source_coinmarketcap/run.py
 create mode 100644 airbyte-integrations/connectors/source-commcare/source_commcare/run.py
 create mode 100644 airbyte-integrations/connectors/source-commercetools/source_commercetools/run.py
 create mode 100644 airbyte-integrations/connectors/source-configcat/source_configcat/run.py
 create mode 100644 airbyte-integrations/connectors/source-confluence/source_confluence/run.py
 create mode 100644 airbyte-integrations/connectors/source-convertkit/source_convertkit/run.py
 create mode 100644 airbyte-integrations/connectors/source-convex/source_convex/run.py
 create mode 100644 airbyte-integrations/connectors/source-copper/source_copper/run.py
 create mode 100644 airbyte-integrations/connectors/source-courier/source_courier/run.py
 create mode 100644 airbyte-integrations/connectors/source-customer-io/source_customer_io/run.py
 create mode 100644 airbyte-integrations/connectors/source-datadog/source_datadog/run.py
 create mode 100644 airbyte-integrations/connectors/source-datascope/source_datascope/run.py
 create mode 100644 airbyte-integrations/connectors/source-delighted/source_delighted/run.py
 create mode 100644 airbyte-integrations/connectors/source-dixa/source_dixa/run.py
 create mode 100644 airbyte-integrations/connectors/source-dockerhub/source_dockerhub/run.py
 create mode 100644 airbyte-integrations/connectors/source-dremio/source_dremio/run.py
 create mode 100644 airbyte-integrations/connectors/source-drift/source_drift/run.py
 create mode 100644 airbyte-integrations/connectors/source-dv-360/source_dv_360/run.py
 create mode 100644 airbyte-integrations/connectors/source-emailoctopus/source_emailoctopus/run.py
 create mode 100644 airbyte-integrations/connectors/source-everhour/source_everhour/run.py
 create mode 100644 airbyte-integrations/connectors/source-exchange-rates/source_exchange_rates/run.py
 create mode 100644 airbyte-integrations/connectors/source-facebook-pages/source_facebook_pages/run.py
 create mode 100644 airbyte-integrations/connectors/source-fastbill/source_fastbill/run.py
 create mode 100644 airbyte-integrations/connectors/source-fauna/source_fauna/run.py
 create mode 100644 airbyte-integrations/connectors/source-file/source_file/run.py
 create mode 100644 airbyte-integrations/connectors/source-firebase-realtime-database/source_firebase_realtime_database/run.py
 create mode 100644 airbyte-integrations/connectors/source-firebolt/source_firebolt/run.py
 create mode 100644 airbyte-integrations/connectors/source-flexport/source_flexport/run.py
 create mode 100644 airbyte-integrations/connectors/source-freshcaller/source_freshcaller/run.py
 create mode 100644 airbyte-integrations/connectors/source-freshsales/source_freshsales/run.py
 create mode 100644 airbyte-integrations/connectors/source-freshservice/source_freshservice/run.py
 create mode 100644 airbyte-integrations/connectors/source-fullstory/source_fullstory/run.py
 create mode 100644 airbyte-integrations/connectors/source-gainsight-px/source_gainsight_px/run.py
 create mode 100644 airbyte-integrations/connectors/source-gcs/source_gcs/run.py
 create mode 100644 airbyte-integrations/connectors/source-genesys/source_genesys/run.py
 create mode 100644 airbyte-integrations/connectors/source-getlago/source_getlago/run.py
 create mode 100644 airbyte-integrations/connectors/source-github/source_github/run.py
 create mode 100644 airbyte-integrations/connectors/source-glassfrog/source_glassfrog/run.py
 create mode 100644 airbyte-integrations/connectors/source-gnews/source_gnews/run.py
 create mode 100644 airbyte-integrations/connectors/source-gocardless/source_gocardless/run.py
 create mode 100644 airbyte-integrations/connectors/source-gong/source_gong/run.py
 create mode 100644 airbyte-integrations/connectors/source-google-analytics-v4/source_google_analytics_v4/run.py
 create mode 100644 airbyte-integrations/connectors/source-google-directory/source_google_directory/run.py
 create mode 100644 airbyte-integrations/connectors/source-google-pagespeed-insights/source_google_pagespeed_insights/run.py
 create mode 100755 airbyte-integrations/connectors/source-google-search-console/source_google_search_console/run.py
 create mode 100644 airbyte-integrations/connectors/source-google-webfonts/source_google_webfonts/run.py
 create mode 100644 airbyte-integrations/connectors/source-google-workspace-admin-reports/source_google_workspace_admin_reports/run.py
 create mode 100644 airbyte-integrations/connectors/source-greenhouse/source_greenhouse/run.py
 create mode 100644 airbyte-integrations/connectors/source-gridly/source_gridly/run.py
 create mode 100644 airbyte-integrations/connectors/source-gutendex/source_gutendex/run.py
 create mode 100644 airbyte-integrations/connectors/source-harness/source_harness/run.py
 create mode 100644 airbyte-integrations/connectors/source-harvest/source_harvest/run.py
 create mode 100644 airbyte-integrations/connectors/source-hellobaton/source_hellobaton/run.py
 create mode 100644 airbyte-integrations/connectors/source-hubplanner/source_hubplanner/run.py
 create mode 100644 airbyte-integrations/connectors/source-hubspot/source_hubspot/run.py
 create mode 100644 airbyte-integrations/connectors/source-insightly/source_insightly/run.py
 create mode 100644 airbyte-integrations/connectors/source-instatus/source_instatus/run.py
 create mode 100644 airbyte-integrations/connectors/source-intercom/source_intercom/run.py
 create mode 100644 airbyte-integrations/connectors/source-intruder/source_intruder/run.py
 create mode 100644 airbyte-integrations/connectors/source-ip2whois/source_ip2whois/run.py
 create mode 100644 airbyte-integrations/connectors/source-jira/source_jira/run.py
 create mode 100644 airbyte-integrations/connectors/source-k6-cloud/source_k6_cloud/run.py
 create mode 100644 airbyte-integrations/connectors/source-klarna/source_klarna/run.py
 create mode 100644 airbyte-integrations/connectors/source-klaus-api/source_klaus_api/run.py
 create mode 100644 airbyte-integrations/connectors/source-klaviyo/source_klaviyo/run.py
 create mode 100644 airbyte-integrations/connectors/source-kustomer-singer/source_kustomer_singer/run.py
 create mode 100644 airbyte-integrations/connectors/source-kyriba/source_kyriba/run.py
 create mode 100644 airbyte-integrations/connectors/source-kyve/source_kyve/run.py
 create mode 100644 airbyte-integrations/connectors/source-launchdarkly/source_launchdarkly/run.py
 create mode 100644 airbyte-integrations/connectors/source-lemlist/source_lemlist/run.py
 create mode 100644 airbyte-integrations/connectors/source-lever-hiring/source_lever_hiring/run.py
 create mode 100644 airbyte-integrations/connectors/source-linkedin-pages/source_linkedin_pages/run.py
 create mode 100644 airbyte-integrations/connectors/source-linnworks/source_linnworks/run.py
 create mode 100644 airbyte-integrations/connectors/source-lokalise/source_lokalise/run.py
 create mode 100644 airbyte-integrations/connectors/source-looker/source_looker/run.py
 create mode 100644 airbyte-integrations/connectors/source-mailerlite/source_mailerlite/run.py
 create mode 100644 airbyte-integrations/connectors/source-mailersend/source_mailersend/run.py
 create mode 100644 airbyte-integrations/connectors/source-mailgun/source_mailgun/run.py
 create mode 100644 airbyte-integrations/connectors/source-mailjet-mail/source_mailjet_mail/run.py
 create mode 100644 airbyte-integrations/connectors/source-mailjet-sms/source_mailjet_sms/run.py
 create mode 100644 airbyte-integrations/connectors/source-merge/source_merge/run.py
 create mode 100644 airbyte-integrations/connectors/source-metabase/source_metabase/run.py
 create mode 100644 airbyte-integrations/connectors/source-microsoft-dataverse/source_microsoft_dataverse/run.py
 create mode 100644 airbyte-integrations/connectors/source-microsoft-onedrive/source_microsoft_onedrive/run.py
 create mode 100644 airbyte-integrations/connectors/source-microsoft-teams/source_microsoft_teams/run.py
 create mode 100644 airbyte-integrations/connectors/source-monday/source_monday/run.py
 create mode 100644 airbyte-integrations/connectors/source-my-hours/source_my_hours/run.py
 create mode 100644 airbyte-integrations/connectors/source-n8n/source_n8n/run.py
 create mode 100644 airbyte-integrations/connectors/source-nasa/source_nasa/run.py
 create mode 100644 airbyte-integrations/connectors/source-netsuite/source_netsuite/run.py
 create mode 100644 airbyte-integrations/connectors/source-news-api/source_news_api/run.py
 create mode 100644 airbyte-integrations/connectors/source-newsdata/source_newsdata/run.py
 create mode 100644 airbyte-integrations/connectors/source-notion/source_notion/run.py
 create mode 100644 airbyte-integrations/connectors/source-nytimes/source_nytimes/run.py
 create mode 100644 airbyte-integrations/connectors/source-okta/source_okta/run.py
 create mode 100644 airbyte-integrations/connectors/source-omnisend/source_omnisend/run.py
 create mode 100644 airbyte-integrations/connectors/source-onesignal/source_onesignal/run.py
 create mode 100644 airbyte-integrations/connectors/source-open-exchange-rates/source_open_exchange_rates/run.py
 create mode 100644 airbyte-integrations/connectors/source-openweather/source_openweather/run.py
 create mode 100644 airbyte-integrations/connectors/source-opsgenie/source_opsgenie/run.py
 create mode 100644 airbyte-integrations/connectors/source-orb/source_orb/run.py
 create mode 100644 airbyte-integrations/connectors/source-orbit/source_orbit/run.py
 create mode 100644 airbyte-integrations/connectors/source-oura/source_oura/run.py
 create mode 100644 airbyte-integrations/connectors/source-outbrain-amplify/source_outbrain_amplify/run.py
 create mode 100644 airbyte-integrations/connectors/source-outreach/source_outreach/run.py
 create mode 100644 airbyte-integrations/connectors/source-pagerduty/source_pagerduty/run.py
 create mode 100644 airbyte-integrations/connectors/source-pardot/source_pardot/run.py
 create mode 100644 airbyte-integrations/connectors/source-partnerstack/source_partnerstack/run.py
 create mode 100644 airbyte-integrations/connectors/source-paystack/source_paystack/run.py
 create mode 100644 airbyte-integrations/connectors/source-pendo/source_pendo/run.py
 create mode 100644 airbyte-integrations/connectors/source-persistiq/source_persistiq/run.py
 create mode 100644 airbyte-integrations/connectors/source-pexels-api/source_pexels_api/run.py
 create mode 100644 airbyte-integrations/connectors/source-pinterest/source_pinterest/run.py
 create mode 100644 airbyte-integrations/connectors/source-pivotal-tracker/source_pivotal_tracker/run.py
 create mode 100644 airbyte-integrations/connectors/source-plaid/source_plaid/run.py
 create mode 100644 airbyte-integrations/connectors/source-plausible/source_plausible/run.py
 create mode 100644 airbyte-integrations/connectors/source-pocket/source_pocket/run.py
 create mode 100644 airbyte-integrations/connectors/source-pokeapi/source_pokeapi/run.py
 create mode 100644 airbyte-integrations/connectors/source-polygon-stock-api/source_polygon_stock_api/run.py
 create mode 100644 airbyte-integrations/connectors/source-posthog/source_posthog/run.py
 create mode 100644 airbyte-integrations/connectors/source-postmarkapp/source_postmarkapp/run.py
 create mode 100644 airbyte-integrations/connectors/source-prestashop/source_prestashop/run.py
 create mode 100644 airbyte-integrations/connectors/source-primetric/source_primetric/run.py
 create mode 100644 airbyte-integrations/connectors/source-public-apis/source_public_apis/run.py
 create mode 100644 airbyte-integrations/connectors/source-punk-api/source_punk_api/run.py
 create mode 100644 airbyte-integrations/connectors/source-pypi/source_pypi/run.py
 create mode 100644 airbyte-integrations/connectors/source-python-http-tutorial/source_python_http_tutorial/run.py
 create mode 100644 airbyte-integrations/connectors/source-qonto/source_qonto/run.py
 create mode 100644 airbyte-integrations/connectors/source-qualaroo/source_qualaroo/run.py
 create mode 100644 airbyte-integrations/connectors/source-quickbooks/source_quickbooks/run.py
 create mode 100644 airbyte-integrations/connectors/source-railz/source_railz/run.py
 create mode 100644 airbyte-integrations/connectors/source-rd-station-marketing/source_rd_station_marketing/run.py
 create mode 100644 airbyte-integrations/connectors/source-recharge/source_recharge/run.py
 create mode 100644 airbyte-integrations/connectors/source-recreation/source_recreation/run.py
 create mode 100644 airbyte-integrations/connectors/source-recruitee/source_recruitee/run.py
 create mode 100644 airbyte-integrations/connectors/source-recurly/source_recurly/run.py
 create mode 100644 airbyte-integrations/connectors/source-reply-io/source_reply_io/run.py
 create mode 100644 airbyte-integrations/connectors/source-retently/source_retently/run.py
 create mode 100644 airbyte-integrations/connectors/source-ringcentral/source_ringcentral/run.py
 create mode 100644 airbyte-integrations/connectors/source-rki-covid/source_rki_covid/run.py
 create mode 100644 airbyte-integrations/connectors/source-rocket-chat/source_rocket_chat/run.py
 create mode 100644 airbyte-integrations/connectors/source-rss/source_rss/run.py
 create mode 100644 airbyte-integrations/connectors/source-salesloft/source_salesloft/run.py
 create mode 100644 airbyte-integrations/connectors/source-sap-fieldglass/source_sap_fieldglass/run.py
 create mode 100644 airbyte-integrations/connectors/source-scaffold-source-http/source_scaffold_source_http/run.py
 create mode 100644 airbyte-integrations/connectors/source-scaffold-source-python/source_scaffold_source_python/run.py
 create mode 100644 airbyte-integrations/connectors/source-search-metrics/source_search_metrics/run.py
 create mode 100644 airbyte-integrations/connectors/source-secoda/source_secoda/run.py
 create mode 100644 airbyte-integrations/connectors/source-sendgrid/source_sendgrid/run.py
 create mode 100644 airbyte-integrations/connectors/source-sendinblue/source_sendinblue/run.py
 create mode 100644 airbyte-integrations/connectors/source-senseforce/source_senseforce/run.py
 create mode 100644 airbyte-integrations/connectors/source-sentry/source_sentry/run.py
 create mode 100644 airbyte-integrations/connectors/source-serpstat/source_serpstat/run.py
 create mode 100644 airbyte-integrations/connectors/source-sftp-bulk/source_sftp_bulk/run.py
 create mode 100644 airbyte-integrations/connectors/source-shortio/source_shortio/run.py
 create mode 100644 airbyte-integrations/connectors/source-smaily/source_smaily/run.py
 create mode 100644 airbyte-integrations/connectors/source-smartengage/source_smartengage/run.py
 create mode 100644 airbyte-integrations/connectors/source-snapchat-marketing/source_snapchat_marketing/run.py
 create mode 100644 airbyte-integrations/connectors/source-sonar-cloud/source_sonar_cloud/run.py
 create mode 100644 airbyte-integrations/connectors/source-spacex-api/source_spacex_api/run.py
 create mode 100644 airbyte-integrations/connectors/source-square/source_square/run.py
 create mode 100644 airbyte-integrations/connectors/source-statuspage/source_statuspage/run.py
 create mode 100644 airbyte-integrations/connectors/source-strava/source_strava/run.py
 create mode 100644 airbyte-integrations/connectors/source-survey-sparrow/source_survey_sparrow/run.py
 create mode 100644 airbyte-integrations/connectors/source-surveycto/source_surveycto/run.py
 create mode 100644 airbyte-integrations/connectors/source-surveymonkey/source_surveymonkey/run.py
 create mode 100644 airbyte-integrations/connectors/source-talkdesk-explore/source_talkdesk_explore/run.py
 create mode 100644 airbyte-integrations/connectors/source-tempo/source_tempo/run.py
 create mode 100644 airbyte-integrations/connectors/source-the-guardian-api/source_the_guardian_api/run.py
 create mode 100644 airbyte-integrations/connectors/source-tiktok-marketing/source_tiktok_marketing/run.py
 create mode 100644 airbyte-integrations/connectors/source-timely/source_timely/run.py
 create mode 100644 airbyte-integrations/connectors/source-tmdb/source_tmdb/run.py
 create mode 100644 airbyte-integrations/connectors/source-todoist/source_todoist/run.py
 create mode 100644 airbyte-integrations/connectors/source-toggl/source_toggl/run.py
 create mode 100644 airbyte-integrations/connectors/source-tplcentral/source_tplcentral/run.py
 create mode 100644 airbyte-integrations/connectors/source-trello/source_trello/run.py
 create mode 100644 airbyte-integrations/connectors/source-trustpilot/source_trustpilot/run.py
 create mode 100644 airbyte-integrations/connectors/source-tvmaze-schedule/source_tvmaze_schedule/run.py
 create mode 100644 airbyte-integrations/connectors/source-twilio-taskrouter/source_twilio_taskrouter/run.py
 create mode 100644 airbyte-integrations/connectors/source-twilio/source_twilio/run.py
 create mode 100644 airbyte-integrations/connectors/source-twitter/source_twitter/run.py
 create mode 100644 airbyte-integrations/connectors/source-tyntec-sms/source_tyntec_sms/run.py
 create mode 100644 airbyte-integrations/connectors/source-unleash/source_unleash/run.py
 create mode 100644 airbyte-integrations/connectors/source-us-census/source_us_census/run.py
 create mode 100644 airbyte-integrations/connectors/source-vantage/source_vantage/run.py
 create mode 100644 airbyte-integrations/connectors/source-visma-economic/source_visma_economic/run.py
 create mode 100644 airbyte-integrations/connectors/source-vitally/source_vitally/run.py
 create mode 100644 airbyte-integrations/connectors/source-waiteraid/source_waiteraid/run.py
 create mode 100644 airbyte-integrations/connectors/source-weatherstack/source_weatherstack/run.py
 create mode 100644 airbyte-integrations/connectors/source-webflow/source_webflow/run.py
 create mode 100644 airbyte-integrations/connectors/source-whisky-hunter/source_whisky_hunter/run.py
 create mode 100755 airbyte-integrations/connectors/source-wikipedia-pageviews/source_wikipedia_pageviews/run.py
 create mode 100644 airbyte-integrations/connectors/source-woocommerce/source_woocommerce/run.py
 create mode 100644 airbyte-integrations/connectors/source-workable/source_workable/run.py
 create mode 100644 airbyte-integrations/connectors/source-workramp/source_workramp/run.py
 create mode 100644 airbyte-integrations/connectors/source-wrike/source_wrike/run.py
 create mode 100644 airbyte-integrations/connectors/source-xkcd/source_xkcd/run.py
 create mode 100644 airbyte-integrations/connectors/source-yahoo-finance-price/source_yahoo_finance_price/run.py
 create mode 100644 airbyte-integrations/connectors/source-yandex-metrica/source_yandex_metrica/run.py
 create mode 100644 airbyte-integrations/connectors/source-yotpo/source_yotpo/run.py
 create mode 100644 airbyte-integrations/connectors/source-younium/source_younium/run.py
 create mode 100644 airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/run.py
 create mode 100644 airbyte-integrations/connectors/source-zapier-supported-storage/source_zapier_supported_storage/run.py
 create mode 100644 airbyte-integrations/connectors/source-zendesk-sell/source_zendesk_sell/run.py
 create mode 100644 airbyte-integrations/connectors/source-zendesk-sunshine/source_zendesk_sunshine/run.py
 create mode 100644 airbyte-integrations/connectors/source-zenefits/source_zenefits/run.py
 create mode 100644 airbyte-integrations/connectors/source-zenloop/source_zenloop/run.py
 create mode 100644 airbyte-integrations/connectors/source-zoho-crm/source_zoho_crm/run.py
 create mode 100644 airbyte-integrations/connectors/source-zoom/source_zoom/run.py
 create mode 100644 airbyte-integrations/connectors/source-zuora/source_zuora/run.py

diff --git a/airbyte-integrations/connectors/source-activecampaign/main.py b/airbyte-integrations/connectors/source-activecampaign/main.py
index 289325e3c27e9..52ba479174953 100644
--- a/airbyte-integrations/connectors/source-activecampaign/main.py
+++ b/airbyte-integrations/connectors/source-activecampaign/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_activecampaign import SourceActivecampaign
+from source_activecampaign.run import run
 
 if __name__ == "__main__":
-    source = SourceActivecampaign()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-activecampaign/setup.py b/airbyte-integrations/connectors/source-activecampaign/setup.py
index d539a3c2757c6..3c64964fcef16 100644
--- a/airbyte-integrations/connectors/source-activecampaign/setup.py
+++ b/airbyte-integrations/connectors/source-activecampaign/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-activecampaign=source_activecampaign.run:run",
+        ],
+    },
     name="source_activecampaign",
     description="Source implementation for Activecampaign.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-activecampaign/source_activecampaign/run.py b/airbyte-integrations/connectors/source-activecampaign/source_activecampaign/run.py
new file mode 100644
index 0000000000000..adc9dbcc7e053
--- /dev/null
+++ b/airbyte-integrations/connectors/source-activecampaign/source_activecampaign/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_activecampaign import SourceActivecampaign
+
+
+def run():
+    source = SourceActivecampaign()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-adjust/main.py b/airbyte-integrations/connectors/source-adjust/main.py
index 1639515b23aed..06eebde5d55cf 100644
--- a/airbyte-integrations/connectors/source-adjust/main.py
+++ b/airbyte-integrations/connectors/source-adjust/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_adjust import SourceAdjust
+from source_adjust.run import run
 
 if __name__ == "__main__":
-    source = SourceAdjust()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-adjust/setup.py b/airbyte-integrations/connectors/source-adjust/setup.py
index 99691631d22c7..7195646cdfce7 100644
--- a/airbyte-integrations/connectors/source-adjust/setup.py
+++ b/airbyte-integrations/connectors/source-adjust/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-adjust=source_adjust.run:run",
+        ],
+    },
     name="source_adjust",
     description="Source implementation for Adjust.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-adjust/source_adjust/run.py b/airbyte-integrations/connectors/source-adjust/source_adjust/run.py
new file mode 100644
index 0000000000000..db3689a7552d2
--- /dev/null
+++ b/airbyte-integrations/connectors/source-adjust/source_adjust/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_adjust import SourceAdjust
+
+
+def run():
+    source = SourceAdjust()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-aha/main.py b/airbyte-integrations/connectors/source-aha/main.py
index 79ed7a087f638..b07aafa3db460 100644
--- a/airbyte-integrations/connectors/source-aha/main.py
+++ b/airbyte-integrations/connectors/source-aha/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_aha import SourceAha
+from source_aha.run import run
 
 if __name__ == "__main__":
-    source = SourceAha()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-aha/setup.py b/airbyte-integrations/connectors/source-aha/setup.py
index 30789cbe1a0a2..bbcedc901f758 100644
--- a/airbyte-integrations/connectors/source-aha/setup.py
+++ b/airbyte-integrations/connectors/source-aha/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-aha=source_aha.run:run",
+        ],
+    },
     name="source_aha",
     description="Source implementation for Aha.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-aha/source_aha/run.py b/airbyte-integrations/connectors/source-aha/source_aha/run.py
new file mode 100644
index 0000000000000..7a67cc7e710c2
--- /dev/null
+++ b/airbyte-integrations/connectors/source-aha/source_aha/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_aha import SourceAha
+
+
+def run():
+    source = SourceAha()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-aircall/main.py b/airbyte-integrations/connectors/source-aircall/main.py
index ff8cceaf862cb..3a1a1acff9b2c 100644
--- a/airbyte-integrations/connectors/source-aircall/main.py
+++ b/airbyte-integrations/connectors/source-aircall/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_aircall import SourceAircall
+from source_aircall.run import run
 
 if __name__ == "__main__":
-    source = SourceAircall()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-aircall/setup.py b/airbyte-integrations/connectors/source-aircall/setup.py
index 25b830a1e3cce..8453ded69fcad 100644
--- a/airbyte-integrations/connectors/source-aircall/setup.py
+++ b/airbyte-integrations/connectors/source-aircall/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-aircall=source_aircall.run:run",
+        ],
+    },
     name="source_aircall",
     description="Source implementation for Aircall.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-aircall/source_aircall/run.py b/airbyte-integrations/connectors/source-aircall/source_aircall/run.py
new file mode 100644
index 0000000000000..b6d0e6bb463ce
--- /dev/null
+++ b/airbyte-integrations/connectors/source-aircall/source_aircall/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_aircall import SourceAircall
+
+
+def run():
+    source = SourceAircall()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-airtable/main.py b/airbyte-integrations/connectors/source-airtable/main.py
index 61aedaa8b88d2..170d6caf75b11 100644
--- a/airbyte-integrations/connectors/source-airtable/main.py
+++ b/airbyte-integrations/connectors/source-airtable/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_airtable import SourceAirtable
+from source_airtable.run import run
 
 if __name__ == "__main__":
-    source = SourceAirtable()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-airtable/setup.py b/airbyte-integrations/connectors/source-airtable/setup.py
index 2c294e0b0dfb1..9cae029705397 100644
--- a/airbyte-integrations/connectors/source-airtable/setup.py
+++ b/airbyte-integrations/connectors/source-airtable/setup.py
@@ -16,6 +16,11 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-airtable=source_airtable.run:run",
+        ],
+    },
     name="source_airtable",
     description="Source implementation for Airtable.",
     author="Airbyte",
diff --git a/airbyte-integrations/connectors/source-airtable/source_airtable/run.py b/airbyte-integrations/connectors/source-airtable/source_airtable/run.py
new file mode 100644
index 0000000000000..e993fd6eaa7d9
--- /dev/null
+++ b/airbyte-integrations/connectors/source-airtable/source_airtable/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_airtable import SourceAirtable
+
+
+def run():
+    source = SourceAirtable()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-alpha-vantage/main.py b/airbyte-integrations/connectors/source-alpha-vantage/main.py
index 422447d19ea6a..dcccfe7a535c2 100644
--- a/airbyte-integrations/connectors/source-alpha-vantage/main.py
+++ b/airbyte-integrations/connectors/source-alpha-vantage/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_alpha_vantage import SourceAlphaVantage
+from source_alpha_vantage.run import run
 
 if __name__ == "__main__":
-    source = SourceAlphaVantage()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-alpha-vantage/setup.py b/airbyte-integrations/connectors/source-alpha-vantage/setup.py
index bf4ebe78c025c..22bb9790ab516 100644
--- a/airbyte-integrations/connectors/source-alpha-vantage/setup.py
+++ b/airbyte-integrations/connectors/source-alpha-vantage/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-alpha-vantage=source_alpha_vantage.run:run",
+        ],
+    },
     name="source_alpha_vantage",
     description="Source implementation for Alpha Vantage.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-alpha-vantage/source_alpha_vantage/run.py b/airbyte-integrations/connectors/source-alpha-vantage/source_alpha_vantage/run.py
new file mode 100644
index 0000000000000..fe5a71ac01fb7
--- /dev/null
+++ b/airbyte-integrations/connectors/source-alpha-vantage/source_alpha_vantage/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_alpha_vantage import SourceAlphaVantage
+
+
+def run():
+    source = SourceAlphaVantage()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-amazon-ads/main.py b/airbyte-integrations/connectors/source-amazon-ads/main.py
index 1c292d29e4cad..30a0b6957860f 100644
--- a/airbyte-integrations/connectors/source-amazon-ads/main.py
+++ b/airbyte-integrations/connectors/source-amazon-ads/main.py
@@ -2,14 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_amazon_ads import SourceAmazonAds
-from source_amazon_ads.config_migrations import MigrateStartDate
+from source_amazon_ads.run import run
 
 if __name__ == "__main__":
-    source = SourceAmazonAds()
-    MigrateStartDate.migrate(sys.argv[1:], source)
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-amazon-ads/setup.py b/airbyte-integrations/connectors/source-amazon-ads/setup.py
index 7d612fffeaaa9..18026e1939506 100644
--- a/airbyte-integrations/connectors/source-amazon-ads/setup.py
+++ b/airbyte-integrations/connectors/source-amazon-ads/setup.py
@@ -17,6 +17,11 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-amazon-ads=source_amazon_ads.run:run",
+        ],
+    },
     name="source_amazon_ads",
     description="Source implementation for Amazon Ads.",
     author="Airbyte",
diff --git a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/run.py b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/run.py
new file mode 100644
index 0000000000000..a8012240de66d
--- /dev/null
+++ b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/run.py
@@ -0,0 +1,16 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_amazon_ads import SourceAmazonAds
+from source_amazon_ads.config_migrations import MigrateStartDate
+
+
+def run():
+    source = SourceAmazonAds()
+    MigrateStartDate.migrate(sys.argv[1:], source)
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-amazon-seller-partner/main.py b/airbyte-integrations/connectors/source-amazon-seller-partner/main.py
index d53252191baf6..ee7f33aa3ce57 100644
--- a/airbyte-integrations/connectors/source-amazon-seller-partner/main.py
+++ b/airbyte-integrations/connectors/source-amazon-seller-partner/main.py
@@ -2,15 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_amazon_seller_partner import SourceAmazonSellerPartner
-from source_amazon_seller_partner.config_migrations import MigrateAccountType, MigrateReportOptions
+from source_amazon_seller_partner.run import run
 
 if __name__ == "__main__":
-    source = SourceAmazonSellerPartner()
-    MigrateAccountType.migrate(sys.argv[1:], source)
-    MigrateReportOptions.migrate(sys.argv[1:], source)
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-amazon-seller-partner/setup.py b/airbyte-integrations/connectors/source-amazon-seller-partner/setup.py
index 8a171d3ee035b..2b9f48ca5e811 100644
--- a/airbyte-integrations/connectors/source-amazon-seller-partner/setup.py
+++ b/airbyte-integrations/connectors/source-amazon-seller-partner/setup.py
@@ -10,6 +10,11 @@
 TEST_REQUIREMENTS = ["requests-mock~=1.9.3", "pytest~=6.1", "pytest-mock"]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-amazon-seller-partner=source_amazon_seller_partner.run:run",
+        ],
+    },
     name="source_amazon_seller_partner",
     description="Source implementation for Amazon Seller Partner.",
     author="Airbyte",
diff --git a/airbyte-integrations/connectors/source-amazon-seller-partner/source_amazon_seller_partner/run.py b/airbyte-integrations/connectors/source-amazon-seller-partner/source_amazon_seller_partner/run.py
new file mode 100644
index 0000000000000..538cf70c8afcd
--- /dev/null
+++ b/airbyte-integrations/connectors/source-amazon-seller-partner/source_amazon_seller_partner/run.py
@@ -0,0 +1,17 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_amazon_seller_partner import SourceAmazonSellerPartner
+from source_amazon_seller_partner.config_migrations import MigrateAccountType, MigrateReportOptions
+
+
+def run():
+    source = SourceAmazonSellerPartner()
+    MigrateAccountType.migrate(sys.argv[1:], source)
+    MigrateReportOptions.migrate(sys.argv[1:], source)
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-amazon-sqs/main.py b/airbyte-integrations/connectors/source-amazon-sqs/main.py
index bbf86753b1de9..3e218a144f8f7 100644
--- a/airbyte-integrations/connectors/source-amazon-sqs/main.py
+++ b/airbyte-integrations/connectors/source-amazon-sqs/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_amazon_sqs import SourceAmazonSqs
+from source_amazon_sqs.run import run
 
 if __name__ == "__main__":
-    source = SourceAmazonSqs()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-amazon-sqs/setup.py b/airbyte-integrations/connectors/source-amazon-sqs/setup.py
index 3ca84d0f1041e..12414e180650c 100644
--- a/airbyte-integrations/connectors/source-amazon-sqs/setup.py
+++ b/airbyte-integrations/connectors/source-amazon-sqs/setup.py
@@ -10,6 +10,11 @@
 TEST_REQUIREMENTS = ["requests-mock~=1.9.3", "pytest-mock~=3.6.1", "pytest~=6.1", "moto[sqs, iam]"]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-amazon-sqs=source_amazon_sqs.run:run",
+        ],
+    },
     name="source_amazon_sqs",
     description="Source implementation for Amazon Sqs.",
     author="Alasdair Brown",
diff --git a/airbyte-integrations/connectors/source-amazon-sqs/source_amazon_sqs/run.py b/airbyte-integrations/connectors/source-amazon-sqs/source_amazon_sqs/run.py
new file mode 100644
index 0000000000000..428858388b639
--- /dev/null
+++ b/airbyte-integrations/connectors/source-amazon-sqs/source_amazon_sqs/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_amazon_sqs import SourceAmazonSqs
+
+
+def run():
+    source = SourceAmazonSqs()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-amplitude/main.py b/airbyte-integrations/connectors/source-amplitude/main.py
index 7bf14f9904f85..14500e9c73e63 100644
--- a/airbyte-integrations/connectors/source-amplitude/main.py
+++ b/airbyte-integrations/connectors/source-amplitude/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_amplitude import SourceAmplitude
+from source_amplitude.run import run
 
 if __name__ == "__main__":
-    source = SourceAmplitude()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-amplitude/setup.py b/airbyte-integrations/connectors/source-amplitude/setup.py
index 29cccb75e13fd..2f3809b7ffe9c 100644
--- a/airbyte-integrations/connectors/source-amplitude/setup.py
+++ b/airbyte-integrations/connectors/source-amplitude/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-amplitude=source_amplitude.run:run",
+        ],
+    },
     name="source_amplitude",
     description="Source implementation for Amplitude.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-amplitude/source_amplitude/run.py b/airbyte-integrations/connectors/source-amplitude/source_amplitude/run.py
new file mode 100644
index 0000000000000..3649e5d9b3114
--- /dev/null
+++ b/airbyte-integrations/connectors/source-amplitude/source_amplitude/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_amplitude import SourceAmplitude
+
+
+def run():
+    source = SourceAmplitude()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-apify-dataset/setup.py b/airbyte-integrations/connectors/source-apify-dataset/setup.py
index eb3a7db40ab2e..994bf4b0f9513 100644
--- a/airbyte-integrations/connectors/source-apify-dataset/setup.py
+++ b/airbyte-integrations/connectors/source-apify-dataset/setup.py
@@ -16,7 +16,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-appfollow/main.py b/airbyte-integrations/connectors/source-appfollow/main.py
index a4cd4bd636900..79dea68512c55 100644
--- a/airbyte-integrations/connectors/source-appfollow/main.py
+++ b/airbyte-integrations/connectors/source-appfollow/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_appfollow import SourceAppfollow
+from source_appfollow.run import run
 
 if __name__ == "__main__":
-    source = SourceAppfollow()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-appfollow/setup.py b/airbyte-integrations/connectors/source-appfollow/setup.py
index c808dd5682e96..73e20b4ae8b1d 100644
--- a/airbyte-integrations/connectors/source-appfollow/setup.py
+++ b/airbyte-integrations/connectors/source-appfollow/setup.py
@@ -12,13 +12,30 @@
 TEST_REQUIREMENTS = ["requests-mock~=1.9.3", "pytest~=6.1", "pytest-mock~=3.6.1", "requests_mock~=1.9"]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-appfollow=source_appfollow.run:run",
+        ],
+    },
     name="source_appfollow",
     description="Source implementation for Appfollow.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-appfollow/source_appfollow/run.py b/airbyte-integrations/connectors/source-appfollow/source_appfollow/run.py
new file mode 100644
index 0000000000000..019ce80f3ba5c
--- /dev/null
+++ b/airbyte-integrations/connectors/source-appfollow/source_appfollow/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_appfollow import SourceAppfollow
+
+
+def run():
+    source = SourceAppfollow()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-apple-search-ads/main.py b/airbyte-integrations/connectors/source-apple-search-ads/main.py
index 8998f6bd43888..df8b0f70775cc 100644
--- a/airbyte-integrations/connectors/source-apple-search-ads/main.py
+++ b/airbyte-integrations/connectors/source-apple-search-ads/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_apple_search_ads import SourceAppleSearchAds
+from source_apple_search_ads.run import run
 
 if __name__ == "__main__":
-    source = SourceAppleSearchAds()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-apple-search-ads/setup.py b/airbyte-integrations/connectors/source-apple-search-ads/setup.py
index a66de217e0fd0..c70cfcb0168b7 100644
--- a/airbyte-integrations/connectors/source-apple-search-ads/setup.py
+++ b/airbyte-integrations/connectors/source-apple-search-ads/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-apple-search-ads=source_apple_search_ads.run:run",
+        ],
+    },
     name="source_apple_search_ads",
     description="Source implementation for Apple Search Ads.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-apple-search-ads/source_apple_search_ads/run.py b/airbyte-integrations/connectors/source-apple-search-ads/source_apple_search_ads/run.py
new file mode 100644
index 0000000000000..dc2def6147ad2
--- /dev/null
+++ b/airbyte-integrations/connectors/source-apple-search-ads/source_apple_search_ads/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_apple_search_ads import SourceAppleSearchAds
+
+
+def run():
+    source = SourceAppleSearchAds()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-appsflyer/main.py b/airbyte-integrations/connectors/source-appsflyer/main.py
index 1dee48f3f0aba..ebf2655b2ec44 100644
--- a/airbyte-integrations/connectors/source-appsflyer/main.py
+++ b/airbyte-integrations/connectors/source-appsflyer/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_appsflyer import SourceAppsflyer
+from source_appsflyer.run import run
 
 if __name__ == "__main__":
-    source = SourceAppsflyer()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-appsflyer/setup.py b/airbyte-integrations/connectors/source-appsflyer/setup.py
index ac74ebcabfc93..cabee5977060d 100644
--- a/airbyte-integrations/connectors/source-appsflyer/setup.py
+++ b/airbyte-integrations/connectors/source-appsflyer/setup.py
@@ -14,6 +14,11 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-appsflyer=source_appsflyer.run:run",
+        ],
+    },
     name="source_appsflyer",
     description="Source implementation for Appsflyer.",
     author="Airbyte",
diff --git a/airbyte-integrations/connectors/source-appsflyer/source_appsflyer/run.py b/airbyte-integrations/connectors/source-appsflyer/source_appsflyer/run.py
new file mode 100644
index 0000000000000..40c1e2feb0385
--- /dev/null
+++ b/airbyte-integrations/connectors/source-appsflyer/source_appsflyer/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_appsflyer import SourceAppsflyer
+
+
+def run():
+    source = SourceAppsflyer()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-appstore-singer/main.py b/airbyte-integrations/connectors/source-appstore-singer/main.py
index 5e0f99d007be3..34e585afeeedb 100644
--- a/airbyte-integrations/connectors/source-appstore-singer/main.py
+++ b/airbyte-integrations/connectors/source-appstore-singer/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_appstore_singer import SourceAppstoreSinger
+from source_appstore_singer.run import run
 
 if __name__ == "__main__":
-    source = SourceAppstoreSinger()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-appstore-singer/setup.py b/airbyte-integrations/connectors/source-appstore-singer/setup.py
index b6ecccc99a037..d85ef5d07f43e 100644
--- a/airbyte-integrations/connectors/source-appstore-singer/setup.py
+++ b/airbyte-integrations/connectors/source-appstore-singer/setup.py
@@ -19,6 +19,11 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-appstore-singer=source_appstore_singer.run:run",
+        ],
+    },
     name="source_appstore_singer",
     description="Source implementation for Appstore, built on the Singer tap implementation.",
     author="Airbyte",
diff --git a/airbyte-integrations/connectors/source-appstore-singer/source_appstore_singer/run.py b/airbyte-integrations/connectors/source-appstore-singer/source_appstore_singer/run.py
new file mode 100644
index 0000000000000..ef9f845e8d810
--- /dev/null
+++ b/airbyte-integrations/connectors/source-appstore-singer/source_appstore_singer/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_appstore_singer import SourceAppstoreSinger
+
+
+def run():
+    source = SourceAppstoreSinger()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-asana/main.py b/airbyte-integrations/connectors/source-asana/main.py
index ac64981a1e3ec..5fde4e3c72d68 100644
--- a/airbyte-integrations/connectors/source-asana/main.py
+++ b/airbyte-integrations/connectors/source-asana/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_asana import SourceAsana
+from source_asana.run import run
 
 if __name__ == "__main__":
-    source = SourceAsana()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-asana/setup.py b/airbyte-integrations/connectors/source-asana/setup.py
index dda6ee977db1f..7d19a10aad8ac 100644
--- a/airbyte-integrations/connectors/source-asana/setup.py
+++ b/airbyte-integrations/connectors/source-asana/setup.py
@@ -12,6 +12,11 @@
 TEST_REQUIREMENTS = ["pytest-mock~=3.6.1", "pytest~=6.1", "requests-mock~=1.9.3"]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-asana=source_asana.run:run",
+        ],
+    },
     name="source_asana",
     description="Source implementation for Asana.",
     author="Airbyte",
diff --git a/airbyte-integrations/connectors/source-asana/source_asana/run.py b/airbyte-integrations/connectors/source-asana/source_asana/run.py
new file mode 100644
index 0000000000000..cf9dbf1ffa48e
--- /dev/null
+++ b/airbyte-integrations/connectors/source-asana/source_asana/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_asana import SourceAsana
+
+
+def run():
+    source = SourceAsana()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-ashby/main.py b/airbyte-integrations/connectors/source-ashby/main.py
index a19039ecb6158..96b5bfe556e31 100644
--- a/airbyte-integrations/connectors/source-ashby/main.py
+++ b/airbyte-integrations/connectors/source-ashby/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_ashby import SourceAshby
+from source_ashby.run import run
 
 if __name__ == "__main__":
-    source = SourceAshby()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-ashby/setup.py b/airbyte-integrations/connectors/source-ashby/setup.py
index d4fd781c5f1e7..d506c08b09658 100644
--- a/airbyte-integrations/connectors/source-ashby/setup.py
+++ b/airbyte-integrations/connectors/source-ashby/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-ashby=source_ashby.run:run",
+        ],
+    },
     name="source_ashby",
     description="Source implementation for Ashby.",
     author="Elliot Trabac",
     author_email="elliot.trabac1@gmail.com",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-ashby/source_ashby/run.py b/airbyte-integrations/connectors/source-ashby/source_ashby/run.py
new file mode 100644
index 0000000000000..2330c6f910b5a
--- /dev/null
+++ b/airbyte-integrations/connectors/source-ashby/source_ashby/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_ashby import SourceAshby
+
+
+def run():
+    source = SourceAshby()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-auth0/main.py b/airbyte-integrations/connectors/source-auth0/main.py
index 3904766c4ec2a..f29790fbabd77 100644
--- a/airbyte-integrations/connectors/source-auth0/main.py
+++ b/airbyte-integrations/connectors/source-auth0/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_auth0 import SourceAuth0
+from source_auth0.run import run
 
 if __name__ == "__main__":
-    source = SourceAuth0()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-auth0/setup.py b/airbyte-integrations/connectors/source-auth0/setup.py
index 29b448c8c0de4..ed772442f1e0f 100644
--- a/airbyte-integrations/connectors/source-auth0/setup.py
+++ b/airbyte-integrations/connectors/source-auth0/setup.py
@@ -15,13 +15,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-auth0=source_auth0.run:run",
+        ],
+    },
     name="source_auth0",
     description="Source implementation for Auth0.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-auth0/source_auth0/run.py b/airbyte-integrations/connectors/source-auth0/source_auth0/run.py
new file mode 100644
index 0000000000000..bae97c9f5cb43
--- /dev/null
+++ b/airbyte-integrations/connectors/source-auth0/source_auth0/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_auth0 import SourceAuth0
+
+
+def run():
+    source = SourceAuth0()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-aws-cloudtrail/main.py b/airbyte-integrations/connectors/source-aws-cloudtrail/main.py
index 7ae051b2be22a..f2324dfe8812b 100644
--- a/airbyte-integrations/connectors/source-aws-cloudtrail/main.py
+++ b/airbyte-integrations/connectors/source-aws-cloudtrail/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_aws_cloudtrail import SourceAwsCloudtrail
+from source_aws_cloudtrail.run import run
 
 if __name__ == "__main__":
-    source = SourceAwsCloudtrail()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-aws-cloudtrail/setup.py b/airbyte-integrations/connectors/source-aws-cloudtrail/setup.py
index bda35b60aa1eb..77d6bdf204863 100644
--- a/airbyte-integrations/connectors/source-aws-cloudtrail/setup.py
+++ b/airbyte-integrations/connectors/source-aws-cloudtrail/setup.py
@@ -14,6 +14,11 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-aws-cloudtrail=source_aws_cloudtrail.run:run",
+        ],
+    },
     name="source_aws_cloudtrail",
     description="Source implementation for Aws Cloudtrail.",
     author="Airbyte",
diff --git a/airbyte-integrations/connectors/source-aws-cloudtrail/source_aws_cloudtrail/run.py b/airbyte-integrations/connectors/source-aws-cloudtrail/source_aws_cloudtrail/run.py
new file mode 100644
index 0000000000000..576aae749bc20
--- /dev/null
+++ b/airbyte-integrations/connectors/source-aws-cloudtrail/source_aws_cloudtrail/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_aws_cloudtrail import SourceAwsCloudtrail
+
+
+def run():
+    source = SourceAwsCloudtrail()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-azure-blob-storage/main.py b/airbyte-integrations/connectors/source-azure-blob-storage/main.py
index b3361a6556d7b..5e798013d9e4b 100644
--- a/airbyte-integrations/connectors/source-azure-blob-storage/main.py
+++ b/airbyte-integrations/connectors/source-azure-blob-storage/main.py
@@ -2,32 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-import sys
-import traceback
-from datetime import datetime
-
-from airbyte_cdk.entrypoint import AirbyteEntrypoint, launch
-from airbyte_cdk.models import AirbyteErrorTraceMessage, AirbyteMessage, AirbyteTraceMessage, TraceType, Type
-from source_azure_blob_storage import Config, SourceAzureBlobStorage, SourceAzureBlobStorageStreamReader
+from source_azure_blob_storage.run import run
 
 if __name__ == "__main__":
-    args = sys.argv[1:]
-    catalog_path = AirbyteEntrypoint.extract_catalog(args)
-    try:
-        source = SourceAzureBlobStorage(SourceAzureBlobStorageStreamReader(), Config, catalog_path)
-    except Exception:
-        print(
-            AirbyteMessage(
-                type=Type.TRACE,
-                trace=AirbyteTraceMessage(
-                    type=TraceType.ERROR,
-                    emitted_at=int(datetime.now().timestamp() * 1000),
-                    error=AirbyteErrorTraceMessage(
-                        message="Error starting the sync. This could be due to an invalid configuration or catalog. Please contact Support for assistance.",
-                        stack_trace=traceback.format_exc(),
-                    ),
-                ),
-            ).json()
-        )
-    else:
-        launch(source, args)
+    run()
diff --git a/airbyte-integrations/connectors/source-azure-blob-storage/setup.py b/airbyte-integrations/connectors/source-azure-blob-storage/setup.py
index 4246eb43364c0..1dc7c4a275c46 100644
--- a/airbyte-integrations/connectors/source-azure-blob-storage/setup.py
+++ b/airbyte-integrations/connectors/source-azure-blob-storage/setup.py
@@ -14,6 +14,11 @@
 TEST_REQUIREMENTS = ["requests-mock~=1.9.3", "pytest-mock~=3.6.1", "pytest~=6.2"]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-azure-blob-storage=source_azure_blob_storage.run:run",
+        ],
+    },
     name="source_azure_blob_storage",
     description="Source implementation for Azure Blob Storage.",
     author="Airbyte",
diff --git a/airbyte-integrations/connectors/source-azure-blob-storage/source_azure_blob_storage/run.py b/airbyte-integrations/connectors/source-azure-blob-storage/source_azure_blob_storage/run.py
new file mode 100644
index 0000000000000..404d919b60f3e
--- /dev/null
+++ b/airbyte-integrations/connectors/source-azure-blob-storage/source_azure_blob_storage/run.py
@@ -0,0 +1,34 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+import sys
+import traceback
+from datetime import datetime
+
+from airbyte_cdk.entrypoint import AirbyteEntrypoint, launch
+from airbyte_cdk.models import AirbyteErrorTraceMessage, AirbyteMessage, AirbyteTraceMessage, TraceType, Type
+from source_azure_blob_storage import Config, SourceAzureBlobStorage, SourceAzureBlobStorageStreamReader
+
+
+def run():
+    args = sys.argv[1:]
+    catalog_path = AirbyteEntrypoint.extract_catalog(args)
+    try:
+        source = SourceAzureBlobStorage(SourceAzureBlobStorageStreamReader(), Config, catalog_path)
+    except Exception:
+        print(
+            AirbyteMessage(
+                type=Type.TRACE,
+                trace=AirbyteTraceMessage(
+                    type=TraceType.ERROR,
+                    emitted_at=int(datetime.now().timestamp() * 1000),
+                    error=AirbyteErrorTraceMessage(
+                        message="Error starting the sync. This could be due to an invalid configuration or catalog. Please contact Support for assistance.",
+                        stack_trace=traceback.format_exc(),
+                    ),
+                ),
+            ).json()
+        )
+    else:
+        launch(source, args)
diff --git a/airbyte-integrations/connectors/source-azure-table/main.py b/airbyte-integrations/connectors/source-azure-table/main.py
index ffdca7c26cefa..0831f80657669 100644
--- a/airbyte-integrations/connectors/source-azure-table/main.py
+++ b/airbyte-integrations/connectors/source-azure-table/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_azure_table import SourceAzureTable
+from source_azure_table.run import run
 
 if __name__ == "__main__":
-    source = SourceAzureTable()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-azure-table/setup.py b/airbyte-integrations/connectors/source-azure-table/setup.py
index a04c790cbb8f0..31eceef9c80e2 100644
--- a/airbyte-integrations/connectors/source-azure-table/setup.py
+++ b/airbyte-integrations/connectors/source-azure-table/setup.py
@@ -14,6 +14,11 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-azure-table=source_azure_table.run:run",
+        ],
+    },
     name="source_azure_table",
     description="Source implementation for Azure Table.",
     author="Airbyte",
diff --git a/airbyte-integrations/connectors/source-azure-table/source_azure_table/run.py b/airbyte-integrations/connectors/source-azure-table/source_azure_table/run.py
new file mode 100644
index 0000000000000..b39667cd684a8
--- /dev/null
+++ b/airbyte-integrations/connectors/source-azure-table/source_azure_table/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_azure_table import SourceAzureTable
+
+
+def run():
+    source = SourceAzureTable()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-babelforce/main.py b/airbyte-integrations/connectors/source-babelforce/main.py
index 33b4c6d35a82b..da6273a1dca9f 100644
--- a/airbyte-integrations/connectors/source-babelforce/main.py
+++ b/airbyte-integrations/connectors/source-babelforce/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_babelforce import SourceBabelforce
+from source_babelforce.run import run
 
 if __name__ == "__main__":
-    source = SourceBabelforce()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-babelforce/setup.py b/airbyte-integrations/connectors/source-babelforce/setup.py
index 36286f264643b..5033ec7b34e2c 100644
--- a/airbyte-integrations/connectors/source-babelforce/setup.py
+++ b/airbyte-integrations/connectors/source-babelforce/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-babelforce=source_babelforce.run:run",
+        ],
+    },
     name="source_babelforce",
     description="Source implementation for Babelforce.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-babelforce/source_babelforce/run.py b/airbyte-integrations/connectors/source-babelforce/source_babelforce/run.py
new file mode 100644
index 0000000000000..056cf590f3262
--- /dev/null
+++ b/airbyte-integrations/connectors/source-babelforce/source_babelforce/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_babelforce import SourceBabelforce
+
+
+def run():
+    source = SourceBabelforce()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-bamboo-hr/main.py b/airbyte-integrations/connectors/source-bamboo-hr/main.py
index 2ebc95cb12569..0118185a67fc1 100644
--- a/airbyte-integrations/connectors/source-bamboo-hr/main.py
+++ b/airbyte-integrations/connectors/source-bamboo-hr/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_bamboo_hr import SourceBambooHr
+from source_bamboo_hr.run import run
 
 if __name__ == "__main__":
-    source = SourceBambooHr()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-bamboo-hr/setup.py b/airbyte-integrations/connectors/source-bamboo-hr/setup.py
index a81279a9f2dd8..52914c4c34d46 100644
--- a/airbyte-integrations/connectors/source-bamboo-hr/setup.py
+++ b/airbyte-integrations/connectors/source-bamboo-hr/setup.py
@@ -14,6 +14,11 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-bamboo-hr=source_bamboo_hr.run:run",
+        ],
+    },
     name="source_bamboo_hr",
     description="Source implementation for Bamboo Hr.",
     author="Airbyte",
diff --git a/airbyte-integrations/connectors/source-bamboo-hr/source_bamboo_hr/run.py b/airbyte-integrations/connectors/source-bamboo-hr/source_bamboo_hr/run.py
new file mode 100644
index 0000000000000..d9a04d56a9640
--- /dev/null
+++ b/airbyte-integrations/connectors/source-bamboo-hr/source_bamboo_hr/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_bamboo_hr import SourceBambooHr
+
+
+def run():
+    source = SourceBambooHr()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-bigcommerce/main.py b/airbyte-integrations/connectors/source-bigcommerce/main.py
index 2d28000deab0f..7830bf519a654 100644
--- a/airbyte-integrations/connectors/source-bigcommerce/main.py
+++ b/airbyte-integrations/connectors/source-bigcommerce/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_bigcommerce import SourceBigcommerce
+from source_bigcommerce.run import run
 
 if __name__ == "__main__":
-    source = SourceBigcommerce()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-bigcommerce/setup.py b/airbyte-integrations/connectors/source-bigcommerce/setup.py
index 7189d313888fc..43cc76692ad74 100644
--- a/airbyte-integrations/connectors/source-bigcommerce/setup.py
+++ b/airbyte-integrations/connectors/source-bigcommerce/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-bigcommerce=source_bigcommerce.run:run",
+        ],
+    },
     name="source_bigcommerce",
     description="Source implementation for Bigcommerce.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-bigcommerce/source_bigcommerce/run.py b/airbyte-integrations/connectors/source-bigcommerce/source_bigcommerce/run.py
new file mode 100644
index 0000000000000..7e5234a1b2b1d
--- /dev/null
+++ b/airbyte-integrations/connectors/source-bigcommerce/source_bigcommerce/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_bigcommerce import SourceBigcommerce
+
+
+def run():
+    source = SourceBigcommerce()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-bing-ads/main.py b/airbyte-integrations/connectors/source-bing-ads/main.py
index 11548ad408a8e..c05297b01ad80 100644
--- a/airbyte-integrations/connectors/source-bing-ads/main.py
+++ b/airbyte-integrations/connectors/source-bing-ads/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_bing_ads import SourceBingAds
+from source_bing_ads.run import run
 
 if __name__ == "__main__":
-    source = SourceBingAds()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-bing-ads/setup.py b/airbyte-integrations/connectors/source-bing-ads/setup.py
index e586d0ea27ae2..68f92f541a5fd 100644
--- a/airbyte-integrations/connectors/source-bing-ads/setup.py
+++ b/airbyte-integrations/connectors/source-bing-ads/setup.py
@@ -15,6 +15,11 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-bing-ads=source_bing_ads.run:run",
+        ],
+    },
     name="source_bing_ads",
     description="Source implementation for Bing Ads.",
     author="Airbyte",
diff --git a/airbyte-integrations/connectors/source-bing-ads/source_bing_ads/run.py b/airbyte-integrations/connectors/source-bing-ads/source_bing_ads/run.py
new file mode 100644
index 0000000000000..3dd73c2fec5e9
--- /dev/null
+++ b/airbyte-integrations/connectors/source-bing-ads/source_bing_ads/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_bing_ads import SourceBingAds
+
+
+def run():
+    source = SourceBingAds()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-braintree/main.py b/airbyte-integrations/connectors/source-braintree/main.py
index 3b3c6039f9fe2..d4ae7bec52239 100644
--- a/airbyte-integrations/connectors/source-braintree/main.py
+++ b/airbyte-integrations/connectors/source-braintree/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_braintree import SourceBraintree
+from source_braintree.run import run
 
 if __name__ == "__main__":
-    source = SourceBraintree()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-braintree/setup.py b/airbyte-integrations/connectors/source-braintree/setup.py
index 0a6f5d53752ed..cd584b74e6997 100644
--- a/airbyte-integrations/connectors/source-braintree/setup.py
+++ b/airbyte-integrations/connectors/source-braintree/setup.py
@@ -13,13 +13,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-braintree=source_braintree.run:run",
+        ],
+    },
     name="source_braintree_no_code",
     description="Source implementation for Braintree No Code.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-braintree/source_braintree/run.py b/airbyte-integrations/connectors/source-braintree/source_braintree/run.py
new file mode 100644
index 0000000000000..df776d3952c61
--- /dev/null
+++ b/airbyte-integrations/connectors/source-braintree/source_braintree/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_braintree import SourceBraintree
+
+
+def run():
+    source = SourceBraintree()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-braze/main.py b/airbyte-integrations/connectors/source-braze/main.py
index 15453641a7f04..723116b280980 100644
--- a/airbyte-integrations/connectors/source-braze/main.py
+++ b/airbyte-integrations/connectors/source-braze/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_braze import SourceBraze
+from source_braze.run import run
 
 if __name__ == "__main__":
-    source = SourceBraze()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-braze/setup.py b/airbyte-integrations/connectors/source-braze/setup.py
index aade45358b418..43f778382f75b 100644
--- a/airbyte-integrations/connectors/source-braze/setup.py
+++ b/airbyte-integrations/connectors/source-braze/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-braze=source_braze.run:run",
+        ],
+    },
     name="source_braze",
     description="Source implementation for Braze.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-braze/source_braze/run.py b/airbyte-integrations/connectors/source-braze/source_braze/run.py
new file mode 100644
index 0000000000000..645b7a31df248
--- /dev/null
+++ b/airbyte-integrations/connectors/source-braze/source_braze/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_braze import SourceBraze
+
+
+def run():
+    source = SourceBraze()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-breezometer/main.py b/airbyte-integrations/connectors/source-breezometer/main.py
index e14371ac83bba..3fc185eec93c1 100644
--- a/airbyte-integrations/connectors/source-breezometer/main.py
+++ b/airbyte-integrations/connectors/source-breezometer/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_breezometer import SourceBreezometer
+from source_breezometer.run import run
 
 if __name__ == "__main__":
-    source = SourceBreezometer()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-breezometer/setup.py b/airbyte-integrations/connectors/source-breezometer/setup.py
index 61bd2c5256107..fc9d1e85cd20c 100644
--- a/airbyte-integrations/connectors/source-breezometer/setup.py
+++ b/airbyte-integrations/connectors/source-breezometer/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-breezometer=source_breezometer.run:run",
+        ],
+    },
     name="source_breezometer",
     description="Source implementation for Breezometer.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-breezometer/source_breezometer/run.py b/airbyte-integrations/connectors/source-breezometer/source_breezometer/run.py
new file mode 100644
index 0000000000000..6855613e55867
--- /dev/null
+++ b/airbyte-integrations/connectors/source-breezometer/source_breezometer/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_breezometer import SourceBreezometer
+
+
+def run():
+    source = SourceBreezometer()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-callrail/main.py b/airbyte-integrations/connectors/source-callrail/main.py
index cb3607679473c..d5651af4f615f 100644
--- a/airbyte-integrations/connectors/source-callrail/main.py
+++ b/airbyte-integrations/connectors/source-callrail/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_callrail import SourceCallrail
+from source_callrail.run import run
 
 if __name__ == "__main__":
-    source = SourceCallrail()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-callrail/setup.py b/airbyte-integrations/connectors/source-callrail/setup.py
index c744bbc957ffc..e6d0d00d5d460 100644
--- a/airbyte-integrations/connectors/source-callrail/setup.py
+++ b/airbyte-integrations/connectors/source-callrail/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-callrail=source_callrail.run:run",
+        ],
+    },
     name="source_callrail",
     description="Source implementation for Callrail.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-callrail/source_callrail/run.py b/airbyte-integrations/connectors/source-callrail/source_callrail/run.py
new file mode 100644
index 0000000000000..d271cf7a502b6
--- /dev/null
+++ b/airbyte-integrations/connectors/source-callrail/source_callrail/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_callrail import SourceCallrail
+
+
+def run():
+    source = SourceCallrail()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-captain-data/main.py b/airbyte-integrations/connectors/source-captain-data/main.py
index 765d967fad15c..50a0dfd7944d0 100644
--- a/airbyte-integrations/connectors/source-captain-data/main.py
+++ b/airbyte-integrations/connectors/source-captain-data/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_captain_data import SourceCaptainData
+from source_captain_data.run import run
 
 if __name__ == "__main__":
-    source = SourceCaptainData()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-captain-data/setup.py b/airbyte-integrations/connectors/source-captain-data/setup.py
index f6121791ddd8d..cf4b2f7f5fc75 100644
--- a/airbyte-integrations/connectors/source-captain-data/setup.py
+++ b/airbyte-integrations/connectors/source-captain-data/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-captain-data=source_captain_data.run:run",
+        ],
+    },
     name="source_captain_data",
     description="Source implementation for Captain Data.",
     author="Elliot Trabac",
     author_email="elliot.trabac1@gmail.com",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-captain-data/source_captain_data/run.py b/airbyte-integrations/connectors/source-captain-data/source_captain_data/run.py
new file mode 100644
index 0000000000000..5b25fd1be5a48
--- /dev/null
+++ b/airbyte-integrations/connectors/source-captain-data/source_captain_data/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_captain_data import SourceCaptainData
+
+
+def run():
+    source = SourceCaptainData()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-cart/main.py b/airbyte-integrations/connectors/source-cart/main.py
index b294ae4e2c156..c7f69c914848c 100644
--- a/airbyte-integrations/connectors/source-cart/main.py
+++ b/airbyte-integrations/connectors/source-cart/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_cart import SourceCart
+from source_cart.run import run
 
 if __name__ == "__main__":
-    source = SourceCart()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-cart/setup.py b/airbyte-integrations/connectors/source-cart/setup.py
index 69df33c757d3b..fe389ea16d47d 100644
--- a/airbyte-integrations/connectors/source-cart/setup.py
+++ b/airbyte-integrations/connectors/source-cart/setup.py
@@ -16,6 +16,11 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-cart=source_cart.run:run",
+        ],
+    },
     name="source_cart",
     description="Source implementation for Cart.",
     author="Airbyte",
diff --git a/airbyte-integrations/connectors/source-cart/source_cart/run.py b/airbyte-integrations/connectors/source-cart/source_cart/run.py
new file mode 100644
index 0000000000000..7f639ab6c6948
--- /dev/null
+++ b/airbyte-integrations/connectors/source-cart/source_cart/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_cart import SourceCart
+
+
+def run():
+    source = SourceCart()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-chargebee/main.py b/airbyte-integrations/connectors/source-chargebee/main.py
index 946cf215df2d1..351ea1590b359 100644
--- a/airbyte-integrations/connectors/source-chargebee/main.py
+++ b/airbyte-integrations/connectors/source-chargebee/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_chargebee import SourceChargebee
+from source_chargebee.run import run
 
 if __name__ == "__main__":
-    source = SourceChargebee()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-chargebee/setup.py b/airbyte-integrations/connectors/source-chargebee/setup.py
index 5c3b625e0b4c4..f201051e3f110 100644
--- a/airbyte-integrations/connectors/source-chargebee/setup.py
+++ b/airbyte-integrations/connectors/source-chargebee/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-chargebee=source_chargebee.run:run",
+        ],
+    },
     name="source_chargebee",
     description="Source implementation for Chargebee.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-chargebee/source_chargebee/run.py b/airbyte-integrations/connectors/source-chargebee/source_chargebee/run.py
new file mode 100644
index 0000000000000..5c0b427da1970
--- /dev/null
+++ b/airbyte-integrations/connectors/source-chargebee/source_chargebee/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_chargebee import SourceChargebee
+
+
+def run():
+    source = SourceChargebee()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-chargify/main.py b/airbyte-integrations/connectors/source-chargify/main.py
index 1a4568ff615bc..44e0f11562712 100644
--- a/airbyte-integrations/connectors/source-chargify/main.py
+++ b/airbyte-integrations/connectors/source-chargify/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_chargify import SourceChargify
+from source_chargify.run import run
 
 if __name__ == "__main__":
-    source = SourceChargify()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-chargify/setup.py b/airbyte-integrations/connectors/source-chargify/setup.py
index 521c61646023e..deda5abcc0b0e 100644
--- a/airbyte-integrations/connectors/source-chargify/setup.py
+++ b/airbyte-integrations/connectors/source-chargify/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-chargify=source_chargify.run:run",
+        ],
+    },
     name="source_chargify",
     description="Source implementation for Chargify.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-chargify/source_chargify/run.py b/airbyte-integrations/connectors/source-chargify/source_chargify/run.py
new file mode 100644
index 0000000000000..88f4450c9bcfa
--- /dev/null
+++ b/airbyte-integrations/connectors/source-chargify/source_chargify/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_chargify import SourceChargify
+
+
+def run():
+    source = SourceChargify()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-chartmogul/main.py b/airbyte-integrations/connectors/source-chartmogul/main.py
index 5dc03e8a74a97..bf13dab9878d7 100644
--- a/airbyte-integrations/connectors/source-chartmogul/main.py
+++ b/airbyte-integrations/connectors/source-chartmogul/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_chartmogul import SourceChartmogul
+from source_chartmogul.run import run
 
 if __name__ == "__main__":
-    source = SourceChartmogul()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-chartmogul/setup.py b/airbyte-integrations/connectors/source-chartmogul/setup.py
index fa0d73f436c97..57b6c73fbac82 100644
--- a/airbyte-integrations/connectors/source-chartmogul/setup.py
+++ b/airbyte-integrations/connectors/source-chartmogul/setup.py
@@ -16,6 +16,11 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-chartmogul=source_chartmogul.run:run",
+        ],
+    },
     name="source_chartmogul",
     description="Source implementation for Chartmogul.",
     author="Titas Skrebe",
diff --git a/airbyte-integrations/connectors/source-chartmogul/source_chartmogul/run.py b/airbyte-integrations/connectors/source-chartmogul/source_chartmogul/run.py
new file mode 100644
index 0000000000000..f8e5bbd30e63a
--- /dev/null
+++ b/airbyte-integrations/connectors/source-chartmogul/source_chartmogul/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_chartmogul import SourceChartmogul
+
+
+def run():
+    source = SourceChartmogul()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-clickup-api/main.py b/airbyte-integrations/connectors/source-clickup-api/main.py
index 01d656f16c437..76c09b38846f9 100644
--- a/airbyte-integrations/connectors/source-clickup-api/main.py
+++ b/airbyte-integrations/connectors/source-clickup-api/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_clickup_api import SourceClickupApi
+from source_clickup_api.run import run
 
 if __name__ == "__main__":
-    source = SourceClickupApi()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-clickup-api/setup.py b/airbyte-integrations/connectors/source-clickup-api/setup.py
index 4fb2367a75162..b23f4ed53a1ab 100644
--- a/airbyte-integrations/connectors/source-clickup-api/setup.py
+++ b/airbyte-integrations/connectors/source-clickup-api/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-clickup-api=source_clickup_api.run:run",
+        ],
+    },
     name="source_clickup_api",
     description="Source implementation for Clickup Api.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-clickup-api/source_clickup_api/run.py b/airbyte-integrations/connectors/source-clickup-api/source_clickup_api/run.py
new file mode 100644
index 0000000000000..3767b66395e97
--- /dev/null
+++ b/airbyte-integrations/connectors/source-clickup-api/source_clickup_api/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_clickup_api import SourceClickupApi
+
+
+def run():
+    source = SourceClickupApi()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-clockify/main.py b/airbyte-integrations/connectors/source-clockify/main.py
index 9f04d4eb176cf..486525f0e2938 100644
--- a/airbyte-integrations/connectors/source-clockify/main.py
+++ b/airbyte-integrations/connectors/source-clockify/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_clockify import SourceClockify
+from source_clockify.run import run
 
 if __name__ == "__main__":
-    source = SourceClockify()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-clockify/setup.py b/airbyte-integrations/connectors/source-clockify/setup.py
index bcd38b28c29ae..940c87ba74b43 100644
--- a/airbyte-integrations/connectors/source-clockify/setup.py
+++ b/airbyte-integrations/connectors/source-clockify/setup.py
@@ -17,13 +17,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-clockify=source_clockify.run:run",
+        ],
+    },
     name="source_clockify",
     description="Source implementation for Clockify.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-clockify/source_clockify/run.py b/airbyte-integrations/connectors/source-clockify/source_clockify/run.py
new file mode 100644
index 0000000000000..ef88995f79dd6
--- /dev/null
+++ b/airbyte-integrations/connectors/source-clockify/source_clockify/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_clockify import SourceClockify
+
+
+def run():
+    source = SourceClockify()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-close-com/main.py b/airbyte-integrations/connectors/source-close-com/main.py
index 22787dfbd89e6..f80e763159393 100644
--- a/airbyte-integrations/connectors/source-close-com/main.py
+++ b/airbyte-integrations/connectors/source-close-com/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_close_com import SourceCloseCom
+from source_close_com.run import run
 
 if __name__ == "__main__":
-    source = SourceCloseCom()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-close-com/setup.py b/airbyte-integrations/connectors/source-close-com/setup.py
index b9d9aaf53e7de..a67ed8241bb01 100644
--- a/airbyte-integrations/connectors/source-close-com/setup.py
+++ b/airbyte-integrations/connectors/source-close-com/setup.py
@@ -14,6 +14,11 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-close-com=source_close_com.run:run",
+        ],
+    },
     name="source_close_com",
     description="Source implementation for Close.com.",
     author="Airbyte",
diff --git a/airbyte-integrations/connectors/source-close-com/source_close_com/run.py b/airbyte-integrations/connectors/source-close-com/source_close_com/run.py
new file mode 100644
index 0000000000000..eb80c6eab53ee
--- /dev/null
+++ b/airbyte-integrations/connectors/source-close-com/source_close_com/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_close_com import SourceCloseCom
+
+
+def run():
+    source = SourceCloseCom()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-coda/main.py b/airbyte-integrations/connectors/source-coda/main.py
index aae501071c7d2..dbc36f9d68864 100644
--- a/airbyte-integrations/connectors/source-coda/main.py
+++ b/airbyte-integrations/connectors/source-coda/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_coda import SourceCoda
+from source_coda.run import run
 
 if __name__ == "__main__":
-    source = SourceCoda()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-coda/setup.py b/airbyte-integrations/connectors/source-coda/setup.py
index 446b5807dcec2..92e0b6526fe7c 100644
--- a/airbyte-integrations/connectors/source-coda/setup.py
+++ b/airbyte-integrations/connectors/source-coda/setup.py
@@ -15,13 +15,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-coda=source_coda.run:run",
+        ],
+    },
     name="source_coda",
     description="Source implementation for Coda.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-coda/source_coda/run.py b/airbyte-integrations/connectors/source-coda/source_coda/run.py
new file mode 100644
index 0000000000000..0a1547db7b470
--- /dev/null
+++ b/airbyte-integrations/connectors/source-coda/source_coda/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_coda import SourceCoda
+
+
+def run():
+    source = SourceCoda()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-coin-api/main.py b/airbyte-integrations/connectors/source-coin-api/main.py
index 44b7d1ff5d1a8..0a62eaad6b92f 100644
--- a/airbyte-integrations/connectors/source-coin-api/main.py
+++ b/airbyte-integrations/connectors/source-coin-api/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_coin_api import SourceCoinApi
+from source_coin_api.run import run
 
 if __name__ == "__main__":
-    source = SourceCoinApi()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-coin-api/setup.py b/airbyte-integrations/connectors/source-coin-api/setup.py
index b4c098be77972..904de0b886613 100644
--- a/airbyte-integrations/connectors/source-coin-api/setup.py
+++ b/airbyte-integrations/connectors/source-coin-api/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-coin-api=source_coin_api.run:run",
+        ],
+    },
     name="source_coin_api",
     description="Source implementation for Coin Api.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-coin-api/source_coin_api/run.py b/airbyte-integrations/connectors/source-coin-api/source_coin_api/run.py
new file mode 100644
index 0000000000000..d0d729797ece4
--- /dev/null
+++ b/airbyte-integrations/connectors/source-coin-api/source_coin_api/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_coin_api import SourceCoinApi
+
+
+def run():
+    source = SourceCoinApi()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-coingecko-coins/main.py b/airbyte-integrations/connectors/source-coingecko-coins/main.py
index 6ab339e39a73e..0317d9bbf40b9 100644
--- a/airbyte-integrations/connectors/source-coingecko-coins/main.py
+++ b/airbyte-integrations/connectors/source-coingecko-coins/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_coingecko_coins import SourceCoingeckoCoins
+from source_coingecko_coins.run import run
 
 if __name__ == "__main__":
-    source = SourceCoingeckoCoins()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-coingecko-coins/setup.py b/airbyte-integrations/connectors/source-coingecko-coins/setup.py
index 39a959dcdc27c..efc1c015a4df9 100644
--- a/airbyte-integrations/connectors/source-coingecko-coins/setup.py
+++ b/airbyte-integrations/connectors/source-coingecko-coins/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-coingecko-coins=source_coingecko_coins.run:run",
+        ],
+    },
     name="source_coingecko_coins",
     description="Source implementation for Coingecko Coins.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-coingecko-coins/source_coingecko_coins/run.py b/airbyte-integrations/connectors/source-coingecko-coins/source_coingecko_coins/run.py
new file mode 100644
index 0000000000000..c652fd9af6d05
--- /dev/null
+++ b/airbyte-integrations/connectors/source-coingecko-coins/source_coingecko_coins/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_coingecko_coins import SourceCoingeckoCoins
+
+
+def run():
+    source = SourceCoingeckoCoins()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-coinmarketcap/main.py b/airbyte-integrations/connectors/source-coinmarketcap/main.py
index e2c19d866514d..908e017006131 100644
--- a/airbyte-integrations/connectors/source-coinmarketcap/main.py
+++ b/airbyte-integrations/connectors/source-coinmarketcap/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_coinmarketcap import SourceCoinmarketcap
+from source_coinmarketcap.run import run
 
 if __name__ == "__main__":
-    source = SourceCoinmarketcap()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-coinmarketcap/setup.py b/airbyte-integrations/connectors/source-coinmarketcap/setup.py
index 64fd1b41273b7..608c7f92baef2 100644
--- a/airbyte-integrations/connectors/source-coinmarketcap/setup.py
+++ b/airbyte-integrations/connectors/source-coinmarketcap/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-coinmarketcap=source_coinmarketcap.run:run",
+        ],
+    },
     name="source_coinmarketcap",
     description="Source implementation for Coinmarketcap.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-coinmarketcap/source_coinmarketcap/run.py b/airbyte-integrations/connectors/source-coinmarketcap/source_coinmarketcap/run.py
new file mode 100644
index 0000000000000..523d670c3aa93
--- /dev/null
+++ b/airbyte-integrations/connectors/source-coinmarketcap/source_coinmarketcap/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_coinmarketcap import SourceCoinmarketcap
+
+
+def run():
+    source = SourceCoinmarketcap()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-commcare/main.py b/airbyte-integrations/connectors/source-commcare/main.py
index 362386c57b336..edd438bde5be7 100644
--- a/airbyte-integrations/connectors/source-commcare/main.py
+++ b/airbyte-integrations/connectors/source-commcare/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_commcare import SourceCommcare
+from source_commcare.run import run
 
 if __name__ == "__main__":
-    source = SourceCommcare()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-commcare/setup.py b/airbyte-integrations/connectors/source-commcare/setup.py
index fd011eec2b1f4..44ba9e72640a5 100644
--- a/airbyte-integrations/connectors/source-commcare/setup.py
+++ b/airbyte-integrations/connectors/source-commcare/setup.py
@@ -19,13 +19,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-commcare=source_commcare.run:run",
+        ],
+    },
     name="source_commcare",
     description="Source implementation for Commcare.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-commcare/source_commcare/run.py b/airbyte-integrations/connectors/source-commcare/source_commcare/run.py
new file mode 100644
index 0000000000000..d42251049d081
--- /dev/null
+++ b/airbyte-integrations/connectors/source-commcare/source_commcare/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_commcare import SourceCommcare
+
+
+def run():
+    source = SourceCommcare()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-commercetools/main.py b/airbyte-integrations/connectors/source-commercetools/main.py
index 32aac6ed9f306..44dd2fb8f9527 100644
--- a/airbyte-integrations/connectors/source-commercetools/main.py
+++ b/airbyte-integrations/connectors/source-commercetools/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_commercetools import SourceCommercetools
+from source_commercetools.run import run
 
 if __name__ == "__main__":
-    source = SourceCommercetools()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-commercetools/setup.py b/airbyte-integrations/connectors/source-commercetools/setup.py
index 9622d7ad2c242..386e9738b744b 100644
--- a/airbyte-integrations/connectors/source-commercetools/setup.py
+++ b/airbyte-integrations/connectors/source-commercetools/setup.py
@@ -10,13 +10,30 @@
 TEST_REQUIREMENTS = ["requests-mock~=1.9.3", "pytest~=6.2", "pytest-mock~=3.6.1"]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-commercetools=source_commercetools.run:run",
+        ],
+    },
     name="source_commercetools",
     description="Source implementation for Commercetools.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-commercetools/source_commercetools/run.py b/airbyte-integrations/connectors/source-commercetools/source_commercetools/run.py
new file mode 100644
index 0000000000000..0d264787f978d
--- /dev/null
+++ b/airbyte-integrations/connectors/source-commercetools/source_commercetools/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_commercetools import SourceCommercetools
+
+
+def run():
+    source = SourceCommercetools()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-configcat/main.py b/airbyte-integrations/connectors/source-configcat/main.py
index b398a6dc8c921..9b554d1d713fc 100644
--- a/airbyte-integrations/connectors/source-configcat/main.py
+++ b/airbyte-integrations/connectors/source-configcat/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_configcat import SourceConfigcat
+from source_configcat.run import run
 
 if __name__ == "__main__":
-    source = SourceConfigcat()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-configcat/setup.py b/airbyte-integrations/connectors/source-configcat/setup.py
index 0bfbad2e71707..0f65dc21183f5 100644
--- a/airbyte-integrations/connectors/source-configcat/setup.py
+++ b/airbyte-integrations/connectors/source-configcat/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-configcat=source_configcat.run:run",
+        ],
+    },
     name="source_configcat",
     description="Source implementation for Configcat.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-configcat/source_configcat/run.py b/airbyte-integrations/connectors/source-configcat/source_configcat/run.py
new file mode 100644
index 0000000000000..9167f73fa44ca
--- /dev/null
+++ b/airbyte-integrations/connectors/source-configcat/source_configcat/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_configcat import SourceConfigcat
+
+
+def run():
+    source = SourceConfigcat()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-confluence/main.py b/airbyte-integrations/connectors/source-confluence/main.py
index 5cf3cd8797133..eb38dbbac0f07 100644
--- a/airbyte-integrations/connectors/source-confluence/main.py
+++ b/airbyte-integrations/connectors/source-confluence/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_confluence import SourceConfluence
+from source_confluence.run import run
 
 if __name__ == "__main__":
-    source = SourceConfluence()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-confluence/setup.py b/airbyte-integrations/connectors/source-confluence/setup.py
index aaacdff5bbe33..993c131b35f92 100644
--- a/airbyte-integrations/connectors/source-confluence/setup.py
+++ b/airbyte-integrations/connectors/source-confluence/setup.py
@@ -17,13 +17,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-confluence=source_confluence.run:run",
+        ],
+    },
     name="source_confluence",
     description="Source implementation for Confluence.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-confluence/source_confluence/run.py b/airbyte-integrations/connectors/source-confluence/source_confluence/run.py
new file mode 100644
index 0000000000000..b52381028de6d
--- /dev/null
+++ b/airbyte-integrations/connectors/source-confluence/source_confluence/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_confluence import SourceConfluence
+
+
+def run():
+    source = SourceConfluence()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-convertkit/main.py b/airbyte-integrations/connectors/source-convertkit/main.py
index 95b40e4a8c42f..0338150054eb0 100644
--- a/airbyte-integrations/connectors/source-convertkit/main.py
+++ b/airbyte-integrations/connectors/source-convertkit/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_convertkit import SourceConvertkit
+from source_convertkit.run import run
 
 if __name__ == "__main__":
-    source = SourceConvertkit()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-convertkit/setup.py b/airbyte-integrations/connectors/source-convertkit/setup.py
index a4a3f97a2b7d7..1f8512be419fa 100644
--- a/airbyte-integrations/connectors/source-convertkit/setup.py
+++ b/airbyte-integrations/connectors/source-convertkit/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-convertkit=source_convertkit.run:run",
+        ],
+    },
     name="source_convertkit",
     description="Source implementation for Convertkit.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-convertkit/source_convertkit/run.py b/airbyte-integrations/connectors/source-convertkit/source_convertkit/run.py
new file mode 100644
index 0000000000000..0db38a005bc4f
--- /dev/null
+++ b/airbyte-integrations/connectors/source-convertkit/source_convertkit/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_convertkit import SourceConvertkit
+
+
+def run():
+    source = SourceConvertkit()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-convex/main.py b/airbyte-integrations/connectors/source-convex/main.py
index 90037cfed046c..751ae667fae24 100644
--- a/airbyte-integrations/connectors/source-convex/main.py
+++ b/airbyte-integrations/connectors/source-convex/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_convex import SourceConvex
+from source_convex.run import run
 
 if __name__ == "__main__":
-    source = SourceConvex()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-convex/setup.py b/airbyte-integrations/connectors/source-convex/setup.py
index 22937fa853f16..82f937d289d93 100644
--- a/airbyte-integrations/connectors/source-convex/setup.py
+++ b/airbyte-integrations/connectors/source-convex/setup.py
@@ -17,13 +17,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-convex=source_convex.run:run",
+        ],
+    },
     name="source_convex",
     description="Source implementation for Convex.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-convex/source_convex/run.py b/airbyte-integrations/connectors/source-convex/source_convex/run.py
new file mode 100644
index 0000000000000..94ff036e088cc
--- /dev/null
+++ b/airbyte-integrations/connectors/source-convex/source_convex/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_convex import SourceConvex
+
+
+def run():
+    source = SourceConvex()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-copper/main.py b/airbyte-integrations/connectors/source-copper/main.py
index 5c45e3420a77f..090988115e85d 100644
--- a/airbyte-integrations/connectors/source-copper/main.py
+++ b/airbyte-integrations/connectors/source-copper/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_copper import SourceCopper
+from source_copper.run import run
 
 if __name__ == "__main__":
-    source = SourceCopper()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-copper/setup.py b/airbyte-integrations/connectors/source-copper/setup.py
index 15fe92381858d..f4a0f506acbbb 100644
--- a/airbyte-integrations/connectors/source-copper/setup.py
+++ b/airbyte-integrations/connectors/source-copper/setup.py
@@ -10,13 +10,30 @@
 TEST_REQUIREMENTS = ["pytest~=6.2", "pytest-mock~=3.6.1"]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-copper=source_copper.run:run",
+        ],
+    },
     name="source_copper",
     description="Source implementation for Copper.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-copper/source_copper/run.py b/airbyte-integrations/connectors/source-copper/source_copper/run.py
new file mode 100644
index 0000000000000..1267cf2c47228
--- /dev/null
+++ b/airbyte-integrations/connectors/source-copper/source_copper/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_copper import SourceCopper
+
+
+def run():
+    source = SourceCopper()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-courier/main.py b/airbyte-integrations/connectors/source-courier/main.py
index df87edbfaf1dd..d4de8fbdc9171 100644
--- a/airbyte-integrations/connectors/source-courier/main.py
+++ b/airbyte-integrations/connectors/source-courier/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_courier import SourceCourier
+from source_courier.run import run
 
 if __name__ == "__main__":
-    source = SourceCourier()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-courier/setup.py b/airbyte-integrations/connectors/source-courier/setup.py
index 883332ece7a6a..9bb4390f1913a 100644
--- a/airbyte-integrations/connectors/source-courier/setup.py
+++ b/airbyte-integrations/connectors/source-courier/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-courier=source_courier.run:run",
+        ],
+    },
     name="source_courier",
     description="Source implementation for Courier.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-courier/source_courier/run.py b/airbyte-integrations/connectors/source-courier/source_courier/run.py
new file mode 100644
index 0000000000000..c6e85fbde2381
--- /dev/null
+++ b/airbyte-integrations/connectors/source-courier/source_courier/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_courier import SourceCourier
+
+
+def run():
+    source = SourceCourier()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-customer-io/main.py b/airbyte-integrations/connectors/source-customer-io/main.py
index 835bc1df92ba2..ce54e7ce6db67 100644
--- a/airbyte-integrations/connectors/source-customer-io/main.py
+++ b/airbyte-integrations/connectors/source-customer-io/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_customer_io import SourceCustomerIo
+from source_customer_io.run import run
 
 if __name__ == "__main__":
-    source = SourceCustomerIo()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-customer-io/setup.py b/airbyte-integrations/connectors/source-customer-io/setup.py
index 04cd8664c8a13..eb13cd73bbea6 100644
--- a/airbyte-integrations/connectors/source-customer-io/setup.py
+++ b/airbyte-integrations/connectors/source-customer-io/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-customer-io=source_customer_io.run:run",
+        ],
+    },
     name="source_customer_io",
     description="Source implementation for Customer Io.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-customer-io/source_customer_io/run.py b/airbyte-integrations/connectors/source-customer-io/source_customer_io/run.py
new file mode 100644
index 0000000000000..b122bbd034971
--- /dev/null
+++ b/airbyte-integrations/connectors/source-customer-io/source_customer_io/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_customer_io import SourceCustomerIo
+
+
+def run():
+    source = SourceCustomerIo()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-datadog/main.py b/airbyte-integrations/connectors/source-datadog/main.py
index 768db52beb4f7..d8e7d33f093e2 100644
--- a/airbyte-integrations/connectors/source-datadog/main.py
+++ b/airbyte-integrations/connectors/source-datadog/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_datadog import SourceDatadog
+from source_datadog.run import run
 
 if __name__ == "__main__":
-    source = SourceDatadog()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-datadog/setup.py b/airbyte-integrations/connectors/source-datadog/setup.py
index 432515ebd8f0b..59b397984d788 100644
--- a/airbyte-integrations/connectors/source-datadog/setup.py
+++ b/airbyte-integrations/connectors/source-datadog/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-datadog=source_datadog.run:run",
+        ],
+    },
     name="source_datadog",
     description="Source implementation for Datadog.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-datadog/source_datadog/run.py b/airbyte-integrations/connectors/source-datadog/source_datadog/run.py
new file mode 100644
index 0000000000000..62adbe197666a
--- /dev/null
+++ b/airbyte-integrations/connectors/source-datadog/source_datadog/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_datadog import SourceDatadog
+
+
+def run():
+    source = SourceDatadog()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-datascope/main.py b/airbyte-integrations/connectors/source-datascope/main.py
index dbdd6b9cc1a51..59b428ca23964 100644
--- a/airbyte-integrations/connectors/source-datascope/main.py
+++ b/airbyte-integrations/connectors/source-datascope/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_datascope import SourceDatascope
+from source_datascope.run import run
 
 if __name__ == "__main__":
-    source = SourceDatascope()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-datascope/setup.py b/airbyte-integrations/connectors/source-datascope/setup.py
index 4a3a8864ddf47..d999c1e722908 100644
--- a/airbyte-integrations/connectors/source-datascope/setup.py
+++ b/airbyte-integrations/connectors/source-datascope/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-datascope=source_datascope.run:run",
+        ],
+    },
     name="source_datascope",
     description="Source implementation for Datascope.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-datascope/source_datascope/run.py b/airbyte-integrations/connectors/source-datascope/source_datascope/run.py
new file mode 100644
index 0000000000000..e1543c70c39c0
--- /dev/null
+++ b/airbyte-integrations/connectors/source-datascope/source_datascope/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_datascope import SourceDatascope
+
+
+def run():
+    source = SourceDatascope()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-delighted/main.py b/airbyte-integrations/connectors/source-delighted/main.py
index 2ba66b4bf80af..f2a80745b8cd6 100644
--- a/airbyte-integrations/connectors/source-delighted/main.py
+++ b/airbyte-integrations/connectors/source-delighted/main.py
@@ -2,34 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-# MIT License
-#
-# Copyright (c) 2020 Airbyte
-#
-# Permission is hereby granted, free of charge, to any person obtaining a copy
-# of this software and associated documentation files (the "Software"), to deal
-# in the Software without restriction, including without limitation the rights
-# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-# copies of the Software, and to permit persons to whom the Software is
-# furnished to do so, subject to the following conditions:
-#
-# The above copyright notice and this permission notice shall be included in all
-# copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-# SOFTWARE.
-
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_delighted import SourceDelighted
+from source_delighted.run import run
 
 if __name__ == "__main__":
-    source = SourceDelighted()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-delighted/setup.py b/airbyte-integrations/connectors/source-delighted/setup.py
index ca92c54ec6fe3..f1f4a7be9d788 100644
--- a/airbyte-integrations/connectors/source-delighted/setup.py
+++ b/airbyte-integrations/connectors/source-delighted/setup.py
@@ -17,6 +17,11 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-delighted=source_delighted.run:run",
+        ],
+    },
     name="source_delighted",
     description="Source implementation for Delighted.",
     author="Airbyte",
diff --git a/airbyte-integrations/connectors/source-delighted/source_delighted/run.py b/airbyte-integrations/connectors/source-delighted/source_delighted/run.py
new file mode 100644
index 0000000000000..b38535e5962d0
--- /dev/null
+++ b/airbyte-integrations/connectors/source-delighted/source_delighted/run.py
@@ -0,0 +1,36 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+# MIT License
+#
+# Copyright (c) 2020 Airbyte
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in all
+# copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_delighted import SourceDelighted
+
+
+def run():
+    source = SourceDelighted()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-dixa/main.py b/airbyte-integrations/connectors/source-dixa/main.py
index 5ec7b113ae37b..cf2dc464235a5 100644
--- a/airbyte-integrations/connectors/source-dixa/main.py
+++ b/airbyte-integrations/connectors/source-dixa/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_dixa import SourceDixa
+from source_dixa.run import run
 
 if __name__ == "__main__":
-    source = SourceDixa()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-dixa/setup.py b/airbyte-integrations/connectors/source-dixa/setup.py
index be6537c6a3cdc..5a08f6fc55527 100644
--- a/airbyte-integrations/connectors/source-dixa/setup.py
+++ b/airbyte-integrations/connectors/source-dixa/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-dixa=source_dixa.run:run",
+        ],
+    },
     name="source_dixa",
     description="Source implementation for Dixa.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-dixa/source_dixa/run.py b/airbyte-integrations/connectors/source-dixa/source_dixa/run.py
new file mode 100644
index 0000000000000..f264dd78af8e2
--- /dev/null
+++ b/airbyte-integrations/connectors/source-dixa/source_dixa/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_dixa import SourceDixa
+
+
+def run():
+    source = SourceDixa()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-dockerhub/main.py b/airbyte-integrations/connectors/source-dockerhub/main.py
index fffced0a26b78..c7bf0a5fadc90 100644
--- a/airbyte-integrations/connectors/source-dockerhub/main.py
+++ b/airbyte-integrations/connectors/source-dockerhub/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_dockerhub import SourceDockerhub
+from source_dockerhub.run import run
 
 if __name__ == "__main__":
-    source = SourceDockerhub()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-dockerhub/setup.py b/airbyte-integrations/connectors/source-dockerhub/setup.py
index ea4b2d5873c8e..9d382d831668d 100644
--- a/airbyte-integrations/connectors/source-dockerhub/setup.py
+++ b/airbyte-integrations/connectors/source-dockerhub/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-dockerhub=source_dockerhub.run:run",
+        ],
+    },
     name="source_dockerhub",
     description="Source implementation for Dockerhub.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-dockerhub/source_dockerhub/run.py b/airbyte-integrations/connectors/source-dockerhub/source_dockerhub/run.py
new file mode 100644
index 0000000000000..40df913e37e50
--- /dev/null
+++ b/airbyte-integrations/connectors/source-dockerhub/source_dockerhub/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_dockerhub import SourceDockerhub
+
+
+def run():
+    source = SourceDockerhub()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-dremio/main.py b/airbyte-integrations/connectors/source-dremio/main.py
index 10c2231becd94..2a7f7fbaabd45 100644
--- a/airbyte-integrations/connectors/source-dremio/main.py
+++ b/airbyte-integrations/connectors/source-dremio/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_dremio import SourceDremio
+from source_dremio.run import run
 
 if __name__ == "__main__":
-    source = SourceDremio()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-dremio/setup.py b/airbyte-integrations/connectors/source-dremio/setup.py
index 290c8fcf4fbe8..0d89e8a42fe6a 100644
--- a/airbyte-integrations/connectors/source-dremio/setup.py
+++ b/airbyte-integrations/connectors/source-dremio/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-dremio=source_dremio.run:run",
+        ],
+    },
     name="source_dremio",
     description="Source implementation for Dremio.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-dremio/source_dremio/run.py b/airbyte-integrations/connectors/source-dremio/source_dremio/run.py
new file mode 100644
index 0000000000000..8df023f7eff9f
--- /dev/null
+++ b/airbyte-integrations/connectors/source-dremio/source_dremio/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_dremio import SourceDremio
+
+
+def run():
+    source = SourceDremio()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-drift/main.py b/airbyte-integrations/connectors/source-drift/main.py
index 0e0072ac04c3f..7f9fdd2ad3df3 100644
--- a/airbyte-integrations/connectors/source-drift/main.py
+++ b/airbyte-integrations/connectors/source-drift/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_drift import SourceDrift
+from source_drift.run import run
 
 if __name__ == "__main__":
-    source = SourceDrift()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-drift/setup.py b/airbyte-integrations/connectors/source-drift/setup.py
index 5407ab8ae1e5d..7e6632fa47257 100644
--- a/airbyte-integrations/connectors/source-drift/setup.py
+++ b/airbyte-integrations/connectors/source-drift/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-drift=source_drift.run:run",
+        ],
+    },
     name="source_drift",
     description="Source implementation for Drift.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-drift/source_drift/run.py b/airbyte-integrations/connectors/source-drift/source_drift/run.py
new file mode 100644
index 0000000000000..b9b04289c2768
--- /dev/null
+++ b/airbyte-integrations/connectors/source-drift/source_drift/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_drift import SourceDrift
+
+
+def run():
+    source = SourceDrift()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-dv-360/main.py b/airbyte-integrations/connectors/source-dv-360/main.py
index 483df6f4de963..4d7158d2a11db 100644
--- a/airbyte-integrations/connectors/source-dv-360/main.py
+++ b/airbyte-integrations/connectors/source-dv-360/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_dv_360 import SourceDV360
+from source_dv_360.run import run
 
 if __name__ == "__main__":
-    source = SourceDV360()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-dv-360/setup.py b/airbyte-integrations/connectors/source-dv-360/setup.py
index a8198206559e3..99188791455c2 100644
--- a/airbyte-integrations/connectors/source-dv-360/setup.py
+++ b/airbyte-integrations/connectors/source-dv-360/setup.py
@@ -10,6 +10,11 @@
 TEST_REQUIREMENTS = ["requests-mock~=1.9.3", "pytest~=6.1", "pytest-mock"]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-dv-360=source_dv_360.run:run",
+        ],
+    },
     name="source_dv_360",
     description="Source implementation for Display & Video 360.",
     author="Airbyte",
diff --git a/airbyte-integrations/connectors/source-dv-360/source_dv_360/run.py b/airbyte-integrations/connectors/source-dv-360/source_dv_360/run.py
new file mode 100644
index 0000000000000..a869331c4dbf2
--- /dev/null
+++ b/airbyte-integrations/connectors/source-dv-360/source_dv_360/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_dv_360 import SourceDV360
+
+
+def run():
+    source = SourceDV360()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-emailoctopus/main.py b/airbyte-integrations/connectors/source-emailoctopus/main.py
index 18d45ef8ae6fd..c0c08dfdd7746 100644
--- a/airbyte-integrations/connectors/source-emailoctopus/main.py
+++ b/airbyte-integrations/connectors/source-emailoctopus/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_emailoctopus import SourceEmailoctopus
+from source_emailoctopus.run import run
 
 if __name__ == "__main__":
-    source = SourceEmailoctopus()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-emailoctopus/setup.py b/airbyte-integrations/connectors/source-emailoctopus/setup.py
index 9cd42d8b70502..4c4d0b6e863cb 100644
--- a/airbyte-integrations/connectors/source-emailoctopus/setup.py
+++ b/airbyte-integrations/connectors/source-emailoctopus/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-emailoctopus=source_emailoctopus.run:run",
+        ],
+    },
     name="source_emailoctopus",
     description="Source implementation for Emailoctopus.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-emailoctopus/source_emailoctopus/run.py b/airbyte-integrations/connectors/source-emailoctopus/source_emailoctopus/run.py
new file mode 100644
index 0000000000000..407e0e086c979
--- /dev/null
+++ b/airbyte-integrations/connectors/source-emailoctopus/source_emailoctopus/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_emailoctopus import SourceEmailoctopus
+
+
+def run():
+    source = SourceEmailoctopus()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-everhour/main.py b/airbyte-integrations/connectors/source-everhour/main.py
index 8c44913d9ddf0..d69ca6247ce65 100644
--- a/airbyte-integrations/connectors/source-everhour/main.py
+++ b/airbyte-integrations/connectors/source-everhour/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_everhour import SourceEverhour
+from source_everhour.run import run
 
 if __name__ == "__main__":
-    source = SourceEverhour()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-everhour/setup.py b/airbyte-integrations/connectors/source-everhour/setup.py
index e1838cba9eda7..40c9560ff2549 100644
--- a/airbyte-integrations/connectors/source-everhour/setup.py
+++ b/airbyte-integrations/connectors/source-everhour/setup.py
@@ -12,13 +12,30 @@
 TEST_REQUIREMENTS = ["requests-mock~=1.9.3", "pytest~=6.1", "pytest-mock~=3.6.1"]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-everhour=source_everhour.run:run",
+        ],
+    },
     name="source_everhour",
     description="Source implementation for Everhour.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-everhour/source_everhour/run.py b/airbyte-integrations/connectors/source-everhour/source_everhour/run.py
new file mode 100644
index 0000000000000..4e36ccaaf7812
--- /dev/null
+++ b/airbyte-integrations/connectors/source-everhour/source_everhour/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_everhour import SourceEverhour
+
+
+def run():
+    source = SourceEverhour()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-exchange-rates/main.py b/airbyte-integrations/connectors/source-exchange-rates/main.py
index ffdcfd706cff3..ce703c9da5715 100644
--- a/airbyte-integrations/connectors/source-exchange-rates/main.py
+++ b/airbyte-integrations/connectors/source-exchange-rates/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_exchange_rates import SourceExchangeRates
+from source_exchange_rates.run import run
 
 if __name__ == "__main__":
-    source = SourceExchangeRates()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-exchange-rates/setup.py b/airbyte-integrations/connectors/source-exchange-rates/setup.py
index 120437119f72b..c7832abdf32db 100644
--- a/airbyte-integrations/connectors/source-exchange-rates/setup.py
+++ b/airbyte-integrations/connectors/source-exchange-rates/setup.py
@@ -15,13 +15,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-exchange-rates=source_exchange_rates.run:run",
+        ],
+    },
     name="source_exchange_rates",
     description="Source implementation for Exchange Rates.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-exchange-rates/source_exchange_rates/run.py b/airbyte-integrations/connectors/source-exchange-rates/source_exchange_rates/run.py
new file mode 100644
index 0000000000000..c710a7e23d0df
--- /dev/null
+++ b/airbyte-integrations/connectors/source-exchange-rates/source_exchange_rates/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_exchange_rates import SourceExchangeRates
+
+
+def run():
+    source = SourceExchangeRates()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-facebook-pages/main.py b/airbyte-integrations/connectors/source-facebook-pages/main.py
index aba9ffd9f0eaa..466fc2800442d 100644
--- a/airbyte-integrations/connectors/source-facebook-pages/main.py
+++ b/airbyte-integrations/connectors/source-facebook-pages/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_facebook_pages import SourceFacebookPages
+from source_facebook_pages.run import run
 
 if __name__ == "__main__":
-    source = SourceFacebookPages()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-facebook-pages/setup.py b/airbyte-integrations/connectors/source-facebook-pages/setup.py
index 7bce89eaea9d7..808c6ffb27c7a 100644
--- a/airbyte-integrations/connectors/source-facebook-pages/setup.py
+++ b/airbyte-integrations/connectors/source-facebook-pages/setup.py
@@ -12,13 +12,30 @@
 TEST_REQUIREMENTS = ["pytest~=6.1", "pytest-mock~=3.6.1", "requests-mock"]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-facebook-pages=source_facebook_pages.run:run",
+        ],
+    },
     name="source_facebook_pages",
     description="Source implementation for Facebook Pages.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-facebook-pages/source_facebook_pages/run.py b/airbyte-integrations/connectors/source-facebook-pages/source_facebook_pages/run.py
new file mode 100644
index 0000000000000..3b70710fe59d1
--- /dev/null
+++ b/airbyte-integrations/connectors/source-facebook-pages/source_facebook_pages/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_facebook_pages import SourceFacebookPages
+
+
+def run():
+    source = SourceFacebookPages()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-fastbill/main.py b/airbyte-integrations/connectors/source-fastbill/main.py
index d807714bce50b..acf657a8214dd 100644
--- a/airbyte-integrations/connectors/source-fastbill/main.py
+++ b/airbyte-integrations/connectors/source-fastbill/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_fastbill import SourceFastbill
+from source_fastbill.run import run
 
 if __name__ == "__main__":
-    source = SourceFastbill()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-fastbill/setup.py b/airbyte-integrations/connectors/source-fastbill/setup.py
index 843e992da23a2..a83e4e1d307ad 100644
--- a/airbyte-integrations/connectors/source-fastbill/setup.py
+++ b/airbyte-integrations/connectors/source-fastbill/setup.py
@@ -10,13 +10,30 @@
 TEST_REQUIREMENTS = ["pytest~=6.2", "pytest-mock~=3.6.1"]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-fastbill=source_fastbill.run:run",
+        ],
+    },
     name="source_fastbill",
     description="Source implementation for Fastbill.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-fastbill/source_fastbill/run.py b/airbyte-integrations/connectors/source-fastbill/source_fastbill/run.py
new file mode 100644
index 0000000000000..eee32cd7dd6cd
--- /dev/null
+++ b/airbyte-integrations/connectors/source-fastbill/source_fastbill/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_fastbill import SourceFastbill
+
+
+def run():
+    source = SourceFastbill()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-fauna/main.py b/airbyte-integrations/connectors/source-fauna/main.py
index 86b4f167af64b..9e4bc25307ed1 100644
--- a/airbyte-integrations/connectors/source-fauna/main.py
+++ b/airbyte-integrations/connectors/source-fauna/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_fauna import SourceFauna
+from source_fauna.run import run
 
 if __name__ == "__main__":
-    source = SourceFauna()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-fauna/setup.py b/airbyte-integrations/connectors/source-fauna/setup.py
index 552523c1eb374..db1a676e8035c 100644
--- a/airbyte-integrations/connectors/source-fauna/setup.py
+++ b/airbyte-integrations/connectors/source-fauna/setup.py
@@ -17,6 +17,11 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-fauna=source_fauna.run:run",
+        ],
+    },
     name="source_fauna",
     description="Source implementation for Fauna.",
     author="Airbyte",
diff --git a/airbyte-integrations/connectors/source-fauna/source_fauna/run.py b/airbyte-integrations/connectors/source-fauna/source_fauna/run.py
new file mode 100644
index 0000000000000..20d6ee8bb021a
--- /dev/null
+++ b/airbyte-integrations/connectors/source-fauna/source_fauna/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_fauna import SourceFauna
+
+
+def run():
+    source = SourceFauna()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-file/main.py b/airbyte-integrations/connectors/source-file/main.py
index 3ab698c087c01..3e7e82fd61d88 100644
--- a/airbyte-integrations/connectors/source-file/main.py
+++ b/airbyte-integrations/connectors/source-file/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_file import SourceFile
+from source_file.run import run
 
 if __name__ == "__main__":
-    source = SourceFile()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-file/setup.py b/airbyte-integrations/connectors/source-file/setup.py
index 5135270628778..b2ae12af15130 100644
--- a/airbyte-integrations/connectors/source-file/setup.py
+++ b/airbyte-integrations/connectors/source-file/setup.py
@@ -27,6 +27,11 @@
 TEST_REQUIREMENTS = ["requests-mock~=1.9.3", "pytest~=6.2", "pytest-docker~=2.0.1", "pytest-mock~=3.6.1"]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-file=source_file.run:run",
+        ],
+    },
     name="source_file",
     description="Source implementation for File",
     author="Airbyte",
diff --git a/airbyte-integrations/connectors/source-file/source_file/run.py b/airbyte-integrations/connectors/source-file/source_file/run.py
new file mode 100644
index 0000000000000..646b35cb4c939
--- /dev/null
+++ b/airbyte-integrations/connectors/source-file/source_file/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_file import SourceFile
+
+
+def run():
+    source = SourceFile()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-firebase-realtime-database/main.py b/airbyte-integrations/connectors/source-firebase-realtime-database/main.py
index 54d63471838e0..708648fa8c153 100644
--- a/airbyte-integrations/connectors/source-firebase-realtime-database/main.py
+++ b/airbyte-integrations/connectors/source-firebase-realtime-database/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_firebase_realtime_database import SourceFirebaseRealtimeDatabase
+from source_firebase_realtime_database.run import run
 
 if __name__ == "__main__":
-    source = SourceFirebaseRealtimeDatabase()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-firebase-realtime-database/setup.py b/airbyte-integrations/connectors/source-firebase-realtime-database/setup.py
index 1424bb5b1b683..84f7e112ff68c 100644
--- a/airbyte-integrations/connectors/source-firebase-realtime-database/setup.py
+++ b/airbyte-integrations/connectors/source-firebase-realtime-database/setup.py
@@ -18,6 +18,11 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-firebase-realtime-database=source_firebase_realtime_database.run:run",
+        ],
+    },
     name="source_firebase_realtime_database",
     description="Source implementation for Firebase Realtime Database.",
     author="Airbyte",
diff --git a/airbyte-integrations/connectors/source-firebase-realtime-database/source_firebase_realtime_database/run.py b/airbyte-integrations/connectors/source-firebase-realtime-database/source_firebase_realtime_database/run.py
new file mode 100644
index 0000000000000..19b835a4a7a2a
--- /dev/null
+++ b/airbyte-integrations/connectors/source-firebase-realtime-database/source_firebase_realtime_database/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_firebase_realtime_database import SourceFirebaseRealtimeDatabase
+
+
+def run():
+    source = SourceFirebaseRealtimeDatabase()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-firebolt/main.py b/airbyte-integrations/connectors/source-firebolt/main.py
index babb5aad001b3..a901e9c4ae299 100644
--- a/airbyte-integrations/connectors/source-firebolt/main.py
+++ b/airbyte-integrations/connectors/source-firebolt/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_firebolt import SourceFirebolt
+from source_firebolt.run import run
 
 if __name__ == "__main__":
-    source = SourceFirebolt()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-firebolt/setup.py b/airbyte-integrations/connectors/source-firebolt/setup.py
index 13bb7d102b185..7c342fd2ae166 100644
--- a/airbyte-integrations/connectors/source-firebolt/setup.py
+++ b/airbyte-integrations/connectors/source-firebolt/setup.py
@@ -15,6 +15,11 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-firebolt=source_firebolt.run:run",
+        ],
+    },
     name="source_firebolt",
     description="Source implementation for Firebolt.",
     author="Airbyte",
diff --git a/airbyte-integrations/connectors/source-firebolt/source_firebolt/run.py b/airbyte-integrations/connectors/source-firebolt/source_firebolt/run.py
new file mode 100644
index 0000000000000..d37e5a6ba9110
--- /dev/null
+++ b/airbyte-integrations/connectors/source-firebolt/source_firebolt/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_firebolt import SourceFirebolt
+
+
+def run():
+    source = SourceFirebolt()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-flexport/main.py b/airbyte-integrations/connectors/source-flexport/main.py
index e65198a5e67dd..2370e6f8868aa 100644
--- a/airbyte-integrations/connectors/source-flexport/main.py
+++ b/airbyte-integrations/connectors/source-flexport/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_flexport import SourceFlexport
+from source_flexport.run import run
 
 if __name__ == "__main__":
-    source = SourceFlexport()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-flexport/setup.py b/airbyte-integrations/connectors/source-flexport/setup.py
index 0deaf76a64458..8a0a2f201f9bb 100644
--- a/airbyte-integrations/connectors/source-flexport/setup.py
+++ b/airbyte-integrations/connectors/source-flexport/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-flexport=source_flexport.run:run",
+        ],
+    },
     name="source_flexport",
     description="Source implementation for Flexport.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-flexport/source_flexport/run.py b/airbyte-integrations/connectors/source-flexport/source_flexport/run.py
new file mode 100644
index 0000000000000..9bba4b7e96a45
--- /dev/null
+++ b/airbyte-integrations/connectors/source-flexport/source_flexport/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_flexport import SourceFlexport
+
+
+def run():
+    source = SourceFlexport()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-freshcaller/main.py b/airbyte-integrations/connectors/source-freshcaller/main.py
index e0bc9f142e115..7039ceb25a6d4 100644
--- a/airbyte-integrations/connectors/source-freshcaller/main.py
+++ b/airbyte-integrations/connectors/source-freshcaller/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_freshcaller import SourceFreshcaller
+from source_freshcaller.run import run
 
 if __name__ == "__main__":
-    source = SourceFreshcaller()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-freshcaller/setup.py b/airbyte-integrations/connectors/source-freshcaller/setup.py
index 27b47c30913f9..3c1ee9c3ca913 100644
--- a/airbyte-integrations/connectors/source-freshcaller/setup.py
+++ b/airbyte-integrations/connectors/source-freshcaller/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-freshcaller=source_freshcaller.run:run",
+        ],
+    },
     name="source_freshcaller",
     description="Source implementation for Freshcaller.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-freshcaller/source_freshcaller/run.py b/airbyte-integrations/connectors/source-freshcaller/source_freshcaller/run.py
new file mode 100644
index 0000000000000..b6757d75d1aaf
--- /dev/null
+++ b/airbyte-integrations/connectors/source-freshcaller/source_freshcaller/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_freshcaller import SourceFreshcaller
+
+
+def run():
+    source = SourceFreshcaller()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-freshsales/main.py b/airbyte-integrations/connectors/source-freshsales/main.py
index c5069e9490e2a..cdb22eb76f985 100644
--- a/airbyte-integrations/connectors/source-freshsales/main.py
+++ b/airbyte-integrations/connectors/source-freshsales/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_freshsales import SourceFreshsales
+from source_freshsales.run import run
 
 if __name__ == "__main__":
-    source = SourceFreshsales()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-freshsales/setup.py b/airbyte-integrations/connectors/source-freshsales/setup.py
index 2cc1107f0c8b9..664bc7a4ff49d 100644
--- a/airbyte-integrations/connectors/source-freshsales/setup.py
+++ b/airbyte-integrations/connectors/source-freshsales/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-freshsales=source_freshsales.run:run",
+        ],
+    },
     name="source_freshsales",
     description="Source implementation for Freshsales.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-freshsales/source_freshsales/run.py b/airbyte-integrations/connectors/source-freshsales/source_freshsales/run.py
new file mode 100644
index 0000000000000..5eed96da068e8
--- /dev/null
+++ b/airbyte-integrations/connectors/source-freshsales/source_freshsales/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_freshsales import SourceFreshsales
+
+
+def run():
+    source = SourceFreshsales()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-freshservice/main.py b/airbyte-integrations/connectors/source-freshservice/main.py
index 5048dde919295..084c02978df94 100644
--- a/airbyte-integrations/connectors/source-freshservice/main.py
+++ b/airbyte-integrations/connectors/source-freshservice/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_freshservice import SourceFreshservice
+from source_freshservice.run import run
 
 if __name__ == "__main__":
-    source = SourceFreshservice()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-freshservice/setup.py b/airbyte-integrations/connectors/source-freshservice/setup.py
index 422531f33640d..87806214b3dc1 100644
--- a/airbyte-integrations/connectors/source-freshservice/setup.py
+++ b/airbyte-integrations/connectors/source-freshservice/setup.py
@@ -12,13 +12,30 @@
 TEST_REQUIREMENTS = ["pytest~=6.2", "pytest-mock~=3.6.1"]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-freshservice=source_freshservice.run:run",
+        ],
+    },
     name="source_freshservice",
     description="Source implementation for Freshservice.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-freshservice/source_freshservice/run.py b/airbyte-integrations/connectors/source-freshservice/source_freshservice/run.py
new file mode 100644
index 0000000000000..c7a979f0a59bc
--- /dev/null
+++ b/airbyte-integrations/connectors/source-freshservice/source_freshservice/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_freshservice import SourceFreshservice
+
+
+def run():
+    source = SourceFreshservice()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-fullstory/main.py b/airbyte-integrations/connectors/source-fullstory/main.py
index d9696f00cd3d0..ee3e71e54ed53 100644
--- a/airbyte-integrations/connectors/source-fullstory/main.py
+++ b/airbyte-integrations/connectors/source-fullstory/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_fullstory import SourceFullstory
+from source_fullstory.run import run
 
 if __name__ == "__main__":
-    source = SourceFullstory()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-fullstory/setup.py b/airbyte-integrations/connectors/source-fullstory/setup.py
index 99bc576b124a1..4bc344fd16c35 100644
--- a/airbyte-integrations/connectors/source-fullstory/setup.py
+++ b/airbyte-integrations/connectors/source-fullstory/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-fullstory=source_fullstory.run:run",
+        ],
+    },
     name="source_fullstory",
     description="Source implementation for Fullstory.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-fullstory/source_fullstory/run.py b/airbyte-integrations/connectors/source-fullstory/source_fullstory/run.py
new file mode 100644
index 0000000000000..3b6be606bf590
--- /dev/null
+++ b/airbyte-integrations/connectors/source-fullstory/source_fullstory/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_fullstory import SourceFullstory
+
+
+def run():
+    source = SourceFullstory()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-gainsight-px/main.py b/airbyte-integrations/connectors/source-gainsight-px/main.py
index 5ae4980cd0e00..35146e9ca9729 100644
--- a/airbyte-integrations/connectors/source-gainsight-px/main.py
+++ b/airbyte-integrations/connectors/source-gainsight-px/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_gainsight_px import SourceGainsightPx
+from source_gainsight_px.run import run
 
 if __name__ == "__main__":
-    source = SourceGainsightPx()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-gainsight-px/setup.py b/airbyte-integrations/connectors/source-gainsight-px/setup.py
index 3ba161a38e22c..4510521fa81c0 100644
--- a/airbyte-integrations/connectors/source-gainsight-px/setup.py
+++ b/airbyte-integrations/connectors/source-gainsight-px/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-gainsight-px=source_gainsight_px.run:run",
+        ],
+    },
     name="source_gainsight_px",
     description="Source implementation for Gainsight Px.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-gainsight-px/source_gainsight_px/run.py b/airbyte-integrations/connectors/source-gainsight-px/source_gainsight_px/run.py
new file mode 100644
index 0000000000000..f0e263867dd85
--- /dev/null
+++ b/airbyte-integrations/connectors/source-gainsight-px/source_gainsight_px/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_gainsight_px import SourceGainsightPx
+
+
+def run():
+    source = SourceGainsightPx()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-gcs/main.py b/airbyte-integrations/connectors/source-gcs/main.py
index c98b5b943cc79..a3a044fb142db 100644
--- a/airbyte-integrations/connectors/source-gcs/main.py
+++ b/airbyte-integrations/connectors/source-gcs/main.py
@@ -2,14 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import AirbyteEntrypoint, launch
-from source_gcs import Config, Cursor, SourceGCS, SourceGCSStreamReader
+from source_gcs.run import run
 
 if __name__ == "__main__":
-    _args = sys.argv[1:]
-    catalog_path = AirbyteEntrypoint.extract_catalog(_args)
-    source = SourceGCS(SourceGCSStreamReader(), Config, catalog_path, cursor_cls=Cursor)
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-gcs/setup.py b/airbyte-integrations/connectors/source-gcs/setup.py
index b9574a8389711..f218f69dcb09e 100644
--- a/airbyte-integrations/connectors/source-gcs/setup.py
+++ b/airbyte-integrations/connectors/source-gcs/setup.py
@@ -19,6 +19,11 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-gcs=source_gcs.run:run",
+        ],
+    },
     name="source_gcs",
     description="Source implementation for Gcs.",
     author="Airbyte",
diff --git a/airbyte-integrations/connectors/source-gcs/source_gcs/run.py b/airbyte-integrations/connectors/source-gcs/source_gcs/run.py
new file mode 100644
index 0000000000000..d91a6b40df2a0
--- /dev/null
+++ b/airbyte-integrations/connectors/source-gcs/source_gcs/run.py
@@ -0,0 +1,16 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import AirbyteEntrypoint, launch
+from source_gcs import Config, Cursor, SourceGCS, SourceGCSStreamReader
+
+
+def run():
+    _args = sys.argv[1:]
+    catalog_path = AirbyteEntrypoint.extract_catalog(_args)
+    source = SourceGCS(SourceGCSStreamReader(), Config, catalog_path, cursor_cls=Cursor)
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-genesys/main.py b/airbyte-integrations/connectors/source-genesys/main.py
index 603590f5fe123..d34643d2aa219 100644
--- a/airbyte-integrations/connectors/source-genesys/main.py
+++ b/airbyte-integrations/connectors/source-genesys/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_genesys import SourceGenesys
+from source_genesys.run import run
 
 if __name__ == "__main__":
-    source = SourceGenesys()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-genesys/setup.py b/airbyte-integrations/connectors/source-genesys/setup.py
index 1c118e3166802..723222c413e35 100644
--- a/airbyte-integrations/connectors/source-genesys/setup.py
+++ b/airbyte-integrations/connectors/source-genesys/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-genesys=source_genesys.run:run",
+        ],
+    },
     name="source_genesys",
     description="Source implementation for Genesys.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-genesys/source_genesys/run.py b/airbyte-integrations/connectors/source-genesys/source_genesys/run.py
new file mode 100644
index 0000000000000..1c7ee790a0ca2
--- /dev/null
+++ b/airbyte-integrations/connectors/source-genesys/source_genesys/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_genesys import SourceGenesys
+
+
+def run():
+    source = SourceGenesys()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-getlago/main.py b/airbyte-integrations/connectors/source-getlago/main.py
index 0748c658182d3..979e8b779cc5f 100644
--- a/airbyte-integrations/connectors/source-getlago/main.py
+++ b/airbyte-integrations/connectors/source-getlago/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_getlago import SourceGetlago
+from source_getlago.run import run
 
 if __name__ == "__main__":
-    source = SourceGetlago()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-getlago/setup.py b/airbyte-integrations/connectors/source-getlago/setup.py
index 37d77842438d2..b4d2e1a140eb4 100644
--- a/airbyte-integrations/connectors/source-getlago/setup.py
+++ b/airbyte-integrations/connectors/source-getlago/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-getlago=source_getlago.run:run",
+        ],
+    },
     name="source_getlago",
     description="Source implementation for Getlago.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-getlago/source_getlago/run.py b/airbyte-integrations/connectors/source-getlago/source_getlago/run.py
new file mode 100644
index 0000000000000..a7822c1b112ac
--- /dev/null
+++ b/airbyte-integrations/connectors/source-getlago/source_getlago/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_getlago import SourceGetlago
+
+
+def run():
+    source = SourceGetlago()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-github/main.py b/airbyte-integrations/connectors/source-github/main.py
index aa6b652e953cc..4d37ce6cccf59 100644
--- a/airbyte-integrations/connectors/source-github/main.py
+++ b/airbyte-integrations/connectors/source-github/main.py
@@ -2,15 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_github import SourceGithub
-from source_github.config_migrations import MigrateBranch, MigrateRepository
+from source_github.run import run
 
 if __name__ == "__main__":
-    source = SourceGithub()
-    MigrateRepository.migrate(sys.argv[1:], source)
-    MigrateBranch.migrate(sys.argv[1:], source)
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-github/setup.py b/airbyte-integrations/connectors/source-github/setup.py
index 8b5f90f29e125..822fd9e37edfe 100644
--- a/airbyte-integrations/connectors/source-github/setup.py
+++ b/airbyte-integrations/connectors/source-github/setup.py
@@ -10,6 +10,11 @@
 TEST_REQUIREMENTS = ["requests-mock~=1.9.3", "pytest-mock~=3.6.1", "pytest~=6.2", "responses~=0.23.1", "freezegun~=1.2"]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-github=source_github.run:run",
+        ],
+    },
     name="source_github",
     description="Source implementation for Github.",
     author="Airbyte",
diff --git a/airbyte-integrations/connectors/source-github/source_github/run.py b/airbyte-integrations/connectors/source-github/source_github/run.py
new file mode 100644
index 0000000000000..3abce97248422
--- /dev/null
+++ b/airbyte-integrations/connectors/source-github/source_github/run.py
@@ -0,0 +1,17 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_github import SourceGithub
+from source_github.config_migrations import MigrateBranch, MigrateRepository
+
+
+def run():
+    source = SourceGithub()
+    MigrateRepository.migrate(sys.argv[1:], source)
+    MigrateBranch.migrate(sys.argv[1:], source)
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-glassfrog/main.py b/airbyte-integrations/connectors/source-glassfrog/main.py
index 22d58701db3d8..f063b41ef47ff 100644
--- a/airbyte-integrations/connectors/source-glassfrog/main.py
+++ b/airbyte-integrations/connectors/source-glassfrog/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_glassfrog import SourceGlassfrog
+from source_glassfrog.run import run
 
 if __name__ == "__main__":
-    source = SourceGlassfrog()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-glassfrog/setup.py b/airbyte-integrations/connectors/source-glassfrog/setup.py
index e62098fca78b8..531a1c2a7d870 100644
--- a/airbyte-integrations/connectors/source-glassfrog/setup.py
+++ b/airbyte-integrations/connectors/source-glassfrog/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-glassfrog=source_glassfrog.run:run",
+        ],
+    },
     name="source_glassfrog",
     description="Source implementation for Glassfrog.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-glassfrog/source_glassfrog/run.py b/airbyte-integrations/connectors/source-glassfrog/source_glassfrog/run.py
new file mode 100644
index 0000000000000..618d3873c80c9
--- /dev/null
+++ b/airbyte-integrations/connectors/source-glassfrog/source_glassfrog/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_glassfrog import SourceGlassfrog
+
+
+def run():
+    source = SourceGlassfrog()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-gnews/main.py b/airbyte-integrations/connectors/source-gnews/main.py
index 2d7fef6170534..4702ac5fd3643 100644
--- a/airbyte-integrations/connectors/source-gnews/main.py
+++ b/airbyte-integrations/connectors/source-gnews/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_gnews import SourceGnews
+from source_gnews.run import run
 
 if __name__ == "__main__":
-    source = SourceGnews()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-gnews/setup.py b/airbyte-integrations/connectors/source-gnews/setup.py
index 3e4cf6f2cc28e..564eaf258c856 100644
--- a/airbyte-integrations/connectors/source-gnews/setup.py
+++ b/airbyte-integrations/connectors/source-gnews/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-gnews=source_gnews.run:run",
+        ],
+    },
     name="source_gnews",
     description="Source implementation for Gnews.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-gnews/source_gnews/run.py b/airbyte-integrations/connectors/source-gnews/source_gnews/run.py
new file mode 100644
index 0000000000000..c2bf1ff536a4e
--- /dev/null
+++ b/airbyte-integrations/connectors/source-gnews/source_gnews/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_gnews import SourceGnews
+
+
+def run():
+    source = SourceGnews()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-gocardless/main.py b/airbyte-integrations/connectors/source-gocardless/main.py
index 0c7fbe5c27ed2..b7d51bd717b78 100644
--- a/airbyte-integrations/connectors/source-gocardless/main.py
+++ b/airbyte-integrations/connectors/source-gocardless/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_gocardless import SourceGocardless
+from source_gocardless.run import run
 
 if __name__ == "__main__":
-    source = SourceGocardless()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-gocardless/setup.py b/airbyte-integrations/connectors/source-gocardless/setup.py
index b49d3b8111e0f..46bcd590d0028 100644
--- a/airbyte-integrations/connectors/source-gocardless/setup.py
+++ b/airbyte-integrations/connectors/source-gocardless/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-gocardless=source_gocardless.run:run",
+        ],
+    },
     name="source_gocardless",
     description="Source implementation for Gocardless.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-gocardless/source_gocardless/run.py b/airbyte-integrations/connectors/source-gocardless/source_gocardless/run.py
new file mode 100644
index 0000000000000..1884dd380ed41
--- /dev/null
+++ b/airbyte-integrations/connectors/source-gocardless/source_gocardless/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_gocardless import SourceGocardless
+
+
+def run():
+    source = SourceGocardless()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-gong/main.py b/airbyte-integrations/connectors/source-gong/main.py
index d303894475511..dc012c0e42c05 100644
--- a/airbyte-integrations/connectors/source-gong/main.py
+++ b/airbyte-integrations/connectors/source-gong/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_gong import SourceGong
+from source_gong.run import run
 
 if __name__ == "__main__":
-    source = SourceGong()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-gong/setup.py b/airbyte-integrations/connectors/source-gong/setup.py
index e87d4ea567717..2232e3fe24a12 100644
--- a/airbyte-integrations/connectors/source-gong/setup.py
+++ b/airbyte-integrations/connectors/source-gong/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-gong=source_gong.run:run",
+        ],
+    },
     name="source_gong",
     description="Source implementation for Gong.",
     author="Elliot Trabac",
     author_email="elliot.trabac1@gmail.com",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-gong/source_gong/run.py b/airbyte-integrations/connectors/source-gong/source_gong/run.py
new file mode 100644
index 0000000000000..95da404269f9e
--- /dev/null
+++ b/airbyte-integrations/connectors/source-gong/source_gong/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_gong import SourceGong
+
+
+def run():
+    source = SourceGong()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-google-analytics-v4/main.py b/airbyte-integrations/connectors/source-google-analytics-v4/main.py
index 45b902bd6ced0..3fd58bc1d5f62 100644
--- a/airbyte-integrations/connectors/source-google-analytics-v4/main.py
+++ b/airbyte-integrations/connectors/source-google-analytics-v4/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_google_analytics_v4 import SourceGoogleAnalyticsV4
+from source_google_analytics_v4.run import run
 
 if __name__ == "__main__":
-    source = SourceGoogleAnalyticsV4()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-google-analytics-v4/setup.py b/airbyte-integrations/connectors/source-google-analytics-v4/setup.py
index 62ec012a72f9b..43f18fd04b376 100644
--- a/airbyte-integrations/connectors/source-google-analytics-v4/setup.py
+++ b/airbyte-integrations/connectors/source-google-analytics-v4/setup.py
@@ -15,6 +15,11 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-google-analytics-v4=source_google_analytics_v4.run:run",
+        ],
+    },
     name="source_google_analytics_v4",
     description="Source implementation for Google Analytics V4.",
     author="Airbyte",
diff --git a/airbyte-integrations/connectors/source-google-analytics-v4/source_google_analytics_v4/run.py b/airbyte-integrations/connectors/source-google-analytics-v4/source_google_analytics_v4/run.py
new file mode 100644
index 0000000000000..ebb414319fab5
--- /dev/null
+++ b/airbyte-integrations/connectors/source-google-analytics-v4/source_google_analytics_v4/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_google_analytics_v4 import SourceGoogleAnalyticsV4
+
+
+def run():
+    source = SourceGoogleAnalyticsV4()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-google-directory/main.py b/airbyte-integrations/connectors/source-google-directory/main.py
index 97076817e3a7c..fa60e31af90e0 100644
--- a/airbyte-integrations/connectors/source-google-directory/main.py
+++ b/airbyte-integrations/connectors/source-google-directory/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_google_directory import SourceGoogleDirectory
+from source_google_directory.run import run
 
 if __name__ == "__main__":
-    source = SourceGoogleDirectory()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-google-directory/setup.py b/airbyte-integrations/connectors/source-google-directory/setup.py
index a4dbf5967f65d..e10411bc26687 100644
--- a/airbyte-integrations/connectors/source-google-directory/setup.py
+++ b/airbyte-integrations/connectors/source-google-directory/setup.py
@@ -20,6 +20,11 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-google-directory=source_google_directory.run:run",
+        ],
+    },
     name="source_google_directory",
     description="Source implementation for Google Directory.",
     author="Airbyte",
diff --git a/airbyte-integrations/connectors/source-google-directory/source_google_directory/run.py b/airbyte-integrations/connectors/source-google-directory/source_google_directory/run.py
new file mode 100644
index 0000000000000..d7110346906bd
--- /dev/null
+++ b/airbyte-integrations/connectors/source-google-directory/source_google_directory/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_google_directory import SourceGoogleDirectory
+
+
+def run():
+    source = SourceGoogleDirectory()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-google-pagespeed-insights/main.py b/airbyte-integrations/connectors/source-google-pagespeed-insights/main.py
index 8265a27b1edb2..956a0e47d3cb2 100644
--- a/airbyte-integrations/connectors/source-google-pagespeed-insights/main.py
+++ b/airbyte-integrations/connectors/source-google-pagespeed-insights/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_google_pagespeed_insights import SourceGooglePagespeedInsights
+from source_google_pagespeed_insights.run import run
 
 if __name__ == "__main__":
-    source = SourceGooglePagespeedInsights()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-google-pagespeed-insights/setup.py b/airbyte-integrations/connectors/source-google-pagespeed-insights/setup.py
index 07d5d4a738fff..e1c998d1d69de 100644
--- a/airbyte-integrations/connectors/source-google-pagespeed-insights/setup.py
+++ b/airbyte-integrations/connectors/source-google-pagespeed-insights/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-google-pagespeed-insights=source_google_pagespeed_insights.run:run",
+        ],
+    },
     name="source_google_pagespeed_insights",
     description="Source implementation for Google Pagespeed Insights.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-google-pagespeed-insights/source_google_pagespeed_insights/run.py b/airbyte-integrations/connectors/source-google-pagespeed-insights/source_google_pagespeed_insights/run.py
new file mode 100644
index 0000000000000..e4bb2c99def7a
--- /dev/null
+++ b/airbyte-integrations/connectors/source-google-pagespeed-insights/source_google_pagespeed_insights/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_google_pagespeed_insights import SourceGooglePagespeedInsights
+
+
+def run():
+    source = SourceGooglePagespeedInsights()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-google-search-console/main.py b/airbyte-integrations/connectors/source-google-search-console/main.py
index 117df652ca762..845383457bb79 100755
--- a/airbyte-integrations/connectors/source-google-search-console/main.py
+++ b/airbyte-integrations/connectors/source-google-search-console/main.py
@@ -2,16 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_google_search_console import SourceGoogleSearchConsole
-from source_google_search_console.config_migrations import MigrateCustomReports
+from source_google_search_console.run import run
 
 if __name__ == "__main__":
-    source = SourceGoogleSearchConsole()
-    # migrate config at runtime
-    MigrateCustomReports.migrate(sys.argv[1:], source)
-    # run the connector
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-google-search-console/setup.py b/airbyte-integrations/connectors/source-google-search-console/setup.py
index fd73d6450d37d..9888c3a79d5e9 100755
--- a/airbyte-integrations/connectors/source-google-search-console/setup.py
+++ b/airbyte-integrations/connectors/source-google-search-console/setup.py
@@ -19,6 +19,11 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-google-search-console=source_google_search_console.run:run",
+        ],
+    },
     name="source_google_search_console",
     description="Source implementation for Google Search Console.",
     author="Airbyte",
diff --git a/airbyte-integrations/connectors/source-google-search-console/source_google_search_console/run.py b/airbyte-integrations/connectors/source-google-search-console/source_google_search_console/run.py
new file mode 100755
index 0000000000000..3de91fb3cc50d
--- /dev/null
+++ b/airbyte-integrations/connectors/source-google-search-console/source_google_search_console/run.py
@@ -0,0 +1,18 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_google_search_console import SourceGoogleSearchConsole
+from source_google_search_console.config_migrations import MigrateCustomReports
+
+
+def run():
+    source = SourceGoogleSearchConsole()
+    # migrate config at runtime
+    MigrateCustomReports.migrate(sys.argv[1:], source)
+    # run the connector
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-google-sheets/setup.py b/airbyte-integrations/connectors/source-google-sheets/setup.py
index 921d19138dbe2..af6935a4686fe 100644
--- a/airbyte-integrations/connectors/source-google-sheets/setup.py
+++ b/airbyte-integrations/connectors/source-google-sheets/setup.py
@@ -29,7 +29,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-google-webfonts/main.py b/airbyte-integrations/connectors/source-google-webfonts/main.py
index 99b5b45a2ba9b..70cd774d0a018 100644
--- a/airbyte-integrations/connectors/source-google-webfonts/main.py
+++ b/airbyte-integrations/connectors/source-google-webfonts/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_google_webfonts import SourceGoogleWebfonts
+from source_google_webfonts.run import run
 
 if __name__ == "__main__":
-    source = SourceGoogleWebfonts()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-google-webfonts/setup.py b/airbyte-integrations/connectors/source-google-webfonts/setup.py
index 863003482ff15..1b50e26184ce1 100644
--- a/airbyte-integrations/connectors/source-google-webfonts/setup.py
+++ b/airbyte-integrations/connectors/source-google-webfonts/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-google-webfonts=source_google_webfonts.run:run",
+        ],
+    },
     name="source_google_webfonts",
     description="Source implementation for Google Webfonts.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-google-webfonts/source_google_webfonts/run.py b/airbyte-integrations/connectors/source-google-webfonts/source_google_webfonts/run.py
new file mode 100644
index 0000000000000..fbce9176984de
--- /dev/null
+++ b/airbyte-integrations/connectors/source-google-webfonts/source_google_webfonts/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_google_webfonts import SourceGoogleWebfonts
+
+
+def run():
+    source = SourceGoogleWebfonts()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-google-workspace-admin-reports/main.py b/airbyte-integrations/connectors/source-google-workspace-admin-reports/main.py
index 010d9559e95b7..1e88c29a963d2 100644
--- a/airbyte-integrations/connectors/source-google-workspace-admin-reports/main.py
+++ b/airbyte-integrations/connectors/source-google-workspace-admin-reports/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_google_workspace_admin_reports import SourceGoogleWorkspaceAdminReports
+from source_google_workspace_admin_reports.run import run
 
 if __name__ == "__main__":
-    source = SourceGoogleWorkspaceAdminReports()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-google-workspace-admin-reports/setup.py b/airbyte-integrations/connectors/source-google-workspace-admin-reports/setup.py
index 7170103bf496e..787e9f8981b48 100644
--- a/airbyte-integrations/connectors/source-google-workspace-admin-reports/setup.py
+++ b/airbyte-integrations/connectors/source-google-workspace-admin-reports/setup.py
@@ -21,6 +21,11 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-google-workspace-admin-reports=source_google_workspace_admin_reports.run:run",
+        ],
+    },
     name="source_google_workspace_admin_reports",
     description="Source implementation for Google Workspace Admin Reports.",
     author="Airbyte",
diff --git a/airbyte-integrations/connectors/source-google-workspace-admin-reports/source_google_workspace_admin_reports/run.py b/airbyte-integrations/connectors/source-google-workspace-admin-reports/source_google_workspace_admin_reports/run.py
new file mode 100644
index 0000000000000..b5ecb1fabd637
--- /dev/null
+++ b/airbyte-integrations/connectors/source-google-workspace-admin-reports/source_google_workspace_admin_reports/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_google_workspace_admin_reports import SourceGoogleWorkspaceAdminReports
+
+
+def run():
+    source = SourceGoogleWorkspaceAdminReports()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-greenhouse/main.py b/airbyte-integrations/connectors/source-greenhouse/main.py
index 55e53e344062e..e08a14b429fdd 100644
--- a/airbyte-integrations/connectors/source-greenhouse/main.py
+++ b/airbyte-integrations/connectors/source-greenhouse/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_greenhouse import SourceGreenhouse
+from source_greenhouse.run import run
 
 if __name__ == "__main__":
-    source = SourceGreenhouse()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-greenhouse/setup.py b/airbyte-integrations/connectors/source-greenhouse/setup.py
index 73945258c42b2..3b9c02aec527d 100644
--- a/airbyte-integrations/connectors/source-greenhouse/setup.py
+++ b/airbyte-integrations/connectors/source-greenhouse/setup.py
@@ -12,6 +12,11 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-greenhouse=source_greenhouse.run:run",
+        ],
+    },
     name="source_greenhouse",
     description="Source implementation for Greenhouse.",
     author="Airbyte",
diff --git a/airbyte-integrations/connectors/source-greenhouse/source_greenhouse/run.py b/airbyte-integrations/connectors/source-greenhouse/source_greenhouse/run.py
new file mode 100644
index 0000000000000..d82109b4b6cc3
--- /dev/null
+++ b/airbyte-integrations/connectors/source-greenhouse/source_greenhouse/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_greenhouse import SourceGreenhouse
+
+
+def run():
+    source = SourceGreenhouse()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-gridly/main.py b/airbyte-integrations/connectors/source-gridly/main.py
index 1e999fa0c2d08..307be6500faff 100644
--- a/airbyte-integrations/connectors/source-gridly/main.py
+++ b/airbyte-integrations/connectors/source-gridly/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_gridly import SourceGridly
+from source_gridly.run import run
 
 if __name__ == "__main__":
-    source = SourceGridly()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-gridly/setup.py b/airbyte-integrations/connectors/source-gridly/setup.py
index dc08caa562c50..2b6e0bb2cc20b 100644
--- a/airbyte-integrations/connectors/source-gridly/setup.py
+++ b/airbyte-integrations/connectors/source-gridly/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-gridly=source_gridly.run:run",
+        ],
+    },
     name="source_gridly",
     description="Source implementation for Gridly.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-gridly/source_gridly/run.py b/airbyte-integrations/connectors/source-gridly/source_gridly/run.py
new file mode 100644
index 0000000000000..2cddadbd477df
--- /dev/null
+++ b/airbyte-integrations/connectors/source-gridly/source_gridly/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_gridly import SourceGridly
+
+
+def run():
+    source = SourceGridly()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-gutendex/main.py b/airbyte-integrations/connectors/source-gutendex/main.py
index 0fd65db37ce0b..8304e254daa4c 100644
--- a/airbyte-integrations/connectors/source-gutendex/main.py
+++ b/airbyte-integrations/connectors/source-gutendex/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_gutendex import SourceGutendex
+from source_gutendex.run import run
 
 if __name__ == "__main__":
-    source = SourceGutendex()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-gutendex/setup.py b/airbyte-integrations/connectors/source-gutendex/setup.py
index b96103135cdfc..6759689d84b52 100644
--- a/airbyte-integrations/connectors/source-gutendex/setup.py
+++ b/airbyte-integrations/connectors/source-gutendex/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-gutendex=source_gutendex.run:run",
+        ],
+    },
     name="source_gutendex",
     description="Source implementation for Gutendex.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-gutendex/source_gutendex/run.py b/airbyte-integrations/connectors/source-gutendex/source_gutendex/run.py
new file mode 100644
index 0000000000000..ba4bcb6755ac9
--- /dev/null
+++ b/airbyte-integrations/connectors/source-gutendex/source_gutendex/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_gutendex import SourceGutendex
+
+
+def run():
+    source = SourceGutendex()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-harness/main.py b/airbyte-integrations/connectors/source-harness/main.py
index b323465b96c8c..a33c09315382d 100644
--- a/airbyte-integrations/connectors/source-harness/main.py
+++ b/airbyte-integrations/connectors/source-harness/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_harness import SourceHarness
+from source_harness.run import run
 
 if __name__ == "__main__":
-    source = SourceHarness()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-harness/setup.py b/airbyte-integrations/connectors/source-harness/setup.py
index 6bef3ce1447c2..170c960c95001 100644
--- a/airbyte-integrations/connectors/source-harness/setup.py
+++ b/airbyte-integrations/connectors/source-harness/setup.py
@@ -14,13 +14,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-harness=source_harness.run:run",
+        ],
+    },
     name="source_harness",
     description="Source implementation for Harness.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-harness/source_harness/run.py b/airbyte-integrations/connectors/source-harness/source_harness/run.py
new file mode 100644
index 0000000000000..544daa9407a16
--- /dev/null
+++ b/airbyte-integrations/connectors/source-harness/source_harness/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_harness import SourceHarness
+
+
+def run():
+    source = SourceHarness()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-harvest/main.py b/airbyte-integrations/connectors/source-harvest/main.py
index 3fa9904a1ea68..e00a49b587fd0 100644
--- a/airbyte-integrations/connectors/source-harvest/main.py
+++ b/airbyte-integrations/connectors/source-harvest/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_harvest import SourceHarvest
+from source_harvest.run import run
 
 if __name__ == "__main__":
-    source = SourceHarvest()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-harvest/setup.py b/airbyte-integrations/connectors/source-harvest/setup.py
index a208606a02a84..4c73f9283e52e 100644
--- a/airbyte-integrations/connectors/source-harvest/setup.py
+++ b/airbyte-integrations/connectors/source-harvest/setup.py
@@ -16,6 +16,11 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-harvest=source_harvest.run:run",
+        ],
+    },
     name="source_harvest",
     description="Source implementation for Harvest.",
     author="Airbyte",
diff --git a/airbyte-integrations/connectors/source-harvest/source_harvest/run.py b/airbyte-integrations/connectors/source-harvest/source_harvest/run.py
new file mode 100644
index 0000000000000..53406b411f86e
--- /dev/null
+++ b/airbyte-integrations/connectors/source-harvest/source_harvest/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_harvest import SourceHarvest
+
+
+def run():
+    source = SourceHarvest()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-hellobaton/main.py b/airbyte-integrations/connectors/source-hellobaton/main.py
index 1c9ad3053e5a6..17a946f7180e4 100644
--- a/airbyte-integrations/connectors/source-hellobaton/main.py
+++ b/airbyte-integrations/connectors/source-hellobaton/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_hellobaton import SourceHellobaton
+from source_hellobaton.run import run
 
 if __name__ == "__main__":
-    source = SourceHellobaton()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-hellobaton/setup.py b/airbyte-integrations/connectors/source-hellobaton/setup.py
index 91ef2d7cc5f07..d11d669bfcadb 100644
--- a/airbyte-integrations/connectors/source-hellobaton/setup.py
+++ b/airbyte-integrations/connectors/source-hellobaton/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-hellobaton=source_hellobaton.run:run",
+        ],
+    },
     name="source_hellobaton",
     description="Source implementation for Hellobaton.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-hellobaton/source_hellobaton/run.py b/airbyte-integrations/connectors/source-hellobaton/source_hellobaton/run.py
new file mode 100644
index 0000000000000..4d005af85b843
--- /dev/null
+++ b/airbyte-integrations/connectors/source-hellobaton/source_hellobaton/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_hellobaton import SourceHellobaton
+
+
+def run():
+    source = SourceHellobaton()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-hubplanner/main.py b/airbyte-integrations/connectors/source-hubplanner/main.py
index 23d01f5e10a63..aa973ab41009b 100644
--- a/airbyte-integrations/connectors/source-hubplanner/main.py
+++ b/airbyte-integrations/connectors/source-hubplanner/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_hubplanner import SourceHubplanner
+from source_hubplanner.run import run
 
 if __name__ == "__main__":
-    source = SourceHubplanner()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-hubplanner/setup.py b/airbyte-integrations/connectors/source-hubplanner/setup.py
index 5a7474d7c1800..dd6d82f7fb645 100644
--- a/airbyte-integrations/connectors/source-hubplanner/setup.py
+++ b/airbyte-integrations/connectors/source-hubplanner/setup.py
@@ -17,13 +17,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-hubplanner=source_hubplanner.run:run",
+        ],
+    },
     name="source_hubplanner",
     description="Source implementation for Hubplanner.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-hubplanner/source_hubplanner/run.py b/airbyte-integrations/connectors/source-hubplanner/source_hubplanner/run.py
new file mode 100644
index 0000000000000..325f3b045b43d
--- /dev/null
+++ b/airbyte-integrations/connectors/source-hubplanner/source_hubplanner/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_hubplanner import SourceHubplanner
+
+
+def run():
+    source = SourceHubplanner()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-hubspot/main.py b/airbyte-integrations/connectors/source-hubspot/main.py
index 0f1cf13e4d10d..dc073ca21ed64 100644
--- a/airbyte-integrations/connectors/source-hubspot/main.py
+++ b/airbyte-integrations/connectors/source-hubspot/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_hubspot import SourceHubspot
+from source_hubspot.run import run
 
 if __name__ == "__main__":
-    source = SourceHubspot()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-hubspot/setup.py b/airbyte-integrations/connectors/source-hubspot/setup.py
index 0f0721b230ff4..a1831948c262e 100644
--- a/airbyte-integrations/connectors/source-hubspot/setup.py
+++ b/airbyte-integrations/connectors/source-hubspot/setup.py
@@ -17,6 +17,11 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-hubspot=source_hubspot.run:run",
+        ],
+    },
     name="source_hubspot",
     description="Source implementation for HubSpot.",
     author="Airbyte",
diff --git a/airbyte-integrations/connectors/source-hubspot/source_hubspot/run.py b/airbyte-integrations/connectors/source-hubspot/source_hubspot/run.py
new file mode 100644
index 0000000000000..26f4d0abef15e
--- /dev/null
+++ b/airbyte-integrations/connectors/source-hubspot/source_hubspot/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_hubspot import SourceHubspot
+
+
+def run():
+    source = SourceHubspot()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-insightly/main.py b/airbyte-integrations/connectors/source-insightly/main.py
index 5797ba54c9776..a486e61080cb9 100644
--- a/airbyte-integrations/connectors/source-insightly/main.py
+++ b/airbyte-integrations/connectors/source-insightly/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_insightly import SourceInsightly
+from source_insightly.run import run
 
 if __name__ == "__main__":
-    source = SourceInsightly()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-insightly/setup.py b/airbyte-integrations/connectors/source-insightly/setup.py
index a3c0700987912..40a7bc03b71c6 100644
--- a/airbyte-integrations/connectors/source-insightly/setup.py
+++ b/airbyte-integrations/connectors/source-insightly/setup.py
@@ -14,13 +14,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-insightly=source_insightly.run:run",
+        ],
+    },
     name="source_insightly",
     description="Source implementation for Insightly.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-insightly/source_insightly/run.py b/airbyte-integrations/connectors/source-insightly/source_insightly/run.py
new file mode 100644
index 0000000000000..d3b9124ae5510
--- /dev/null
+++ b/airbyte-integrations/connectors/source-insightly/source_insightly/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_insightly import SourceInsightly
+
+
+def run():
+    source = SourceInsightly()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-instatus/main.py b/airbyte-integrations/connectors/source-instatus/main.py
index dc0a480e8f7e4..0e0c5af556b5b 100644
--- a/airbyte-integrations/connectors/source-instatus/main.py
+++ b/airbyte-integrations/connectors/source-instatus/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_instatus import SourceInstatus
+from source_instatus.run import run
 
 if __name__ == "__main__":
-    source = SourceInstatus()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-instatus/setup.py b/airbyte-integrations/connectors/source-instatus/setup.py
index 0a0586841809b..8a914c480bb37 100644
--- a/airbyte-integrations/connectors/source-instatus/setup.py
+++ b/airbyte-integrations/connectors/source-instatus/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-instatus=source_instatus.run:run",
+        ],
+    },
     name="source_instatus",
     description="Source implementation for Instatus.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-instatus/source_instatus/run.py b/airbyte-integrations/connectors/source-instatus/source_instatus/run.py
new file mode 100644
index 0000000000000..ade50f0a9cddd
--- /dev/null
+++ b/airbyte-integrations/connectors/source-instatus/source_instatus/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_instatus import SourceInstatus
+
+
+def run():
+    source = SourceInstatus()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-intercom/main.py b/airbyte-integrations/connectors/source-intercom/main.py
index a1f0ae6911bf0..410860c90fd87 100644
--- a/airbyte-integrations/connectors/source-intercom/main.py
+++ b/airbyte-integrations/connectors/source-intercom/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_intercom import SourceIntercom
+from source_intercom.run import run
 
 if __name__ == "__main__":
-    source = SourceIntercom()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-intercom/setup.py b/airbyte-integrations/connectors/source-intercom/setup.py
index 0432b7d7f10a7..4aaa6c80c87fa 100644
--- a/airbyte-integrations/connectors/source-intercom/setup.py
+++ b/airbyte-integrations/connectors/source-intercom/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-intercom=source_intercom.run:run",
+        ],
+    },
     name="source_intercom",
     description="Source implementation for Intercom Yaml.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-intercom/source_intercom/run.py b/airbyte-integrations/connectors/source-intercom/source_intercom/run.py
new file mode 100644
index 0000000000000..434766998b6e1
--- /dev/null
+++ b/airbyte-integrations/connectors/source-intercom/source_intercom/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_intercom import SourceIntercom
+
+
+def run():
+    source = SourceIntercom()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-intruder/main.py b/airbyte-integrations/connectors/source-intruder/main.py
index 3bb638ef0b9b1..ec9ff51965a68 100644
--- a/airbyte-integrations/connectors/source-intruder/main.py
+++ b/airbyte-integrations/connectors/source-intruder/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_intruder import SourceIntruder
+from source_intruder.run import run
 
 if __name__ == "__main__":
-    source = SourceIntruder()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-intruder/setup.py b/airbyte-integrations/connectors/source-intruder/setup.py
index 67cb265463dbb..1860d710d5012 100644
--- a/airbyte-integrations/connectors/source-intruder/setup.py
+++ b/airbyte-integrations/connectors/source-intruder/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-intruder=source_intruder.run:run",
+        ],
+    },
     name="source_intruder",
     description="Source implementation for Intruder.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-intruder/source_intruder/run.py b/airbyte-integrations/connectors/source-intruder/source_intruder/run.py
new file mode 100644
index 0000000000000..fcdedf420bc89
--- /dev/null
+++ b/airbyte-integrations/connectors/source-intruder/source_intruder/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_intruder import SourceIntruder
+
+
+def run():
+    source = SourceIntruder()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-ip2whois/main.py b/airbyte-integrations/connectors/source-ip2whois/main.py
index 9ca61a68d1e16..746592c487053 100644
--- a/airbyte-integrations/connectors/source-ip2whois/main.py
+++ b/airbyte-integrations/connectors/source-ip2whois/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_ip2whois import SourceIp2whois
+from source_ip2whois.run import run
 
 if __name__ == "__main__":
-    source = SourceIp2whois()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-ip2whois/setup.py b/airbyte-integrations/connectors/source-ip2whois/setup.py
index 92303a3f0ea42..10c6ca83410b5 100644
--- a/airbyte-integrations/connectors/source-ip2whois/setup.py
+++ b/airbyte-integrations/connectors/source-ip2whois/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-ip2whois=source_ip2whois.run:run",
+        ],
+    },
     name="source_ip2whois",
     description="Source implementation for Ip2whois.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-ip2whois/source_ip2whois/run.py b/airbyte-integrations/connectors/source-ip2whois/source_ip2whois/run.py
new file mode 100644
index 0000000000000..7c3e0cda5573c
--- /dev/null
+++ b/airbyte-integrations/connectors/source-ip2whois/source_ip2whois/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_ip2whois import SourceIp2whois
+
+
+def run():
+    source = SourceIp2whois()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-jira/main.py b/airbyte-integrations/connectors/source-jira/main.py
index 9a560c777bf78..1885b3974defb 100644
--- a/airbyte-integrations/connectors/source-jira/main.py
+++ b/airbyte-integrations/connectors/source-jira/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_jira import SourceJira
+from source_jira.run import run
 
 if __name__ == "__main__":
-    source = SourceJira()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-jira/setup.py b/airbyte-integrations/connectors/source-jira/setup.py
index 800525b0a829a..ccce70beddfc9 100644
--- a/airbyte-integrations/connectors/source-jira/setup.py
+++ b/airbyte-integrations/connectors/source-jira/setup.py
@@ -15,6 +15,11 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-jira=source_jira.run:run",
+        ],
+    },
     name="source_jira",
     description="Source implementation for Jira.",
     author="Airbyte",
diff --git a/airbyte-integrations/connectors/source-jira/source_jira/run.py b/airbyte-integrations/connectors/source-jira/source_jira/run.py
new file mode 100644
index 0000000000000..c5702721e0b82
--- /dev/null
+++ b/airbyte-integrations/connectors/source-jira/source_jira/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_jira import SourceJira
+
+
+def run():
+    source = SourceJira()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-k6-cloud/main.py b/airbyte-integrations/connectors/source-k6-cloud/main.py
index 5b694eda96f21..61325917a5397 100644
--- a/airbyte-integrations/connectors/source-k6-cloud/main.py
+++ b/airbyte-integrations/connectors/source-k6-cloud/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_k6_cloud import SourceK6Cloud
+from source_k6_cloud.run import run
 
 if __name__ == "__main__":
-    source = SourceK6Cloud()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-k6-cloud/setup.py b/airbyte-integrations/connectors/source-k6-cloud/setup.py
index 05908924fd5b8..03ce14d72e5b6 100644
--- a/airbyte-integrations/connectors/source-k6-cloud/setup.py
+++ b/airbyte-integrations/connectors/source-k6-cloud/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-k6-cloud=source_k6_cloud.run:run",
+        ],
+    },
     name="source_k6_cloud",
     description="Source implementation for K6 Cloud.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-k6-cloud/source_k6_cloud/run.py b/airbyte-integrations/connectors/source-k6-cloud/source_k6_cloud/run.py
new file mode 100644
index 0000000000000..c5103e21aa212
--- /dev/null
+++ b/airbyte-integrations/connectors/source-k6-cloud/source_k6_cloud/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_k6_cloud import SourceK6Cloud
+
+
+def run():
+    source = SourceK6Cloud()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-klarna/main.py b/airbyte-integrations/connectors/source-klarna/main.py
index 4abe77680d8b0..566bf5c666d65 100644
--- a/airbyte-integrations/connectors/source-klarna/main.py
+++ b/airbyte-integrations/connectors/source-klarna/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_klarna import SourceKlarna
+from source_klarna.run import run
 
 if __name__ == "__main__":
-    source = SourceKlarna()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-klarna/setup.py b/airbyte-integrations/connectors/source-klarna/setup.py
index a4742e88dd567..58609f375fe36 100644
--- a/airbyte-integrations/connectors/source-klarna/setup.py
+++ b/airbyte-integrations/connectors/source-klarna/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-klarna=source_klarna.run:run",
+        ],
+    },
     name="source_klarna",
     description="Source implementation for Klarna.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-klarna/source_klarna/run.py b/airbyte-integrations/connectors/source-klarna/source_klarna/run.py
new file mode 100644
index 0000000000000..8ae916c3c4e7c
--- /dev/null
+++ b/airbyte-integrations/connectors/source-klarna/source_klarna/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_klarna import SourceKlarna
+
+
+def run():
+    source = SourceKlarna()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-klaus-api/main.py b/airbyte-integrations/connectors/source-klaus-api/main.py
index 9be6460ab485d..7896d99aec94b 100644
--- a/airbyte-integrations/connectors/source-klaus-api/main.py
+++ b/airbyte-integrations/connectors/source-klaus-api/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_klaus_api import SourceKlausApi
+from source_klaus_api.run import run
 
 if __name__ == "__main__":
-    source = SourceKlausApi()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-klaus-api/setup.py b/airbyte-integrations/connectors/source-klaus-api/setup.py
index b4444f99dd06d..815b951298482 100644
--- a/airbyte-integrations/connectors/source-klaus-api/setup.py
+++ b/airbyte-integrations/connectors/source-klaus-api/setup.py
@@ -15,13 +15,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-klaus-api=source_klaus_api.run:run",
+        ],
+    },
     name="source_klaus_api",
     description="Source implementation for Klaus Api.",
     author="Deke Li",
     author_email="deke.li@sendinblue.com",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-klaus-api/source_klaus_api/run.py b/airbyte-integrations/connectors/source-klaus-api/source_klaus_api/run.py
new file mode 100644
index 0000000000000..c000d38646462
--- /dev/null
+++ b/airbyte-integrations/connectors/source-klaus-api/source_klaus_api/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_klaus_api import SourceKlausApi
+
+
+def run():
+    source = SourceKlausApi()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-klaviyo/main.py b/airbyte-integrations/connectors/source-klaviyo/main.py
index 6285473bf2cdd..5b8c871c3d7d1 100644
--- a/airbyte-integrations/connectors/source-klaviyo/main.py
+++ b/airbyte-integrations/connectors/source-klaviyo/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_klaviyo import SourceKlaviyo
+from source_klaviyo.run import run
 
 if __name__ == "__main__":
-    source = SourceKlaviyo()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-klaviyo/setup.py b/airbyte-integrations/connectors/source-klaviyo/setup.py
index 32a31edb08487..d9ac3a2fb8070 100644
--- a/airbyte-integrations/connectors/source-klaviyo/setup.py
+++ b/airbyte-integrations/connectors/source-klaviyo/setup.py
@@ -10,6 +10,11 @@
 TEST_REQUIREMENTS = ["requests-mock~=1.9.3", "pytest~=6.1", "pytest-mock", "requests_mock~=1.8"]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-klaviyo=source_klaviyo.run:run",
+        ],
+    },
     name="source_klaviyo",
     description="Source implementation for Klaviyo.",
     author="Airbyte",
diff --git a/airbyte-integrations/connectors/source-klaviyo/source_klaviyo/run.py b/airbyte-integrations/connectors/source-klaviyo/source_klaviyo/run.py
new file mode 100644
index 0000000000000..afcae2272e291
--- /dev/null
+++ b/airbyte-integrations/connectors/source-klaviyo/source_klaviyo/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_klaviyo import SourceKlaviyo
+
+
+def run():
+    source = SourceKlaviyo()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-kustomer-singer/main.py b/airbyte-integrations/connectors/source-kustomer-singer/main.py
index 77ee51ee831cb..00920dc58a367 100644
--- a/airbyte-integrations/connectors/source-kustomer-singer/main.py
+++ b/airbyte-integrations/connectors/source-kustomer-singer/main.py
@@ -2,11 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_kustomer_singer import SourceKustomerSinger
+from source_kustomer_singer.run import run
 
 if __name__ == "__main__":
-    source = SourceKustomerSinger()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-kustomer-singer/setup.py b/airbyte-integrations/connectors/source-kustomer-singer/setup.py
index 5e14ee6e2e1d1..dbaf47851ce79 100644
--- a/airbyte-integrations/connectors/source-kustomer-singer/setup.py
+++ b/airbyte-integrations/connectors/source-kustomer-singer/setup.py
@@ -53,6 +53,11 @@ def run(self):
 TEST_REQUIREMENTS = ["requests-mock~=1.9.3", "pytest-mock~=3.6.1", "pytest~=6.1"]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-kustomer-singer=source_kustomer_singer.run:run",
+        ],
+    },
     name="source_kustomer_singer",
     description="Source implementation for Kustomer, built on the Singer tap implementation.",
     author="Airbyte",
diff --git a/airbyte-integrations/connectors/source-kustomer-singer/source_kustomer_singer/run.py b/airbyte-integrations/connectors/source-kustomer-singer/source_kustomer_singer/run.py
new file mode 100644
index 0000000000000..fba603c749e8a
--- /dev/null
+++ b/airbyte-integrations/connectors/source-kustomer-singer/source_kustomer_singer/run.py
@@ -0,0 +1,13 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_kustomer_singer import SourceKustomerSinger
+
+
+def run():
+    source = SourceKustomerSinger()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-kyriba/main.py b/airbyte-integrations/connectors/source-kyriba/main.py
index 771b738d1b1bd..cd0b8f1f2f3e7 100644
--- a/airbyte-integrations/connectors/source-kyriba/main.py
+++ b/airbyte-integrations/connectors/source-kyriba/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_kyriba import SourceKyriba
+from source_kyriba.run import run
 
 if __name__ == "__main__":
-    source = SourceKyriba()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-kyriba/setup.py b/airbyte-integrations/connectors/source-kyriba/setup.py
index c81f4d4e1e0d3..00c6c13f5657c 100644
--- a/airbyte-integrations/connectors/source-kyriba/setup.py
+++ b/airbyte-integrations/connectors/source-kyriba/setup.py
@@ -16,6 +16,11 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-kyriba=source_kyriba.run:run",
+        ],
+    },
     name="source_kyriba",
     description="Source implementation for Kyriba.",
     author="Airbyte",
diff --git a/airbyte-integrations/connectors/source-kyriba/source_kyriba/run.py b/airbyte-integrations/connectors/source-kyriba/source_kyriba/run.py
new file mode 100644
index 0000000000000..e12facaaab47c
--- /dev/null
+++ b/airbyte-integrations/connectors/source-kyriba/source_kyriba/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_kyriba import SourceKyriba
+
+
+def run():
+    source = SourceKyriba()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-kyve/main.py b/airbyte-integrations/connectors/source-kyve/main.py
index f4055d71e80e9..a3740b34d958b 100644
--- a/airbyte-integrations/connectors/source-kyve/main.py
+++ b/airbyte-integrations/connectors/source-kyve/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_kyve import SourceKyve
+from source_kyve.run import run
 
 if __name__ == "__main__":
-    source = SourceKyve()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-kyve/setup.py b/airbyte-integrations/connectors/source-kyve/setup.py
index 1d6d5bbde662b..128e97f87d250 100644
--- a/airbyte-integrations/connectors/source-kyve/setup.py
+++ b/airbyte-integrations/connectors/source-kyve/setup.py
@@ -16,6 +16,11 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-kyve=source_kyve.run:run",
+        ],
+    },
     name="source_kyve",
     description="Source implementation for KYVE.",
     author="KYVE Core Team",
diff --git a/airbyte-integrations/connectors/source-kyve/source_kyve/run.py b/airbyte-integrations/connectors/source-kyve/source_kyve/run.py
new file mode 100644
index 0000000000000..fc9753ebf2bb8
--- /dev/null
+++ b/airbyte-integrations/connectors/source-kyve/source_kyve/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_kyve import SourceKyve
+
+
+def run():
+    source = SourceKyve()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-launchdarkly/main.py b/airbyte-integrations/connectors/source-launchdarkly/main.py
index beb7cab5ae2ff..997cfda7e4412 100644
--- a/airbyte-integrations/connectors/source-launchdarkly/main.py
+++ b/airbyte-integrations/connectors/source-launchdarkly/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_launchdarkly import SourceLaunchdarkly
+from source_launchdarkly.run import run
 
 if __name__ == "__main__":
-    source = SourceLaunchdarkly()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-launchdarkly/setup.py b/airbyte-integrations/connectors/source-launchdarkly/setup.py
index 07d48e22e847b..722dfc7a07684 100644
--- a/airbyte-integrations/connectors/source-launchdarkly/setup.py
+++ b/airbyte-integrations/connectors/source-launchdarkly/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-launchdarkly=source_launchdarkly.run:run",
+        ],
+    },
     name="source_launchdarkly",
     description="Source implementation for Launchdarkly.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-launchdarkly/source_launchdarkly/run.py b/airbyte-integrations/connectors/source-launchdarkly/source_launchdarkly/run.py
new file mode 100644
index 0000000000000..9807f36d4a6eb
--- /dev/null
+++ b/airbyte-integrations/connectors/source-launchdarkly/source_launchdarkly/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_launchdarkly import SourceLaunchdarkly
+
+
+def run():
+    source = SourceLaunchdarkly()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-lemlist/main.py b/airbyte-integrations/connectors/source-lemlist/main.py
index 3d71a2f889d8f..5d7573f451625 100644
--- a/airbyte-integrations/connectors/source-lemlist/main.py
+++ b/airbyte-integrations/connectors/source-lemlist/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_lemlist import SourceLemlist
+from source_lemlist.run import run
 
 if __name__ == "__main__":
-    source = SourceLemlist()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-lemlist/setup.py b/airbyte-integrations/connectors/source-lemlist/setup.py
index b202001b47e2d..53550286882a4 100644
--- a/airbyte-integrations/connectors/source-lemlist/setup.py
+++ b/airbyte-integrations/connectors/source-lemlist/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-lemlist=source_lemlist.run:run",
+        ],
+    },
     name="source_lemlist",
     description="Source implementation for Lemlist.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-lemlist/source_lemlist/run.py b/airbyte-integrations/connectors/source-lemlist/source_lemlist/run.py
new file mode 100644
index 0000000000000..092c7e718f2b4
--- /dev/null
+++ b/airbyte-integrations/connectors/source-lemlist/source_lemlist/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_lemlist import SourceLemlist
+
+
+def run():
+    source = SourceLemlist()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-lever-hiring/main.py b/airbyte-integrations/connectors/source-lever-hiring/main.py
index b79de94f75eef..ca4773e96a030 100644
--- a/airbyte-integrations/connectors/source-lever-hiring/main.py
+++ b/airbyte-integrations/connectors/source-lever-hiring/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_lever_hiring import SourceLeverHiring
+from source_lever_hiring.run import run
 
 if __name__ == "__main__":
-    source = SourceLeverHiring()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-lever-hiring/setup.py b/airbyte-integrations/connectors/source-lever-hiring/setup.py
index 3ceb890c8e93d..0004a96f9d059 100644
--- a/airbyte-integrations/connectors/source-lever-hiring/setup.py
+++ b/airbyte-integrations/connectors/source-lever-hiring/setup.py
@@ -17,6 +17,11 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-lever-hiring=source_lever_hiring.run:run",
+        ],
+    },
     name="source_lever_hiring",
     description="Source implementation for Lever Hiring.",
     author="Airbyte",
diff --git a/airbyte-integrations/connectors/source-lever-hiring/source_lever_hiring/run.py b/airbyte-integrations/connectors/source-lever-hiring/source_lever_hiring/run.py
new file mode 100644
index 0000000000000..cd8dc4e7bfc37
--- /dev/null
+++ b/airbyte-integrations/connectors/source-lever-hiring/source_lever_hiring/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_lever_hiring import SourceLeverHiring
+
+
+def run():
+    source = SourceLeverHiring()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-linkedin-pages/main.py b/airbyte-integrations/connectors/source-linkedin-pages/main.py
index 74ee9b7342f2d..a6068720a6a8d 100644
--- a/airbyte-integrations/connectors/source-linkedin-pages/main.py
+++ b/airbyte-integrations/connectors/source-linkedin-pages/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_linkedin_pages import SourceLinkedinPages
+from source_linkedin_pages.run import run
 
 if __name__ == "__main__":
-    source = SourceLinkedinPages()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-linkedin-pages/setup.py b/airbyte-integrations/connectors/source-linkedin-pages/setup.py
index f690842da7954..6f3d0697a13d7 100644
--- a/airbyte-integrations/connectors/source-linkedin-pages/setup.py
+++ b/airbyte-integrations/connectors/source-linkedin-pages/setup.py
@@ -17,6 +17,11 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-linkedin-pages=source_linkedin_pages.run:run",
+        ],
+    },
     name="source_linkedin_pages",
     description="Source implementation for Linkedin Company Pages.",
     author="Airbyte",
diff --git a/airbyte-integrations/connectors/source-linkedin-pages/source_linkedin_pages/run.py b/airbyte-integrations/connectors/source-linkedin-pages/source_linkedin_pages/run.py
new file mode 100644
index 0000000000000..4f0787573f2e0
--- /dev/null
+++ b/airbyte-integrations/connectors/source-linkedin-pages/source_linkedin_pages/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_linkedin_pages import SourceLinkedinPages
+
+
+def run():
+    source = SourceLinkedinPages()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-linnworks/main.py b/airbyte-integrations/connectors/source-linnworks/main.py
index 7d0337b4c1b1f..ee964c061ce04 100644
--- a/airbyte-integrations/connectors/source-linnworks/main.py
+++ b/airbyte-integrations/connectors/source-linnworks/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_linnworks import SourceLinnworks
+from source_linnworks.run import run
 
 if __name__ == "__main__":
-    source = SourceLinnworks()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-linnworks/setup.py b/airbyte-integrations/connectors/source-linnworks/setup.py
index f0a4871915675..1256710cb3ff0 100644
--- a/airbyte-integrations/connectors/source-linnworks/setup.py
+++ b/airbyte-integrations/connectors/source-linnworks/setup.py
@@ -16,6 +16,11 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-linnworks=source_linnworks.run:run",
+        ],
+    },
     name="source_linnworks",
     description="Source implementation for Linnworks.",
     author="Labanoras Tech",
diff --git a/airbyte-integrations/connectors/source-linnworks/source_linnworks/run.py b/airbyte-integrations/connectors/source-linnworks/source_linnworks/run.py
new file mode 100644
index 0000000000000..d08e84e3ae6ca
--- /dev/null
+++ b/airbyte-integrations/connectors/source-linnworks/source_linnworks/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_linnworks import SourceLinnworks
+
+
+def run():
+    source = SourceLinnworks()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-lokalise/main.py b/airbyte-integrations/connectors/source-lokalise/main.py
index 4d4423bbe36af..d02dfd231989d 100644
--- a/airbyte-integrations/connectors/source-lokalise/main.py
+++ b/airbyte-integrations/connectors/source-lokalise/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_lokalise import SourceLokalise
+from source_lokalise.run import run
 
 if __name__ == "__main__":
-    source = SourceLokalise()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-lokalise/setup.py b/airbyte-integrations/connectors/source-lokalise/setup.py
index 69d13c0b79f09..b2a8b5b467ec5 100644
--- a/airbyte-integrations/connectors/source-lokalise/setup.py
+++ b/airbyte-integrations/connectors/source-lokalise/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-lokalise=source_lokalise.run:run",
+        ],
+    },
     name="source_lokalise",
     description="Source implementation for Lokalise.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-lokalise/source_lokalise/run.py b/airbyte-integrations/connectors/source-lokalise/source_lokalise/run.py
new file mode 100644
index 0000000000000..21002eb93feeb
--- /dev/null
+++ b/airbyte-integrations/connectors/source-lokalise/source_lokalise/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_lokalise import SourceLokalise
+
+
+def run():
+    source = SourceLokalise()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-looker/main.py b/airbyte-integrations/connectors/source-looker/main.py
index dee0fd4beb4e1..b6164cb0322bf 100644
--- a/airbyte-integrations/connectors/source-looker/main.py
+++ b/airbyte-integrations/connectors/source-looker/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_looker import SourceLooker
+from source_looker.run import run
 
 if __name__ == "__main__":
-    source = SourceLooker()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-looker/setup.py b/airbyte-integrations/connectors/source-looker/setup.py
index f38fc2a1095ed..dc5e3295ad405 100644
--- a/airbyte-integrations/connectors/source-looker/setup.py
+++ b/airbyte-integrations/connectors/source-looker/setup.py
@@ -20,6 +20,11 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-looker=source_looker.run:run",
+        ],
+    },
     name="source_looker",
     description="Source implementation for Looker.",
     author="Airbyte",
diff --git a/airbyte-integrations/connectors/source-looker/source_looker/run.py b/airbyte-integrations/connectors/source-looker/source_looker/run.py
new file mode 100644
index 0000000000000..53aaad83ea7fd
--- /dev/null
+++ b/airbyte-integrations/connectors/source-looker/source_looker/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_looker import SourceLooker
+
+
+def run():
+    source = SourceLooker()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-mailerlite/main.py b/airbyte-integrations/connectors/source-mailerlite/main.py
index 9c906a15e0124..1f2347a95e634 100644
--- a/airbyte-integrations/connectors/source-mailerlite/main.py
+++ b/airbyte-integrations/connectors/source-mailerlite/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_mailerlite import SourceMailerlite
+from source_mailerlite.run import run
 
 if __name__ == "__main__":
-    source = SourceMailerlite()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-mailerlite/setup.py b/airbyte-integrations/connectors/source-mailerlite/setup.py
index 5b49cb1a5d31b..71fc89f1f56a8 100644
--- a/airbyte-integrations/connectors/source-mailerlite/setup.py
+++ b/airbyte-integrations/connectors/source-mailerlite/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-mailerlite=source_mailerlite.run:run",
+        ],
+    },
     name="source_mailerlite",
     description="Source implementation for Mailerlite.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-mailerlite/source_mailerlite/run.py b/airbyte-integrations/connectors/source-mailerlite/source_mailerlite/run.py
new file mode 100644
index 0000000000000..c1c7548459e55
--- /dev/null
+++ b/airbyte-integrations/connectors/source-mailerlite/source_mailerlite/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_mailerlite import SourceMailerlite
+
+
+def run():
+    source = SourceMailerlite()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-mailersend/main.py b/airbyte-integrations/connectors/source-mailersend/main.py
index 8b72a409be460..9afae9104c154 100644
--- a/airbyte-integrations/connectors/source-mailersend/main.py
+++ b/airbyte-integrations/connectors/source-mailersend/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_mailersend import SourceMailersend
+from source_mailersend.run import run
 
 if __name__ == "__main__":
-    source = SourceMailersend()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-mailersend/setup.py b/airbyte-integrations/connectors/source-mailersend/setup.py
index 8fc9c7d2bdbcc..33d180e17b8f0 100644
--- a/airbyte-integrations/connectors/source-mailersend/setup.py
+++ b/airbyte-integrations/connectors/source-mailersend/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-mailersend=source_mailersend.run:run",
+        ],
+    },
     name="source_mailersend",
     description="Source implementation for Mailersend.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-mailersend/source_mailersend/run.py b/airbyte-integrations/connectors/source-mailersend/source_mailersend/run.py
new file mode 100644
index 0000000000000..ddc9feff24b47
--- /dev/null
+++ b/airbyte-integrations/connectors/source-mailersend/source_mailersend/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_mailersend import SourceMailersend
+
+
+def run():
+    source = SourceMailersend()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-mailgun/main.py b/airbyte-integrations/connectors/source-mailgun/main.py
index bffb131e2745a..ee1ad2379837b 100644
--- a/airbyte-integrations/connectors/source-mailgun/main.py
+++ b/airbyte-integrations/connectors/source-mailgun/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_mailgun import SourceMailgun
+from source_mailgun.run import run
 
 if __name__ == "__main__":
-    source = SourceMailgun()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-mailgun/setup.py b/airbyte-integrations/connectors/source-mailgun/setup.py
index f7661245f2fd0..616448f500d5c 100644
--- a/airbyte-integrations/connectors/source-mailgun/setup.py
+++ b/airbyte-integrations/connectors/source-mailgun/setup.py
@@ -15,13 +15,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-mailgun=source_mailgun.run:run",
+        ],
+    },
     name="source_mailgun",
     description="Source implementation for Mailgun.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-mailgun/source_mailgun/run.py b/airbyte-integrations/connectors/source-mailgun/source_mailgun/run.py
new file mode 100644
index 0000000000000..6cda7fec6e718
--- /dev/null
+++ b/airbyte-integrations/connectors/source-mailgun/source_mailgun/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_mailgun import SourceMailgun
+
+
+def run():
+    source = SourceMailgun()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-mailjet-mail/main.py b/airbyte-integrations/connectors/source-mailjet-mail/main.py
index 46dc79c4b5f74..5d8c4b9df24e7 100644
--- a/airbyte-integrations/connectors/source-mailjet-mail/main.py
+++ b/airbyte-integrations/connectors/source-mailjet-mail/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_mailjet_mail import SourceMailjetMail
+from source_mailjet_mail.run import run
 
 if __name__ == "__main__":
-    source = SourceMailjetMail()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-mailjet-mail/setup.py b/airbyte-integrations/connectors/source-mailjet-mail/setup.py
index 5f6daf3cdc2b1..ea60824d3a2c8 100644
--- a/airbyte-integrations/connectors/source-mailjet-mail/setup.py
+++ b/airbyte-integrations/connectors/source-mailjet-mail/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-mailjet-mail=source_mailjet_mail.run:run",
+        ],
+    },
     name="source_mailjet_mail",
     description="Source implementation for Mailjet Mail.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-mailjet-mail/source_mailjet_mail/run.py b/airbyte-integrations/connectors/source-mailjet-mail/source_mailjet_mail/run.py
new file mode 100644
index 0000000000000..87dcd7ecc1985
--- /dev/null
+++ b/airbyte-integrations/connectors/source-mailjet-mail/source_mailjet_mail/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_mailjet_mail import SourceMailjetMail
+
+
+def run():
+    source = SourceMailjetMail()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-mailjet-sms/main.py b/airbyte-integrations/connectors/source-mailjet-sms/main.py
index 7dfd0868672e8..52420c275761d 100644
--- a/airbyte-integrations/connectors/source-mailjet-sms/main.py
+++ b/airbyte-integrations/connectors/source-mailjet-sms/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_mailjet_sms import SourceMailjetSms
+from source_mailjet_sms.run import run
 
 if __name__ == "__main__":
-    source = SourceMailjetSms()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-mailjet-sms/setup.py b/airbyte-integrations/connectors/source-mailjet-sms/setup.py
index 7edfd5e35e8e5..6b4be21374cc2 100644
--- a/airbyte-integrations/connectors/source-mailjet-sms/setup.py
+++ b/airbyte-integrations/connectors/source-mailjet-sms/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-mailjet-sms=source_mailjet_sms.run:run",
+        ],
+    },
     name="source_mailjet_sms",
     description="Source implementation for Mailjet Sms.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-mailjet-sms/source_mailjet_sms/run.py b/airbyte-integrations/connectors/source-mailjet-sms/source_mailjet_sms/run.py
new file mode 100644
index 0000000000000..a8568fdb2f688
--- /dev/null
+++ b/airbyte-integrations/connectors/source-mailjet-sms/source_mailjet_sms/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_mailjet_sms import SourceMailjetSms
+
+
+def run():
+    source = SourceMailjetSms()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-merge/main.py b/airbyte-integrations/connectors/source-merge/main.py
index 53420fa4b3c14..694c83302b0b5 100644
--- a/airbyte-integrations/connectors/source-merge/main.py
+++ b/airbyte-integrations/connectors/source-merge/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_merge import SourceMerge
+from source_merge.run import run
 
 if __name__ == "__main__":
-    source = SourceMerge()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-merge/setup.py b/airbyte-integrations/connectors/source-merge/setup.py
index aa45d3bdc5e2c..b403aa227f4c0 100644
--- a/airbyte-integrations/connectors/source-merge/setup.py
+++ b/airbyte-integrations/connectors/source-merge/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-merge=source_merge.run:run",
+        ],
+    },
     name="source_merge",
     description="Source implementation for Merge.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-merge/source_merge/run.py b/airbyte-integrations/connectors/source-merge/source_merge/run.py
new file mode 100644
index 0000000000000..63187bee47539
--- /dev/null
+++ b/airbyte-integrations/connectors/source-merge/source_merge/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_merge import SourceMerge
+
+
+def run():
+    source = SourceMerge()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-metabase/main.py b/airbyte-integrations/connectors/source-metabase/main.py
index aeaaab1115421..1e571d2ddb48d 100644
--- a/airbyte-integrations/connectors/source-metabase/main.py
+++ b/airbyte-integrations/connectors/source-metabase/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_metabase import SourceMetabase
+from source_metabase.run import run
 
 if __name__ == "__main__":
-    source = SourceMetabase()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-metabase/setup.py b/airbyte-integrations/connectors/source-metabase/setup.py
index 228d443e50e2a..e6772737da24e 100644
--- a/airbyte-integrations/connectors/source-metabase/setup.py
+++ b/airbyte-integrations/connectors/source-metabase/setup.py
@@ -15,13 +15,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-metabase=source_metabase.run:run",
+        ],
+    },
     name="source_metabase",
     description="Source implementation for Metabase.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-metabase/source_metabase/run.py b/airbyte-integrations/connectors/source-metabase/source_metabase/run.py
new file mode 100644
index 0000000000000..90df278478afa
--- /dev/null
+++ b/airbyte-integrations/connectors/source-metabase/source_metabase/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_metabase import SourceMetabase
+
+
+def run():
+    source = SourceMetabase()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-microsoft-dataverse/main.py b/airbyte-integrations/connectors/source-microsoft-dataverse/main.py
index 7cf530c14f54a..88b4cf3808e82 100644
--- a/airbyte-integrations/connectors/source-microsoft-dataverse/main.py
+++ b/airbyte-integrations/connectors/source-microsoft-dataverse/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_microsoft_dataverse import SourceMicrosoftDataverse
+from source_microsoft_dataverse.run import run
 
 if __name__ == "__main__":
-    source = SourceMicrosoftDataverse()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-microsoft-dataverse/setup.py b/airbyte-integrations/connectors/source-microsoft-dataverse/setup.py
index e86306c301388..57920ae5cd4a6 100644
--- a/airbyte-integrations/connectors/source-microsoft-dataverse/setup.py
+++ b/airbyte-integrations/connectors/source-microsoft-dataverse/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-microsoft-dataverse=source_microsoft_dataverse.run:run",
+        ],
+    },
     name="source_microsoft_dataverse",
     description="Source implementation for Microsoft Dataverse.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-microsoft-dataverse/source_microsoft_dataverse/run.py b/airbyte-integrations/connectors/source-microsoft-dataverse/source_microsoft_dataverse/run.py
new file mode 100644
index 0000000000000..b5e6982f72920
--- /dev/null
+++ b/airbyte-integrations/connectors/source-microsoft-dataverse/source_microsoft_dataverse/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_microsoft_dataverse import SourceMicrosoftDataverse
+
+
+def run():
+    source = SourceMicrosoftDataverse()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-microsoft-onedrive/main.py b/airbyte-integrations/connectors/source-microsoft-onedrive/main.py
index 205effefe600e..c9280337d108a 100644
--- a/airbyte-integrations/connectors/source-microsoft-onedrive/main.py
+++ b/airbyte-integrations/connectors/source-microsoft-onedrive/main.py
@@ -2,15 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk import AirbyteEntrypoint
-from airbyte_cdk.entrypoint import launch
-from source_microsoft_onedrive import SourceMicrosoftOneDrive
+from source_microsoft_onedrive.run import run
 
 if __name__ == "__main__":
-    args = sys.argv[1:]
-    catalog_path = AirbyteEntrypoint.extract_catalog(args)
-    source = SourceMicrosoftOneDrive(catalog_path)
-    launch(source, args)
+    run()
diff --git a/airbyte-integrations/connectors/source-microsoft-onedrive/setup.py b/airbyte-integrations/connectors/source-microsoft-onedrive/setup.py
index c8ed1601ac4eb..8709208c5be2e 100644
--- a/airbyte-integrations/connectors/source-microsoft-onedrive/setup.py
+++ b/airbyte-integrations/connectors/source-microsoft-onedrive/setup.py
@@ -19,13 +19,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-microsoft-onedrive=source_microsoft_onedrive.run:run",
+        ],
+    },
     name="source_microsoft_onedrive",
     description="Source implementation for Microsoft OneDrive.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-microsoft-onedrive/source_microsoft_onedrive/run.py b/airbyte-integrations/connectors/source-microsoft-onedrive/source_microsoft_onedrive/run.py
new file mode 100644
index 0000000000000..2141089780b9a
--- /dev/null
+++ b/airbyte-integrations/connectors/source-microsoft-onedrive/source_microsoft_onedrive/run.py
@@ -0,0 +1,17 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk import AirbyteEntrypoint
+from airbyte_cdk.entrypoint import launch
+from source_microsoft_onedrive import SourceMicrosoftOneDrive
+
+
+def run():
+    args = sys.argv[1:]
+    catalog_path = AirbyteEntrypoint.extract_catalog(args)
+    source = SourceMicrosoftOneDrive(catalog_path)
+    launch(source, args)
diff --git a/airbyte-integrations/connectors/source-microsoft-teams/main.py b/airbyte-integrations/connectors/source-microsoft-teams/main.py
index c8bc03c5deeaf..213b13e85ee54 100644
--- a/airbyte-integrations/connectors/source-microsoft-teams/main.py
+++ b/airbyte-integrations/connectors/source-microsoft-teams/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_microsoft_teams import SourceMicrosoftTeams
+from source_microsoft_teams.run import run
 
 if __name__ == "__main__":
-    source = SourceMicrosoftTeams()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-microsoft-teams/setup.py b/airbyte-integrations/connectors/source-microsoft-teams/setup.py
index 6cc04d3f3b073..f840cc27859ae 100644
--- a/airbyte-integrations/connectors/source-microsoft-teams/setup.py
+++ b/airbyte-integrations/connectors/source-microsoft-teams/setup.py
@@ -19,6 +19,11 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-microsoft-teams=source_microsoft_teams.run:run",
+        ],
+    },
     name="source_microsoft_teams",
     description="Source implementation for Microsoft Teams.",
     author="Airbyte",
diff --git a/airbyte-integrations/connectors/source-microsoft-teams/source_microsoft_teams/run.py b/airbyte-integrations/connectors/source-microsoft-teams/source_microsoft_teams/run.py
new file mode 100644
index 0000000000000..f22e12386ac78
--- /dev/null
+++ b/airbyte-integrations/connectors/source-microsoft-teams/source_microsoft_teams/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_microsoft_teams import SourceMicrosoftTeams
+
+
+def run():
+    source = SourceMicrosoftTeams()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-monday/main.py b/airbyte-integrations/connectors/source-monday/main.py
index 6fec8ed55e58e..14f4fa2d04399 100644
--- a/airbyte-integrations/connectors/source-monday/main.py
+++ b/airbyte-integrations/connectors/source-monday/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_monday import SourceMonday
+from source_monday.run import run
 
 if __name__ == "__main__":
-    source = SourceMonday()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-monday/setup.py b/airbyte-integrations/connectors/source-monday/setup.py
index 4af4bd4dac1c2..c99ddb8f0ed0a 100644
--- a/airbyte-integrations/connectors/source-monday/setup.py
+++ b/airbyte-integrations/connectors/source-monday/setup.py
@@ -16,6 +16,11 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-monday=source_monday.run:run",
+        ],
+    },
     name="source_monday",
     description="Source implementation for Monday.",
     author="Airbyte",
diff --git a/airbyte-integrations/connectors/source-monday/source_monday/run.py b/airbyte-integrations/connectors/source-monday/source_monday/run.py
new file mode 100644
index 0000000000000..9ef2d048d213d
--- /dev/null
+++ b/airbyte-integrations/connectors/source-monday/source_monday/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_monday import SourceMonday
+
+
+def run():
+    source = SourceMonday()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-my-hours/main.py b/airbyte-integrations/connectors/source-my-hours/main.py
index 050526fca1667..d4e838cb48102 100644
--- a/airbyte-integrations/connectors/source-my-hours/main.py
+++ b/airbyte-integrations/connectors/source-my-hours/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_my_hours import SourceMyHours
+from source_my_hours.run import run
 
 if __name__ == "__main__":
-    source = SourceMyHours()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-my-hours/setup.py b/airbyte-integrations/connectors/source-my-hours/setup.py
index eb4d9a7c9734b..4e8a87ce39eda 100644
--- a/airbyte-integrations/connectors/source-my-hours/setup.py
+++ b/airbyte-integrations/connectors/source-my-hours/setup.py
@@ -17,6 +17,11 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-my-hours=source_my_hours.run:run",
+        ],
+    },
     name="source_my_hours",
     description="Source implementation for My Hours.",
     author="Wisse Jelgersma",
diff --git a/airbyte-integrations/connectors/source-my-hours/source_my_hours/run.py b/airbyte-integrations/connectors/source-my-hours/source_my_hours/run.py
new file mode 100644
index 0000000000000..adad265e0bac6
--- /dev/null
+++ b/airbyte-integrations/connectors/source-my-hours/source_my_hours/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_my_hours import SourceMyHours
+
+
+def run():
+    source = SourceMyHours()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-n8n/main.py b/airbyte-integrations/connectors/source-n8n/main.py
index 0762610cb5f1b..b40f7c3487525 100644
--- a/airbyte-integrations/connectors/source-n8n/main.py
+++ b/airbyte-integrations/connectors/source-n8n/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_n8n import SourceN8n
+from source_n8n.run import run
 
 if __name__ == "__main__":
-    source = SourceN8n()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-n8n/setup.py b/airbyte-integrations/connectors/source-n8n/setup.py
index 82cdff7f8589f..3592a5b8939f8 100644
--- a/airbyte-integrations/connectors/source-n8n/setup.py
+++ b/airbyte-integrations/connectors/source-n8n/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-n8n=source_n8n.run:run",
+        ],
+    },
     name="source_n8n",
     description="Source implementation for N8n.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-n8n/source_n8n/run.py b/airbyte-integrations/connectors/source-n8n/source_n8n/run.py
new file mode 100644
index 0000000000000..04f48f6c06969
--- /dev/null
+++ b/airbyte-integrations/connectors/source-n8n/source_n8n/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_n8n import SourceN8n
+
+
+def run():
+    source = SourceN8n()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-nasa/main.py b/airbyte-integrations/connectors/source-nasa/main.py
index c1627273e2278..5887db8608883 100644
--- a/airbyte-integrations/connectors/source-nasa/main.py
+++ b/airbyte-integrations/connectors/source-nasa/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_nasa import SourceNasa
+from source_nasa.run import run
 
 if __name__ == "__main__":
-    source = SourceNasa()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-nasa/setup.py b/airbyte-integrations/connectors/source-nasa/setup.py
index ecd81e7b2fd45..849b81fce45d2 100644
--- a/airbyte-integrations/connectors/source-nasa/setup.py
+++ b/airbyte-integrations/connectors/source-nasa/setup.py
@@ -10,13 +10,30 @@
 TEST_REQUIREMENTS = ["requests-mock~=1.9.3", "pytest~=6.2", "pytest-mock~=3.6.1"]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-nasa=source_nasa.run:run",
+        ],
+    },
     name="source_nasa",
     description="Source implementation for Nasa.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-nasa/source_nasa/run.py b/airbyte-integrations/connectors/source-nasa/source_nasa/run.py
new file mode 100644
index 0000000000000..6b14f02804271
--- /dev/null
+++ b/airbyte-integrations/connectors/source-nasa/source_nasa/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_nasa import SourceNasa
+
+
+def run():
+    source = SourceNasa()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-netsuite/main.py b/airbyte-integrations/connectors/source-netsuite/main.py
index 7b88a055cfe23..492266da15e29 100644
--- a/airbyte-integrations/connectors/source-netsuite/main.py
+++ b/airbyte-integrations/connectors/source-netsuite/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_netsuite import SourceNetsuite
+from source_netsuite.run import run
 
 if __name__ == "__main__":
-    source = SourceNetsuite()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-netsuite/setup.py b/airbyte-integrations/connectors/source-netsuite/setup.py
index 42288908347cf..e16d4d5b270f3 100644
--- a/airbyte-integrations/connectors/source-netsuite/setup.py
+++ b/airbyte-integrations/connectors/source-netsuite/setup.py
@@ -17,13 +17,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-netsuite=source_netsuite.run:run",
+        ],
+    },
     name="source_netsuite",
     description="Source implementation for Netsuite Soap.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-netsuite/source_netsuite/run.py b/airbyte-integrations/connectors/source-netsuite/source_netsuite/run.py
new file mode 100644
index 0000000000000..c1a2043c455d8
--- /dev/null
+++ b/airbyte-integrations/connectors/source-netsuite/source_netsuite/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_netsuite import SourceNetsuite
+
+
+def run():
+    source = SourceNetsuite()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-news-api/main.py b/airbyte-integrations/connectors/source-news-api/main.py
index 0b2c02a552476..835032115f029 100644
--- a/airbyte-integrations/connectors/source-news-api/main.py
+++ b/airbyte-integrations/connectors/source-news-api/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_news_api import SourceNewsApi
+from source_news_api.run import run
 
 if __name__ == "__main__":
-    source = SourceNewsApi()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-news-api/setup.py b/airbyte-integrations/connectors/source-news-api/setup.py
index 733fc131e9ab9..db15b71d90fac 100644
--- a/airbyte-integrations/connectors/source-news-api/setup.py
+++ b/airbyte-integrations/connectors/source-news-api/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-news-api=source_news_api.run:run",
+        ],
+    },
     name="source_news_api",
     description="Source implementation for News Api.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-news-api/source_news_api/run.py b/airbyte-integrations/connectors/source-news-api/source_news_api/run.py
new file mode 100644
index 0000000000000..188ce3f53c6f7
--- /dev/null
+++ b/airbyte-integrations/connectors/source-news-api/source_news_api/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_news_api import SourceNewsApi
+
+
+def run():
+    source = SourceNewsApi()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-newsdata/main.py b/airbyte-integrations/connectors/source-newsdata/main.py
index 2f7c8b1ecbac9..81dc024c6fb2a 100644
--- a/airbyte-integrations/connectors/source-newsdata/main.py
+++ b/airbyte-integrations/connectors/source-newsdata/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_newsdata import SourceNewsdata
+from source_newsdata.run import run
 
 if __name__ == "__main__":
-    source = SourceNewsdata()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-newsdata/setup.py b/airbyte-integrations/connectors/source-newsdata/setup.py
index a7bc19daa4ba7..55b34a9fb7088 100644
--- a/airbyte-integrations/connectors/source-newsdata/setup.py
+++ b/airbyte-integrations/connectors/source-newsdata/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-newsdata=source_newsdata.run:run",
+        ],
+    },
     name="source_newsdata",
     description="Source implementation for Newsdata.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-newsdata/source_newsdata/run.py b/airbyte-integrations/connectors/source-newsdata/source_newsdata/run.py
new file mode 100644
index 0000000000000..2cdae722bfb05
--- /dev/null
+++ b/airbyte-integrations/connectors/source-newsdata/source_newsdata/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_newsdata import SourceNewsdata
+
+
+def run():
+    source = SourceNewsdata()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-notion/main.py b/airbyte-integrations/connectors/source-notion/main.py
index dd188d547982a..671d6cd692faa 100644
--- a/airbyte-integrations/connectors/source-notion/main.py
+++ b/airbyte-integrations/connectors/source-notion/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_notion import SourceNotion
+from source_notion.run import run
 
 if __name__ == "__main__":
-    source = SourceNotion()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-notion/setup.py b/airbyte-integrations/connectors/source-notion/setup.py
index 80a1ed81533f0..d31dfbbdeee3c 100644
--- a/airbyte-integrations/connectors/source-notion/setup.py
+++ b/airbyte-integrations/connectors/source-notion/setup.py
@@ -18,6 +18,11 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-notion=source_notion.run:run",
+        ],
+    },
     name="source_notion",
     description="Source implementation for Notion.",
     author="Airbyte",
diff --git a/airbyte-integrations/connectors/source-notion/source_notion/run.py b/airbyte-integrations/connectors/source-notion/source_notion/run.py
new file mode 100644
index 0000000000000..df14df5ee9e4c
--- /dev/null
+++ b/airbyte-integrations/connectors/source-notion/source_notion/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_notion import SourceNotion
+
+
+def run():
+    source = SourceNotion()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-nytimes/main.py b/airbyte-integrations/connectors/source-nytimes/main.py
index b3e9d432ee288..ed513aa4248ef 100644
--- a/airbyte-integrations/connectors/source-nytimes/main.py
+++ b/airbyte-integrations/connectors/source-nytimes/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_nytimes import SourceNytimes
+from source_nytimes.run import run
 
 if __name__ == "__main__":
-    source = SourceNytimes()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-nytimes/setup.py b/airbyte-integrations/connectors/source-nytimes/setup.py
index ae57a1144c9f1..6c0cc1d179b5d 100644
--- a/airbyte-integrations/connectors/source-nytimes/setup.py
+++ b/airbyte-integrations/connectors/source-nytimes/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-nytimes=source_nytimes.run:run",
+        ],
+    },
     name="source_nytimes",
     description="Source implementation for Nytimes.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-nytimes/source_nytimes/run.py b/airbyte-integrations/connectors/source-nytimes/source_nytimes/run.py
new file mode 100644
index 0000000000000..ef4ddbd555e5b
--- /dev/null
+++ b/airbyte-integrations/connectors/source-nytimes/source_nytimes/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_nytimes import SourceNytimes
+
+
+def run():
+    source = SourceNytimes()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-okta/main.py b/airbyte-integrations/connectors/source-okta/main.py
index 93c853b816f54..488cb6ca1b6f8 100644
--- a/airbyte-integrations/connectors/source-okta/main.py
+++ b/airbyte-integrations/connectors/source-okta/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_okta import SourceOkta
+from source_okta.run import run
 
 if __name__ == "__main__":
-    source = SourceOkta()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-okta/setup.py b/airbyte-integrations/connectors/source-okta/setup.py
index a3fac533b39ea..1a15dc58fd478 100644
--- a/airbyte-integrations/connectors/source-okta/setup.py
+++ b/airbyte-integrations/connectors/source-okta/setup.py
@@ -17,6 +17,11 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-okta=source_okta.run:run",
+        ],
+    },
     name="source_okta",
     description="Source implementation for Okta.",
     author="Airbyte",
diff --git a/airbyte-integrations/connectors/source-okta/source_okta/run.py b/airbyte-integrations/connectors/source-okta/source_okta/run.py
new file mode 100644
index 0000000000000..f40c87dc0e376
--- /dev/null
+++ b/airbyte-integrations/connectors/source-okta/source_okta/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_okta import SourceOkta
+
+
+def run():
+    source = SourceOkta()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-omnisend/main.py b/airbyte-integrations/connectors/source-omnisend/main.py
index 01c8cb75e1338..bf2d072e4c001 100644
--- a/airbyte-integrations/connectors/source-omnisend/main.py
+++ b/airbyte-integrations/connectors/source-omnisend/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_omnisend import SourceOmnisend
+from source_omnisend.run import run
 
 if __name__ == "__main__":
-    source = SourceOmnisend()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-omnisend/setup.py b/airbyte-integrations/connectors/source-omnisend/setup.py
index 653728e512b56..990506f80f9ba 100644
--- a/airbyte-integrations/connectors/source-omnisend/setup.py
+++ b/airbyte-integrations/connectors/source-omnisend/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-omnisend=source_omnisend.run:run",
+        ],
+    },
     name="source_omnisend",
     description="Source implementation for Omnisend.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-omnisend/source_omnisend/run.py b/airbyte-integrations/connectors/source-omnisend/source_omnisend/run.py
new file mode 100644
index 0000000000000..46479c299f0a7
--- /dev/null
+++ b/airbyte-integrations/connectors/source-omnisend/source_omnisend/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_omnisend import SourceOmnisend
+
+
+def run():
+    source = SourceOmnisend()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-onesignal/main.py b/airbyte-integrations/connectors/source-onesignal/main.py
index ccff041b46e3e..e735cf13bacbf 100644
--- a/airbyte-integrations/connectors/source-onesignal/main.py
+++ b/airbyte-integrations/connectors/source-onesignal/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_onesignal import SourceOnesignal
+from source_onesignal.run import run
 
 if __name__ == "__main__":
-    source = SourceOnesignal()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-onesignal/setup.py b/airbyte-integrations/connectors/source-onesignal/setup.py
index 47af71852c6a9..aac6704b131b9 100644
--- a/airbyte-integrations/connectors/source-onesignal/setup.py
+++ b/airbyte-integrations/connectors/source-onesignal/setup.py
@@ -12,13 +12,30 @@
 TEST_REQUIREMENTS = ["pytest~=6.2", "pytest-mock~=3.6.1", "connector-acceptance-test"]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-onesignal=source_onesignal.run:run",
+        ],
+    },
     name="source_onesignal",
     description="Source implementation for Onesignal.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-onesignal/source_onesignal/run.py b/airbyte-integrations/connectors/source-onesignal/source_onesignal/run.py
new file mode 100644
index 0000000000000..e5690d762c47b
--- /dev/null
+++ b/airbyte-integrations/connectors/source-onesignal/source_onesignal/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_onesignal import SourceOnesignal
+
+
+def run():
+    source = SourceOnesignal()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-open-exchange-rates/main.py b/airbyte-integrations/connectors/source-open-exchange-rates/main.py
index b311cb841f618..6223dbf6da8f1 100644
--- a/airbyte-integrations/connectors/source-open-exchange-rates/main.py
+++ b/airbyte-integrations/connectors/source-open-exchange-rates/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_open_exchange_rates import SourceOpenExchangeRates
+from source_open_exchange_rates.run import run
 
 if __name__ == "__main__":
-    source = SourceOpenExchangeRates()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-open-exchange-rates/setup.py b/airbyte-integrations/connectors/source-open-exchange-rates/setup.py
index 55fd4589213f1..4b12738562df2 100644
--- a/airbyte-integrations/connectors/source-open-exchange-rates/setup.py
+++ b/airbyte-integrations/connectors/source-open-exchange-rates/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-open-exchange-rates=source_open_exchange_rates.run:run",
+        ],
+    },
     name="source_open_exchange_rates",
     description="Source implementation for Open Exchange Rates.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-open-exchange-rates/source_open_exchange_rates/run.py b/airbyte-integrations/connectors/source-open-exchange-rates/source_open_exchange_rates/run.py
new file mode 100644
index 0000000000000..b2d83005c0ed7
--- /dev/null
+++ b/airbyte-integrations/connectors/source-open-exchange-rates/source_open_exchange_rates/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_open_exchange_rates import SourceOpenExchangeRates
+
+
+def run():
+    source = SourceOpenExchangeRates()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-openweather/main.py b/airbyte-integrations/connectors/source-openweather/main.py
index 398948d541718..381fb38ae2dc4 100644
--- a/airbyte-integrations/connectors/source-openweather/main.py
+++ b/airbyte-integrations/connectors/source-openweather/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_openweather import SourceOpenweather
+from source_openweather.run import run
 
 if __name__ == "__main__":
-    source = SourceOpenweather()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-openweather/setup.py b/airbyte-integrations/connectors/source-openweather/setup.py
index fd32d06044493..2f978664b0578 100644
--- a/airbyte-integrations/connectors/source-openweather/setup.py
+++ b/airbyte-integrations/connectors/source-openweather/setup.py
@@ -17,13 +17,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-openweather=source_openweather.run:run",
+        ],
+    },
     name="source_openweather",
     description="Source implementation for Openweather.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-openweather/source_openweather/run.py b/airbyte-integrations/connectors/source-openweather/source_openweather/run.py
new file mode 100644
index 0000000000000..f18939c72eb2b
--- /dev/null
+++ b/airbyte-integrations/connectors/source-openweather/source_openweather/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_openweather import SourceOpenweather
+
+
+def run():
+    source = SourceOpenweather()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-opsgenie/main.py b/airbyte-integrations/connectors/source-opsgenie/main.py
index 0acd6dee136d7..4f5798deffe11 100644
--- a/airbyte-integrations/connectors/source-opsgenie/main.py
+++ b/airbyte-integrations/connectors/source-opsgenie/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_opsgenie import SourceOpsgenie
+from source_opsgenie.run import run
 
 if __name__ == "__main__":
-    source = SourceOpsgenie()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-opsgenie/setup.py b/airbyte-integrations/connectors/source-opsgenie/setup.py
index 48fa326b15b9a..4bf256910f2b0 100644
--- a/airbyte-integrations/connectors/source-opsgenie/setup.py
+++ b/airbyte-integrations/connectors/source-opsgenie/setup.py
@@ -15,13 +15,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-opsgenie=source_opsgenie.run:run",
+        ],
+    },
     name="source_opsgenie",
     description="Source implementation for Opsgenie.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-opsgenie/source_opsgenie/run.py b/airbyte-integrations/connectors/source-opsgenie/source_opsgenie/run.py
new file mode 100644
index 0000000000000..63e0eb89c264b
--- /dev/null
+++ b/airbyte-integrations/connectors/source-opsgenie/source_opsgenie/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_opsgenie import SourceOpsgenie
+
+
+def run():
+    source = SourceOpsgenie()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-orb/main.py b/airbyte-integrations/connectors/source-orb/main.py
index 08c8985a056a0..725dc3553298d 100644
--- a/airbyte-integrations/connectors/source-orb/main.py
+++ b/airbyte-integrations/connectors/source-orb/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_orb import SourceOrb
+from source_orb.run import run
 
 if __name__ == "__main__":
-    source = SourceOrb()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-orb/setup.py b/airbyte-integrations/connectors/source-orb/setup.py
index 38e64fa19ee14..68f05af00a2c1 100644
--- a/airbyte-integrations/connectors/source-orb/setup.py
+++ b/airbyte-integrations/connectors/source-orb/setup.py
@@ -10,6 +10,11 @@
 TEST_REQUIREMENTS = ["requests-mock~=1.9.3", "pytest~=6.1", "pytest-mock~=3.6.1", "responses~=0.13.3", "pendulum==2.1.2"]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-orb=source_orb.run:run",
+        ],
+    },
     name="source_orb",
     description="Source implementation for Orb.",
     author="Airbyte",
diff --git a/airbyte-integrations/connectors/source-orb/source_orb/run.py b/airbyte-integrations/connectors/source-orb/source_orb/run.py
new file mode 100644
index 0000000000000..05f19468aac93
--- /dev/null
+++ b/airbyte-integrations/connectors/source-orb/source_orb/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_orb import SourceOrb
+
+
+def run():
+    source = SourceOrb()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-orbit/main.py b/airbyte-integrations/connectors/source-orbit/main.py
index 82e25dd0caa56..16b6891a52b62 100644
--- a/airbyte-integrations/connectors/source-orbit/main.py
+++ b/airbyte-integrations/connectors/source-orbit/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_orbit import SourceOrbit
+from source_orbit.run import run
 
 if __name__ == "__main__":
-    source = SourceOrbit()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-orbit/setup.py b/airbyte-integrations/connectors/source-orbit/setup.py
index ae8d7e9b1c8b5..9ca2a1394b2a8 100644
--- a/airbyte-integrations/connectors/source-orbit/setup.py
+++ b/airbyte-integrations/connectors/source-orbit/setup.py
@@ -10,13 +10,30 @@
 TEST_REQUIREMENTS = ["requests-mock~=1.9.3", "pytest~=6.2", "pytest-mock~=3.6.1"]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-orbit=source_orbit.run:run",
+        ],
+    },
     name="source_orbit",
     description="Source implementation for Orbit.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-orbit/source_orbit/run.py b/airbyte-integrations/connectors/source-orbit/source_orbit/run.py
new file mode 100644
index 0000000000000..593cfb9a326a3
--- /dev/null
+++ b/airbyte-integrations/connectors/source-orbit/source_orbit/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_orbit import SourceOrbit
+
+
+def run():
+    source = SourceOrbit()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-oura/main.py b/airbyte-integrations/connectors/source-oura/main.py
index 35f15399d9586..f72173126bd0b 100644
--- a/airbyte-integrations/connectors/source-oura/main.py
+++ b/airbyte-integrations/connectors/source-oura/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_oura import SourceOura
+from source_oura.run import run
 
 if __name__ == "__main__":
-    source = SourceOura()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-oura/setup.py b/airbyte-integrations/connectors/source-oura/setup.py
index b78b256c87fb1..36e29e32605c1 100644
--- a/airbyte-integrations/connectors/source-oura/setup.py
+++ b/airbyte-integrations/connectors/source-oura/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-oura=source_oura.run:run",
+        ],
+    },
     name="source_oura",
     description="Source implementation for Oura.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-oura/source_oura/run.py b/airbyte-integrations/connectors/source-oura/source_oura/run.py
new file mode 100644
index 0000000000000..af46311895fbb
--- /dev/null
+++ b/airbyte-integrations/connectors/source-oura/source_oura/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_oura import SourceOura
+
+
+def run():
+    source = SourceOura()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-outbrain-amplify/main.py b/airbyte-integrations/connectors/source-outbrain-amplify/main.py
index 2f2acbc0b6275..dc58d39d5bcd2 100644
--- a/airbyte-integrations/connectors/source-outbrain-amplify/main.py
+++ b/airbyte-integrations/connectors/source-outbrain-amplify/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_outbrain_amplify import SourceOutbrainAmplify
+from source_outbrain_amplify.run import run
 
 if __name__ == "__main__":
-    source = SourceOutbrainAmplify()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-outbrain-amplify/setup.py b/airbyte-integrations/connectors/source-outbrain-amplify/setup.py
index d8b5563f3dce6..f4f709b99a498 100644
--- a/airbyte-integrations/connectors/source-outbrain-amplify/setup.py
+++ b/airbyte-integrations/connectors/source-outbrain-amplify/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-outbrain-amplify=source_outbrain_amplify.run:run",
+        ],
+    },
     name="source_outbrain_amplify",
     description="Source implementation for Outbrain Amplify.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-outbrain-amplify/source_outbrain_amplify/run.py b/airbyte-integrations/connectors/source-outbrain-amplify/source_outbrain_amplify/run.py
new file mode 100644
index 0000000000000..8f90ae8e04698
--- /dev/null
+++ b/airbyte-integrations/connectors/source-outbrain-amplify/source_outbrain_amplify/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_outbrain_amplify import SourceOutbrainAmplify
+
+
+def run():
+    source = SourceOutbrainAmplify()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-outreach/main.py b/airbyte-integrations/connectors/source-outreach/main.py
index 77394c375d030..9ad460e89200e 100644
--- a/airbyte-integrations/connectors/source-outreach/main.py
+++ b/airbyte-integrations/connectors/source-outreach/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_outreach import SourceOutreach
+from source_outreach.run import run
 
 if __name__ == "__main__":
-    source = SourceOutreach()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-outreach/setup.py b/airbyte-integrations/connectors/source-outreach/setup.py
index 2367148b8d732..dc15e76330f87 100644
--- a/airbyte-integrations/connectors/source-outreach/setup.py
+++ b/airbyte-integrations/connectors/source-outreach/setup.py
@@ -16,6 +16,11 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-outreach=source_outreach.run:run",
+        ],
+    },
     name="source_outreach",
     description="Source implementation for Outreach.",
     author="Airbyte",
diff --git a/airbyte-integrations/connectors/source-outreach/source_outreach/run.py b/airbyte-integrations/connectors/source-outreach/source_outreach/run.py
new file mode 100644
index 0000000000000..2d48fe0806cdf
--- /dev/null
+++ b/airbyte-integrations/connectors/source-outreach/source_outreach/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_outreach import SourceOutreach
+
+
+def run():
+    source = SourceOutreach()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-pagerduty/main.py b/airbyte-integrations/connectors/source-pagerduty/main.py
index 61d193268f6bb..22537946cc8c7 100644
--- a/airbyte-integrations/connectors/source-pagerduty/main.py
+++ b/airbyte-integrations/connectors/source-pagerduty/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_pagerduty import SourcePagerduty
+from source_pagerduty.run import run
 
 if __name__ == "__main__":
-    source = SourcePagerduty()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-pagerduty/setup.py b/airbyte-integrations/connectors/source-pagerduty/setup.py
index aec396ac036d1..cba7caa9d5bd2 100644
--- a/airbyte-integrations/connectors/source-pagerduty/setup.py
+++ b/airbyte-integrations/connectors/source-pagerduty/setup.py
@@ -14,13 +14,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-pagerduty=source_pagerduty.run:run",
+        ],
+    },
     name="source_pagerduty",
     description="Source implementation for Pagerduty.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-pagerduty/source_pagerduty/run.py b/airbyte-integrations/connectors/source-pagerduty/source_pagerduty/run.py
new file mode 100644
index 0000000000000..f73afe9c65927
--- /dev/null
+++ b/airbyte-integrations/connectors/source-pagerduty/source_pagerduty/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_pagerduty import SourcePagerduty
+
+
+def run():
+    source = SourcePagerduty()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-pardot/main.py b/airbyte-integrations/connectors/source-pardot/main.py
index 8158c5fc7d665..6112e4e13e275 100644
--- a/airbyte-integrations/connectors/source-pardot/main.py
+++ b/airbyte-integrations/connectors/source-pardot/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_pardot import SourcePardot
+from source_pardot.run import run
 
 if __name__ == "__main__":
-    source = SourcePardot()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-pardot/setup.py b/airbyte-integrations/connectors/source-pardot/setup.py
index c04454b0bd05a..47cbea1de2c02 100644
--- a/airbyte-integrations/connectors/source-pardot/setup.py
+++ b/airbyte-integrations/connectors/source-pardot/setup.py
@@ -16,6 +16,11 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-pardot=source_pardot.run:run",
+        ],
+    },
     name="source_pardot",
     description="Source implementation for Pardot.",
     author="Airbyte",
diff --git a/airbyte-integrations/connectors/source-pardot/source_pardot/run.py b/airbyte-integrations/connectors/source-pardot/source_pardot/run.py
new file mode 100644
index 0000000000000..34bd6425a06dc
--- /dev/null
+++ b/airbyte-integrations/connectors/source-pardot/source_pardot/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_pardot import SourcePardot
+
+
+def run():
+    source = SourcePardot()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-partnerstack/main.py b/airbyte-integrations/connectors/source-partnerstack/main.py
index 24bd018141000..d22642a3ee660 100644
--- a/airbyte-integrations/connectors/source-partnerstack/main.py
+++ b/airbyte-integrations/connectors/source-partnerstack/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_partnerstack import SourcePartnerstack
+from source_partnerstack.run import run
 
 if __name__ == "__main__":
-    source = SourcePartnerstack()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-partnerstack/setup.py b/airbyte-integrations/connectors/source-partnerstack/setup.py
index 5e6542bbc4d66..4d13b3c870f85 100644
--- a/airbyte-integrations/connectors/source-partnerstack/setup.py
+++ b/airbyte-integrations/connectors/source-partnerstack/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-partnerstack=source_partnerstack.run:run",
+        ],
+    },
     name="source_partnerstack",
     description="Source implementation for Partnerstack.",
     author="Elliot Trabac",
     author_email="elliot.trabac1@gmail.com",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-partnerstack/source_partnerstack/run.py b/airbyte-integrations/connectors/source-partnerstack/source_partnerstack/run.py
new file mode 100644
index 0000000000000..1b7dad130b551
--- /dev/null
+++ b/airbyte-integrations/connectors/source-partnerstack/source_partnerstack/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_partnerstack import SourcePartnerstack
+
+
+def run():
+    source = SourcePartnerstack()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-paypal-transaction/setup.py b/airbyte-integrations/connectors/source-paypal-transaction/setup.py
index a7f633e8ca287..1fdb3b7826a24 100644
--- a/airbyte-integrations/connectors/source-paypal-transaction/setup.py
+++ b/airbyte-integrations/connectors/source-paypal-transaction/setup.py
@@ -27,7 +27,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-paystack/main.py b/airbyte-integrations/connectors/source-paystack/main.py
index 04c982f1ed900..8f792800f6de0 100644
--- a/airbyte-integrations/connectors/source-paystack/main.py
+++ b/airbyte-integrations/connectors/source-paystack/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_paystack import SourcePaystack
+from source_paystack.run import run
 
 if __name__ == "__main__":
-    source = SourcePaystack()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-paystack/setup.py b/airbyte-integrations/connectors/source-paystack/setup.py
index 9465043140005..22f2c755d169c 100644
--- a/airbyte-integrations/connectors/source-paystack/setup.py
+++ b/airbyte-integrations/connectors/source-paystack/setup.py
@@ -12,6 +12,11 @@
 TEST_REQUIREMENTS = ["pytest~=6.1", "pytest-mock~=3.6.1", "requests-mock"]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-paystack=source_paystack.run:run",
+        ],
+    },
     name="source_paystack",
     description="Source implementation for Paystack.",
     author="Airbyte",
diff --git a/airbyte-integrations/connectors/source-paystack/source_paystack/run.py b/airbyte-integrations/connectors/source-paystack/source_paystack/run.py
new file mode 100644
index 0000000000000..001e5668317ee
--- /dev/null
+++ b/airbyte-integrations/connectors/source-paystack/source_paystack/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_paystack import SourcePaystack
+
+
+def run():
+    source = SourcePaystack()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-pendo/main.py b/airbyte-integrations/connectors/source-pendo/main.py
index 6d17f4106c1dd..882482d947f8c 100644
--- a/airbyte-integrations/connectors/source-pendo/main.py
+++ b/airbyte-integrations/connectors/source-pendo/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_pendo import SourcePendo
+from source_pendo.run import run
 
 if __name__ == "__main__":
-    source = SourcePendo()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-pendo/setup.py b/airbyte-integrations/connectors/source-pendo/setup.py
index 8aa15183ac487..907aa867ff7b3 100644
--- a/airbyte-integrations/connectors/source-pendo/setup.py
+++ b/airbyte-integrations/connectors/source-pendo/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-pendo=source_pendo.run:run",
+        ],
+    },
     name="source_pendo",
     description="Source implementation for Pendo.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-pendo/source_pendo/run.py b/airbyte-integrations/connectors/source-pendo/source_pendo/run.py
new file mode 100644
index 0000000000000..a98bdc7d16ff4
--- /dev/null
+++ b/airbyte-integrations/connectors/source-pendo/source_pendo/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_pendo import SourcePendo
+
+
+def run():
+    source = SourcePendo()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-persistiq/main.py b/airbyte-integrations/connectors/source-persistiq/main.py
index 438306b66706c..b6be0062f615c 100644
--- a/airbyte-integrations/connectors/source-persistiq/main.py
+++ b/airbyte-integrations/connectors/source-persistiq/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_persistiq import SourcePersistiq
+from source_persistiq.run import run
 
 if __name__ == "__main__":
-    source = SourcePersistiq()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-persistiq/setup.py b/airbyte-integrations/connectors/source-persistiq/setup.py
index 88f883fbdacf6..509b4ddc17978 100644
--- a/airbyte-integrations/connectors/source-persistiq/setup.py
+++ b/airbyte-integrations/connectors/source-persistiq/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-persistiq=source_persistiq.run:run",
+        ],
+    },
     name="source_persistiq",
     description="Source implementation for Persistiq.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-persistiq/source_persistiq/run.py b/airbyte-integrations/connectors/source-persistiq/source_persistiq/run.py
new file mode 100644
index 0000000000000..2f604abf6ae55
--- /dev/null
+++ b/airbyte-integrations/connectors/source-persistiq/source_persistiq/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_persistiq import SourcePersistiq
+
+
+def run():
+    source = SourcePersistiq()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-pexels-api/main.py b/airbyte-integrations/connectors/source-pexels-api/main.py
index f13d88a9f3019..4fdc405e120e9 100644
--- a/airbyte-integrations/connectors/source-pexels-api/main.py
+++ b/airbyte-integrations/connectors/source-pexels-api/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_pexels_api import SourcePexelsApi
+from source_pexels_api.run import run
 
 if __name__ == "__main__":
-    source = SourcePexelsApi()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-pexels-api/setup.py b/airbyte-integrations/connectors/source-pexels-api/setup.py
index e45f600af4469..7525bf7113f5f 100644
--- a/airbyte-integrations/connectors/source-pexels-api/setup.py
+++ b/airbyte-integrations/connectors/source-pexels-api/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-pexels-api=source_pexels_api.run:run",
+        ],
+    },
     name="source_pexels_api",
     description="Source implementation for Pexels Api.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-pexels-api/source_pexels_api/run.py b/airbyte-integrations/connectors/source-pexels-api/source_pexels_api/run.py
new file mode 100644
index 0000000000000..da128a40cea08
--- /dev/null
+++ b/airbyte-integrations/connectors/source-pexels-api/source_pexels_api/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_pexels_api import SourcePexelsApi
+
+
+def run():
+    source = SourcePexelsApi()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-pinterest/main.py b/airbyte-integrations/connectors/source-pinterest/main.py
index 377a6ad6dd764..aff013c703198 100644
--- a/airbyte-integrations/connectors/source-pinterest/main.py
+++ b/airbyte-integrations/connectors/source-pinterest/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_pinterest import SourcePinterest
+from source_pinterest.run import run
 
 if __name__ == "__main__":
-    source = SourcePinterest()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-pinterest/setup.py b/airbyte-integrations/connectors/source-pinterest/setup.py
index 5da646d8e719b..d09828b5c17e6 100644
--- a/airbyte-integrations/connectors/source-pinterest/setup.py
+++ b/airbyte-integrations/connectors/source-pinterest/setup.py
@@ -15,6 +15,11 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-pinterest=source_pinterest.run:run",
+        ],
+    },
     name="source_pinterest",
     description="Source implementation for Pinterest.",
     author="Airbyte",
diff --git a/airbyte-integrations/connectors/source-pinterest/source_pinterest/run.py b/airbyte-integrations/connectors/source-pinterest/source_pinterest/run.py
new file mode 100644
index 0000000000000..2acf5886cb16a
--- /dev/null
+++ b/airbyte-integrations/connectors/source-pinterest/source_pinterest/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_pinterest import SourcePinterest
+
+
+def run():
+    source = SourcePinterest()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-pipedrive/setup.py b/airbyte-integrations/connectors/source-pipedrive/setup.py
index 5d3c1999b80c8..388dc3e91906e 100644
--- a/airbyte-integrations/connectors/source-pipedrive/setup.py
+++ b/airbyte-integrations/connectors/source-pipedrive/setup.py
@@ -26,7 +26,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-pivotal-tracker/main.py b/airbyte-integrations/connectors/source-pivotal-tracker/main.py
index 3115bba2f9325..7677181082968 100644
--- a/airbyte-integrations/connectors/source-pivotal-tracker/main.py
+++ b/airbyte-integrations/connectors/source-pivotal-tracker/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_pivotal_tracker import SourcePivotalTracker
+from source_pivotal_tracker.run import run
 
 if __name__ == "__main__":
-    source = SourcePivotalTracker()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-pivotal-tracker/setup.py b/airbyte-integrations/connectors/source-pivotal-tracker/setup.py
index 63de73cbd36f0..e6c5edb752f17 100644
--- a/airbyte-integrations/connectors/source-pivotal-tracker/setup.py
+++ b/airbyte-integrations/connectors/source-pivotal-tracker/setup.py
@@ -17,6 +17,11 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-pivotal-tracker=source_pivotal_tracker.run:run",
+        ],
+    },
     name="source_pivotal_tracker",
     description="Source implementation for Pivotal Tracker.",
     author="Airbyte",
diff --git a/airbyte-integrations/connectors/source-pivotal-tracker/source_pivotal_tracker/run.py b/airbyte-integrations/connectors/source-pivotal-tracker/source_pivotal_tracker/run.py
new file mode 100644
index 0000000000000..a187ff169ac20
--- /dev/null
+++ b/airbyte-integrations/connectors/source-pivotal-tracker/source_pivotal_tracker/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_pivotal_tracker import SourcePivotalTracker
+
+
+def run():
+    source = SourcePivotalTracker()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-plaid/main.py b/airbyte-integrations/connectors/source-plaid/main.py
index e8f3663ddcccf..be0011cc48607 100644
--- a/airbyte-integrations/connectors/source-plaid/main.py
+++ b/airbyte-integrations/connectors/source-plaid/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_plaid import SourcePlaid
+from source_plaid.run import run
 
 if __name__ == "__main__":
-    source = SourcePlaid()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-plaid/setup.py b/airbyte-integrations/connectors/source-plaid/setup.py
index bcbf0b34a80c4..fc63687955554 100644
--- a/airbyte-integrations/connectors/source-plaid/setup.py
+++ b/airbyte-integrations/connectors/source-plaid/setup.py
@@ -17,13 +17,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-plaid=source_plaid.run:run",
+        ],
+    },
     name="source_plaid",
     description="Source implementation for Plaid.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-plaid/source_plaid/run.py b/airbyte-integrations/connectors/source-plaid/source_plaid/run.py
new file mode 100644
index 0000000000000..c83935220787f
--- /dev/null
+++ b/airbyte-integrations/connectors/source-plaid/source_plaid/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_plaid import SourcePlaid
+
+
+def run():
+    source = SourcePlaid()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-plausible/main.py b/airbyte-integrations/connectors/source-plausible/main.py
index 581156e36e0f1..453a2f4577958 100644
--- a/airbyte-integrations/connectors/source-plausible/main.py
+++ b/airbyte-integrations/connectors/source-plausible/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_plausible import SourcePlausible
+from source_plausible.run import run
 
 if __name__ == "__main__":
-    source = SourcePlausible()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-plausible/setup.py b/airbyte-integrations/connectors/source-plausible/setup.py
index d222145d848ea..894526785513c 100644
--- a/airbyte-integrations/connectors/source-plausible/setup.py
+++ b/airbyte-integrations/connectors/source-plausible/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-plausible=source_plausible.run:run",
+        ],
+    },
     name="source_plausible",
     description="Source implementation for Plausible.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-plausible/source_plausible/run.py b/airbyte-integrations/connectors/source-plausible/source_plausible/run.py
new file mode 100644
index 0000000000000..57370a5f3748e
--- /dev/null
+++ b/airbyte-integrations/connectors/source-plausible/source_plausible/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_plausible import SourcePlausible
+
+
+def run():
+    source = SourcePlausible()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-pocket/main.py b/airbyte-integrations/connectors/source-pocket/main.py
index bf2c5d41e1219..45d6104c34f8a 100644
--- a/airbyte-integrations/connectors/source-pocket/main.py
+++ b/airbyte-integrations/connectors/source-pocket/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_pocket import SourcePocket
+from source_pocket.run import run
 
 if __name__ == "__main__":
-    source = SourcePocket()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-pocket/setup.py b/airbyte-integrations/connectors/source-pocket/setup.py
index bdbf2b6549abd..d7238d34a09e8 100644
--- a/airbyte-integrations/connectors/source-pocket/setup.py
+++ b/airbyte-integrations/connectors/source-pocket/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-pocket=source_pocket.run:run",
+        ],
+    },
     name="source_pocket",
     description="Source implementation for Pocket.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-pocket/source_pocket/run.py b/airbyte-integrations/connectors/source-pocket/source_pocket/run.py
new file mode 100644
index 0000000000000..75eaea5398f6c
--- /dev/null
+++ b/airbyte-integrations/connectors/source-pocket/source_pocket/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_pocket import SourcePocket
+
+
+def run():
+    source = SourcePocket()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-pokeapi/main.py b/airbyte-integrations/connectors/source-pokeapi/main.py
index 38a510a3f2d77..f32ce6b381058 100644
--- a/airbyte-integrations/connectors/source-pokeapi/main.py
+++ b/airbyte-integrations/connectors/source-pokeapi/main.py
@@ -2,11 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_pokeapi import SourcePokeapi
+from source_pokeapi.run import run
 
 if __name__ == "__main__":
-    source = SourcePokeapi()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-pokeapi/setup.py b/airbyte-integrations/connectors/source-pokeapi/setup.py
index 2fa7839b58fca..27a5590ece4d9 100644
--- a/airbyte-integrations/connectors/source-pokeapi/setup.py
+++ b/airbyte-integrations/connectors/source-pokeapi/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-pokeapi=source_pokeapi.run:run",
+        ],
+    },
     name="source_pokeapi",
     description="Source implementation for Pokeapi.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-pokeapi/source_pokeapi/run.py b/airbyte-integrations/connectors/source-pokeapi/source_pokeapi/run.py
new file mode 100644
index 0000000000000..2b573e6939542
--- /dev/null
+++ b/airbyte-integrations/connectors/source-pokeapi/source_pokeapi/run.py
@@ -0,0 +1,13 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_pokeapi import SourcePokeapi
+
+
+def run():
+    source = SourcePokeapi()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-polygon-stock-api/main.py b/airbyte-integrations/connectors/source-polygon-stock-api/main.py
index 7fc7ae2dd4970..77c0f73430bea 100644
--- a/airbyte-integrations/connectors/source-polygon-stock-api/main.py
+++ b/airbyte-integrations/connectors/source-polygon-stock-api/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_polygon_stock_api import SourcePolygonStockApi
+from source_polygon_stock_api.run import run
 
 if __name__ == "__main__":
-    source = SourcePolygonStockApi()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-polygon-stock-api/setup.py b/airbyte-integrations/connectors/source-polygon-stock-api/setup.py
index ddd7463c92925..2b4930c184d39 100644
--- a/airbyte-integrations/connectors/source-polygon-stock-api/setup.py
+++ b/airbyte-integrations/connectors/source-polygon-stock-api/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-polygon-stock-api=source_polygon_stock_api.run:run",
+        ],
+    },
     name="source_polygon_stock_api",
     description="Source implementation for Polygon Stock Api.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-polygon-stock-api/source_polygon_stock_api/run.py b/airbyte-integrations/connectors/source-polygon-stock-api/source_polygon_stock_api/run.py
new file mode 100644
index 0000000000000..ab2a75d41fe6d
--- /dev/null
+++ b/airbyte-integrations/connectors/source-polygon-stock-api/source_polygon_stock_api/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_polygon_stock_api import SourcePolygonStockApi
+
+
+def run():
+    source = SourcePolygonStockApi()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-posthog/main.py b/airbyte-integrations/connectors/source-posthog/main.py
index c788205d69b6b..f7e69357d9997 100644
--- a/airbyte-integrations/connectors/source-posthog/main.py
+++ b/airbyte-integrations/connectors/source-posthog/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_posthog import SourcePosthog
+from source_posthog.run import run
 
 if __name__ == "__main__":
-    source = SourcePosthog()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-posthog/setup.py b/airbyte-integrations/connectors/source-posthog/setup.py
index 75fb93d9ac2cd..2f23e21f1cf87 100644
--- a/airbyte-integrations/connectors/source-posthog/setup.py
+++ b/airbyte-integrations/connectors/source-posthog/setup.py
@@ -14,6 +14,11 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-posthog=source_posthog.run:run",
+        ],
+    },
     name="source_posthog",
     description="Source implementation for Posthog.",
     author="Airbyte",
diff --git a/airbyte-integrations/connectors/source-posthog/source_posthog/run.py b/airbyte-integrations/connectors/source-posthog/source_posthog/run.py
new file mode 100644
index 0000000000000..711b2e4ae4833
--- /dev/null
+++ b/airbyte-integrations/connectors/source-posthog/source_posthog/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_posthog import SourcePosthog
+
+
+def run():
+    source = SourcePosthog()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-postmarkapp/main.py b/airbyte-integrations/connectors/source-postmarkapp/main.py
index 8257a82e80c12..c6b256d74b3af 100644
--- a/airbyte-integrations/connectors/source-postmarkapp/main.py
+++ b/airbyte-integrations/connectors/source-postmarkapp/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_postmarkapp import SourcePostmarkapp
+from source_postmarkapp.run import run
 
 if __name__ == "__main__":
-    source = SourcePostmarkapp()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-postmarkapp/setup.py b/airbyte-integrations/connectors/source-postmarkapp/setup.py
index 08a9898829422..3c5e3ab4e6717 100644
--- a/airbyte-integrations/connectors/source-postmarkapp/setup.py
+++ b/airbyte-integrations/connectors/source-postmarkapp/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-postmarkapp=source_postmarkapp.run:run",
+        ],
+    },
     name="source_postmarkapp",
     description="Source implementation for Postmarkapp.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-postmarkapp/source_postmarkapp/run.py b/airbyte-integrations/connectors/source-postmarkapp/source_postmarkapp/run.py
new file mode 100644
index 0000000000000..b3308b251000d
--- /dev/null
+++ b/airbyte-integrations/connectors/source-postmarkapp/source_postmarkapp/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_postmarkapp import SourcePostmarkapp
+
+
+def run():
+    source = SourcePostmarkapp()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-prestashop/main.py b/airbyte-integrations/connectors/source-prestashop/main.py
index 813f7411045f3..e51c47a996aa4 100644
--- a/airbyte-integrations/connectors/source-prestashop/main.py
+++ b/airbyte-integrations/connectors/source-prestashop/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_prestashop import SourcePrestashop
+from source_prestashop.run import run
 
 if __name__ == "__main__":
-    source = SourcePrestashop()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-prestashop/setup.py b/airbyte-integrations/connectors/source-prestashop/setup.py
index 4762aa8a2eaf0..e883c046c0afd 100644
--- a/airbyte-integrations/connectors/source-prestashop/setup.py
+++ b/airbyte-integrations/connectors/source-prestashop/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-prestashop=source_prestashop.run:run",
+        ],
+    },
     name="source_prestashop",
     description="Source implementation for PrestaShop.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-prestashop/source_prestashop/run.py b/airbyte-integrations/connectors/source-prestashop/source_prestashop/run.py
new file mode 100644
index 0000000000000..23f77c77bf558
--- /dev/null
+++ b/airbyte-integrations/connectors/source-prestashop/source_prestashop/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_prestashop import SourcePrestashop
+
+
+def run():
+    source = SourcePrestashop()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-primetric/main.py b/airbyte-integrations/connectors/source-primetric/main.py
index 3cbd6368b2cf0..3cb9977197cc0 100644
--- a/airbyte-integrations/connectors/source-primetric/main.py
+++ b/airbyte-integrations/connectors/source-primetric/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_primetric import SourcePrimetric
+from source_primetric.run import run
 
 if __name__ == "__main__":
-    source = SourcePrimetric()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-primetric/setup.py b/airbyte-integrations/connectors/source-primetric/setup.py
index 00a6f81dc6b3f..d73e7ee77688c 100644
--- a/airbyte-integrations/connectors/source-primetric/setup.py
+++ b/airbyte-integrations/connectors/source-primetric/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-primetric=source_primetric.run:run",
+        ],
+    },
     name="source_primetric",
     description="Source implementation for Primetric.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-primetric/source_primetric/run.py b/airbyte-integrations/connectors/source-primetric/source_primetric/run.py
new file mode 100644
index 0000000000000..729752166581a
--- /dev/null
+++ b/airbyte-integrations/connectors/source-primetric/source_primetric/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_primetric import SourcePrimetric
+
+
+def run():
+    source = SourcePrimetric()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-public-apis/main.py b/airbyte-integrations/connectors/source-public-apis/main.py
index c5ad4ac06bd93..c9796a4aa4ef6 100644
--- a/airbyte-integrations/connectors/source-public-apis/main.py
+++ b/airbyte-integrations/connectors/source-public-apis/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_public_apis import SourcePublicApis
+from source_public_apis.run import run
 
 if __name__ == "__main__":
-    source = SourcePublicApis()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-public-apis/setup.py b/airbyte-integrations/connectors/source-public-apis/setup.py
index 8e3f218e28f7a..d454fb726a25d 100644
--- a/airbyte-integrations/connectors/source-public-apis/setup.py
+++ b/airbyte-integrations/connectors/source-public-apis/setup.py
@@ -12,13 +12,30 @@
 TEST_REQUIREMENTS = ["requests-mock~=1.9.3", "pytest~=6.2", "pytest-mock~=3.6.1"]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-public-apis=source_public_apis.run:run",
+        ],
+    },
     name="source_public_apis",
     description="Source implementation for Public Apis.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-public-apis/source_public_apis/run.py b/airbyte-integrations/connectors/source-public-apis/source_public_apis/run.py
new file mode 100644
index 0000000000000..b4927fb5a5e29
--- /dev/null
+++ b/airbyte-integrations/connectors/source-public-apis/source_public_apis/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_public_apis import SourcePublicApis
+
+
+def run():
+    source = SourcePublicApis()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-punk-api/main.py b/airbyte-integrations/connectors/source-punk-api/main.py
index c16f1cc798dc2..bd3661bdabfc7 100644
--- a/airbyte-integrations/connectors/source-punk-api/main.py
+++ b/airbyte-integrations/connectors/source-punk-api/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_punk_api import SourcePunkApi
+from source_punk_api.run import run
 
 if __name__ == "__main__":
-    source = SourcePunkApi()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-punk-api/setup.py b/airbyte-integrations/connectors/source-punk-api/setup.py
index 6e0119b0fd17d..834098b436feb 100644
--- a/airbyte-integrations/connectors/source-punk-api/setup.py
+++ b/airbyte-integrations/connectors/source-punk-api/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-punk-api=source_punk_api.run:run",
+        ],
+    },
     name="source_punk_api",
     description="Source implementation for Punk Api.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-punk-api/source_punk_api/run.py b/airbyte-integrations/connectors/source-punk-api/source_punk_api/run.py
new file mode 100644
index 0000000000000..f1a31bfed3f7a
--- /dev/null
+++ b/airbyte-integrations/connectors/source-punk-api/source_punk_api/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_punk_api import SourcePunkApi
+
+
+def run():
+    source = SourcePunkApi()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-pypi/main.py b/airbyte-integrations/connectors/source-pypi/main.py
index a61df9711f418..44f5f367986f5 100644
--- a/airbyte-integrations/connectors/source-pypi/main.py
+++ b/airbyte-integrations/connectors/source-pypi/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_pypi import SourcePypi
+from source_pypi.run import run
 
 if __name__ == "__main__":
-    source = SourcePypi()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-pypi/setup.py b/airbyte-integrations/connectors/source-pypi/setup.py
index ae9a89a654a59..b1198fecaead6 100644
--- a/airbyte-integrations/connectors/source-pypi/setup.py
+++ b/airbyte-integrations/connectors/source-pypi/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-pypi=source_pypi.run:run",
+        ],
+    },
     name="source_pypi",
     description="Source implementation for Pypi.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-pypi/source_pypi/run.py b/airbyte-integrations/connectors/source-pypi/source_pypi/run.py
new file mode 100644
index 0000000000000..5fc71c441a593
--- /dev/null
+++ b/airbyte-integrations/connectors/source-pypi/source_pypi/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_pypi import SourcePypi
+
+
+def run():
+    source = SourcePypi()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-python-http-tutorial/main.py b/airbyte-integrations/connectors/source-python-http-tutorial/main.py
index e13b685ed7d46..57dce4e0679c9 100644
--- a/airbyte-integrations/connectors/source-python-http-tutorial/main.py
+++ b/airbyte-integrations/connectors/source-python-http-tutorial/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_python_http_tutorial import SourcePythonHttpTutorial
+from source_python_http_tutorial.run import run
 
 if __name__ == "__main__":
-    source = SourcePythonHttpTutorial()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-python-http-tutorial/setup.py b/airbyte-integrations/connectors/source-python-http-tutorial/setup.py
index 473e22de73aa1..be40ba5ca6c62 100644
--- a/airbyte-integrations/connectors/source-python-http-tutorial/setup.py
+++ b/airbyte-integrations/connectors/source-python-http-tutorial/setup.py
@@ -5,6 +5,11 @@
 from setuptools import find_packages, setup
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-python-http-tutorial=source_python_http_tutorial.run:run",
+        ],
+    },
     name="source_python_http_tutorial",
     description="Source implementation for Python Http Tutorial.",
     author="Airbyte",
diff --git a/airbyte-integrations/connectors/source-python-http-tutorial/source_python_http_tutorial/run.py b/airbyte-integrations/connectors/source-python-http-tutorial/source_python_http_tutorial/run.py
new file mode 100644
index 0000000000000..60690aa68eff7
--- /dev/null
+++ b/airbyte-integrations/connectors/source-python-http-tutorial/source_python_http_tutorial/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_python_http_tutorial import SourcePythonHttpTutorial
+
+
+def run():
+    source = SourcePythonHttpTutorial()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-qonto/main.py b/airbyte-integrations/connectors/source-qonto/main.py
index 749ae981779fc..eb2e90e366c1f 100644
--- a/airbyte-integrations/connectors/source-qonto/main.py
+++ b/airbyte-integrations/connectors/source-qonto/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_qonto import SourceQonto
+from source_qonto.run import run
 
 if __name__ == "__main__":
-    source = SourceQonto()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-qonto/setup.py b/airbyte-integrations/connectors/source-qonto/setup.py
index 8847f94437619..ba340d0b242a2 100644
--- a/airbyte-integrations/connectors/source-qonto/setup.py
+++ b/airbyte-integrations/connectors/source-qonto/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-qonto=source_qonto.run:run",
+        ],
+    },
     name="source_qonto",
     description="Source implementation for Qonto.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-qonto/source_qonto/run.py b/airbyte-integrations/connectors/source-qonto/source_qonto/run.py
new file mode 100644
index 0000000000000..0ea8c8470c1f0
--- /dev/null
+++ b/airbyte-integrations/connectors/source-qonto/source_qonto/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_qonto import SourceQonto
+
+
+def run():
+    source = SourceQonto()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-qualaroo/main.py b/airbyte-integrations/connectors/source-qualaroo/main.py
index 149d1ab5a20f7..7a7ed24a96bf8 100644
--- a/airbyte-integrations/connectors/source-qualaroo/main.py
+++ b/airbyte-integrations/connectors/source-qualaroo/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_qualaroo import SourceQualaroo
+from source_qualaroo.run import run
 
 if __name__ == "__main__":
-    source = SourceQualaroo()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-qualaroo/setup.py b/airbyte-integrations/connectors/source-qualaroo/setup.py
index 840126cac8fbe..24bf8b993372b 100644
--- a/airbyte-integrations/connectors/source-qualaroo/setup.py
+++ b/airbyte-integrations/connectors/source-qualaroo/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-qualaroo=source_qualaroo.run:run",
+        ],
+    },
     name="source_qualaroo",
     description="Source implementation for Qualaroo.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-qualaroo/source_qualaroo/run.py b/airbyte-integrations/connectors/source-qualaroo/source_qualaroo/run.py
new file mode 100644
index 0000000000000..c6b4c65009e5b
--- /dev/null
+++ b/airbyte-integrations/connectors/source-qualaroo/source_qualaroo/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_qualaroo import SourceQualaroo
+
+
+def run():
+    source = SourceQualaroo()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-quickbooks/main.py b/airbyte-integrations/connectors/source-quickbooks/main.py
index c475c3cf97fd5..abeed13585f59 100644
--- a/airbyte-integrations/connectors/source-quickbooks/main.py
+++ b/airbyte-integrations/connectors/source-quickbooks/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_quickbooks import SourceQuickbooks
+from source_quickbooks.run import run
 
 if __name__ == "__main__":
-    source = SourceQuickbooks()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-quickbooks/setup.py b/airbyte-integrations/connectors/source-quickbooks/setup.py
index 47ca1b1285055..ac3c35cb290ff 100644
--- a/airbyte-integrations/connectors/source-quickbooks/setup.py
+++ b/airbyte-integrations/connectors/source-quickbooks/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-quickbooks=source_quickbooks.run:run",
+        ],
+    },
     name="source_quickbooks",
     description="Source implementation for Quickbooks.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-quickbooks/source_quickbooks/run.py b/airbyte-integrations/connectors/source-quickbooks/source_quickbooks/run.py
new file mode 100644
index 0000000000000..4e5d18504e8d3
--- /dev/null
+++ b/airbyte-integrations/connectors/source-quickbooks/source_quickbooks/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_quickbooks import SourceQuickbooks
+
+
+def run():
+    source = SourceQuickbooks()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-railz/main.py b/airbyte-integrations/connectors/source-railz/main.py
index 03bea5dbba8a7..bfa6b9fadb2f3 100644
--- a/airbyte-integrations/connectors/source-railz/main.py
+++ b/airbyte-integrations/connectors/source-railz/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_railz import SourceRailz
+from source_railz.run import run
 
 if __name__ == "__main__":
-    source = SourceRailz()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-railz/setup.py b/airbyte-integrations/connectors/source-railz/setup.py
index 3b938dc45ff50..37478efb8ddc1 100644
--- a/airbyte-integrations/connectors/source-railz/setup.py
+++ b/airbyte-integrations/connectors/source-railz/setup.py
@@ -19,13 +19,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-railz=source_railz.run:run",
+        ],
+    },
     name="source_railz",
     description="Source implementation for Railz.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-railz/source_railz/run.py b/airbyte-integrations/connectors/source-railz/source_railz/run.py
new file mode 100644
index 0000000000000..831b665a05da6
--- /dev/null
+++ b/airbyte-integrations/connectors/source-railz/source_railz/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_railz import SourceRailz
+
+
+def run():
+    source = SourceRailz()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-rd-station-marketing/main.py b/airbyte-integrations/connectors/source-rd-station-marketing/main.py
index b5e333d8a220d..5210a9fdc2b34 100644
--- a/airbyte-integrations/connectors/source-rd-station-marketing/main.py
+++ b/airbyte-integrations/connectors/source-rd-station-marketing/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_rd_station_marketing import SourceRDStationMarketing
+from source_rd_station_marketing.run import run
 
 if __name__ == "__main__":
-    source = SourceRDStationMarketing()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-rd-station-marketing/setup.py b/airbyte-integrations/connectors/source-rd-station-marketing/setup.py
index fc5481e12eb5b..039dd82b7d54f 100644
--- a/airbyte-integrations/connectors/source-rd-station-marketing/setup.py
+++ b/airbyte-integrations/connectors/source-rd-station-marketing/setup.py
@@ -17,13 +17,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-rd-station-marketing=source_rd_station_marketing.run:run",
+        ],
+    },
     name="source_rd_station_marketing",
     description="Source implementation for RD Station Marketing.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-rd-station-marketing/source_rd_station_marketing/run.py b/airbyte-integrations/connectors/source-rd-station-marketing/source_rd_station_marketing/run.py
new file mode 100644
index 0000000000000..c684a12ed29fd
--- /dev/null
+++ b/airbyte-integrations/connectors/source-rd-station-marketing/source_rd_station_marketing/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_rd_station_marketing import SourceRDStationMarketing
+
+
+def run():
+    source = SourceRDStationMarketing()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-recharge/main.py b/airbyte-integrations/connectors/source-recharge/main.py
index c61ef445b68d9..d8ccf40b711ea 100644
--- a/airbyte-integrations/connectors/source-recharge/main.py
+++ b/airbyte-integrations/connectors/source-recharge/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_recharge import SourceRecharge
+from source_recharge.run import run
 
 if __name__ == "__main__":
-    source = SourceRecharge()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-recharge/setup.py b/airbyte-integrations/connectors/source-recharge/setup.py
index bb091a439b28b..d51c828ffa5b4 100644
--- a/airbyte-integrations/connectors/source-recharge/setup.py
+++ b/airbyte-integrations/connectors/source-recharge/setup.py
@@ -16,6 +16,11 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-recharge=source_recharge.run:run",
+        ],
+    },
     name="source_recharge",
     description="Source implementation for Recharge.",
     author="Airbyte",
diff --git a/airbyte-integrations/connectors/source-recharge/source_recharge/run.py b/airbyte-integrations/connectors/source-recharge/source_recharge/run.py
new file mode 100644
index 0000000000000..2a56566c41c2b
--- /dev/null
+++ b/airbyte-integrations/connectors/source-recharge/source_recharge/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_recharge import SourceRecharge
+
+
+def run():
+    source = SourceRecharge()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-recreation/main.py b/airbyte-integrations/connectors/source-recreation/main.py
index f126b44607d6a..6847e93aab46b 100644
--- a/airbyte-integrations/connectors/source-recreation/main.py
+++ b/airbyte-integrations/connectors/source-recreation/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_recreation import SourceRecreation
+from source_recreation.run import run
 
 if __name__ == "__main__":
-    source = SourceRecreation()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-recreation/setup.py b/airbyte-integrations/connectors/source-recreation/setup.py
index 26e4b5657f8a1..9f41baeed4b1f 100644
--- a/airbyte-integrations/connectors/source-recreation/setup.py
+++ b/airbyte-integrations/connectors/source-recreation/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-recreation=source_recreation.run:run",
+        ],
+    },
     name="source_recreation",
     description="Source implementation for Recreation.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-recreation/source_recreation/run.py b/airbyte-integrations/connectors/source-recreation/source_recreation/run.py
new file mode 100644
index 0000000000000..2f8b496ad6950
--- /dev/null
+++ b/airbyte-integrations/connectors/source-recreation/source_recreation/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_recreation import SourceRecreation
+
+
+def run():
+    source = SourceRecreation()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-recruitee/main.py b/airbyte-integrations/connectors/source-recruitee/main.py
index 8d918eec10e2e..26802f658cda7 100644
--- a/airbyte-integrations/connectors/source-recruitee/main.py
+++ b/airbyte-integrations/connectors/source-recruitee/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_recruitee import SourceRecruitee
+from source_recruitee.run import run
 
 if __name__ == "__main__":
-    source = SourceRecruitee()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-recruitee/setup.py b/airbyte-integrations/connectors/source-recruitee/setup.py
index d2b12eff3c686..c03d7631bd28f 100644
--- a/airbyte-integrations/connectors/source-recruitee/setup.py
+++ b/airbyte-integrations/connectors/source-recruitee/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-recruitee=source_recruitee.run:run",
+        ],
+    },
     name="source_recruitee",
     description="Source implementation for Recruitee.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-recruitee/source_recruitee/run.py b/airbyte-integrations/connectors/source-recruitee/source_recruitee/run.py
new file mode 100644
index 0000000000000..3d4111901af27
--- /dev/null
+++ b/airbyte-integrations/connectors/source-recruitee/source_recruitee/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_recruitee import SourceRecruitee
+
+
+def run():
+    source = SourceRecruitee()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-recurly/main.py b/airbyte-integrations/connectors/source-recurly/main.py
index 251a30f0dffe1..ba5c26176fde6 100644
--- a/airbyte-integrations/connectors/source-recurly/main.py
+++ b/airbyte-integrations/connectors/source-recurly/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_recurly import SourceRecurly
+from source_recurly.run import run
 
 if __name__ == "__main__":
-    source = SourceRecurly()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-recurly/setup.py b/airbyte-integrations/connectors/source-recurly/setup.py
index 1d278d40ec9f7..16e2364aeb01c 100644
--- a/airbyte-integrations/connectors/source-recurly/setup.py
+++ b/airbyte-integrations/connectors/source-recurly/setup.py
@@ -14,6 +14,11 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-recurly=source_recurly.run:run",
+        ],
+    },
     name="source_recurly",
     description="Source implementation for Recurly.",
     author="Airbyte",
diff --git a/airbyte-integrations/connectors/source-recurly/source_recurly/run.py b/airbyte-integrations/connectors/source-recurly/source_recurly/run.py
new file mode 100644
index 0000000000000..746b6556605cc
--- /dev/null
+++ b/airbyte-integrations/connectors/source-recurly/source_recurly/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_recurly import SourceRecurly
+
+
+def run():
+    source = SourceRecurly()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-reply-io/main.py b/airbyte-integrations/connectors/source-reply-io/main.py
index 879d184cebcda..ebe3ff2bfe7bc 100644
--- a/airbyte-integrations/connectors/source-reply-io/main.py
+++ b/airbyte-integrations/connectors/source-reply-io/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_reply_io import SourceReplyIo
+from source_reply_io.run import run
 
 if __name__ == "__main__":
-    source = SourceReplyIo()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-reply-io/setup.py b/airbyte-integrations/connectors/source-reply-io/setup.py
index bc4d841b50fca..4b8ad096a754c 100644
--- a/airbyte-integrations/connectors/source-reply-io/setup.py
+++ b/airbyte-integrations/connectors/source-reply-io/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-reply-io=source_reply_io.run:run",
+        ],
+    },
     name="source_reply_io",
     description="Source implementation for Reply Io.",
     author="Elliot Trabac",
     author_email="elliot.trabac1@gmail.com",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-reply-io/source_reply_io/run.py b/airbyte-integrations/connectors/source-reply-io/source_reply_io/run.py
new file mode 100644
index 0000000000000..e740b708c45a6
--- /dev/null
+++ b/airbyte-integrations/connectors/source-reply-io/source_reply_io/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_reply_io import SourceReplyIo
+
+
+def run():
+    source = SourceReplyIo()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-retently/main.py b/airbyte-integrations/connectors/source-retently/main.py
index 4aafda0c119f4..dec9d2267e7b6 100644
--- a/airbyte-integrations/connectors/source-retently/main.py
+++ b/airbyte-integrations/connectors/source-retently/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_retently import SourceRetently
+from source_retently.run import run
 
 if __name__ == "__main__":
-    source = SourceRetently()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-retently/setup.py b/airbyte-integrations/connectors/source-retently/setup.py
index 707ffcee736f1..daf9a0a93efc1 100644
--- a/airbyte-integrations/connectors/source-retently/setup.py
+++ b/airbyte-integrations/connectors/source-retently/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-retently=source_retently.run:run",
+        ],
+    },
     name="source_retently",
     description="Source implementation for Retently.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-retently/source_retently/run.py b/airbyte-integrations/connectors/source-retently/source_retently/run.py
new file mode 100644
index 0000000000000..4e0687b5c6a91
--- /dev/null
+++ b/airbyte-integrations/connectors/source-retently/source_retently/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_retently import SourceRetently
+
+
+def run():
+    source = SourceRetently()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-ringcentral/main.py b/airbyte-integrations/connectors/source-ringcentral/main.py
index cb412fcab28f2..12f2eb4285cc0 100644
--- a/airbyte-integrations/connectors/source-ringcentral/main.py
+++ b/airbyte-integrations/connectors/source-ringcentral/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_ringcentral import SourceRingcentral
+from source_ringcentral.run import run
 
 if __name__ == "__main__":
-    source = SourceRingcentral()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-ringcentral/setup.py b/airbyte-integrations/connectors/source-ringcentral/setup.py
index a0a34d080b35a..90d664f5d9f60 100644
--- a/airbyte-integrations/connectors/source-ringcentral/setup.py
+++ b/airbyte-integrations/connectors/source-ringcentral/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-ringcentral=source_ringcentral.run:run",
+        ],
+    },
     name="source_ringcentral",
     description="Source implementation for Ringcentral.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-ringcentral/source_ringcentral/run.py b/airbyte-integrations/connectors/source-ringcentral/source_ringcentral/run.py
new file mode 100644
index 0000000000000..f203a14ce2d15
--- /dev/null
+++ b/airbyte-integrations/connectors/source-ringcentral/source_ringcentral/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_ringcentral import SourceRingcentral
+
+
+def run():
+    source = SourceRingcentral()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-rki-covid/main.py b/airbyte-integrations/connectors/source-rki-covid/main.py
index 7b345c79d6d57..a104106001cb1 100644
--- a/airbyte-integrations/connectors/source-rki-covid/main.py
+++ b/airbyte-integrations/connectors/source-rki-covid/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_rki_covid import SourceRkiCovid
+from source_rki_covid.run import run
 
 if __name__ == "__main__":
-    source = SourceRkiCovid()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-rki-covid/setup.py b/airbyte-integrations/connectors/source-rki-covid/setup.py
index 4c8abfd776743..78722548d0b10 100644
--- a/airbyte-integrations/connectors/source-rki-covid/setup.py
+++ b/airbyte-integrations/connectors/source-rki-covid/setup.py
@@ -12,6 +12,11 @@
 TEST_REQUIREMENTS = ["requests-mock~=1.9.3", "pytest~=6.1", "pytest-mock~=3.6.1", "airbyte-cdk"]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-rki-covid=source_rki_covid.run:run",
+        ],
+    },
     name="source_rki_covid",
     description="Source implementation for Rki Covid.",
     author="Airbyte",
diff --git a/airbyte-integrations/connectors/source-rki-covid/source_rki_covid/run.py b/airbyte-integrations/connectors/source-rki-covid/source_rki_covid/run.py
new file mode 100644
index 0000000000000..dc5cdd95d152a
--- /dev/null
+++ b/airbyte-integrations/connectors/source-rki-covid/source_rki_covid/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_rki_covid import SourceRkiCovid
+
+
+def run():
+    source = SourceRkiCovid()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-rocket-chat/main.py b/airbyte-integrations/connectors/source-rocket-chat/main.py
index befcababa0fec..3e9e4cdfb68ed 100644
--- a/airbyte-integrations/connectors/source-rocket-chat/main.py
+++ b/airbyte-integrations/connectors/source-rocket-chat/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_rocket_chat import SourceRocketChat
+from source_rocket_chat.run import run
 
 if __name__ == "__main__":
-    source = SourceRocketChat()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-rocket-chat/setup.py b/airbyte-integrations/connectors/source-rocket-chat/setup.py
index 86e7d41371abb..0dea0d1fba8fb 100644
--- a/airbyte-integrations/connectors/source-rocket-chat/setup.py
+++ b/airbyte-integrations/connectors/source-rocket-chat/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-rocket-chat=source_rocket_chat.run:run",
+        ],
+    },
     name="source_rocket_chat",
     description="Source implementation for Rocket Chat.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-rocket-chat/source_rocket_chat/run.py b/airbyte-integrations/connectors/source-rocket-chat/source_rocket_chat/run.py
new file mode 100644
index 0000000000000..1cb56e2819783
--- /dev/null
+++ b/airbyte-integrations/connectors/source-rocket-chat/source_rocket_chat/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_rocket_chat import SourceRocketChat
+
+
+def run():
+    source = SourceRocketChat()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-rss/main.py b/airbyte-integrations/connectors/source-rss/main.py
index 967135ca32542..9e21c3c977934 100644
--- a/airbyte-integrations/connectors/source-rss/main.py
+++ b/airbyte-integrations/connectors/source-rss/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_rss import SourceRss
+from source_rss.run import run
 
 if __name__ == "__main__":
-    source = SourceRss()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-rss/setup.py b/airbyte-integrations/connectors/source-rss/setup.py
index 7bd87cde621ba..f49ef214cb6ab 100644
--- a/airbyte-integrations/connectors/source-rss/setup.py
+++ b/airbyte-integrations/connectors/source-rss/setup.py
@@ -14,13 +14,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-rss=source_rss.run:run",
+        ],
+    },
     name="source_rss",
     description="Source implementation for Rss.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-rss/source_rss/run.py b/airbyte-integrations/connectors/source-rss/source_rss/run.py
new file mode 100644
index 0000000000000..90f8a101fcfa1
--- /dev/null
+++ b/airbyte-integrations/connectors/source-rss/source_rss/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_rss import SourceRss
+
+
+def run():
+    source = SourceRss()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-salesforce/setup.py b/airbyte-integrations/connectors/source-salesforce/setup.py
index 4add132d7cb51..2e7fc4fff78d9 100644
--- a/airbyte-integrations/connectors/source-salesforce/setup.py
+++ b/airbyte-integrations/connectors/source-salesforce/setup.py
@@ -16,7 +16,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-salesloft/main.py b/airbyte-integrations/connectors/source-salesloft/main.py
index 8ee79923b9139..6ae4308e9ab64 100644
--- a/airbyte-integrations/connectors/source-salesloft/main.py
+++ b/airbyte-integrations/connectors/source-salesloft/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_salesloft import SourceSalesloft
+from source_salesloft.run import run
 
 if __name__ == "__main__":
-    source = SourceSalesloft()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-salesloft/setup.py b/airbyte-integrations/connectors/source-salesloft/setup.py
index bd9fc0a48179a..58bcf6176dd63 100644
--- a/airbyte-integrations/connectors/source-salesloft/setup.py
+++ b/airbyte-integrations/connectors/source-salesloft/setup.py
@@ -14,6 +14,11 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-salesloft=source_salesloft.run:run",
+        ],
+    },
     name="source_salesloft",
     description="Source implementation for Salesloft.",
     author="Airbyte",
diff --git a/airbyte-integrations/connectors/source-salesloft/source_salesloft/run.py b/airbyte-integrations/connectors/source-salesloft/source_salesloft/run.py
new file mode 100644
index 0000000000000..e68c3785893ce
--- /dev/null
+++ b/airbyte-integrations/connectors/source-salesloft/source_salesloft/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_salesloft import SourceSalesloft
+
+
+def run():
+    source = SourceSalesloft()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-sap-fieldglass/main.py b/airbyte-integrations/connectors/source-sap-fieldglass/main.py
index c9273ef8ae475..8d82309172892 100644
--- a/airbyte-integrations/connectors/source-sap-fieldglass/main.py
+++ b/airbyte-integrations/connectors/source-sap-fieldglass/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_sap_fieldglass import SourceSapFieldglass
+from source_sap_fieldglass.run import run
 
 if __name__ == "__main__":
-    source = SourceSapFieldglass()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-sap-fieldglass/setup.py b/airbyte-integrations/connectors/source-sap-fieldglass/setup.py
index 0f5e02083b5be..7365a4beb5ce0 100644
--- a/airbyte-integrations/connectors/source-sap-fieldglass/setup.py
+++ b/airbyte-integrations/connectors/source-sap-fieldglass/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-sap-fieldglass=source_sap_fieldglass.run:run",
+        ],
+    },
     name="source_sap_fieldglass",
     description="Source implementation for Sap Fieldglass.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-sap-fieldglass/source_sap_fieldglass/run.py b/airbyte-integrations/connectors/source-sap-fieldglass/source_sap_fieldglass/run.py
new file mode 100644
index 0000000000000..69768a3d9efc1
--- /dev/null
+++ b/airbyte-integrations/connectors/source-sap-fieldglass/source_sap_fieldglass/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_sap_fieldglass import SourceSapFieldglass
+
+
+def run():
+    source = SourceSapFieldglass()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-scaffold-source-http/main.py b/airbyte-integrations/connectors/source-scaffold-source-http/main.py
index f8030f72e9276..f51b0283a6812 100644
--- a/airbyte-integrations/connectors/source-scaffold-source-http/main.py
+++ b/airbyte-integrations/connectors/source-scaffold-source-http/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_scaffold_source_http import SourceScaffoldSourceHttp
+from source_scaffold_source_http.run import run
 
 if __name__ == "__main__":
-    source = SourceScaffoldSourceHttp()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-scaffold-source-http/setup.py b/airbyte-integrations/connectors/source-scaffold-source-http/setup.py
index 4fbb5fc38b4df..a7a496b521616 100644
--- a/airbyte-integrations/connectors/source-scaffold-source-http/setup.py
+++ b/airbyte-integrations/connectors/source-scaffold-source-http/setup.py
@@ -17,13 +17,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-scaffold-source-http=source_scaffold_source_http.run:run",
+        ],
+    },
     name="source_scaffold_source_http",
     description="Source implementation for Scaffold Source Http.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-scaffold-source-http/source_scaffold_source_http/run.py b/airbyte-integrations/connectors/source-scaffold-source-http/source_scaffold_source_http/run.py
new file mode 100644
index 0000000000000..94b4f015f312e
--- /dev/null
+++ b/airbyte-integrations/connectors/source-scaffold-source-http/source_scaffold_source_http/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_scaffold_source_http import SourceScaffoldSourceHttp
+
+
+def run():
+    source = SourceScaffoldSourceHttp()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-scaffold-source-python/main.py b/airbyte-integrations/connectors/source-scaffold-source-python/main.py
index 0b8a208301632..038eaf6dba553 100644
--- a/airbyte-integrations/connectors/source-scaffold-source-python/main.py
+++ b/airbyte-integrations/connectors/source-scaffold-source-python/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_scaffold_source_python import SourceScaffoldSourcePython
+from source_scaffold_source_python.run import run
 
 if __name__ == "__main__":
-    source = SourceScaffoldSourcePython()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-scaffold-source-python/setup.py b/airbyte-integrations/connectors/source-scaffold-source-python/setup.py
index b302f081011f3..d4b3ebe7601b7 100644
--- a/airbyte-integrations/connectors/source-scaffold-source-python/setup.py
+++ b/airbyte-integrations/connectors/source-scaffold-source-python/setup.py
@@ -17,6 +17,11 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-scaffold-source-python=source_scaffold_source_python.run:run",
+        ],
+    },
     name="source_scaffold_source_python",
     description="Source implementation for Scaffold Source Python.",
     author="Airbyte",
diff --git a/airbyte-integrations/connectors/source-scaffold-source-python/source_scaffold_source_python/run.py b/airbyte-integrations/connectors/source-scaffold-source-python/source_scaffold_source_python/run.py
new file mode 100644
index 0000000000000..6bb55fc68e7d6
--- /dev/null
+++ b/airbyte-integrations/connectors/source-scaffold-source-python/source_scaffold_source_python/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_scaffold_source_python import SourceScaffoldSourcePython
+
+
+def run():
+    source = SourceScaffoldSourcePython()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-search-metrics/main.py b/airbyte-integrations/connectors/source-search-metrics/main.py
index c07a9cf2a41ba..29e5e8a133a67 100644
--- a/airbyte-integrations/connectors/source-search-metrics/main.py
+++ b/airbyte-integrations/connectors/source-search-metrics/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_search_metrics import SourceSearchMetrics
+from source_search_metrics.run import run
 
 if __name__ == "__main__":
-    source = SourceSearchMetrics()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-search-metrics/setup.py b/airbyte-integrations/connectors/source-search-metrics/setup.py
index fda5333cc2aeb..dfc33d408c228 100644
--- a/airbyte-integrations/connectors/source-search-metrics/setup.py
+++ b/airbyte-integrations/connectors/source-search-metrics/setup.py
@@ -16,6 +16,11 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-search-metrics=source_search_metrics.run:run",
+        ],
+    },
     name="source_search_metrics",
     description="Source implementation for Search Metrics.",
     author="Airbyte",
diff --git a/airbyte-integrations/connectors/source-search-metrics/source_search_metrics/run.py b/airbyte-integrations/connectors/source-search-metrics/source_search_metrics/run.py
new file mode 100644
index 0000000000000..29a0ebc75addd
--- /dev/null
+++ b/airbyte-integrations/connectors/source-search-metrics/source_search_metrics/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_search_metrics import SourceSearchMetrics
+
+
+def run():
+    source = SourceSearchMetrics()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-secoda/main.py b/airbyte-integrations/connectors/source-secoda/main.py
index 81d52e2f8a48d..96bc9de24afaa 100644
--- a/airbyte-integrations/connectors/source-secoda/main.py
+++ b/airbyte-integrations/connectors/source-secoda/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_secoda import SourceSecoda
+from source_secoda.run import run
 
 if __name__ == "__main__":
-    source = SourceSecoda()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-secoda/setup.py b/airbyte-integrations/connectors/source-secoda/setup.py
index 3b603c1d6e21c..b80c65173e946 100644
--- a/airbyte-integrations/connectors/source-secoda/setup.py
+++ b/airbyte-integrations/connectors/source-secoda/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-secoda=source_secoda.run:run",
+        ],
+    },
     name="source_secoda",
     description="Source implementation for Secoda.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-secoda/source_secoda/run.py b/airbyte-integrations/connectors/source-secoda/source_secoda/run.py
new file mode 100644
index 0000000000000..ed456d531ce18
--- /dev/null
+++ b/airbyte-integrations/connectors/source-secoda/source_secoda/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_secoda import SourceSecoda
+
+
+def run():
+    source = SourceSecoda()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-sendgrid/main.py b/airbyte-integrations/connectors/source-sendgrid/main.py
index f9720b12f1c8a..e1c5a04db60d9 100644
--- a/airbyte-integrations/connectors/source-sendgrid/main.py
+++ b/airbyte-integrations/connectors/source-sendgrid/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_sendgrid import SourceSendgrid
+from source_sendgrid.run import run
 
 if __name__ == "__main__":
-    source = SourceSendgrid()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-sendgrid/setup.py b/airbyte-integrations/connectors/source-sendgrid/setup.py
index 64dc92cce236b..0bfa4f9dd3b2a 100644
--- a/airbyte-integrations/connectors/source-sendgrid/setup.py
+++ b/airbyte-integrations/connectors/source-sendgrid/setup.py
@@ -14,6 +14,11 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-sendgrid=source_sendgrid.run:run",
+        ],
+    },
     name="source_sendgrid",
     description="Source implementation for Sendgrid.",
     author="Airbyte",
diff --git a/airbyte-integrations/connectors/source-sendgrid/source_sendgrid/run.py b/airbyte-integrations/connectors/source-sendgrid/source_sendgrid/run.py
new file mode 100644
index 0000000000000..d2c1b798edb94
--- /dev/null
+++ b/airbyte-integrations/connectors/source-sendgrid/source_sendgrid/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_sendgrid import SourceSendgrid
+
+
+def run():
+    source = SourceSendgrid()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-sendinblue/main.py b/airbyte-integrations/connectors/source-sendinblue/main.py
index 8f9399e259f24..7227005ddf6ff 100644
--- a/airbyte-integrations/connectors/source-sendinblue/main.py
+++ b/airbyte-integrations/connectors/source-sendinblue/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_sendinblue import SourceSendinblue
+from source_sendinblue.run import run
 
 if __name__ == "__main__":
-    source = SourceSendinblue()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-sendinblue/setup.py b/airbyte-integrations/connectors/source-sendinblue/setup.py
index 0b5269c46b84f..e452b66f447ae 100644
--- a/airbyte-integrations/connectors/source-sendinblue/setup.py
+++ b/airbyte-integrations/connectors/source-sendinblue/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-sendinblue=source_sendinblue.run:run",
+        ],
+    },
     name="source_sendinblue",
     description="Source implementation for Sendinblue.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-sendinblue/source_sendinblue/run.py b/airbyte-integrations/connectors/source-sendinblue/source_sendinblue/run.py
new file mode 100644
index 0000000000000..fbf77ce5a97a7
--- /dev/null
+++ b/airbyte-integrations/connectors/source-sendinblue/source_sendinblue/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_sendinblue import SourceSendinblue
+
+
+def run():
+    source = SourceSendinblue()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-senseforce/main.py b/airbyte-integrations/connectors/source-senseforce/main.py
index ba269b9ba0ef3..3a6a5e7fd4c7d 100644
--- a/airbyte-integrations/connectors/source-senseforce/main.py
+++ b/airbyte-integrations/connectors/source-senseforce/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_senseforce import SourceSenseforce
+from source_senseforce.run import run
 
 if __name__ == "__main__":
-    source = SourceSenseforce()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-senseforce/setup.py b/airbyte-integrations/connectors/source-senseforce/setup.py
index 976590623a830..4c653a13c824a 100644
--- a/airbyte-integrations/connectors/source-senseforce/setup.py
+++ b/airbyte-integrations/connectors/source-senseforce/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-senseforce=source_senseforce.run:run",
+        ],
+    },
     name="source_senseforce",
     description="Source implementation for Senseforce.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-senseforce/source_senseforce/run.py b/airbyte-integrations/connectors/source-senseforce/source_senseforce/run.py
new file mode 100644
index 0000000000000..944e3468fed7e
--- /dev/null
+++ b/airbyte-integrations/connectors/source-senseforce/source_senseforce/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_senseforce import SourceSenseforce
+
+
+def run():
+    source = SourceSenseforce()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-sentry/main.py b/airbyte-integrations/connectors/source-sentry/main.py
index 0844bc450390c..1c7adc746e974 100644
--- a/airbyte-integrations/connectors/source-sentry/main.py
+++ b/airbyte-integrations/connectors/source-sentry/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_sentry import SourceSentry
+from source_sentry.run import run
 
 if __name__ == "__main__":
-    source = SourceSentry()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-sentry/setup.py b/airbyte-integrations/connectors/source-sentry/setup.py
index 18d172dcd9422..d1677c524a4d1 100644
--- a/airbyte-integrations/connectors/source-sentry/setup.py
+++ b/airbyte-integrations/connectors/source-sentry/setup.py
@@ -17,6 +17,11 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-sentry=source_sentry.run:run",
+        ],
+    },
     name="source_sentry",
     description="Source implementation for Sentry.",
     author="Airbyte",
diff --git a/airbyte-integrations/connectors/source-sentry/source_sentry/run.py b/airbyte-integrations/connectors/source-sentry/source_sentry/run.py
new file mode 100644
index 0000000000000..acf82b00a03dd
--- /dev/null
+++ b/airbyte-integrations/connectors/source-sentry/source_sentry/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_sentry import SourceSentry
+
+
+def run():
+    source = SourceSentry()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-serpstat/main.py b/airbyte-integrations/connectors/source-serpstat/main.py
index 92fb7edc04743..75c87dbf86f9f 100644
--- a/airbyte-integrations/connectors/source-serpstat/main.py
+++ b/airbyte-integrations/connectors/source-serpstat/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_serpstat import SourceSerpstat
+from source_serpstat.run import run
 
 if __name__ == "__main__":
-    source = SourceSerpstat()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-serpstat/setup.py b/airbyte-integrations/connectors/source-serpstat/setup.py
index 42ab32a171b05..9c7f530242680 100644
--- a/airbyte-integrations/connectors/source-serpstat/setup.py
+++ b/airbyte-integrations/connectors/source-serpstat/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-serpstat=source_serpstat.run:run",
+        ],
+    },
     name="source_serpstat",
     description="Source implementation for Serpstat.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-serpstat/source_serpstat/run.py b/airbyte-integrations/connectors/source-serpstat/source_serpstat/run.py
new file mode 100644
index 0000000000000..3dc6051ee8f8b
--- /dev/null
+++ b/airbyte-integrations/connectors/source-serpstat/source_serpstat/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_serpstat import SourceSerpstat
+
+
+def run():
+    source = SourceSerpstat()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-sftp-bulk/main.py b/airbyte-integrations/connectors/source-sftp-bulk/main.py
index c2b1e7afb5b3e..9e6488da04cc2 100644
--- a/airbyte-integrations/connectors/source-sftp-bulk/main.py
+++ b/airbyte-integrations/connectors/source-sftp-bulk/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_sftp_bulk import SourceFtp
+from source_sftp_bulk.run import run
 
 if __name__ == "__main__":
-    source = SourceFtp()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-sftp-bulk/setup.py b/airbyte-integrations/connectors/source-sftp-bulk/setup.py
index 6d9d1990f6349..e09d478f90079 100644
--- a/airbyte-integrations/connectors/source-sftp-bulk/setup.py
+++ b/airbyte-integrations/connectors/source-sftp-bulk/setup.py
@@ -16,6 +16,11 @@
 TEST_REQUIREMENTS = ["requests-mock~=1.9.3", "pytest-mock~=3.6.1", "pytest~=6.1", "docker==5.0.3"]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-sftp-bulk=source_sftp_bulk.run:run",
+        ],
+    },
     name="source_sftp_bulk",
     description="Source implementation for SFTP Bulk.",
     author="Airbyte",
diff --git a/airbyte-integrations/connectors/source-sftp-bulk/source_sftp_bulk/run.py b/airbyte-integrations/connectors/source-sftp-bulk/source_sftp_bulk/run.py
new file mode 100644
index 0000000000000..c3e00b8100cd0
--- /dev/null
+++ b/airbyte-integrations/connectors/source-sftp-bulk/source_sftp_bulk/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_sftp_bulk import SourceFtp
+
+
+def run():
+    source = SourceFtp()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-shortio/main.py b/airbyte-integrations/connectors/source-shortio/main.py
index 0c6be2ce44690..eaef1e24f90de 100644
--- a/airbyte-integrations/connectors/source-shortio/main.py
+++ b/airbyte-integrations/connectors/source-shortio/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_shortio import SourceShortio
+from source_shortio.run import run
 
 if __name__ == "__main__":
-    source = SourceShortio()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-shortio/setup.py b/airbyte-integrations/connectors/source-shortio/setup.py
index 6c8cbba1b880d..d0b2d6cc581cb 100644
--- a/airbyte-integrations/connectors/source-shortio/setup.py
+++ b/airbyte-integrations/connectors/source-shortio/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-shortio=source_shortio.run:run",
+        ],
+    },
     name="source_shortio",
     description="Source implementation for Shortio.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-shortio/source_shortio/run.py b/airbyte-integrations/connectors/source-shortio/source_shortio/run.py
new file mode 100644
index 0000000000000..dce618a444e4d
--- /dev/null
+++ b/airbyte-integrations/connectors/source-shortio/source_shortio/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_shortio import SourceShortio
+
+
+def run():
+    source = SourceShortio()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-smaily/main.py b/airbyte-integrations/connectors/source-smaily/main.py
index 647f5a347f70c..fbb55aa40a54b 100644
--- a/airbyte-integrations/connectors/source-smaily/main.py
+++ b/airbyte-integrations/connectors/source-smaily/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_smaily import SourceSmaily
+from source_smaily.run import run
 
 if __name__ == "__main__":
-    source = SourceSmaily()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-smaily/setup.py b/airbyte-integrations/connectors/source-smaily/setup.py
index aa835b3698f6e..f3b23a618c6a7 100644
--- a/airbyte-integrations/connectors/source-smaily/setup.py
+++ b/airbyte-integrations/connectors/source-smaily/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-smaily=source_smaily.run:run",
+        ],
+    },
     name="source_smaily",
     description="Source implementation for Smaily.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-smaily/source_smaily/run.py b/airbyte-integrations/connectors/source-smaily/source_smaily/run.py
new file mode 100644
index 0000000000000..24297e8addb3f
--- /dev/null
+++ b/airbyte-integrations/connectors/source-smaily/source_smaily/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_smaily import SourceSmaily
+
+
+def run():
+    source = SourceSmaily()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-smartengage/main.py b/airbyte-integrations/connectors/source-smartengage/main.py
index f9aec77e67ecd..d445802b0ed4a 100644
--- a/airbyte-integrations/connectors/source-smartengage/main.py
+++ b/airbyte-integrations/connectors/source-smartengage/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_smartengage import SourceSmartengage
+from source_smartengage.run import run
 
 if __name__ == "__main__":
-    source = SourceSmartengage()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-smartengage/setup.py b/airbyte-integrations/connectors/source-smartengage/setup.py
index 958a3b00df735..e4dd81fe7a9b2 100644
--- a/airbyte-integrations/connectors/source-smartengage/setup.py
+++ b/airbyte-integrations/connectors/source-smartengage/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-smartengage=source_smartengage.run:run",
+        ],
+    },
     name="source_smartengage",
     description="Source implementation for Smartengage.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-smartengage/source_smartengage/run.py b/airbyte-integrations/connectors/source-smartengage/source_smartengage/run.py
new file mode 100644
index 0000000000000..593e4eaf40f12
--- /dev/null
+++ b/airbyte-integrations/connectors/source-smartengage/source_smartengage/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_smartengage import SourceSmartengage
+
+
+def run():
+    source = SourceSmartengage()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-snapchat-marketing/main.py b/airbyte-integrations/connectors/source-snapchat-marketing/main.py
index 3b7dadc93a3ee..d48c013d7dcf5 100644
--- a/airbyte-integrations/connectors/source-snapchat-marketing/main.py
+++ b/airbyte-integrations/connectors/source-snapchat-marketing/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_snapchat_marketing import SourceSnapchatMarketing
+from source_snapchat_marketing.run import run
 
 if __name__ == "__main__":
-    source = SourceSnapchatMarketing()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-snapchat-marketing/setup.py b/airbyte-integrations/connectors/source-snapchat-marketing/setup.py
index cc60f43cbe709..71d4210cbe54e 100644
--- a/airbyte-integrations/connectors/source-snapchat-marketing/setup.py
+++ b/airbyte-integrations/connectors/source-snapchat-marketing/setup.py
@@ -12,6 +12,11 @@
 TEST_REQUIREMENTS = ["requests-mock~=1.9.3", "pytest-mock~=3.6.1", "pytest~=6.1", "requests_mock"]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-snapchat-marketing=source_snapchat_marketing.run:run",
+        ],
+    },
     name="source_snapchat_marketing",
     description="Source implementation for Snapchat Marketing.",
     author="Airbyte",
diff --git a/airbyte-integrations/connectors/source-snapchat-marketing/source_snapchat_marketing/run.py b/airbyte-integrations/connectors/source-snapchat-marketing/source_snapchat_marketing/run.py
new file mode 100644
index 0000000000000..61c972da8a2df
--- /dev/null
+++ b/airbyte-integrations/connectors/source-snapchat-marketing/source_snapchat_marketing/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_snapchat_marketing import SourceSnapchatMarketing
+
+
+def run():
+    source = SourceSnapchatMarketing()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-sonar-cloud/main.py b/airbyte-integrations/connectors/source-sonar-cloud/main.py
index 81355fadfed17..5ba429ba3211c 100644
--- a/airbyte-integrations/connectors/source-sonar-cloud/main.py
+++ b/airbyte-integrations/connectors/source-sonar-cloud/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_sonar_cloud import SourceSonarCloud
+from source_sonar_cloud.run import run
 
 if __name__ == "__main__":
-    source = SourceSonarCloud()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-sonar-cloud/setup.py b/airbyte-integrations/connectors/source-sonar-cloud/setup.py
index e99684d61a65c..2f8f82301482c 100644
--- a/airbyte-integrations/connectors/source-sonar-cloud/setup.py
+++ b/airbyte-integrations/connectors/source-sonar-cloud/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-sonar-cloud=source_sonar_cloud.run:run",
+        ],
+    },
     name="source_sonar_cloud",
     description="Source implementation for Sonar Cloud.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-sonar-cloud/source_sonar_cloud/run.py b/airbyte-integrations/connectors/source-sonar-cloud/source_sonar_cloud/run.py
new file mode 100644
index 0000000000000..e29261106741d
--- /dev/null
+++ b/airbyte-integrations/connectors/source-sonar-cloud/source_sonar_cloud/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_sonar_cloud import SourceSonarCloud
+
+
+def run():
+    source = SourceSonarCloud()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-spacex-api/main.py b/airbyte-integrations/connectors/source-spacex-api/main.py
index 7ceab1979a8bc..52f8d09f45087 100644
--- a/airbyte-integrations/connectors/source-spacex-api/main.py
+++ b/airbyte-integrations/connectors/source-spacex-api/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_spacex_api import SourceSpacexApi
+from source_spacex_api.run import run
 
 if __name__ == "__main__":
-    source = SourceSpacexApi()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-spacex-api/setup.py b/airbyte-integrations/connectors/source-spacex-api/setup.py
index 2d202b30ec9a2..00b9cc0110f4b 100644
--- a/airbyte-integrations/connectors/source-spacex-api/setup.py
+++ b/airbyte-integrations/connectors/source-spacex-api/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-spacex-api=source_spacex_api.run:run",
+        ],
+    },
     name="source_spacex_api",
     description="Source implementation for Spacex Api.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-spacex-api/source_spacex_api/run.py b/airbyte-integrations/connectors/source-spacex-api/source_spacex_api/run.py
new file mode 100644
index 0000000000000..7baf4913b4536
--- /dev/null
+++ b/airbyte-integrations/connectors/source-spacex-api/source_spacex_api/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_spacex_api import SourceSpacexApi
+
+
+def run():
+    source = SourceSpacexApi()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-square/main.py b/airbyte-integrations/connectors/source-square/main.py
index 064f99648db87..7102d93900cfc 100644
--- a/airbyte-integrations/connectors/source-square/main.py
+++ b/airbyte-integrations/connectors/source-square/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_square import SourceSquare
+from source_square.run import run
 
 if __name__ == "__main__":
-    source = SourceSquare()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-square/setup.py b/airbyte-integrations/connectors/source-square/setup.py
index fe3012decd5db..3b7c2204ad12b 100644
--- a/airbyte-integrations/connectors/source-square/setup.py
+++ b/airbyte-integrations/connectors/source-square/setup.py
@@ -17,13 +17,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-square=source_square.run:run",
+        ],
+    },
     name="source_square",
     description="Source implementation for Square.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-square/source_square/run.py b/airbyte-integrations/connectors/source-square/source_square/run.py
new file mode 100644
index 0000000000000..df5f3fd74012c
--- /dev/null
+++ b/airbyte-integrations/connectors/source-square/source_square/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_square import SourceSquare
+
+
+def run():
+    source = SourceSquare()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-statuspage/main.py b/airbyte-integrations/connectors/source-statuspage/main.py
index 8046f076e8ab3..2701aa6de07d3 100644
--- a/airbyte-integrations/connectors/source-statuspage/main.py
+++ b/airbyte-integrations/connectors/source-statuspage/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_statuspage import SourceStatuspage
+from source_statuspage.run import run
 
 if __name__ == "__main__":
-    source = SourceStatuspage()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-statuspage/setup.py b/airbyte-integrations/connectors/source-statuspage/setup.py
index 772fedc5e0347..f7adbd694ed6e 100644
--- a/airbyte-integrations/connectors/source-statuspage/setup.py
+++ b/airbyte-integrations/connectors/source-statuspage/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-statuspage=source_statuspage.run:run",
+        ],
+    },
     name="source_statuspage",
     description="Source implementation for Statuspage.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-statuspage/source_statuspage/run.py b/airbyte-integrations/connectors/source-statuspage/source_statuspage/run.py
new file mode 100644
index 0000000000000..d29716d7c02fb
--- /dev/null
+++ b/airbyte-integrations/connectors/source-statuspage/source_statuspage/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_statuspage import SourceStatuspage
+
+
+def run():
+    source = SourceStatuspage()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-strava/main.py b/airbyte-integrations/connectors/source-strava/main.py
index 054e4911089cf..9fc5a4bb29189 100644
--- a/airbyte-integrations/connectors/source-strava/main.py
+++ b/airbyte-integrations/connectors/source-strava/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_strava import SourceStrava
+from source_strava.run import run
 
 if __name__ == "__main__":
-    source = SourceStrava()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-strava/setup.py b/airbyte-integrations/connectors/source-strava/setup.py
index 8dda89709cd46..3bdc926460700 100644
--- a/airbyte-integrations/connectors/source-strava/setup.py
+++ b/airbyte-integrations/connectors/source-strava/setup.py
@@ -14,13 +14,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-strava=source_strava.run:run",
+        ],
+    },
     name="source_strava",
     description="Source implementation for Strava.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-strava/source_strava/run.py b/airbyte-integrations/connectors/source-strava/source_strava/run.py
new file mode 100644
index 0000000000000..c8b1590993cd2
--- /dev/null
+++ b/airbyte-integrations/connectors/source-strava/source_strava/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_strava import SourceStrava
+
+
+def run():
+    source = SourceStrava()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-stripe/setup.py b/airbyte-integrations/connectors/source-stripe/setup.py
index c1b020664edb9..e0203e616ad73 100644
--- a/airbyte-integrations/connectors/source-stripe/setup.py
+++ b/airbyte-integrations/connectors/source-stripe/setup.py
@@ -17,7 +17,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-survey-sparrow/main.py b/airbyte-integrations/connectors/source-survey-sparrow/main.py
index 31056359d13b1..5c4977542eaf2 100644
--- a/airbyte-integrations/connectors/source-survey-sparrow/main.py
+++ b/airbyte-integrations/connectors/source-survey-sparrow/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_survey_sparrow import SourceSurveySparrow
+from source_survey_sparrow.run import run
 
 if __name__ == "__main__":
-    source = SourceSurveySparrow()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-survey-sparrow/setup.py b/airbyte-integrations/connectors/source-survey-sparrow/setup.py
index da1ca261a46e1..dfa0601abbde7 100644
--- a/airbyte-integrations/connectors/source-survey-sparrow/setup.py
+++ b/airbyte-integrations/connectors/source-survey-sparrow/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-survey-sparrow=source_survey_sparrow.run:run",
+        ],
+    },
     name="source_survey_sparrow",
     description="Source implementation for Survey Sparrow.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-survey-sparrow/source_survey_sparrow/run.py b/airbyte-integrations/connectors/source-survey-sparrow/source_survey_sparrow/run.py
new file mode 100644
index 0000000000000..af39a841b3dde
--- /dev/null
+++ b/airbyte-integrations/connectors/source-survey-sparrow/source_survey_sparrow/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_survey_sparrow import SourceSurveySparrow
+
+
+def run():
+    source = SourceSurveySparrow()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-surveycto/main.py b/airbyte-integrations/connectors/source-surveycto/main.py
index 4f26fe81785fe..9f282dbc2ecd4 100644
--- a/airbyte-integrations/connectors/source-surveycto/main.py
+++ b/airbyte-integrations/connectors/source-surveycto/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_surveycto import SourceSurveycto
+from source_surveycto.run import run
 
 if __name__ == "__main__":
-    source = SourceSurveycto()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-surveycto/setup.py b/airbyte-integrations/connectors/source-surveycto/setup.py
index be5f78fbdd148..92e965e0651bb 100644
--- a/airbyte-integrations/connectors/source-surveycto/setup.py
+++ b/airbyte-integrations/connectors/source-surveycto/setup.py
@@ -14,13 +14,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-surveycto=source_surveycto.run:run",
+        ],
+    },
     name="source_surveycto",
     description="Source implementation for Surveycto.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-surveycto/source_surveycto/run.py b/airbyte-integrations/connectors/source-surveycto/source_surveycto/run.py
new file mode 100644
index 0000000000000..927d17c9eb1f2
--- /dev/null
+++ b/airbyte-integrations/connectors/source-surveycto/source_surveycto/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_surveycto import SourceSurveycto
+
+
+def run():
+    source = SourceSurveycto()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-surveymonkey/main.py b/airbyte-integrations/connectors/source-surveymonkey/main.py
index 7fd72e7dd38fb..bf4f900ad3776 100644
--- a/airbyte-integrations/connectors/source-surveymonkey/main.py
+++ b/airbyte-integrations/connectors/source-surveymonkey/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_surveymonkey import SourceSurveymonkey
+from source_surveymonkey.run import run
 
 if __name__ == "__main__":
-    source = SourceSurveymonkey()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-surveymonkey/setup.py b/airbyte-integrations/connectors/source-surveymonkey/setup.py
index f70f3e894857d..a72a0108a10bf 100644
--- a/airbyte-integrations/connectors/source-surveymonkey/setup.py
+++ b/airbyte-integrations/connectors/source-surveymonkey/setup.py
@@ -10,6 +10,11 @@
 TEST_REQUIREMENTS = ["requests-mock~=1.9.3", "pytest-mock~=3.6.1", "pytest~=6.1", "requests_mock"]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-surveymonkey=source_surveymonkey.run:run",
+        ],
+    },
     name="source_surveymonkey",
     description="Source implementation for Surveymonkey.",
     author="Airbyte",
diff --git a/airbyte-integrations/connectors/source-surveymonkey/source_surveymonkey/run.py b/airbyte-integrations/connectors/source-surveymonkey/source_surveymonkey/run.py
new file mode 100644
index 0000000000000..f3cbc028402b0
--- /dev/null
+++ b/airbyte-integrations/connectors/source-surveymonkey/source_surveymonkey/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_surveymonkey import SourceSurveymonkey
+
+
+def run():
+    source = SourceSurveymonkey()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-talkdesk-explore/main.py b/airbyte-integrations/connectors/source-talkdesk-explore/main.py
index 33dcea10e90aa..745a3f67e0013 100644
--- a/airbyte-integrations/connectors/source-talkdesk-explore/main.py
+++ b/airbyte-integrations/connectors/source-talkdesk-explore/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_talkdesk_explore import SourceTalkdeskExplore
+from source_talkdesk_explore.run import run
 
 if __name__ == "__main__":
-    source = SourceTalkdeskExplore()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-talkdesk-explore/setup.py b/airbyte-integrations/connectors/source-talkdesk-explore/setup.py
index 2694e175a3334..5df2ba2853d07 100644
--- a/airbyte-integrations/connectors/source-talkdesk-explore/setup.py
+++ b/airbyte-integrations/connectors/source-talkdesk-explore/setup.py
@@ -16,6 +16,11 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-talkdesk-explore=source_talkdesk_explore.run:run",
+        ],
+    },
     name="source_talkdesk_explore",
     description="Source implementation for Talkdesk Explore API.",
     author="Airbyte",
diff --git a/airbyte-integrations/connectors/source-talkdesk-explore/source_talkdesk_explore/run.py b/airbyte-integrations/connectors/source-talkdesk-explore/source_talkdesk_explore/run.py
new file mode 100644
index 0000000000000..442b84e5a2787
--- /dev/null
+++ b/airbyte-integrations/connectors/source-talkdesk-explore/source_talkdesk_explore/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_talkdesk_explore import SourceTalkdeskExplore
+
+
+def run():
+    source = SourceTalkdeskExplore()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-tempo/main.py b/airbyte-integrations/connectors/source-tempo/main.py
index e26fc47cd8067..d8f0e748fb2f1 100644
--- a/airbyte-integrations/connectors/source-tempo/main.py
+++ b/airbyte-integrations/connectors/source-tempo/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_tempo import SourceTempo
+from source_tempo.run import run
 
 if __name__ == "__main__":
-    source = SourceTempo()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-tempo/setup.py b/airbyte-integrations/connectors/source-tempo/setup.py
index 16051a8dfa6be..3e2668d10d6c3 100644
--- a/airbyte-integrations/connectors/source-tempo/setup.py
+++ b/airbyte-integrations/connectors/source-tempo/setup.py
@@ -16,6 +16,11 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-tempo=source_tempo.run:run",
+        ],
+    },
     name="source_tempo",
     description="Source implementation for Tempo.",
     author="Thomas van Latum",
diff --git a/airbyte-integrations/connectors/source-tempo/source_tempo/run.py b/airbyte-integrations/connectors/source-tempo/source_tempo/run.py
new file mode 100644
index 0000000000000..8883fc3f0a241
--- /dev/null
+++ b/airbyte-integrations/connectors/source-tempo/source_tempo/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_tempo import SourceTempo
+
+
+def run():
+    source = SourceTempo()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-the-guardian-api/main.py b/airbyte-integrations/connectors/source-the-guardian-api/main.py
index 96a88ceac6662..50182e0c2da09 100644
--- a/airbyte-integrations/connectors/source-the-guardian-api/main.py
+++ b/airbyte-integrations/connectors/source-the-guardian-api/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_the_guardian_api import SourceTheGuardianApi
+from source_the_guardian_api.run import run
 
 if __name__ == "__main__":
-    source = SourceTheGuardianApi()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-the-guardian-api/setup.py b/airbyte-integrations/connectors/source-the-guardian-api/setup.py
index 1fb11d947926f..9627db8db884b 100644
--- a/airbyte-integrations/connectors/source-the-guardian-api/setup.py
+++ b/airbyte-integrations/connectors/source-the-guardian-api/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-the-guardian-api=source_the_guardian_api.run:run",
+        ],
+    },
     name="source_the_guardian_api",
     description="Source implementation for The Guardian Api.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-the-guardian-api/source_the_guardian_api/run.py b/airbyte-integrations/connectors/source-the-guardian-api/source_the_guardian_api/run.py
new file mode 100644
index 0000000000000..eafbdfd35301b
--- /dev/null
+++ b/airbyte-integrations/connectors/source-the-guardian-api/source_the_guardian_api/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_the_guardian_api import SourceTheGuardianApi
+
+
+def run():
+    source = SourceTheGuardianApi()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-tiktok-marketing/main.py b/airbyte-integrations/connectors/source-tiktok-marketing/main.py
index d20d9e211aa80..b523ea1b0fdd2 100644
--- a/airbyte-integrations/connectors/source-tiktok-marketing/main.py
+++ b/airbyte-integrations/connectors/source-tiktok-marketing/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_tiktok_marketing import SourceTiktokMarketing
+from source_tiktok_marketing.run import run
 
 if __name__ == "__main__":
-    source = SourceTiktokMarketing()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-tiktok-marketing/setup.py b/airbyte-integrations/connectors/source-tiktok-marketing/setup.py
index 3a5d282355a8a..21896188c6be1 100644
--- a/airbyte-integrations/connectors/source-tiktok-marketing/setup.py
+++ b/airbyte-integrations/connectors/source-tiktok-marketing/setup.py
@@ -10,6 +10,11 @@
 TEST_REQUIREMENTS = ["pytest-mock~=3.6.1", "pytest~=6.1", "requests-mock==1.9.3", "timeout-decorator==0.5.0"]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-tiktok-marketing=source_tiktok_marketing.run:run",
+        ],
+    },
     name="source_tiktok_marketing",
     description="Source implementation for Tiktok Marketing.",
     author="Airbyte",
diff --git a/airbyte-integrations/connectors/source-tiktok-marketing/source_tiktok_marketing/run.py b/airbyte-integrations/connectors/source-tiktok-marketing/source_tiktok_marketing/run.py
new file mode 100644
index 0000000000000..341638b66529d
--- /dev/null
+++ b/airbyte-integrations/connectors/source-tiktok-marketing/source_tiktok_marketing/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_tiktok_marketing import SourceTiktokMarketing
+
+
+def run():
+    source = SourceTiktokMarketing()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-timely/main.py b/airbyte-integrations/connectors/source-timely/main.py
index 674590cf1d99b..1007e1945bc04 100644
--- a/airbyte-integrations/connectors/source-timely/main.py
+++ b/airbyte-integrations/connectors/source-timely/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_timely import SourceTimely
+from source_timely.run import run
 
 if __name__ == "__main__":
-    source = SourceTimely()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-timely/setup.py b/airbyte-integrations/connectors/source-timely/setup.py
index 6dc55b4722ef9..9004e784b6132 100644
--- a/airbyte-integrations/connectors/source-timely/setup.py
+++ b/airbyte-integrations/connectors/source-timely/setup.py
@@ -10,13 +10,30 @@
 TEST_REQUIREMENTS = ["requests-mock~=1.9.3", "pytest~=6.2", "pytest-mock~=3.6.1"]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-timely=source_timely.run:run",
+        ],
+    },
     name="source_timely",
     description="Source implementation for Timely.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-timely/source_timely/run.py b/airbyte-integrations/connectors/source-timely/source_timely/run.py
new file mode 100644
index 0000000000000..6ead8b999eb94
--- /dev/null
+++ b/airbyte-integrations/connectors/source-timely/source_timely/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_timely import SourceTimely
+
+
+def run():
+    source = SourceTimely()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-tmdb/main.py b/airbyte-integrations/connectors/source-tmdb/main.py
index 8fb1b3a132967..de1e36196011a 100644
--- a/airbyte-integrations/connectors/source-tmdb/main.py
+++ b/airbyte-integrations/connectors/source-tmdb/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_tmdb import SourceTmdb
+from source_tmdb.run import run
 
 if __name__ == "__main__":
-    source = SourceTmdb()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-tmdb/setup.py b/airbyte-integrations/connectors/source-tmdb/setup.py
index 35310f2278366..d1b20699bcf3f 100644
--- a/airbyte-integrations/connectors/source-tmdb/setup.py
+++ b/airbyte-integrations/connectors/source-tmdb/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-tmdb=source_tmdb.run:run",
+        ],
+    },
     name="source_tmdb",
     description="Source implementation for Tmdb.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-tmdb/source_tmdb/run.py b/airbyte-integrations/connectors/source-tmdb/source_tmdb/run.py
new file mode 100644
index 0000000000000..100edabab0b14
--- /dev/null
+++ b/airbyte-integrations/connectors/source-tmdb/source_tmdb/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_tmdb import SourceTmdb
+
+
+def run():
+    source = SourceTmdb()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-todoist/main.py b/airbyte-integrations/connectors/source-todoist/main.py
index 21ae17e05de76..159e7dcdc036a 100644
--- a/airbyte-integrations/connectors/source-todoist/main.py
+++ b/airbyte-integrations/connectors/source-todoist/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_todoist import SourceTodoist
+from source_todoist.run import run
 
 if __name__ == "__main__":
-    source = SourceTodoist()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-todoist/setup.py b/airbyte-integrations/connectors/source-todoist/setup.py
index 3add922621898..601df38fd542b 100644
--- a/airbyte-integrations/connectors/source-todoist/setup.py
+++ b/airbyte-integrations/connectors/source-todoist/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-todoist=source_todoist.run:run",
+        ],
+    },
     name="source_todoist",
     description="Source implementation for Todoist.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-todoist/source_todoist/run.py b/airbyte-integrations/connectors/source-todoist/source_todoist/run.py
new file mode 100644
index 0000000000000..b20e5a2d580fd
--- /dev/null
+++ b/airbyte-integrations/connectors/source-todoist/source_todoist/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_todoist import SourceTodoist
+
+
+def run():
+    source = SourceTodoist()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-toggl/main.py b/airbyte-integrations/connectors/source-toggl/main.py
index bd1b4defb2de2..a52cb2ff9370f 100644
--- a/airbyte-integrations/connectors/source-toggl/main.py
+++ b/airbyte-integrations/connectors/source-toggl/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_toggl import SourceToggl
+from source_toggl.run import run
 
 if __name__ == "__main__":
-    source = SourceToggl()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-toggl/setup.py b/airbyte-integrations/connectors/source-toggl/setup.py
index bb481cee53280..cdd1baad6ba7c 100644
--- a/airbyte-integrations/connectors/source-toggl/setup.py
+++ b/airbyte-integrations/connectors/source-toggl/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-toggl=source_toggl.run:run",
+        ],
+    },
     name="source_toggl",
     description="Source implementation for Toggl.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-toggl/source_toggl/run.py b/airbyte-integrations/connectors/source-toggl/source_toggl/run.py
new file mode 100644
index 0000000000000..fd06c41abef32
--- /dev/null
+++ b/airbyte-integrations/connectors/source-toggl/source_toggl/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_toggl import SourceToggl
+
+
+def run():
+    source = SourceToggl()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-tplcentral/main.py b/airbyte-integrations/connectors/source-tplcentral/main.py
index e8e5f30138f43..c5e7b8a95ec4b 100644
--- a/airbyte-integrations/connectors/source-tplcentral/main.py
+++ b/airbyte-integrations/connectors/source-tplcentral/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_tplcentral import SourceTplcentral
+from source_tplcentral.run import run
 
 if __name__ == "__main__":
-    source = SourceTplcentral()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-tplcentral/setup.py b/airbyte-integrations/connectors/source-tplcentral/setup.py
index 602d12056cb39..45cd0ff8a6335 100644
--- a/airbyte-integrations/connectors/source-tplcentral/setup.py
+++ b/airbyte-integrations/connectors/source-tplcentral/setup.py
@@ -17,6 +17,11 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-tplcentral=source_tplcentral.run:run",
+        ],
+    },
     name="source_tplcentral",
     description="Source implementation for Tplcentral.",
     author="Labanoras Tech",
diff --git a/airbyte-integrations/connectors/source-tplcentral/source_tplcentral/run.py b/airbyte-integrations/connectors/source-tplcentral/source_tplcentral/run.py
new file mode 100644
index 0000000000000..443a194ed6c16
--- /dev/null
+++ b/airbyte-integrations/connectors/source-tplcentral/source_tplcentral/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_tplcentral import SourceTplcentral
+
+
+def run():
+    source = SourceTplcentral()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-trello/main.py b/airbyte-integrations/connectors/source-trello/main.py
index c0657c0065fc9..7b0b502fdb1e6 100644
--- a/airbyte-integrations/connectors/source-trello/main.py
+++ b/airbyte-integrations/connectors/source-trello/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_trello import SourceTrello
+from source_trello.run import run
 
 if __name__ == "__main__":
-    source = SourceTrello()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-trello/setup.py b/airbyte-integrations/connectors/source-trello/setup.py
index 38d12ba647859..85fd6920b1aff 100644
--- a/airbyte-integrations/connectors/source-trello/setup.py
+++ b/airbyte-integrations/connectors/source-trello/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-trello=source_trello.run:run",
+        ],
+    },
     name="source_trello",
     description="Source implementation for Trello.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-trello/source_trello/run.py b/airbyte-integrations/connectors/source-trello/source_trello/run.py
new file mode 100644
index 0000000000000..628d22faf0db2
--- /dev/null
+++ b/airbyte-integrations/connectors/source-trello/source_trello/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_trello import SourceTrello
+
+
+def run():
+    source = SourceTrello()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-trustpilot/main.py b/airbyte-integrations/connectors/source-trustpilot/main.py
index f0cd7b4265e56..27e409441e33d 100644
--- a/airbyte-integrations/connectors/source-trustpilot/main.py
+++ b/airbyte-integrations/connectors/source-trustpilot/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_trustpilot import SourceTrustpilot
+from source_trustpilot.run import run
 
 if __name__ == "__main__":
-    source = SourceTrustpilot()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-trustpilot/setup.py b/airbyte-integrations/connectors/source-trustpilot/setup.py
index 4b8001807ec1d..7c61c708d96ed 100644
--- a/airbyte-integrations/connectors/source-trustpilot/setup.py
+++ b/airbyte-integrations/connectors/source-trustpilot/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-trustpilot=source_trustpilot.run:run",
+        ],
+    },
     name="source_trustpilot",
     description="Source implementation for Trustpilot.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-trustpilot/source_trustpilot/run.py b/airbyte-integrations/connectors/source-trustpilot/source_trustpilot/run.py
new file mode 100644
index 0000000000000..40c488dbf9a74
--- /dev/null
+++ b/airbyte-integrations/connectors/source-trustpilot/source_trustpilot/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_trustpilot import SourceTrustpilot
+
+
+def run():
+    source = SourceTrustpilot()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-tvmaze-schedule/main.py b/airbyte-integrations/connectors/source-tvmaze-schedule/main.py
index 3a530f427a6f0..be6abd8ef07c0 100644
--- a/airbyte-integrations/connectors/source-tvmaze-schedule/main.py
+++ b/airbyte-integrations/connectors/source-tvmaze-schedule/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_tvmaze_schedule import SourceTvmazeSchedule
+from source_tvmaze_schedule.run import run
 
 if __name__ == "__main__":
-    source = SourceTvmazeSchedule()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-tvmaze-schedule/setup.py b/airbyte-integrations/connectors/source-tvmaze-schedule/setup.py
index 77c97057564e5..800761e02c239 100644
--- a/airbyte-integrations/connectors/source-tvmaze-schedule/setup.py
+++ b/airbyte-integrations/connectors/source-tvmaze-schedule/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-tvmaze-schedule=source_tvmaze_schedule.run:run",
+        ],
+    },
     name="source_tvmaze_schedule",
     description="Source implementation for Tvmaze Schedule.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-tvmaze-schedule/source_tvmaze_schedule/run.py b/airbyte-integrations/connectors/source-tvmaze-schedule/source_tvmaze_schedule/run.py
new file mode 100644
index 0000000000000..24cdb98bf6993
--- /dev/null
+++ b/airbyte-integrations/connectors/source-tvmaze-schedule/source_tvmaze_schedule/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_tvmaze_schedule import SourceTvmazeSchedule
+
+
+def run():
+    source = SourceTvmazeSchedule()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-twilio-taskrouter/main.py b/airbyte-integrations/connectors/source-twilio-taskrouter/main.py
index 792fa7db3284b..94a3a9659fe90 100644
--- a/airbyte-integrations/connectors/source-twilio-taskrouter/main.py
+++ b/airbyte-integrations/connectors/source-twilio-taskrouter/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_twilio_taskrouter import SourceTwilioTaskrouter
+from source_twilio_taskrouter.run import run
 
 if __name__ == "__main__":
-    source = SourceTwilioTaskrouter()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-twilio-taskrouter/setup.py b/airbyte-integrations/connectors/source-twilio-taskrouter/setup.py
index be86feef816ff..2d7ea97c98330 100644
--- a/airbyte-integrations/connectors/source-twilio-taskrouter/setup.py
+++ b/airbyte-integrations/connectors/source-twilio-taskrouter/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-twilio-taskrouter=source_twilio_taskrouter.run:run",
+        ],
+    },
     name="source_twilio_taskrouter",
     description="Source implementation for Twilio Taskrouter.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-twilio-taskrouter/source_twilio_taskrouter/run.py b/airbyte-integrations/connectors/source-twilio-taskrouter/source_twilio_taskrouter/run.py
new file mode 100644
index 0000000000000..6c677af9dd2c4
--- /dev/null
+++ b/airbyte-integrations/connectors/source-twilio-taskrouter/source_twilio_taskrouter/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_twilio_taskrouter import SourceTwilioTaskrouter
+
+
+def run():
+    source = SourceTwilioTaskrouter()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-twilio/main.py b/airbyte-integrations/connectors/source-twilio/main.py
index 8f91bc04c56ff..0999d1e67f264 100644
--- a/airbyte-integrations/connectors/source-twilio/main.py
+++ b/airbyte-integrations/connectors/source-twilio/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_twilio import SourceTwilio
+from source_twilio.run import run
 
 if __name__ == "__main__":
-    source = SourceTwilio()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-twilio/setup.py b/airbyte-integrations/connectors/source-twilio/setup.py
index 66a2cb8a7ee00..19717cccc42f1 100644
--- a/airbyte-integrations/connectors/source-twilio/setup.py
+++ b/airbyte-integrations/connectors/source-twilio/setup.py
@@ -14,6 +14,11 @@
 TEST_REQUIREMENTS = ["requests-mock~=1.9.3", "pytest~=6.1", "pytest-mock", "requests_mock", "freezegun"]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-twilio=source_twilio.run:run",
+        ],
+    },
     name="source_twilio",
     description="Source implementation for Twilio.",
     author="Airbyte",
diff --git a/airbyte-integrations/connectors/source-twilio/source_twilio/run.py b/airbyte-integrations/connectors/source-twilio/source_twilio/run.py
new file mode 100644
index 0000000000000..bb95086d7eba3
--- /dev/null
+++ b/airbyte-integrations/connectors/source-twilio/source_twilio/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_twilio import SourceTwilio
+
+
+def run():
+    source = SourceTwilio()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-twitter/main.py b/airbyte-integrations/connectors/source-twitter/main.py
index 3e6dae60da347..f50219e6455c3 100644
--- a/airbyte-integrations/connectors/source-twitter/main.py
+++ b/airbyte-integrations/connectors/source-twitter/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_twitter import SourceTwitter
+from source_twitter.run import run
 
 if __name__ == "__main__":
-    source = SourceTwitter()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-twitter/setup.py b/airbyte-integrations/connectors/source-twitter/setup.py
index bcc921fcba465..e85c1d404a2a6 100644
--- a/airbyte-integrations/connectors/source-twitter/setup.py
+++ b/airbyte-integrations/connectors/source-twitter/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-twitter=source_twitter.run:run",
+        ],
+    },
     name="source_twitter",
     description="Source implementation for Twitter.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-twitter/source_twitter/run.py b/airbyte-integrations/connectors/source-twitter/source_twitter/run.py
new file mode 100644
index 0000000000000..4c18e4636da4b
--- /dev/null
+++ b/airbyte-integrations/connectors/source-twitter/source_twitter/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_twitter import SourceTwitter
+
+
+def run():
+    source = SourceTwitter()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-tyntec-sms/main.py b/airbyte-integrations/connectors/source-tyntec-sms/main.py
index 37e1042478464..142de37101e60 100644
--- a/airbyte-integrations/connectors/source-tyntec-sms/main.py
+++ b/airbyte-integrations/connectors/source-tyntec-sms/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_tyntec_sms import SourceTyntecSms
+from source_tyntec_sms.run import run
 
 if __name__ == "__main__":
-    source = SourceTyntecSms()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-tyntec-sms/setup.py b/airbyte-integrations/connectors/source-tyntec-sms/setup.py
index 1a15c62236944..832b4139ef2d7 100644
--- a/airbyte-integrations/connectors/source-tyntec-sms/setup.py
+++ b/airbyte-integrations/connectors/source-tyntec-sms/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-tyntec-sms=source_tyntec_sms.run:run",
+        ],
+    },
     name="source_tyntec_sms",
     description="Source implementation for Tyntec Sms.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-tyntec-sms/source_tyntec_sms/run.py b/airbyte-integrations/connectors/source-tyntec-sms/source_tyntec_sms/run.py
new file mode 100644
index 0000000000000..cd08f8c0c7ee5
--- /dev/null
+++ b/airbyte-integrations/connectors/source-tyntec-sms/source_tyntec_sms/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_tyntec_sms import SourceTyntecSms
+
+
+def run():
+    source = SourceTyntecSms()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-typeform/setup.py b/airbyte-integrations/connectors/source-typeform/setup.py
index 09b119b93869c..1caa440b91225 100644
--- a/airbyte-integrations/connectors/source-typeform/setup.py
+++ b/airbyte-integrations/connectors/source-typeform/setup.py
@@ -21,7 +21,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-unleash/main.py b/airbyte-integrations/connectors/source-unleash/main.py
index 9e57236c979a0..72ec2c888dcb9 100644
--- a/airbyte-integrations/connectors/source-unleash/main.py
+++ b/airbyte-integrations/connectors/source-unleash/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_unleash import SourceUnleash
+from source_unleash.run import run
 
 if __name__ == "__main__":
-    source = SourceUnleash()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-unleash/setup.py b/airbyte-integrations/connectors/source-unleash/setup.py
index 8c00746f3fd47..9822815f03ce3 100644
--- a/airbyte-integrations/connectors/source-unleash/setup.py
+++ b/airbyte-integrations/connectors/source-unleash/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-unleash=source_unleash.run:run",
+        ],
+    },
     name="source_unleash",
     description="Source implementation for Unleash.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-unleash/source_unleash/run.py b/airbyte-integrations/connectors/source-unleash/source_unleash/run.py
new file mode 100644
index 0000000000000..0de14599b8b36
--- /dev/null
+++ b/airbyte-integrations/connectors/source-unleash/source_unleash/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_unleash import SourceUnleash
+
+
+def run():
+    source = SourceUnleash()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-us-census/main.py b/airbyte-integrations/connectors/source-us-census/main.py
index 95978af824186..c46fd28c9ce64 100644
--- a/airbyte-integrations/connectors/source-us-census/main.py
+++ b/airbyte-integrations/connectors/source-us-census/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_us_census import SourceUsCensus
+from source_us_census.run import run
 
 if __name__ == "__main__":
-    source = SourceUsCensus()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-us-census/setup.py b/airbyte-integrations/connectors/source-us-census/setup.py
index 7b2b4ebc83ec1..bf3858455362c 100644
--- a/airbyte-integrations/connectors/source-us-census/setup.py
+++ b/airbyte-integrations/connectors/source-us-census/setup.py
@@ -17,6 +17,11 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-us-census=source_us_census.run:run",
+        ],
+    },
     name="source_us_census",
     description="Source implementation for Us Census.",
     author="Airbyte",
diff --git a/airbyte-integrations/connectors/source-us-census/source_us_census/run.py b/airbyte-integrations/connectors/source-us-census/source_us_census/run.py
new file mode 100644
index 0000000000000..20b8b7eedd0c4
--- /dev/null
+++ b/airbyte-integrations/connectors/source-us-census/source_us_census/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_us_census import SourceUsCensus
+
+
+def run():
+    source = SourceUsCensus()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-vantage/main.py b/airbyte-integrations/connectors/source-vantage/main.py
index fdec95252d78f..eab761b3302d3 100644
--- a/airbyte-integrations/connectors/source-vantage/main.py
+++ b/airbyte-integrations/connectors/source-vantage/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_vantage import SourceVantage
+from source_vantage.run import run
 
 if __name__ == "__main__":
-    source = SourceVantage()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-vantage/setup.py b/airbyte-integrations/connectors/source-vantage/setup.py
index 11fe68724009e..6f3c091a99c37 100644
--- a/airbyte-integrations/connectors/source-vantage/setup.py
+++ b/airbyte-integrations/connectors/source-vantage/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-vantage=source_vantage.run:run",
+        ],
+    },
     name="source_vantage",
     description="Source implementation for Vantage.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-vantage/source_vantage/run.py b/airbyte-integrations/connectors/source-vantage/source_vantage/run.py
new file mode 100644
index 0000000000000..a9c2ee3eb36aa
--- /dev/null
+++ b/airbyte-integrations/connectors/source-vantage/source_vantage/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_vantage import SourceVantage
+
+
+def run():
+    source = SourceVantage()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-visma-economic/main.py b/airbyte-integrations/connectors/source-visma-economic/main.py
index f5a5d1e8f8838..ae896df1e48f6 100644
--- a/airbyte-integrations/connectors/source-visma-economic/main.py
+++ b/airbyte-integrations/connectors/source-visma-economic/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_visma_economic import SourceVismaEconomic
+from source_visma_economic.run import run
 
 if __name__ == "__main__":
-    source = SourceVismaEconomic()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-visma-economic/setup.py b/airbyte-integrations/connectors/source-visma-economic/setup.py
index 9574bffc86ff8..aca046a78f087 100644
--- a/airbyte-integrations/connectors/source-visma-economic/setup.py
+++ b/airbyte-integrations/connectors/source-visma-economic/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-visma-economic=source_visma_economic.run:run",
+        ],
+    },
     name="source_visma_economic",
     description="Source implementation for Visma Economic.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-visma-economic/source_visma_economic/run.py b/airbyte-integrations/connectors/source-visma-economic/source_visma_economic/run.py
new file mode 100644
index 0000000000000..4c8146aa54ec0
--- /dev/null
+++ b/airbyte-integrations/connectors/source-visma-economic/source_visma_economic/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_visma_economic import SourceVismaEconomic
+
+
+def run():
+    source = SourceVismaEconomic()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-vitally/main.py b/airbyte-integrations/connectors/source-vitally/main.py
index d03f28ec1f1b6..1410ead03c397 100644
--- a/airbyte-integrations/connectors/source-vitally/main.py
+++ b/airbyte-integrations/connectors/source-vitally/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_vitally import SourceVitally
+from source_vitally.run import run
 
 if __name__ == "__main__":
-    source = SourceVitally()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-vitally/setup.py b/airbyte-integrations/connectors/source-vitally/setup.py
index f7091d2171d5b..d0adc3fc2c1fa 100644
--- a/airbyte-integrations/connectors/source-vitally/setup.py
+++ b/airbyte-integrations/connectors/source-vitally/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-vitally=source_vitally.run:run",
+        ],
+    },
     name="source_vitally",
     description="Source implementation for Vitally.",
     author="Elliot Trabac",
     author_email="elliot.trabac1@gmail.com",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-vitally/source_vitally/run.py b/airbyte-integrations/connectors/source-vitally/source_vitally/run.py
new file mode 100644
index 0000000000000..1c6c2f841ed91
--- /dev/null
+++ b/airbyte-integrations/connectors/source-vitally/source_vitally/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_vitally import SourceVitally
+
+
+def run():
+    source = SourceVitally()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-waiteraid/main.py b/airbyte-integrations/connectors/source-waiteraid/main.py
index 0ba9d249cc5a2..50171148de01d 100644
--- a/airbyte-integrations/connectors/source-waiteraid/main.py
+++ b/airbyte-integrations/connectors/source-waiteraid/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_waiteraid import SourceWaiteraid
+from source_waiteraid.run import run
 
 if __name__ == "__main__":
-    source = SourceWaiteraid()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-waiteraid/setup.py b/airbyte-integrations/connectors/source-waiteraid/setup.py
index fe5d754e3df51..e2dc21a8895f5 100644
--- a/airbyte-integrations/connectors/source-waiteraid/setup.py
+++ b/airbyte-integrations/connectors/source-waiteraid/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-waiteraid=source_waiteraid.run:run",
+        ],
+    },
     name="source_waiteraid",
     description="Source implementation for Waiteraid.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-waiteraid/source_waiteraid/run.py b/airbyte-integrations/connectors/source-waiteraid/source_waiteraid/run.py
new file mode 100644
index 0000000000000..5219abc38724d
--- /dev/null
+++ b/airbyte-integrations/connectors/source-waiteraid/source_waiteraid/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_waiteraid import SourceWaiteraid
+
+
+def run():
+    source = SourceWaiteraid()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-weatherstack/main.py b/airbyte-integrations/connectors/source-weatherstack/main.py
index 1924e100bb8d6..83c59afceaf50 100644
--- a/airbyte-integrations/connectors/source-weatherstack/main.py
+++ b/airbyte-integrations/connectors/source-weatherstack/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_weatherstack import SourceWeatherstack
+from source_weatherstack.run import run
 
 if __name__ == "__main__":
-    source = SourceWeatherstack()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-weatherstack/setup.py b/airbyte-integrations/connectors/source-weatherstack/setup.py
index 98887751b488b..207fe4d3c13d3 100644
--- a/airbyte-integrations/connectors/source-weatherstack/setup.py
+++ b/airbyte-integrations/connectors/source-weatherstack/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-weatherstack=source_weatherstack.run:run",
+        ],
+    },
     name="source_weatherstack",
     description="Source implementation for Weatherstack.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-weatherstack/source_weatherstack/run.py b/airbyte-integrations/connectors/source-weatherstack/source_weatherstack/run.py
new file mode 100644
index 0000000000000..07f3930dd2b2d
--- /dev/null
+++ b/airbyte-integrations/connectors/source-weatherstack/source_weatherstack/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_weatherstack import SourceWeatherstack
+
+
+def run():
+    source = SourceWeatherstack()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-webflow/main.py b/airbyte-integrations/connectors/source-webflow/main.py
index f35348e338c3b..4d481e07151bf 100644
--- a/airbyte-integrations/connectors/source-webflow/main.py
+++ b/airbyte-integrations/connectors/source-webflow/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_webflow import SourceWebflow
+from source_webflow.run import run
 
 if __name__ == "__main__":
-    source = SourceWebflow()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-webflow/setup.py b/airbyte-integrations/connectors/source-webflow/setup.py
index 6912dcae7d7c8..1d604e8b4ea15 100644
--- a/airbyte-integrations/connectors/source-webflow/setup.py
+++ b/airbyte-integrations/connectors/source-webflow/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-webflow=source_webflow.run:run",
+        ],
+    },
     name="source_webflow",
     description="Source implementation for Webflow.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-webflow/source_webflow/run.py b/airbyte-integrations/connectors/source-webflow/source_webflow/run.py
new file mode 100644
index 0000000000000..a71297a1d6a2a
--- /dev/null
+++ b/airbyte-integrations/connectors/source-webflow/source_webflow/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_webflow import SourceWebflow
+
+
+def run():
+    source = SourceWebflow()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-whisky-hunter/main.py b/airbyte-integrations/connectors/source-whisky-hunter/main.py
index b9e7c8a1c682b..76cf72379579e 100644
--- a/airbyte-integrations/connectors/source-whisky-hunter/main.py
+++ b/airbyte-integrations/connectors/source-whisky-hunter/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_whisky_hunter import SourceWhiskyHunter
+from source_whisky_hunter.run import run
 
 if __name__ == "__main__":
-    source = SourceWhiskyHunter()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-whisky-hunter/setup.py b/airbyte-integrations/connectors/source-whisky-hunter/setup.py
index 6ea55fe522d97..6b48b33f68c83 100644
--- a/airbyte-integrations/connectors/source-whisky-hunter/setup.py
+++ b/airbyte-integrations/connectors/source-whisky-hunter/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-whisky-hunter=source_whisky_hunter.run:run",
+        ],
+    },
     name="source_whisky_hunter",
     description="Source implementation for Whisky Hunter.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-whisky-hunter/source_whisky_hunter/run.py b/airbyte-integrations/connectors/source-whisky-hunter/source_whisky_hunter/run.py
new file mode 100644
index 0000000000000..2af9bbe54e12c
--- /dev/null
+++ b/airbyte-integrations/connectors/source-whisky-hunter/source_whisky_hunter/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_whisky_hunter import SourceWhiskyHunter
+
+
+def run():
+    source = SourceWhiskyHunter()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-wikipedia-pageviews/main.py b/airbyte-integrations/connectors/source-wikipedia-pageviews/main.py
index 3f284fc2e06f2..1ba1f84032407 100755
--- a/airbyte-integrations/connectors/source-wikipedia-pageviews/main.py
+++ b/airbyte-integrations/connectors/source-wikipedia-pageviews/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_wikipedia_pageviews import SourceWikipediaPageviews
+from source_wikipedia_pageviews.run import run
 
 if __name__ == "__main__":
-    source = SourceWikipediaPageviews()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-wikipedia-pageviews/setup.py b/airbyte-integrations/connectors/source-wikipedia-pageviews/setup.py
index 9716b7daa4eeb..f946706e21f92 100755
--- a/airbyte-integrations/connectors/source-wikipedia-pageviews/setup.py
+++ b/airbyte-integrations/connectors/source-wikipedia-pageviews/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-wikipedia-pageviews=source_wikipedia_pageviews.run:run",
+        ],
+    },
     name="source_wikipedia_pageviews",
     description="Source implementation for Wikipedia Pageviews.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-wikipedia-pageviews/source_wikipedia_pageviews/run.py b/airbyte-integrations/connectors/source-wikipedia-pageviews/source_wikipedia_pageviews/run.py
new file mode 100755
index 0000000000000..d77093ecb81bb
--- /dev/null
+++ b/airbyte-integrations/connectors/source-wikipedia-pageviews/source_wikipedia_pageviews/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_wikipedia_pageviews import SourceWikipediaPageviews
+
+
+def run():
+    source = SourceWikipediaPageviews()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-woocommerce/main.py b/airbyte-integrations/connectors/source-woocommerce/main.py
index 606cdff539bab..1fae4df4545e2 100644
--- a/airbyte-integrations/connectors/source-woocommerce/main.py
+++ b/airbyte-integrations/connectors/source-woocommerce/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_woocommerce import SourceWoocommerce
+from source_woocommerce.run import run
 
 if __name__ == "__main__":
-    source = SourceWoocommerce()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-woocommerce/setup.py b/airbyte-integrations/connectors/source-woocommerce/setup.py
index 40945a630f15d..c69b2f2519351 100644
--- a/airbyte-integrations/connectors/source-woocommerce/setup.py
+++ b/airbyte-integrations/connectors/source-woocommerce/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-woocommerce=source_woocommerce.run:run",
+        ],
+    },
     name="source_woocommerce",
     description="Source implementation for Woocommerce.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-woocommerce/source_woocommerce/run.py b/airbyte-integrations/connectors/source-woocommerce/source_woocommerce/run.py
new file mode 100644
index 0000000000000..b53f1bed41bb2
--- /dev/null
+++ b/airbyte-integrations/connectors/source-woocommerce/source_woocommerce/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_woocommerce import SourceWoocommerce
+
+
+def run():
+    source = SourceWoocommerce()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-workable/main.py b/airbyte-integrations/connectors/source-workable/main.py
index 9ca2a8507540e..7c63dc17331bd 100644
--- a/airbyte-integrations/connectors/source-workable/main.py
+++ b/airbyte-integrations/connectors/source-workable/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_workable import SourceWorkable
+from source_workable.run import run
 
 if __name__ == "__main__":
-    source = SourceWorkable()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-workable/setup.py b/airbyte-integrations/connectors/source-workable/setup.py
index 67f123878709d..e35ab25501c6c 100644
--- a/airbyte-integrations/connectors/source-workable/setup.py
+++ b/airbyte-integrations/connectors/source-workable/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-workable=source_workable.run:run",
+        ],
+    },
     name="source_workable",
     description="Source implementation for Workable.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-workable/source_workable/run.py b/airbyte-integrations/connectors/source-workable/source_workable/run.py
new file mode 100644
index 0000000000000..5b838949c4efa
--- /dev/null
+++ b/airbyte-integrations/connectors/source-workable/source_workable/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_workable import SourceWorkable
+
+
+def run():
+    source = SourceWorkable()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-workramp/main.py b/airbyte-integrations/connectors/source-workramp/main.py
index c18f064cceadc..7b2a20cedcacb 100644
--- a/airbyte-integrations/connectors/source-workramp/main.py
+++ b/airbyte-integrations/connectors/source-workramp/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_workramp import SourceWorkramp
+from source_workramp.run import run
 
 if __name__ == "__main__":
-    source = SourceWorkramp()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-workramp/setup.py b/airbyte-integrations/connectors/source-workramp/setup.py
index a2b4fc952a195..eb12a1398b9cd 100644
--- a/airbyte-integrations/connectors/source-workramp/setup.py
+++ b/airbyte-integrations/connectors/source-workramp/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-workramp=source_workramp.run:run",
+        ],
+    },
     name="source_workramp",
     description="Source implementation for Workramp.",
     author="Elliot Trabac",
     author_email="elliot.trabac1@gmail.com",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-workramp/source_workramp/run.py b/airbyte-integrations/connectors/source-workramp/source_workramp/run.py
new file mode 100644
index 0000000000000..6b56635b93cbb
--- /dev/null
+++ b/airbyte-integrations/connectors/source-workramp/source_workramp/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_workramp import SourceWorkramp
+
+
+def run():
+    source = SourceWorkramp()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-wrike/main.py b/airbyte-integrations/connectors/source-wrike/main.py
index 5f853be268739..4c1d0cd0f5fac 100644
--- a/airbyte-integrations/connectors/source-wrike/main.py
+++ b/airbyte-integrations/connectors/source-wrike/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_wrike import SourceWrike
+from source_wrike.run import run
 
 if __name__ == "__main__":
-    source = SourceWrike()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-wrike/setup.py b/airbyte-integrations/connectors/source-wrike/setup.py
index a3c314147ca7c..63714da0ca099 100644
--- a/airbyte-integrations/connectors/source-wrike/setup.py
+++ b/airbyte-integrations/connectors/source-wrike/setup.py
@@ -12,13 +12,30 @@
 TEST_REQUIREMENTS = ["requests-mock~=1.9.3", "pytest~=6.2", "pytest-mock~=3.6.1"]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-wrike=source_wrike.run:run",
+        ],
+    },
     name="source_wrike",
     description="Source implementation for Wrike.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-wrike/source_wrike/run.py b/airbyte-integrations/connectors/source-wrike/source_wrike/run.py
new file mode 100644
index 0000000000000..5795da5261547
--- /dev/null
+++ b/airbyte-integrations/connectors/source-wrike/source_wrike/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_wrike import SourceWrike
+
+
+def run():
+    source = SourceWrike()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-xero/setup.py b/airbyte-integrations/connectors/source-xero/setup.py
index 89541436cfd3b..31cd43ef58383 100644
--- a/airbyte-integrations/connectors/source-xero/setup.py
+++ b/airbyte-integrations/connectors/source-xero/setup.py
@@ -27,7 +27,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-xkcd/main.py b/airbyte-integrations/connectors/source-xkcd/main.py
index c0de984874594..ea20bdf50104a 100644
--- a/airbyte-integrations/connectors/source-xkcd/main.py
+++ b/airbyte-integrations/connectors/source-xkcd/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_xkcd import SourceXkcd
+from source_xkcd.run import run
 
 if __name__ == "__main__":
-    source = SourceXkcd()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-xkcd/setup.py b/airbyte-integrations/connectors/source-xkcd/setup.py
index 7fe43ebd17d6a..f6c8db1ffa165 100644
--- a/airbyte-integrations/connectors/source-xkcd/setup.py
+++ b/airbyte-integrations/connectors/source-xkcd/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-xkcd=source_xkcd.run:run",
+        ],
+    },
     name="source_xkcd",
     description="Source implementation for Xkcd.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-xkcd/source_xkcd/run.py b/airbyte-integrations/connectors/source-xkcd/source_xkcd/run.py
new file mode 100644
index 0000000000000..3e056bd119619
--- /dev/null
+++ b/airbyte-integrations/connectors/source-xkcd/source_xkcd/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_xkcd import SourceXkcd
+
+
+def run():
+    source = SourceXkcd()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-yahoo-finance-price/main.py b/airbyte-integrations/connectors/source-yahoo-finance-price/main.py
index 7f376eec167c4..3b00718b8391e 100644
--- a/airbyte-integrations/connectors/source-yahoo-finance-price/main.py
+++ b/airbyte-integrations/connectors/source-yahoo-finance-price/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_yahoo_finance_price import SourceYahooFinancePrice
+from source_yahoo_finance_price.run import run
 
 if __name__ == "__main__":
-    source = SourceYahooFinancePrice()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-yahoo-finance-price/setup.py b/airbyte-integrations/connectors/source-yahoo-finance-price/setup.py
index 862dc4e0083de..e010bdc6daeef 100644
--- a/airbyte-integrations/connectors/source-yahoo-finance-price/setup.py
+++ b/airbyte-integrations/connectors/source-yahoo-finance-price/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-yahoo-finance-price=source_yahoo_finance_price.run:run",
+        ],
+    },
     name="source_yahoo_finance_price",
     description="Source implementation for Yahoo Finance Price.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-yahoo-finance-price/source_yahoo_finance_price/run.py b/airbyte-integrations/connectors/source-yahoo-finance-price/source_yahoo_finance_price/run.py
new file mode 100644
index 0000000000000..d24a645a41838
--- /dev/null
+++ b/airbyte-integrations/connectors/source-yahoo-finance-price/source_yahoo_finance_price/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_yahoo_finance_price import SourceYahooFinancePrice
+
+
+def run():
+    source = SourceYahooFinancePrice()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-yandex-metrica/main.py b/airbyte-integrations/connectors/source-yandex-metrica/main.py
index 6c6a7edcc3539..a84b23e0a261d 100644
--- a/airbyte-integrations/connectors/source-yandex-metrica/main.py
+++ b/airbyte-integrations/connectors/source-yandex-metrica/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_yandex_metrica import SourceYandexMetrica
+from source_yandex_metrica.run import run
 
 if __name__ == "__main__":
-    source = SourceYandexMetrica()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-yandex-metrica/setup.py b/airbyte-integrations/connectors/source-yandex-metrica/setup.py
index ce5d5b3610109..adebbc0e9bb2a 100644
--- a/airbyte-integrations/connectors/source-yandex-metrica/setup.py
+++ b/airbyte-integrations/connectors/source-yandex-metrica/setup.py
@@ -10,13 +10,30 @@
 TEST_REQUIREMENTS = ["requests-mock~=1.9.3", "freezegun", "pytest~=6.1", "pytest-mock", "requests_mock"]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-yandex-metrica=source_yandex_metrica.run:run",
+        ],
+    },
     name="source_yandex_metrica",
     description="Source implementation for Yandex Metrica.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-yandex-metrica/source_yandex_metrica/run.py b/airbyte-integrations/connectors/source-yandex-metrica/source_yandex_metrica/run.py
new file mode 100644
index 0000000000000..69e34c3d17405
--- /dev/null
+++ b/airbyte-integrations/connectors/source-yandex-metrica/source_yandex_metrica/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_yandex_metrica import SourceYandexMetrica
+
+
+def run():
+    source = SourceYandexMetrica()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-yotpo/main.py b/airbyte-integrations/connectors/source-yotpo/main.py
index d456ca2abab3d..968a262f7f261 100644
--- a/airbyte-integrations/connectors/source-yotpo/main.py
+++ b/airbyte-integrations/connectors/source-yotpo/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_yotpo import SourceYotpo
+from source_yotpo.run import run
 
 if __name__ == "__main__":
-    source = SourceYotpo()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-yotpo/setup.py b/airbyte-integrations/connectors/source-yotpo/setup.py
index ed41819fb6d9d..4d1d2163dbbd2 100644
--- a/airbyte-integrations/connectors/source-yotpo/setup.py
+++ b/airbyte-integrations/connectors/source-yotpo/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-yotpo=source_yotpo.run:run",
+        ],
+    },
     name="source_yotpo",
     description="Source implementation for Yotpo.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-yotpo/source_yotpo/run.py b/airbyte-integrations/connectors/source-yotpo/source_yotpo/run.py
new file mode 100644
index 0000000000000..d302e5b2f4ddc
--- /dev/null
+++ b/airbyte-integrations/connectors/source-yotpo/source_yotpo/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_yotpo import SourceYotpo
+
+
+def run():
+    source = SourceYotpo()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-younium/main.py b/airbyte-integrations/connectors/source-younium/main.py
index 311b077eb0841..8fcc0a655630f 100644
--- a/airbyte-integrations/connectors/source-younium/main.py
+++ b/airbyte-integrations/connectors/source-younium/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_younium import SourceYounium
+from source_younium.run import run
 
 if __name__ == "__main__":
-    source = SourceYounium()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-younium/setup.py b/airbyte-integrations/connectors/source-younium/setup.py
index 2a8872be52872..25ca4c963925f 100644
--- a/airbyte-integrations/connectors/source-younium/setup.py
+++ b/airbyte-integrations/connectors/source-younium/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-younium=source_younium.run:run",
+        ],
+    },
     name="source_younium",
     description="Source implementation for Younium.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-younium/source_younium/run.py b/airbyte-integrations/connectors/source-younium/source_younium/run.py
new file mode 100644
index 0000000000000..5250f8d9bd945
--- /dev/null
+++ b/airbyte-integrations/connectors/source-younium/source_younium/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_younium import SourceYounium
+
+
+def run():
+    source = SourceYounium()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-youtube-analytics/main.py b/airbyte-integrations/connectors/source-youtube-analytics/main.py
index 046af990bcb06..f2542cccc965d 100644
--- a/airbyte-integrations/connectors/source-youtube-analytics/main.py
+++ b/airbyte-integrations/connectors/source-youtube-analytics/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_youtube_analytics import SourceYoutubeAnalytics
+from source_youtube_analytics.run import run
 
 if __name__ == "__main__":
-    source = SourceYoutubeAnalytics()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-youtube-analytics/setup.py b/airbyte-integrations/connectors/source-youtube-analytics/setup.py
index 795c2044a1cad..9b17c4365ad8d 100644
--- a/airbyte-integrations/connectors/source-youtube-analytics/setup.py
+++ b/airbyte-integrations/connectors/source-youtube-analytics/setup.py
@@ -16,6 +16,11 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-youtube-analytics=source_youtube_analytics.run:run",
+        ],
+    },
     name="source_youtube_analytics",
     description="Source implementation for Youtube Analytics.",
     author="Airbyte",
diff --git a/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/run.py b/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/run.py
new file mode 100644
index 0000000000000..27f8967eff437
--- /dev/null
+++ b/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_youtube_analytics import SourceYoutubeAnalytics
+
+
+def run():
+    source = SourceYoutubeAnalytics()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-zapier-supported-storage/main.py b/airbyte-integrations/connectors/source-zapier-supported-storage/main.py
index b65c91f888480..8de0f27f55afa 100644
--- a/airbyte-integrations/connectors/source-zapier-supported-storage/main.py
+++ b/airbyte-integrations/connectors/source-zapier-supported-storage/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_zapier_supported_storage import SourceZapierSupportedStorage
+from source_zapier_supported_storage.run import run
 
 if __name__ == "__main__":
-    source = SourceZapierSupportedStorage()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-zapier-supported-storage/setup.py b/airbyte-integrations/connectors/source-zapier-supported-storage/setup.py
index 1ffccc828857c..9feb0c8cde947 100644
--- a/airbyte-integrations/connectors/source-zapier-supported-storage/setup.py
+++ b/airbyte-integrations/connectors/source-zapier-supported-storage/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-zapier-supported-storage=source_zapier_supported_storage.run:run",
+        ],
+    },
     name="source_zapier_supported_storage",
     description="Source implementation for Zapier Supported Storage.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-zapier-supported-storage/source_zapier_supported_storage/run.py b/airbyte-integrations/connectors/source-zapier-supported-storage/source_zapier_supported_storage/run.py
new file mode 100644
index 0000000000000..a3777475b5b84
--- /dev/null
+++ b/airbyte-integrations/connectors/source-zapier-supported-storage/source_zapier_supported_storage/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_zapier_supported_storage import SourceZapierSupportedStorage
+
+
+def run():
+    source = SourceZapierSupportedStorage()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-zendesk-sell/main.py b/airbyte-integrations/connectors/source-zendesk-sell/main.py
index 6f01a3b8f7a81..e57dccf7d35eb 100644
--- a/airbyte-integrations/connectors/source-zendesk-sell/main.py
+++ b/airbyte-integrations/connectors/source-zendesk-sell/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_zendesk_sell import SourceZendeskSell
+from source_zendesk_sell.run import run
 
 if __name__ == "__main__":
-    source = SourceZendeskSell()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-zendesk-sell/setup.py b/airbyte-integrations/connectors/source-zendesk-sell/setup.py
index 054742fb41d4c..a789b08aeb99c 100644
--- a/airbyte-integrations/connectors/source-zendesk-sell/setup.py
+++ b/airbyte-integrations/connectors/source-zendesk-sell/setup.py
@@ -14,13 +14,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-zendesk-sell=source_zendesk_sell.run:run",
+        ],
+    },
     name="source_zendesk_sell",
     description="Source implementation for Zendesk Sell.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-zendesk-sell/source_zendesk_sell/run.py b/airbyte-integrations/connectors/source-zendesk-sell/source_zendesk_sell/run.py
new file mode 100644
index 0000000000000..0e238308da465
--- /dev/null
+++ b/airbyte-integrations/connectors/source-zendesk-sell/source_zendesk_sell/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_zendesk_sell import SourceZendeskSell
+
+
+def run():
+    source = SourceZendeskSell()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-zendesk-sunshine/main.py b/airbyte-integrations/connectors/source-zendesk-sunshine/main.py
index 0a86066993fcf..4b7507ee396ca 100644
--- a/airbyte-integrations/connectors/source-zendesk-sunshine/main.py
+++ b/airbyte-integrations/connectors/source-zendesk-sunshine/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_zendesk_sunshine import SourceZendeskSunshine
+from source_zendesk_sunshine.run import run
 
 if __name__ == "__main__":
-    source = SourceZendeskSunshine()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-zendesk-sunshine/setup.py b/airbyte-integrations/connectors/source-zendesk-sunshine/setup.py
index 1c47ce8ab0a99..d59a2a4793b42 100644
--- a/airbyte-integrations/connectors/source-zendesk-sunshine/setup.py
+++ b/airbyte-integrations/connectors/source-zendesk-sunshine/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-zendesk-sunshine=source_zendesk_sunshine.run:run",
+        ],
+    },
     name="source_zendesk_sunshine",
     description="Source implementation for Zendesk Sunshine.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-zendesk-sunshine/source_zendesk_sunshine/run.py b/airbyte-integrations/connectors/source-zendesk-sunshine/source_zendesk_sunshine/run.py
new file mode 100644
index 0000000000000..be323283bc95c
--- /dev/null
+++ b/airbyte-integrations/connectors/source-zendesk-sunshine/source_zendesk_sunshine/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_zendesk_sunshine import SourceZendeskSunshine
+
+
+def run():
+    source = SourceZendeskSunshine()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-zenefits/main.py b/airbyte-integrations/connectors/source-zenefits/main.py
index 480734a07faa6..7124907d176d1 100644
--- a/airbyte-integrations/connectors/source-zenefits/main.py
+++ b/airbyte-integrations/connectors/source-zenefits/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_zenefits import SourceZenefits
+from source_zenefits.run import run
 
 if __name__ == "__main__":
-    source = SourceZenefits()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-zenefits/setup.py b/airbyte-integrations/connectors/source-zenefits/setup.py
index 5cc7df2057943..7d33a0d79c913 100644
--- a/airbyte-integrations/connectors/source-zenefits/setup.py
+++ b/airbyte-integrations/connectors/source-zenefits/setup.py
@@ -12,13 +12,30 @@
 TEST_REQUIREMENTS = ["requests-mock~=1.9.3", "pytest~=6.2", "pytest-mock~=3.6.1"]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-zenefits=source_zenefits.run:run",
+        ],
+    },
     name="source_zenefits",
     description="Source implementation for Zenefits.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-zenefits/source_zenefits/run.py b/airbyte-integrations/connectors/source-zenefits/source_zenefits/run.py
new file mode 100644
index 0000000000000..3fa66926fadf9
--- /dev/null
+++ b/airbyte-integrations/connectors/source-zenefits/source_zenefits/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_zenefits import SourceZenefits
+
+
+def run():
+    source = SourceZenefits()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-zenloop/main.py b/airbyte-integrations/connectors/source-zenloop/main.py
index ec861621c9c74..dd3a6687740ec 100644
--- a/airbyte-integrations/connectors/source-zenloop/main.py
+++ b/airbyte-integrations/connectors/source-zenloop/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_zenloop import SourceZenloop
+from source_zenloop.run import run
 
 if __name__ == "__main__":
-    source = SourceZenloop()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-zenloop/setup.py b/airbyte-integrations/connectors/source-zenloop/setup.py
index be53c38ee5589..f6920042865b1 100644
--- a/airbyte-integrations/connectors/source-zenloop/setup.py
+++ b/airbyte-integrations/connectors/source-zenloop/setup.py
@@ -17,6 +17,11 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-zenloop=source_zenloop.run:run",
+        ],
+    },
     name="source_zenloop",
     description="Source implementation for Zenloop.",
     author="Alexander Batoulis",
diff --git a/airbyte-integrations/connectors/source-zenloop/source_zenloop/run.py b/airbyte-integrations/connectors/source-zenloop/source_zenloop/run.py
new file mode 100644
index 0000000000000..344453ff360c3
--- /dev/null
+++ b/airbyte-integrations/connectors/source-zenloop/source_zenloop/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_zenloop import SourceZenloop
+
+
+def run():
+    source = SourceZenloop()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-zoho-crm/main.py b/airbyte-integrations/connectors/source-zoho-crm/main.py
index 911fb44f52f2b..2cf82bb23bf9a 100644
--- a/airbyte-integrations/connectors/source-zoho-crm/main.py
+++ b/airbyte-integrations/connectors/source-zoho-crm/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_zoho_crm import SourceZohoCrm
+from source_zoho_crm.run import run
 
 if __name__ == "__main__":
-    source = SourceZohoCrm()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-zoho-crm/setup.py b/airbyte-integrations/connectors/source-zoho-crm/setup.py
index 4627c0115e63d..a44e9b0529a7e 100644
--- a/airbyte-integrations/connectors/source-zoho-crm/setup.py
+++ b/airbyte-integrations/connectors/source-zoho-crm/setup.py
@@ -16,6 +16,11 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-zoho-crm=source_zoho_crm.run:run",
+        ],
+    },
     name="source_zoho_crm",
     description="Source implementation for Zoho Crm.",
     author="Airbyte",
diff --git a/airbyte-integrations/connectors/source-zoho-crm/source_zoho_crm/run.py b/airbyte-integrations/connectors/source-zoho-crm/source_zoho_crm/run.py
new file mode 100644
index 0000000000000..d915dc05f2b9f
--- /dev/null
+++ b/airbyte-integrations/connectors/source-zoho-crm/source_zoho_crm/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_zoho_crm import SourceZohoCrm
+
+
+def run():
+    source = SourceZohoCrm()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-zoom/main.py b/airbyte-integrations/connectors/source-zoom/main.py
index da33508f6a8eb..137aea5931e64 100644
--- a/airbyte-integrations/connectors/source-zoom/main.py
+++ b/airbyte-integrations/connectors/source-zoom/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_zoom import SourceZoom
+from source_zoom.run import run
 
 if __name__ == "__main__":
-    source = SourceZoom()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-zoom/setup.py b/airbyte-integrations/connectors/source-zoom/setup.py
index edc76fde557ed..6d4f526d5e352 100644
--- a/airbyte-integrations/connectors/source-zoom/setup.py
+++ b/airbyte-integrations/connectors/source-zoom/setup.py
@@ -16,13 +16,30 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-zoom=source_zoom.run:run",
+        ],
+    },
     name="source_zoom",
     description="Source implementation for Zoom.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-zoom/source_zoom/run.py b/airbyte-integrations/connectors/source-zoom/source_zoom/run.py
new file mode 100644
index 0000000000000..e663e84418441
--- /dev/null
+++ b/airbyte-integrations/connectors/source-zoom/source_zoom/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_zoom import SourceZoom
+
+
+def run():
+    source = SourceZoom()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-zuora/main.py b/airbyte-integrations/connectors/source-zuora/main.py
index e65d47a77eda2..404a72854a9e1 100644
--- a/airbyte-integrations/connectors/source-zuora/main.py
+++ b/airbyte-integrations/connectors/source-zuora/main.py
@@ -2,12 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_zuora import SourceZuora
+from source_zuora.run import run
 
 if __name__ == "__main__":
-    source = SourceZuora()
-    launch(source, sys.argv[1:])
+    run()
diff --git a/airbyte-integrations/connectors/source-zuora/setup.py b/airbyte-integrations/connectors/source-zuora/setup.py
index 6fb6e922ce980..43b397e5c1830 100644
--- a/airbyte-integrations/connectors/source-zuora/setup.py
+++ b/airbyte-integrations/connectors/source-zuora/setup.py
@@ -16,6 +16,11 @@
 ]
 
 setup(
+    entry_points={
+        "console_scripts": [
+            "source-zuora=source_zuora.run:run",
+        ],
+    },
     name="source_zuora",
     description="Airbyte source-connector for Zuora.",
     author="Airbyte",
diff --git a/airbyte-integrations/connectors/source-zuora/source_zuora/run.py b/airbyte-integrations/connectors/source-zuora/source_zuora/run.py
new file mode 100644
index 0000000000000..58495d4d67e38
--- /dev/null
+++ b/airbyte-integrations/connectors/source-zuora/source_zuora/run.py
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_zuora import SourceZuora
+
+
+def run():
+    source = SourceZuora()
+    launch(source, sys.argv[1:])

From bd0a8774dc506675451e84a9bffab8e0914b4daf Mon Sep 17 00:00:00 2001
From: Joe Reuter <joe@airbyte.io>
Date: Tue, 30 Jan 2024 10:35:30 +0100
Subject: [PATCH 14/96] airbyte-lib: Fix validation (#34599)

---
 airbyte-lib/airbyte_lib/validate.py                             | 2 +-
 .../tests/integration_tests/fixtures/source-broken/setup.py     | 2 +-
 .../tests/integration_tests/fixtures/source-test/setup.py       | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/airbyte-lib/airbyte_lib/validate.py b/airbyte-lib/airbyte_lib/validate.py
index 551960ed5250d..306b2b58a012f 100644
--- a/airbyte-lib/airbyte_lib/validate.py
+++ b/airbyte-lib/airbyte_lib/validate.py
@@ -129,7 +129,7 @@ def validate(connector_dir: str, sample_config: str, *, validate_install_only: b
 
     pip_path = str(venv_path / "bin" / "pip")
 
-    _run_subprocess_and_raise_on_failure([pip_path, "install", "-e", connector_dir])
+    _run_subprocess_and_raise_on_failure([pip_path, "install", connector_dir])
 
     # write basic registry to temp json file
     registry = {
diff --git a/airbyte-lib/tests/integration_tests/fixtures/source-broken/setup.py b/airbyte-lib/tests/integration_tests/fixtures/source-broken/setup.py
index 1172b397f4934..0a565f98e08ba 100644
--- a/airbyte-lib/tests/integration_tests/fixtures/source-broken/setup.py
+++ b/airbyte-lib/tests/integration_tests/fixtures/source-broken/setup.py
@@ -11,7 +11,7 @@
     description="Test Soutce",
     author="Airbyte",
     author_email="contact@airbyte.io",
-    packages=find_packages(),
+    packages=["source_broken"],
     entry_points={
         "console_scripts": [
             "source-broken=source_broken.run:run",
diff --git a/airbyte-lib/tests/integration_tests/fixtures/source-test/setup.py b/airbyte-lib/tests/integration_tests/fixtures/source-test/setup.py
index b59aca2ec5c3a..348e0c28a2547 100644
--- a/airbyte-lib/tests/integration_tests/fixtures/source-test/setup.py
+++ b/airbyte-lib/tests/integration_tests/fixtures/source-test/setup.py
@@ -11,7 +11,7 @@
     description="Test Soutce",
     author="Airbyte",
     author_email="contact@airbyte.io",
-    packages=find_packages(),
+    packages=["source_test"],
     entry_points={
         "console_scripts": [
             "source-test=source_test.run:run",

From b55173292182a13aafe4ec88c7cba39f7ee12a73 Mon Sep 17 00:00:00 2001
From: Joe Reuter <joe@airbyte.io>
Date: Tue, 30 Jan 2024 10:35:42 +0100
Subject: [PATCH 15/96] =?UTF-8?q?=F0=9F=93=9DDestination=20Astra=20DB=20Co?=
 =?UTF-8?q?nnector=20Name=20Update,=20Icon=20Update,=20Spec=20formatting?=
 =?UTF-8?q?=20and=20tooltips=20(#34600)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Co-authored-by: Obioma Anomnachi <onanomnachi@gmail.com>
---
 .../destination_astra/config.py               | 20 +++++--
 .../connectors/destination-astra/icon.svg     | 57 ++++---------------
 .../integration_tests/spec.json               | 16 +++---
 .../destination-astra/metadata.yaml           |  4 +-
 docs/integrations/destinations/astra.md       |  3 +-
 5 files changed, 38 insertions(+), 62 deletions(-)

diff --git a/airbyte-integrations/connectors/destination-astra/destination_astra/config.py b/airbyte-integrations/connectors/destination-astra/destination_astra/config.py
index 7606aab4f1c52..01d805ecd782c 100644
--- a/airbyte-integrations/connectors/destination-astra/destination_astra/config.py
+++ b/airbyte-integrations/connectors/destination-astra/destination_astra/config.py
@@ -9,19 +9,27 @@
 class AstraIndexingModel(BaseModel):
     astra_db_app_token: str = Field(
         ...,
-        title="AstraDB Application Token",
+        title="Astra DB Application Token",
         airbyte_secret=True,
-        description="AstraDB Application Token",
+        description="The application token authorizes a user to connect to a specific Astra DB database. It is created when the user clicks the Generate Token button on the Overview tab of the Database page in the Astra UI.",
     )
     astra_db_endpoint: str = Field(
         ...,
-        title="AstraDB Endpoint",
-        description="AstraDB Endpoint",
+        title="Astra DB Endpoint",
+        description="The endpoint specifies which Astra DB database queries are sent to. It can be copied from the Database Details section of the Overview tab of the Database page in the Astra UI.",
         pattern="^https:\\/\\/([a-z]|[0-9]){8}-([a-z]|[0-9]){4}-([a-z]|[0-9]){4}-([a-z]|[0-9]){4}-([a-z]|[0-9]){12}-[^\\.]*?\\.apps\\.astra\\.datastax\\.com",
         examples=["https://8292d414-dd1b-4c33-8431-e838bedc04f7-us-east1.apps.astra.datastax.com"],
     )
-    astra_db_keyspace: str = Field(..., title="AstraDB Keyspace", description="Astra DB Keyspace")
-    collection: str = Field(..., title="AstraDB collection", description="AstraDB collection")
+    astra_db_keyspace: str = Field(
+        ...,
+        title="Astra DB Keyspace",
+        description="Keyspaces (or Namespaces) serve as containers for organizing data within a database. You can create a new keyspace uisng the Data Explorer tab in the Astra UI. The keyspace default_keyspace is created for you when you create a Vector Database in Astra DB.",
+    )
+    collection: str = Field(
+        ...,
+        title="Astra DB collection",
+        description="Collections hold data. They are analagous to tables in traditional Cassandra terminology. This tool will create the collection with the provided name automatically if it does not already exist. Alternatively, you can create one thorugh the Data Explorer tab in the Astra UI.",
+    )
 
     class Config:
         title = "Indexing"
diff --git a/airbyte-integrations/connectors/destination-astra/icon.svg b/airbyte-integrations/connectors/destination-astra/icon.svg
index 2d1f6c918ed99..ecc353976f51f 100644
--- a/airbyte-integrations/connectors/destination-astra/icon.svg
+++ b/airbyte-integrations/connectors/destination-astra/icon.svg
@@ -1,46 +1,13 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   version="1.1"
-   id="svg1"
-   width="600"
-   height="600"
-   viewBox="0 0 600 600"
-   sodipodi:docname="AstraLogo.svg"
-   inkscape:version="1.3.2 (091e20e, 2023-11-25, custom)"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:svg="http://www.w3.org/2000/svg">
-  <defs
-     id="defs1" />
-  <sodipodi:namedview
-     id="namedview1"
-     pagecolor="#ffffff"
-     bordercolor="#000000"
-     borderopacity="0.25"
-     inkscape:showpageshadow="2"
-     inkscape:pageopacity="0.0"
-     inkscape:pagecheckerboard="0"
-     inkscape:deskcolor="#d1d1d1"
-     showgrid="false"
-     inkscape:zoom="1.3683333"
-     inkscape:cx="300.73082"
-     inkscape:cy="358.46529"
-     inkscape:window-width="1920"
-     inkscape:window-height="1017"
-     inkscape:window-x="-8"
-     inkscape:window-y="-8"
-     inkscape:window-maximized="1"
-     inkscape:current-layer="g1" />
-  <g
-     inkscape:groupmode="layer"
-     inkscape:label="Image"
-     id="g1">
-    <path
-       style="fill:#eb6c34;stroke:none"
-       d="m 107.61632,519.69306 h 78 c 7.25159,0 23.46246,3.04391 29.58103,-1.02777 4.76104,-3.16834 6.33284,-15.71378 8.08564,-20.97223 6.43479,-19.30435 12.56684,-38.7005 19,-58 15.86245,-47.58731 31.72225,-95.21741 46.98922,-143 8.41156,-26.32654 15.14883,-54.74396 26.34411,-80 12.7153,28.68515 20.71204,61.03027 30.02545,91 13.73072,44.18423 28.67682,88.10681 43.3079,132 6.43521,19.30563 12.5653,38.69592 19,58 1.76568,5.29702 3.45928,17.65976 8.17666,20.97223 5.84427,4.10376 22.44467,1.02777 29.48999,1.02777 h 78 c -2.18585,-14.80066 -10.30337,-30.02018 -15.57638,-44 -9.41745,-24.96759 -18.58191,-50.03076 -28,-75 -29.38108,-77.89524 -56.94291,-156.6088 -87.62732,-234 -12.44626,-31.39157 -42.08469,-51.8414 -75.7963,-52.29013 -36.1582,-0.4813 -65.28782,21.13345 -78.55093,54.29013 -30.89829,77.24319 -58.43645,156.04489 -87.49922,234 -9.82461,26.35254 -19.87812,52.62091 -29.63118,79 -4.48288,12.12481 -11.40259,25.20733 -13.31867,38 z"
-       id="path1" />
-  </g>
+<svg width="600" height="600" viewBox="0 0 600 600" fill="none" xmlns="http://www.w3.org/2000/svg">
+<rect width="600" height="600" fill="none"/>
+<path d="M300 73L496.588 186.5V413.5L300 527L103.412 413.5V186.5L300 73Z" fill="black"/>
+<g clip-path="url(#clip0_574_82)">
+<path d="M266.632 250.898H178V350.102H266.632L288.897 332.944V268.056L266.632 250.898ZM195.177 268.056H271.721V332.962H195.177V268.056Z" fill="white"/>
+<path d="M416.434 268.777V252H335.394L313.39 268.777V291.811L335.394 308.588H406.023V332.223H317.773V349H400.996L423 332.223V308.588L400.996 291.811H330.367V268.777H416.434Z" fill="white"/>
+</g>
+<defs>
+<clipPath id="clip0_574_82">
+<rect width="245" height="97" fill="white" transform="translate(178 252)"/>
+</clipPath>
+</defs>
 </svg>
diff --git a/airbyte-integrations/connectors/destination-astra/integration_tests/spec.json b/airbyte-integrations/connectors/destination-astra/integration_tests/spec.json
index a94caed893cf9..35951290a06c7 100644
--- a/airbyte-integrations/connectors/destination-astra/integration_tests/spec.json
+++ b/airbyte-integrations/connectors/destination-astra/integration_tests/spec.json
@@ -317,14 +317,14 @@
         "type": "object",
         "properties": {
           "astra_db_app_token": {
-            "title": "AstraDB Application Token",
-            "description": "AstraDB Application Token",
+            "title": "Astra DB Application Token",
+            "description": "The application token authorizes a user to connect to a specific Astra DB database. It is created when the user clicks the Generate Token button on the Overview tab of the Database page in the Astra UI.",
             "airbyte_secret": true,
             "type": "string"
           },
           "astra_db_endpoint": {
-            "title": "AstraDB Endpoint",
-            "description": "AstraDB Endpoint",
+            "title": "Astra DB Endpoint",
+            "description": "The endpoint specifies which Astra DB database queries are sent to. It can be copied from the Database Details section of the Overview tab of the Database page in the Astra UI.",
             "pattern": "^https:\\/\\/([a-z]|[0-9]){8}-([a-z]|[0-9]){4}-([a-z]|[0-9]){4}-([a-z]|[0-9]){4}-([a-z]|[0-9]){12}-[^\\.]*?\\.apps\\.astra\\.datastax\\.com",
             "examples": [
               "https://8292d414-dd1b-4c33-8431-e838bedc04f7-us-east1.apps.astra.datastax.com"
@@ -332,13 +332,13 @@
             "type": "string"
           },
           "astra_db_keyspace": {
-            "title": "AstraDB Keyspace",
-            "description": "Astra DB Keyspace",
+            "title": "Astra DB Keyspace",
+            "description": "Keyspaces (or Namespaces) serve as containers for organizing data within a database. You can create a new keyspace uisng the Data Explorer tab in the Astra UI. The keyspace default_keyspace is created for you when you create a Vector Database in Astra DB.",
             "type": "string"
           },
           "collection": {
-            "title": "AstraDB collection",
-            "description": "AstraDB collection",
+            "title": "Astra DB collection",
+            "description": "Collections hold data. They are analagous to tables in traditional Cassandra terminology. This tool will create the collection with the provided name automatically if it does not already exist. Alternatively, you can create one thorugh the Data Explorer tab in the Astra UI.",
             "type": "string"
           }
         },
diff --git a/airbyte-integrations/connectors/destination-astra/metadata.yaml b/airbyte-integrations/connectors/destination-astra/metadata.yaml
index c9c245c358d3f..c675ed875fdd4 100644
--- a/airbyte-integrations/connectors/destination-astra/metadata.yaml
+++ b/airbyte-integrations/connectors/destination-astra/metadata.yaml
@@ -15,12 +15,12 @@ data:
   connectorSubtype: database
   connectorType: destination
   definitionId: 042ce96f-1158-4662-9543-e2ff015be97a
-  dockerImageTag: 0.1.0
+  dockerImageTag: 0.1.1
   dockerRepository: airbyte/destination-astra
   githubIssueLabel: destination-astra
   icon: astra.svg
   license: MIT
-  name: Astra
+  name: Astra DB
   releaseDate: 2024-01-10
   releaseStage: alpha
   supportLevel: community
diff --git a/docs/integrations/destinations/astra.md b/docs/integrations/destinations/astra.md
index 5543685883076..b17eb8c29e8cd 100644
--- a/docs/integrations/destinations/astra.md
+++ b/docs/integrations/destinations/astra.md
@@ -1,4 +1,4 @@
-# Astra Destination
+# Astra DB Destination
 
 This page contains the setup guide and reference information for the destination-astra connector.
 
@@ -38,4 +38,5 @@ This page contains the setup guide and reference information for the destination
 ## Changelog
 | Version | Date       | Pull Request                                             | Subject                     |
 | :------ | :--------- | :------------------------------------------------------- | :-------------------------- |
+| 0.1.1   | 2024-01-26 |                                                          | DS Branding Update          |
 | 0.1.0   | 2024-01-08 |                                                          | Initial Release             |

From cc1f1a28590ca3efaf6bea3135d7aaa6a225d38b Mon Sep 17 00:00:00 2001
From: Joe Reuter <joe@airbyte.io>
Date: Tue, 30 Jan 2024 12:11:41 +0100
Subject: [PATCH 16/96] airbyte-lib: Refactor follow-up (#34649)

---
 .../connectors/source-airtable/setup.py            | 14 +++++++++++++-
 .../connectors/source-amazon-ads/setup.py          | 14 +++++++++++++-
 .../source-amazon-seller-partner/setup.py          | 14 +++++++++++++-
 .../connectors/source-amazon-sqs/setup.py          | 14 +++++++++++++-
 .../connectors/source-appsflyer/setup.py           | 14 +++++++++++++-
 .../connectors/source-appstore-singer/setup.py     | 14 +++++++++++++-
 .../connectors/source-asana/setup.py               | 14 +++++++++++++-
 .../connectors/source-aws-cloudtrail/setup.py      | 14 +++++++++++++-
 .../connectors/source-azure-blob-storage/setup.py  | 14 +++++++++++++-
 .../connectors/source-azure-table/setup.py         | 14 +++++++++++++-
 .../connectors/source-bamboo-hr/setup.py           | 14 +++++++++++++-
 .../connectors/source-bing-ads/setup.py            | 14 +++++++++++++-
 .../connectors/source-cart/setup.py                | 14 +++++++++++++-
 .../connectors/source-chartmogul/setup.py          | 14 +++++++++++++-
 .../connectors/source-close-com/setup.py           | 14 +++++++++++++-
 .../connectors/source-delighted/setup.py           | 14 +++++++++++++-
 .../connectors/source-dv-360/setup.py              | 14 +++++++++++++-
 .../connectors/source-facebook-marketing/setup.py  | 14 +++++++++++++-
 .../connectors/source-faker/setup.py               | 14 +++++++++++++-
 .../connectors/source-fauna/setup.py               | 14 +++++++++++++-
 .../connectors/source-file/setup.py                | 14 +++++++++++++-
 .../source-firebase-realtime-database/setup.py     | 14 +++++++++++++-
 .../connectors/source-firebolt/setup.py            | 14 +++++++++++++-
 .../connectors/source-freshdesk/setup.py           | 14 +++++++++++++-
 .../connectors/source-gcs/setup.py                 | 14 +++++++++++++-
 .../connectors/source-github/setup.py              | 14 +++++++++++++-
 .../connectors/source-gitlab/setup.py              | 14 +++++++++++++-
 .../connectors/source-google-ads/setup.py          | 14 +++++++++++++-
 .../source-google-analytics-data-api/setup.py      | 14 +++++++++++++-
 .../setup.py                                       | 14 +++++++++++++-
 .../connectors/source-google-analytics-v4/setup.py | 14 +++++++++++++-
 .../connectors/source-google-directory/setup.py    | 14 +++++++++++++-
 .../connectors/source-google-drive/setup.py        | 14 +++++++++++++-
 .../credentials/setup.py                           | 14 +++++++++++++-
 .../source-google-search-console/setup.py          | 14 +++++++++++++-
 .../source-google-workspace-admin-reports/setup.py | 14 +++++++++++++-
 .../connectors/source-greenhouse/setup.py          | 14 +++++++++++++-
 .../connectors/source-harvest/setup.py             | 14 +++++++++++++-
 .../connectors/source-hubspot/setup.py             | 14 +++++++++++++-
 .../connectors/source-instagram/setup.py           | 14 +++++++++++++-
 .../connectors/source-iterable/setup.py            | 14 +++++++++++++-
 .../connectors/source-jira/setup.py                | 14 +++++++++++++-
 .../connectors/source-klaviyo/setup.py             | 14 +++++++++++++-
 .../connectors/source-kustomer-singer/setup.py     | 14 +++++++++++++-
 .../connectors/source-kyriba/setup.py              | 14 +++++++++++++-
 .../connectors/source-kyve/setup.py                | 14 +++++++++++++-
 .../connectors/source-lever-hiring/setup.py        | 14 +++++++++++++-
 .../connectors/source-linkedin-ads/setup.py        | 14 +++++++++++++-
 .../connectors/source-linkedin-pages/setup.py      | 14 +++++++++++++-
 .../connectors/source-linnworks/setup.py           | 14 +++++++++++++-
 .../connectors/source-looker/setup.py              | 14 +++++++++++++-
 .../connectors/source-mailchimp/setup.py           | 14 +++++++++++++-
 .../connectors/source-marketo/setup.py             | 14 +++++++++++++-
 .../connectors/source-microsoft-teams/setup.py     | 14 +++++++++++++-
 .../connectors/source-mixpanel/setup.py            | 14 +++++++++++++-
 .../connectors/source-monday/setup.py              | 14 +++++++++++++-
 .../connectors/source-my-hours/setup.py            | 14 +++++++++++++-
 .../connectors/source-notion/setup.py              | 14 +++++++++++++-
 .../connectors/source-okta/setup.py                | 14 +++++++++++++-
 .../connectors/source-orb/setup.py                 | 14 +++++++++++++-
 .../connectors/source-outreach/setup.py            | 14 +++++++++++++-
 .../connectors/source-pardot/setup.py              | 14 +++++++++++++-
 .../connectors/source-paystack/setup.py            | 14 +++++++++++++-
 .../connectors/source-pinterest/setup.py           | 14 +++++++++++++-
 .../connectors/source-pivotal-tracker/setup.py     | 14 +++++++++++++-
 .../connectors/source-posthog/setup.py             | 14 +++++++++++++-
 .../source-python-http-tutorial/setup.py           | 14 +++++++++++++-
 .../connectors/source-recharge/setup.py            | 14 +++++++++++++-
 .../connectors/source-recurly/setup.py             | 14 +++++++++++++-
 .../connectors/source-rki-covid/setup.py           | 14 +++++++++++++-
 airbyte-integrations/connectors/source-s3/setup.py | 14 +++++++++++++-
 .../connectors/source-salesloft/setup.py           | 14 +++++++++++++-
 .../source-scaffold-source-python/setup.py         | 14 +++++++++++++-
 .../connectors/source-search-metrics/setup.py      | 14 +++++++++++++-
 .../connectors/source-sendgrid/setup.py            | 14 +++++++++++++-
 .../connectors/source-sentry/setup.py              | 14 +++++++++++++-
 .../connectors/source-sftp-bulk/setup.py           | 14 +++++++++++++-
 .../connectors/source-shopify/setup.py             | 14 +++++++++++++-
 .../connectors/source-slack/setup.py               | 14 +++++++++++++-
 .../connectors/source-smartsheets/setup.py         | 14 +++++++++++++-
 .../connectors/source-snapchat-marketing/setup.py  | 14 +++++++++++++-
 .../connectors/source-surveymonkey/setup.py        | 14 +++++++++++++-
 .../connectors/source-talkdesk-explore/setup.py    | 14 +++++++++++++-
 .../connectors/source-tempo/setup.py               | 14 +++++++++++++-
 .../connectors/source-tiktok-marketing/setup.py    | 14 +++++++++++++-
 .../connectors/source-tplcentral/setup.py          | 14 +++++++++++++-
 .../connectors/source-twilio/setup.py              | 14 +++++++++++++-
 .../connectors/source-us-census/setup.py           | 14 +++++++++++++-
 .../connectors/source-youtube-analytics/setup.py   | 14 +++++++++++++-
 .../connectors/source-zendesk-chat/setup.py        | 14 +++++++++++++-
 .../connectors/source-zendesk-support/setup.py     | 14 +++++++++++++-
 .../connectors/source-zendesk-talk/setup.py        | 14 +++++++++++++-
 .../connectors/source-zenloop/setup.py             | 14 +++++++++++++-
 .../connectors/source-zoho-crm/setup.py            | 14 +++++++++++++-
 .../connectors/source-zuora/setup.py               | 14 +++++++++++++-
 95 files changed, 1235 insertions(+), 95 deletions(-)

diff --git a/airbyte-integrations/connectors/source-airtable/setup.py b/airbyte-integrations/connectors/source-airtable/setup.py
index 9cae029705397..0c9059006741b 100644
--- a/airbyte-integrations/connectors/source-airtable/setup.py
+++ b/airbyte-integrations/connectors/source-airtable/setup.py
@@ -27,7 +27,19 @@
     author_email="anhtuan.nguyen@me.com",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-amazon-ads/setup.py b/airbyte-integrations/connectors/source-amazon-ads/setup.py
index 18026e1939506..d0d29152fbced 100644
--- a/airbyte-integrations/connectors/source-amazon-ads/setup.py
+++ b/airbyte-integrations/connectors/source-amazon-ads/setup.py
@@ -28,7 +28,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-amazon-seller-partner/setup.py b/airbyte-integrations/connectors/source-amazon-seller-partner/setup.py
index 2b9f48ca5e811..ffb08022871dc 100644
--- a/airbyte-integrations/connectors/source-amazon-seller-partner/setup.py
+++ b/airbyte-integrations/connectors/source-amazon-seller-partner/setup.py
@@ -21,7 +21,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-amazon-sqs/setup.py b/airbyte-integrations/connectors/source-amazon-sqs/setup.py
index 12414e180650c..e39e0d894b216 100644
--- a/airbyte-integrations/connectors/source-amazon-sqs/setup.py
+++ b/airbyte-integrations/connectors/source-amazon-sqs/setup.py
@@ -21,7 +21,19 @@
     author_email="airbyte@alasdairb.com",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-appsflyer/setup.py b/airbyte-integrations/connectors/source-appsflyer/setup.py
index cabee5977060d..613efc02fdda3 100644
--- a/airbyte-integrations/connectors/source-appsflyer/setup.py
+++ b/airbyte-integrations/connectors/source-appsflyer/setup.py
@@ -25,7 +25,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-appstore-singer/setup.py b/airbyte-integrations/connectors/source-appstore-singer/setup.py
index d85ef5d07f43e..ecf51e5403a8e 100644
--- a/airbyte-integrations/connectors/source-appstore-singer/setup.py
+++ b/airbyte-integrations/connectors/source-appstore-singer/setup.py
@@ -30,7 +30,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-asana/setup.py b/airbyte-integrations/connectors/source-asana/setup.py
index 7d19a10aad8ac..08e8edc8363f3 100644
--- a/airbyte-integrations/connectors/source-asana/setup.py
+++ b/airbyte-integrations/connectors/source-asana/setup.py
@@ -23,7 +23,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-aws-cloudtrail/setup.py b/airbyte-integrations/connectors/source-aws-cloudtrail/setup.py
index 77d6bdf204863..3bf29110ccb46 100644
--- a/airbyte-integrations/connectors/source-aws-cloudtrail/setup.py
+++ b/airbyte-integrations/connectors/source-aws-cloudtrail/setup.py
@@ -25,7 +25,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-azure-blob-storage/setup.py b/airbyte-integrations/connectors/source-azure-blob-storage/setup.py
index 1dc7c4a275c46..b22b1d7c6be6c 100644
--- a/airbyte-integrations/connectors/source-azure-blob-storage/setup.py
+++ b/airbyte-integrations/connectors/source-azure-blob-storage/setup.py
@@ -25,7 +25,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-azure-table/setup.py b/airbyte-integrations/connectors/source-azure-table/setup.py
index 31eceef9c80e2..2a7451ab94849 100644
--- a/airbyte-integrations/connectors/source-azure-table/setup.py
+++ b/airbyte-integrations/connectors/source-azure-table/setup.py
@@ -25,7 +25,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-bamboo-hr/setup.py b/airbyte-integrations/connectors/source-bamboo-hr/setup.py
index 52914c4c34d46..465c981987f31 100644
--- a/airbyte-integrations/connectors/source-bamboo-hr/setup.py
+++ b/airbyte-integrations/connectors/source-bamboo-hr/setup.py
@@ -25,7 +25,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-bing-ads/setup.py b/airbyte-integrations/connectors/source-bing-ads/setup.py
index 68f92f541a5fd..131d37a10a3d1 100644
--- a/airbyte-integrations/connectors/source-bing-ads/setup.py
+++ b/airbyte-integrations/connectors/source-bing-ads/setup.py
@@ -26,7 +26,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-cart/setup.py b/airbyte-integrations/connectors/source-cart/setup.py
index fe389ea16d47d..c0ee59c3d0472 100644
--- a/airbyte-integrations/connectors/source-cart/setup.py
+++ b/airbyte-integrations/connectors/source-cart/setup.py
@@ -27,7 +27,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-chartmogul/setup.py b/airbyte-integrations/connectors/source-chartmogul/setup.py
index 57b6c73fbac82..624ab8c53ba28 100644
--- a/airbyte-integrations/connectors/source-chartmogul/setup.py
+++ b/airbyte-integrations/connectors/source-chartmogul/setup.py
@@ -27,7 +27,19 @@
     author_email="titas@omnisend.com",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-close-com/setup.py b/airbyte-integrations/connectors/source-close-com/setup.py
index a67ed8241bb01..a6ad55159cd57 100644
--- a/airbyte-integrations/connectors/source-close-com/setup.py
+++ b/airbyte-integrations/connectors/source-close-com/setup.py
@@ -25,7 +25,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-delighted/setup.py b/airbyte-integrations/connectors/source-delighted/setup.py
index f1f4a7be9d788..fdffdc3684807 100644
--- a/airbyte-integrations/connectors/source-delighted/setup.py
+++ b/airbyte-integrations/connectors/source-delighted/setup.py
@@ -28,7 +28,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-dv-360/setup.py b/airbyte-integrations/connectors/source-dv-360/setup.py
index 99188791455c2..850d55c1e6656 100644
--- a/airbyte-integrations/connectors/source-dv-360/setup.py
+++ b/airbyte-integrations/connectors/source-dv-360/setup.py
@@ -21,7 +21,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-facebook-marketing/setup.py b/airbyte-integrations/connectors/source-facebook-marketing/setup.py
index 44f12e25a0d1f..1c8babe488c32 100644
--- a/airbyte-integrations/connectors/source-facebook-marketing/setup.py
+++ b/airbyte-integrations/connectors/source-facebook-marketing/setup.py
@@ -21,7 +21,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-faker/setup.py b/airbyte-integrations/connectors/source-faker/setup.py
index ab39ea2390373..be34ee990f616 100644
--- a/airbyte-integrations/connectors/source-faker/setup.py
+++ b/airbyte-integrations/connectors/source-faker/setup.py
@@ -20,7 +20,19 @@
     author_email="evan@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "schemas/*.json", "record_data/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-fauna/setup.py b/airbyte-integrations/connectors/source-fauna/setup.py
index db1a676e8035c..25c4e60b8647d 100644
--- a/airbyte-integrations/connectors/source-fauna/setup.py
+++ b/airbyte-integrations/connectors/source-fauna/setup.py
@@ -28,7 +28,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-file/setup.py b/airbyte-integrations/connectors/source-file/setup.py
index b2ae12af15130..ac9498821d4c6 100644
--- a/airbyte-integrations/connectors/source-file/setup.py
+++ b/airbyte-integrations/connectors/source-file/setup.py
@@ -38,7 +38,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-firebase-realtime-database/setup.py b/airbyte-integrations/connectors/source-firebase-realtime-database/setup.py
index 84f7e112ff68c..780ac7c466df9 100644
--- a/airbyte-integrations/connectors/source-firebase-realtime-database/setup.py
+++ b/airbyte-integrations/connectors/source-firebase-realtime-database/setup.py
@@ -29,7 +29,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-firebolt/setup.py b/airbyte-integrations/connectors/source-firebolt/setup.py
index 7c342fd2ae166..3e7be0197a3b2 100644
--- a/airbyte-integrations/connectors/source-firebolt/setup.py
+++ b/airbyte-integrations/connectors/source-firebolt/setup.py
@@ -26,7 +26,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-freshdesk/setup.py b/airbyte-integrations/connectors/source-freshdesk/setup.py
index b9cabbadddfc8..95c1abd99b17d 100644
--- a/airbyte-integrations/connectors/source-freshdesk/setup.py
+++ b/airbyte-integrations/connectors/source-freshdesk/setup.py
@@ -26,7 +26,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-gcs/setup.py b/airbyte-integrations/connectors/source-gcs/setup.py
index f218f69dcb09e..0f576ec930cc4 100644
--- a/airbyte-integrations/connectors/source-gcs/setup.py
+++ b/airbyte-integrations/connectors/source-gcs/setup.py
@@ -30,7 +30,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-github/setup.py b/airbyte-integrations/connectors/source-github/setup.py
index 822fd9e37edfe..f2e77e24ac021 100644
--- a/airbyte-integrations/connectors/source-github/setup.py
+++ b/airbyte-integrations/connectors/source-github/setup.py
@@ -21,7 +21,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-gitlab/setup.py b/airbyte-integrations/connectors/source-gitlab/setup.py
index 2d16bcd7d0583..1d006b51ad96b 100644
--- a/airbyte-integrations/connectors/source-gitlab/setup.py
+++ b/airbyte-integrations/connectors/source-gitlab/setup.py
@@ -21,7 +21,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-google-ads/setup.py b/airbyte-integrations/connectors/source-google-ads/setup.py
index 7211a092ff545..545e49124b1ee 100644
--- a/airbyte-integrations/connectors/source-google-ads/setup.py
+++ b/airbyte-integrations/connectors/source-google-ads/setup.py
@@ -25,7 +25,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-google-analytics-data-api/setup.py b/airbyte-integrations/connectors/source-google-analytics-data-api/setup.py
index f2a10ce3101c0..ced6eab0083a5 100644
--- a/airbyte-integrations/connectors/source-google-analytics-data-api/setup.py
+++ b/airbyte-integrations/connectors/source-google-analytics-data-api/setup.py
@@ -26,7 +26,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "schemas/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-google-analytics-v4-service-account-only/setup.py b/airbyte-integrations/connectors/source-google-analytics-v4-service-account-only/setup.py
index c405add054d69..1c9b47c2ec4e8 100644
--- a/airbyte-integrations/connectors/source-google-analytics-v4-service-account-only/setup.py
+++ b/airbyte-integrations/connectors/source-google-analytics-v4-service-account-only/setup.py
@@ -28,7 +28,19 @@ def local_dependency(name: str) -> str:
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-google-analytics-v4/setup.py b/airbyte-integrations/connectors/source-google-analytics-v4/setup.py
index 43f18fd04b376..8f5be0996f3cf 100644
--- a/airbyte-integrations/connectors/source-google-analytics-v4/setup.py
+++ b/airbyte-integrations/connectors/source-google-analytics-v4/setup.py
@@ -26,7 +26,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "defaults/*.json", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-google-directory/setup.py b/airbyte-integrations/connectors/source-google-directory/setup.py
index e10411bc26687..ac1950ff3ea19 100644
--- a/airbyte-integrations/connectors/source-google-directory/setup.py
+++ b/airbyte-integrations/connectors/source-google-directory/setup.py
@@ -31,7 +31,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-google-drive/setup.py b/airbyte-integrations/connectors/source-google-drive/setup.py
index 1015092ff1c89..0eade80fe5ca8 100644
--- a/airbyte-integrations/connectors/source-google-drive/setup.py
+++ b/airbyte-integrations/connectors/source-google-drive/setup.py
@@ -25,7 +25,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-google-search-console/credentials/setup.py b/airbyte-integrations/connectors/source-google-search-console/credentials/setup.py
index 1174b079d6b3a..4e39115533b46 100755
--- a/airbyte-integrations/connectors/source-google-search-console/credentials/setup.py
+++ b/airbyte-integrations/connectors/source-google-search-console/credentials/setup.py
@@ -20,7 +20,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-google-search-console/setup.py b/airbyte-integrations/connectors/source-google-search-console/setup.py
index 9888c3a79d5e9..791c8b7beba34 100755
--- a/airbyte-integrations/connectors/source-google-search-console/setup.py
+++ b/airbyte-integrations/connectors/source-google-search-console/setup.py
@@ -30,7 +30,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-google-workspace-admin-reports/setup.py b/airbyte-integrations/connectors/source-google-workspace-admin-reports/setup.py
index 787e9f8981b48..9d85298d1b15f 100644
--- a/airbyte-integrations/connectors/source-google-workspace-admin-reports/setup.py
+++ b/airbyte-integrations/connectors/source-google-workspace-admin-reports/setup.py
@@ -32,7 +32,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-greenhouse/setup.py b/airbyte-integrations/connectors/source-greenhouse/setup.py
index 3b9c02aec527d..b0333d480c34b 100644
--- a/airbyte-integrations/connectors/source-greenhouse/setup.py
+++ b/airbyte-integrations/connectors/source-greenhouse/setup.py
@@ -23,7 +23,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=["airbyte-cdk>=0.44.1", "dataclasses-jsonschema==2.15.1"],
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-harvest/setup.py b/airbyte-integrations/connectors/source-harvest/setup.py
index 4c73f9283e52e..d25d065699df1 100644
--- a/airbyte-integrations/connectors/source-harvest/setup.py
+++ b/airbyte-integrations/connectors/source-harvest/setup.py
@@ -27,7 +27,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-hubspot/setup.py b/airbyte-integrations/connectors/source-hubspot/setup.py
index a1831948c262e..0f2f944913267 100644
--- a/airbyte-integrations/connectors/source-hubspot/setup.py
+++ b/airbyte-integrations/connectors/source-hubspot/setup.py
@@ -28,7 +28,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-instagram/setup.py b/airbyte-integrations/connectors/source-instagram/setup.py
index cfaf2e20122fe..b67ee6f39677e 100644
--- a/airbyte-integrations/connectors/source-instagram/setup.py
+++ b/airbyte-integrations/connectors/source-instagram/setup.py
@@ -30,7 +30,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-iterable/setup.py b/airbyte-integrations/connectors/source-iterable/setup.py
index fd2061fb89fb7..8cdf6e07b6667 100644
--- a/airbyte-integrations/connectors/source-iterable/setup.py
+++ b/airbyte-integrations/connectors/source-iterable/setup.py
@@ -30,5 +30,17 @@
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
-    package_data={"": ["*.json", "schemas/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
 )
diff --git a/airbyte-integrations/connectors/source-jira/setup.py b/airbyte-integrations/connectors/source-jira/setup.py
index ccce70beddfc9..653bc9e80640a 100644
--- a/airbyte-integrations/connectors/source-jira/setup.py
+++ b/airbyte-integrations/connectors/source-jira/setup.py
@@ -26,7 +26,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "schemas/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-klaviyo/setup.py b/airbyte-integrations/connectors/source-klaviyo/setup.py
index d9ac3a2fb8070..854e9a61dac30 100644
--- a/airbyte-integrations/connectors/source-klaviyo/setup.py
+++ b/airbyte-integrations/connectors/source-klaviyo/setup.py
@@ -21,7 +21,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "schemas/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-kustomer-singer/setup.py b/airbyte-integrations/connectors/source-kustomer-singer/setup.py
index dbaf47851ce79..bc8c571208078 100644
--- a/airbyte-integrations/connectors/source-kustomer-singer/setup.py
+++ b/airbyte-integrations/connectors/source-kustomer-singer/setup.py
@@ -69,7 +69,19 @@ def run(self):
         "develop": CustomDevelopCommand,
         "egg_info": CustomEggInfoCommand,
     },
-    package_data={"": ["*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-kyriba/setup.py b/airbyte-integrations/connectors/source-kyriba/setup.py
index 00c6c13f5657c..fe8f94c888d0a 100644
--- a/airbyte-integrations/connectors/source-kyriba/setup.py
+++ b/airbyte-integrations/connectors/source-kyriba/setup.py
@@ -27,7 +27,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-kyve/setup.py b/airbyte-integrations/connectors/source-kyve/setup.py
index 128e97f87d250..709638a8574af 100644
--- a/airbyte-integrations/connectors/source-kyve/setup.py
+++ b/airbyte-integrations/connectors/source-kyve/setup.py
@@ -27,7 +27,19 @@
     author_email="security@kyve.network",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-lever-hiring/setup.py b/airbyte-integrations/connectors/source-lever-hiring/setup.py
index 0004a96f9d059..b87f0ba2038ad 100644
--- a/airbyte-integrations/connectors/source-lever-hiring/setup.py
+++ b/airbyte-integrations/connectors/source-lever-hiring/setup.py
@@ -28,7 +28,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-linkedin-ads/setup.py b/airbyte-integrations/connectors/source-linkedin-ads/setup.py
index ceff2ed3bf729..c8ea4f0b34cab 100644
--- a/airbyte-integrations/connectors/source-linkedin-ads/setup.py
+++ b/airbyte-integrations/connectors/source-linkedin-ads/setup.py
@@ -25,7 +25,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-linkedin-pages/setup.py b/airbyte-integrations/connectors/source-linkedin-pages/setup.py
index 6f3d0697a13d7..1b491a1f3e952 100644
--- a/airbyte-integrations/connectors/source-linkedin-pages/setup.py
+++ b/airbyte-integrations/connectors/source-linkedin-pages/setup.py
@@ -28,7 +28,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-linnworks/setup.py b/airbyte-integrations/connectors/source-linnworks/setup.py
index 1256710cb3ff0..54eed575b5d43 100644
--- a/airbyte-integrations/connectors/source-linnworks/setup.py
+++ b/airbyte-integrations/connectors/source-linnworks/setup.py
@@ -27,7 +27,19 @@
     author_email="jv@labanoras.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-looker/setup.py b/airbyte-integrations/connectors/source-looker/setup.py
index dc5e3295ad405..311a876d7fd9b 100644
--- a/airbyte-integrations/connectors/source-looker/setup.py
+++ b/airbyte-integrations/connectors/source-looker/setup.py
@@ -31,7 +31,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "schemas/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-mailchimp/setup.py b/airbyte-integrations/connectors/source-mailchimp/setup.py
index 0773da0844844..58acdf82195dd 100644
--- a/airbyte-integrations/connectors/source-mailchimp/setup.py
+++ b/airbyte-integrations/connectors/source-mailchimp/setup.py
@@ -23,6 +23,18 @@
         "airbyte-cdk",
         "pytest~=6.1",
     ],
-    package_data={"": ["*.json", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={"tests": TEST_REQUIREMENTS},
 )
diff --git a/airbyte-integrations/connectors/source-marketo/setup.py b/airbyte-integrations/connectors/source-marketo/setup.py
index b8dfcde912ade..d1cccd943541e 100644
--- a/airbyte-integrations/connectors/source-marketo/setup.py
+++ b/airbyte-integrations/connectors/source-marketo/setup.py
@@ -28,7 +28,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-microsoft-teams/setup.py b/airbyte-integrations/connectors/source-microsoft-teams/setup.py
index f840cc27859ae..07b984cad43d8 100644
--- a/airbyte-integrations/connectors/source-microsoft-teams/setup.py
+++ b/airbyte-integrations/connectors/source-microsoft-teams/setup.py
@@ -30,7 +30,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-mixpanel/setup.py b/airbyte-integrations/connectors/source-mixpanel/setup.py
index b89f8d01fbd7a..9db4a5f2e5c13 100644
--- a/airbyte-integrations/connectors/source-mixpanel/setup.py
+++ b/airbyte-integrations/connectors/source-mixpanel/setup.py
@@ -23,7 +23,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-monday/setup.py b/airbyte-integrations/connectors/source-monday/setup.py
index c99ddb8f0ed0a..959f2bbcea686 100644
--- a/airbyte-integrations/connectors/source-monday/setup.py
+++ b/airbyte-integrations/connectors/source-monday/setup.py
@@ -27,7 +27,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-my-hours/setup.py b/airbyte-integrations/connectors/source-my-hours/setup.py
index 4e8a87ce39eda..0f1e5c67af1ac 100644
--- a/airbyte-integrations/connectors/source-my-hours/setup.py
+++ b/airbyte-integrations/connectors/source-my-hours/setup.py
@@ -28,7 +28,19 @@
     author_email="wisse@vrowl.nl",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-notion/setup.py b/airbyte-integrations/connectors/source-notion/setup.py
index d31dfbbdeee3c..5ab3bec50ffd1 100644
--- a/airbyte-integrations/connectors/source-notion/setup.py
+++ b/airbyte-integrations/connectors/source-notion/setup.py
@@ -29,7 +29,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-okta/setup.py b/airbyte-integrations/connectors/source-okta/setup.py
index 1a15dc58fd478..1d2c69920b889 100644
--- a/airbyte-integrations/connectors/source-okta/setup.py
+++ b/airbyte-integrations/connectors/source-okta/setup.py
@@ -28,7 +28,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-orb/setup.py b/airbyte-integrations/connectors/source-orb/setup.py
index 68f05af00a2c1..da07d9e21ecd2 100644
--- a/airbyte-integrations/connectors/source-orb/setup.py
+++ b/airbyte-integrations/connectors/source-orb/setup.py
@@ -21,7 +21,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-outreach/setup.py b/airbyte-integrations/connectors/source-outreach/setup.py
index dc15e76330f87..87c10aedcb882 100644
--- a/airbyte-integrations/connectors/source-outreach/setup.py
+++ b/airbyte-integrations/connectors/source-outreach/setup.py
@@ -27,7 +27,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-pardot/setup.py b/airbyte-integrations/connectors/source-pardot/setup.py
index 47cbea1de2c02..da875f7e20575 100644
--- a/airbyte-integrations/connectors/source-pardot/setup.py
+++ b/airbyte-integrations/connectors/source-pardot/setup.py
@@ -27,7 +27,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-paystack/setup.py b/airbyte-integrations/connectors/source-paystack/setup.py
index 22f2c755d169c..8d37937dc6675 100644
--- a/airbyte-integrations/connectors/source-paystack/setup.py
+++ b/airbyte-integrations/connectors/source-paystack/setup.py
@@ -23,7 +23,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-pinterest/setup.py b/airbyte-integrations/connectors/source-pinterest/setup.py
index d09828b5c17e6..e75f6a651d013 100644
--- a/airbyte-integrations/connectors/source-pinterest/setup.py
+++ b/airbyte-integrations/connectors/source-pinterest/setup.py
@@ -26,7 +26,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-pivotal-tracker/setup.py b/airbyte-integrations/connectors/source-pivotal-tracker/setup.py
index e6c5edb752f17..050e33c2a4f73 100644
--- a/airbyte-integrations/connectors/source-pivotal-tracker/setup.py
+++ b/airbyte-integrations/connectors/source-pivotal-tracker/setup.py
@@ -28,7 +28,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-posthog/setup.py b/airbyte-integrations/connectors/source-posthog/setup.py
index 2f23e21f1cf87..5ebf94b4b0799 100644
--- a/airbyte-integrations/connectors/source-posthog/setup.py
+++ b/airbyte-integrations/connectors/source-posthog/setup.py
@@ -25,6 +25,18 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml", "schemas/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={"tests": TEST_REQUIREMENTS},
 )
diff --git a/airbyte-integrations/connectors/source-python-http-tutorial/setup.py b/airbyte-integrations/connectors/source-python-http-tutorial/setup.py
index be40ba5ca6c62..35164f2108aa4 100644
--- a/airbyte-integrations/connectors/source-python-http-tutorial/setup.py
+++ b/airbyte-integrations/connectors/source-python-http-tutorial/setup.py
@@ -16,5 +16,17 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=["airbyte-cdk", "pytest"],
-    package_data={"": ["*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
 )
diff --git a/airbyte-integrations/connectors/source-recharge/setup.py b/airbyte-integrations/connectors/source-recharge/setup.py
index d51c828ffa5b4..3e80432c9c577 100644
--- a/airbyte-integrations/connectors/source-recharge/setup.py
+++ b/airbyte-integrations/connectors/source-recharge/setup.py
@@ -27,7 +27,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-recurly/setup.py b/airbyte-integrations/connectors/source-recurly/setup.py
index 16e2364aeb01c..1d1cce5a7cd78 100644
--- a/airbyte-integrations/connectors/source-recurly/setup.py
+++ b/airbyte-integrations/connectors/source-recurly/setup.py
@@ -25,7 +25,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-rki-covid/setup.py b/airbyte-integrations/connectors/source-rki-covid/setup.py
index 78722548d0b10..382e0f4e84b42 100644
--- a/airbyte-integrations/connectors/source-rki-covid/setup.py
+++ b/airbyte-integrations/connectors/source-rki-covid/setup.py
@@ -23,7 +23,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-s3/setup.py b/airbyte-integrations/connectors/source-s3/setup.py
index cd2c48e2924dc..aa86f2a7c2463 100644
--- a/airbyte-integrations/connectors/source-s3/setup.py
+++ b/airbyte-integrations/connectors/source-s3/setup.py
@@ -23,7 +23,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-salesloft/setup.py b/airbyte-integrations/connectors/source-salesloft/setup.py
index 58bcf6176dd63..f272bb4432de0 100644
--- a/airbyte-integrations/connectors/source-salesloft/setup.py
+++ b/airbyte-integrations/connectors/source-salesloft/setup.py
@@ -25,7 +25,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-scaffold-source-python/setup.py b/airbyte-integrations/connectors/source-scaffold-source-python/setup.py
index d4b3ebe7601b7..ebeda07f69986 100644
--- a/airbyte-integrations/connectors/source-scaffold-source-python/setup.py
+++ b/airbyte-integrations/connectors/source-scaffold-source-python/setup.py
@@ -28,7 +28,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-search-metrics/setup.py b/airbyte-integrations/connectors/source-search-metrics/setup.py
index dfc33d408c228..2e3f6e81f3105 100644
--- a/airbyte-integrations/connectors/source-search-metrics/setup.py
+++ b/airbyte-integrations/connectors/source-search-metrics/setup.py
@@ -27,7 +27,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-sendgrid/setup.py b/airbyte-integrations/connectors/source-sendgrid/setup.py
index 0bfa4f9dd3b2a..6d6e3b9201051 100644
--- a/airbyte-integrations/connectors/source-sendgrid/setup.py
+++ b/airbyte-integrations/connectors/source-sendgrid/setup.py
@@ -25,7 +25,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-sentry/setup.py b/airbyte-integrations/connectors/source-sentry/setup.py
index d1677c524a4d1..b434d911ec501 100644
--- a/airbyte-integrations/connectors/source-sentry/setup.py
+++ b/airbyte-integrations/connectors/source-sentry/setup.py
@@ -28,7 +28,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-sftp-bulk/setup.py b/airbyte-integrations/connectors/source-sftp-bulk/setup.py
index e09d478f90079..282a57ca1fac2 100644
--- a/airbyte-integrations/connectors/source-sftp-bulk/setup.py
+++ b/airbyte-integrations/connectors/source-sftp-bulk/setup.py
@@ -27,7 +27,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "*.yaml"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-shopify/setup.py b/airbyte-integrations/connectors/source-shopify/setup.py
index 7c87ac4cf564b..dc38aaea43d12 100644
--- a/airbyte-integrations/connectors/source-shopify/setup.py
+++ b/airbyte-integrations/connectors/source-shopify/setup.py
@@ -20,7 +20,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-slack/setup.py b/airbyte-integrations/connectors/source-slack/setup.py
index f1040f3acca22..1acab113b35d2 100644
--- a/airbyte-integrations/connectors/source-slack/setup.py
+++ b/airbyte-integrations/connectors/source-slack/setup.py
@@ -23,7 +23,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=["airbyte-cdk", "pendulum>=2,<3"],
-    package_data={"": ["*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-smartsheets/setup.py b/airbyte-integrations/connectors/source-smartsheets/setup.py
index 661a68ca12bec..006b0fab9b906 100644
--- a/airbyte-integrations/connectors/source-smartsheets/setup.py
+++ b/airbyte-integrations/connectors/source-smartsheets/setup.py
@@ -23,5 +23,17 @@
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
-    package_data={"": ["*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
 )
diff --git a/airbyte-integrations/connectors/source-snapchat-marketing/setup.py b/airbyte-integrations/connectors/source-snapchat-marketing/setup.py
index 71d4210cbe54e..083a611ccab0d 100644
--- a/airbyte-integrations/connectors/source-snapchat-marketing/setup.py
+++ b/airbyte-integrations/connectors/source-snapchat-marketing/setup.py
@@ -23,7 +23,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-surveymonkey/setup.py b/airbyte-integrations/connectors/source-surveymonkey/setup.py
index a72a0108a10bf..a39c6d22bc802 100644
--- a/airbyte-integrations/connectors/source-surveymonkey/setup.py
+++ b/airbyte-integrations/connectors/source-surveymonkey/setup.py
@@ -21,7 +21,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-talkdesk-explore/setup.py b/airbyte-integrations/connectors/source-talkdesk-explore/setup.py
index 5df2ba2853d07..1ec623cfb4d57 100644
--- a/airbyte-integrations/connectors/source-talkdesk-explore/setup.py
+++ b/airbyte-integrations/connectors/source-talkdesk-explore/setup.py
@@ -27,7 +27,19 @@
     author_email="alexandre.martins@saltpay.co",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-tempo/setup.py b/airbyte-integrations/connectors/source-tempo/setup.py
index 3e2668d10d6c3..37cf227b0f5b3 100644
--- a/airbyte-integrations/connectors/source-tempo/setup.py
+++ b/airbyte-integrations/connectors/source-tempo/setup.py
@@ -27,7 +27,19 @@
     author_email="thomas@gcompany.nl",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-tiktok-marketing/setup.py b/airbyte-integrations/connectors/source-tiktok-marketing/setup.py
index 21896188c6be1..68b52709f03b0 100644
--- a/airbyte-integrations/connectors/source-tiktok-marketing/setup.py
+++ b/airbyte-integrations/connectors/source-tiktok-marketing/setup.py
@@ -21,6 +21,18 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={"tests": TEST_REQUIREMENTS},
 )
diff --git a/airbyte-integrations/connectors/source-tplcentral/setup.py b/airbyte-integrations/connectors/source-tplcentral/setup.py
index 45cd0ff8a6335..b3d6343e0d1cb 100644
--- a/airbyte-integrations/connectors/source-tplcentral/setup.py
+++ b/airbyte-integrations/connectors/source-tplcentral/setup.py
@@ -28,7 +28,19 @@
     author_email="jv@labanoras.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-twilio/setup.py b/airbyte-integrations/connectors/source-twilio/setup.py
index 19717cccc42f1..d4124f980af5f 100644
--- a/airbyte-integrations/connectors/source-twilio/setup.py
+++ b/airbyte-integrations/connectors/source-twilio/setup.py
@@ -25,7 +25,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-us-census/setup.py b/airbyte-integrations/connectors/source-us-census/setup.py
index bf3858455362c..a88a817b95a91 100644
--- a/airbyte-integrations/connectors/source-us-census/setup.py
+++ b/airbyte-integrations/connectors/source-us-census/setup.py
@@ -28,7 +28,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-youtube-analytics/setup.py b/airbyte-integrations/connectors/source-youtube-analytics/setup.py
index 9b17c4365ad8d..1a4c92407af16 100644
--- a/airbyte-integrations/connectors/source-youtube-analytics/setup.py
+++ b/airbyte-integrations/connectors/source-youtube-analytics/setup.py
@@ -27,7 +27,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-zendesk-chat/setup.py b/airbyte-integrations/connectors/source-zendesk-chat/setup.py
index 8e1732196deb1..88422f67917c6 100644
--- a/airbyte-integrations/connectors/source-zendesk-chat/setup.py
+++ b/airbyte-integrations/connectors/source-zendesk-chat/setup.py
@@ -16,7 +16,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "schemas/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-zendesk-support/setup.py b/airbyte-integrations/connectors/source-zendesk-support/setup.py
index e0466040c015f..bddcdcef42085 100644
--- a/airbyte-integrations/connectors/source-zendesk-support/setup.py
+++ b/airbyte-integrations/connectors/source-zendesk-support/setup.py
@@ -22,7 +22,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-zendesk-talk/setup.py b/airbyte-integrations/connectors/source-zendesk-talk/setup.py
index 204a1c5cded52..2c66cbc2c8671 100644
--- a/airbyte-integrations/connectors/source-zendesk-talk/setup.py
+++ b/airbyte-integrations/connectors/source-zendesk-talk/setup.py
@@ -26,7 +26,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "schemas/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-zenloop/setup.py b/airbyte-integrations/connectors/source-zenloop/setup.py
index f6920042865b1..8bc3ceffdfcb0 100644
--- a/airbyte-integrations/connectors/source-zenloop/setup.py
+++ b/airbyte-integrations/connectors/source-zenloop/setup.py
@@ -28,7 +28,19 @@
     author_email="alexander.batoulis@hometogo.com",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-zoho-crm/setup.py b/airbyte-integrations/connectors/source-zoho-crm/setup.py
index a44e9b0529a7e..15425f380be42 100644
--- a/airbyte-integrations/connectors/source-zoho-crm/setup.py
+++ b/airbyte-integrations/connectors/source-zoho-crm/setup.py
@@ -27,7 +27,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },
diff --git a/airbyte-integrations/connectors/source-zuora/setup.py b/airbyte-integrations/connectors/source-zuora/setup.py
index 43b397e5c1830..6cec429e1996b 100644
--- a/airbyte-integrations/connectors/source-zuora/setup.py
+++ b/airbyte-integrations/connectors/source-zuora/setup.py
@@ -27,7 +27,19 @@
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={"": ["*.json", "schemas/*.json", "schemas/shared/*.json"]},
+    package_data={
+        "": [
+            # Include yaml files in the package (if any)
+            "*.yml",
+            "*.yaml",
+            # Include all json files in the package, up to 4 levels deep
+            "*.json",
+            "*/*.json",
+            "*/*/*.json",
+            "*/*/*/*.json",
+            "*/*/*/*/*.json",
+        ]
+    },
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },

From 70b05a687e41466b8c80af6b5dd697ce80f52dd8 Mon Sep 17 00:00:00 2001
From: Joe Reuter <joe@airbyte.io>
Date: Tue, 30 Jan 2024 12:26:28 +0100
Subject: [PATCH 17/96] Publish pokeapi to pypi (#34650)

---
 airbyte-integrations/connectors/source-pokeapi/metadata.yaml | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/airbyte-integrations/connectors/source-pokeapi/metadata.yaml b/airbyte-integrations/connectors/source-pokeapi/metadata.yaml
index 076a75a780a48..2f6a410ea49b2 100644
--- a/airbyte-integrations/connectors/source-pokeapi/metadata.yaml
+++ b/airbyte-integrations/connectors/source-pokeapi/metadata.yaml
@@ -2,6 +2,10 @@ data:
   allowedHosts:
     hosts:
       - "*"
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-pokeapi
   registries:
     oss:
       enabled: true

From b5e268e2a7ed6c8ad27f4700b97a3669e99eb2f5 Mon Sep 17 00:00:00 2001
From: Anatolii Yatsuk <35109939+tolik0@users.noreply.github.com>
Date: Tue, 30 Jan 2024 13:40:17 +0200
Subject: [PATCH 18/96] :bug: Source Microsoft OneDrive: Fix Oauth (#34478)

---
 .../connectors/source-microsoft-onedrive/metadata.yaml       | 2 +-
 .../source_microsoft_onedrive/source.py                      | 5 +++++
 docs/integrations/sources/microsoft-onedrive.md              | 5 +++--
 3 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/airbyte-integrations/connectors/source-microsoft-onedrive/metadata.yaml b/airbyte-integrations/connectors/source-microsoft-onedrive/metadata.yaml
index 0bab747ccf4d6..f1b3317b475c5 100644
--- a/airbyte-integrations/connectors/source-microsoft-onedrive/metadata.yaml
+++ b/airbyte-integrations/connectors/source-microsoft-onedrive/metadata.yaml
@@ -16,7 +16,7 @@ data:
   connectorSubtype: api
   connectorType: source
   definitionId: 01d1c685-fd4a-4837-8f4c-93fe5a0d2188
-  dockerImageTag: 0.1.0
+  dockerImageTag: 0.1.3
   dockerRepository: airbyte/source-microsoft-onedrive
   githubIssueLabel: source-microsoft-onedrive
   icon: microsoft-onedrive.svg
diff --git a/airbyte-integrations/connectors/source-microsoft-onedrive/source_microsoft_onedrive/source.py b/airbyte-integrations/connectors/source-microsoft-onedrive/source_microsoft_onedrive/source.py
index e58d75d8625c2..87cf25732fd8d 100644
--- a/airbyte-integrations/connectors/source-microsoft-onedrive/source_microsoft_onedrive/source.py
+++ b/airbyte-integrations/connectors/source-microsoft-onedrive/source_microsoft_onedrive/source.py
@@ -50,6 +50,11 @@ def spec(self, *args: Any, **kwargs: Any) -> ConnectorSpecification:
                             "client_secret": {"type": "string", "path_in_connector_config": ["credentials", "client_secret"]},
                         },
                     },
+                    oauth_user_input_from_connector_config_specification={
+                        "type": "object",
+                        "additionalProperties": False,
+                        "properties": {"tenant_id": {"type": "string", "path_in_connector_config": ["credentials", "tenant_id"]}},
+                    },
                 ),
             ),
         )
diff --git a/docs/integrations/sources/microsoft-onedrive.md b/docs/integrations/sources/microsoft-onedrive.md
index e3f1335d2571f..6446c72bcb3bc 100644
--- a/docs/integrations/sources/microsoft-onedrive.md
+++ b/docs/integrations/sources/microsoft-onedrive.md
@@ -121,6 +121,7 @@ The connector is restricted by normal Microsoft Graph [requests limitation](http
 
 | Version | Date       | Pull Request                                             | Subject                   |
 |:--------|:-----------|:---------------------------------------------------------|:--------------------------|
-| 0.1.2   | 2021-12-22 | [00000](https://github.com/airbytehq/airbyte/pull/00000) | Add ql and sl to metadata |
-| 0.1.1   | 2021-12-15 | [33539](https://github.com/airbytehq/airbyte/pull/33539) | Fix for docs name         |
+| 0.1.3   | 2024-01-24 | [34478](https://github.com/airbytehq/airbyte/pull/34478) | Fix OAuth                 |
+| 0.1.2   | 2021-12-22 | [33745](https://github.com/airbytehq/airbyte/pull/33745) | Add ql and sl to metadata |
+| 0.1.1   | 2021-12-15 | [33758](https://github.com/airbytehq/airbyte/pull/33758) | Fix for docs name         |
 | 0.1.0   | 2021-12-06 | [32655](https://github.com/airbytehq/airbyte/pull/32655) | New source                |

From d7ddc776bd3cf8bf156db74458dc17b561bd03f5 Mon Sep 17 00:00:00 2001
From: Joe Reuter <joe@airbyte.io>
Date: Tue, 30 Jan 2024 14:07:04 +0100
Subject: [PATCH 19/96] Publish to pypi (#34652)

---
 .../connectors/source-activecampaign/metadata.yaml           | 4 ++++
 airbyte-integrations/connectors/source-adjust/metadata.yaml  | 4 ++++
 airbyte-integrations/connectors/source-aha/metadata.yaml     | 4 ++++
 airbyte-integrations/connectors/source-aircall/metadata.yaml | 4 ++++
 .../connectors/source-airtable/metadata.yaml                 | 4 ++++
 .../connectors/source-alpha-vantage/metadata.yaml            | 4 ++++
 .../connectors/source-amazon-ads/metadata.yaml               | 4 ++++
 .../connectors/source-amazon-seller-partner/metadata.yaml    | 4 ++++
 .../connectors/source-amazon-sqs/metadata.yaml               | 4 ++++
 .../connectors/source-amplitude/metadata.yaml                | 4 ++++
 .../connectors/source-appfollow/metadata.yaml                | 4 ++++
 .../connectors/source-apple-search-ads/metadata.yaml         | 4 ++++
 .../connectors/source-appsflyer/metadata.yaml                | 4 ++++
 .../connectors/source-appstore-singer/metadata.yaml          | 5 +++++
 airbyte-integrations/connectors/source-asana/metadata.yaml   | 4 ++++
 airbyte-integrations/connectors/source-ashby/metadata.yaml   | 4 ++++
 airbyte-integrations/connectors/source-auth0/metadata.yaml   | 4 ++++
 .../connectors/source-aws-cloudtrail/metadata.yaml           | 4 ++++
 .../connectors/source-azure-blob-storage/metadata.yaml       | 5 +++++
 .../connectors/source-azure-table/metadata.yaml              | 4 ++++
 20 files changed, 82 insertions(+)

diff --git a/airbyte-integrations/connectors/source-activecampaign/metadata.yaml b/airbyte-integrations/connectors/source-activecampaign/metadata.yaml
index 7b302f920aa0b..e7b926edc0a0a 100644
--- a/airbyte-integrations/connectors/source-activecampaign/metadata.yaml
+++ b/airbyte-integrations/connectors/source-activecampaign/metadata.yaml
@@ -12,6 +12,10 @@ data:
   icon: activecampaign.svg
   license: MIT
   name: ActiveCampaign
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-activecampaign
   registries:
     cloud:
       enabled: false
diff --git a/airbyte-integrations/connectors/source-adjust/metadata.yaml b/airbyte-integrations/connectors/source-adjust/metadata.yaml
index f3a7d7bb290ad..f45ead0f39c6d 100644
--- a/airbyte-integrations/connectors/source-adjust/metadata.yaml
+++ b/airbyte-integrations/connectors/source-adjust/metadata.yaml
@@ -12,6 +12,10 @@ data:
   icon: adjust.svg
   license: MIT
   name: Adjust
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-adjust
   registries:
     cloud:
       enabled: false
diff --git a/airbyte-integrations/connectors/source-aha/metadata.yaml b/airbyte-integrations/connectors/source-aha/metadata.yaml
index cbbecab8c0807..88d029de3b5d5 100644
--- a/airbyte-integrations/connectors/source-aha/metadata.yaml
+++ b/airbyte-integrations/connectors/source-aha/metadata.yaml
@@ -12,6 +12,10 @@ data:
   icon: aha.svg
   license: MIT
   name: Aha
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-aha
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-aircall/metadata.yaml b/airbyte-integrations/connectors/source-aircall/metadata.yaml
index 1883e76b2e696..c76243302b10f 100644
--- a/airbyte-integrations/connectors/source-aircall/metadata.yaml
+++ b/airbyte-integrations/connectors/source-aircall/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: aircall.svg
   license: MIT
   name: Aircall
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-aircall
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-airtable/metadata.yaml b/airbyte-integrations/connectors/source-airtable/metadata.yaml
index c722087101dd8..8b3ed52a05ed7 100644
--- a/airbyte-integrations/connectors/source-airtable/metadata.yaml
+++ b/airbyte-integrations/connectors/source-airtable/metadata.yaml
@@ -18,6 +18,10 @@ data:
   icon: airtable.svg
   license: MIT
   name: Airtable
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-airtable
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-alpha-vantage/metadata.yaml b/airbyte-integrations/connectors/source-alpha-vantage/metadata.yaml
index d4f4a1a63e0f5..2eb0807b39578 100644
--- a/airbyte-integrations/connectors/source-alpha-vantage/metadata.yaml
+++ b/airbyte-integrations/connectors/source-alpha-vantage/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: alpha-vantage.svg
   license: MIT
   name: Alpha Vantage
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-alpha-vantage
   registries:
     cloud:
       enabled: false
diff --git a/airbyte-integrations/connectors/source-amazon-ads/metadata.yaml b/airbyte-integrations/connectors/source-amazon-ads/metadata.yaml
index 0efe4b2b434d6..1884fb64ce97b 100644
--- a/airbyte-integrations/connectors/source-amazon-ads/metadata.yaml
+++ b/airbyte-integrations/connectors/source-amazon-ads/metadata.yaml
@@ -20,6 +20,10 @@ data:
   icon: amazonads.svg
   license: MIT
   name: Amazon Ads
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-amazon-ads
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-amazon-seller-partner/metadata.yaml b/airbyte-integrations/connectors/source-amazon-seller-partner/metadata.yaml
index 8c486641bdb44..4d6e4c510c45f 100644
--- a/airbyte-integrations/connectors/source-amazon-seller-partner/metadata.yaml
+++ b/airbyte-integrations/connectors/source-amazon-seller-partner/metadata.yaml
@@ -22,6 +22,10 @@ data:
   icon: amazonsellerpartner.svg
   license: MIT
   name: Amazon Seller Partner
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-amazon-seller-partner
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-amazon-sqs/metadata.yaml b/airbyte-integrations/connectors/source-amazon-sqs/metadata.yaml
index 457e4edafe0e4..6b6bd34f1cfbc 100644
--- a/airbyte-integrations/connectors/source-amazon-sqs/metadata.yaml
+++ b/airbyte-integrations/connectors/source-amazon-sqs/metadata.yaml
@@ -12,6 +12,10 @@ data:
   icon: awssqs.svg
   license: MIT
   name: Amazon SQS
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-amazon-sqs
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-amplitude/metadata.yaml b/airbyte-integrations/connectors/source-amplitude/metadata.yaml
index fac7409316513..1a51b2ef99c20 100644
--- a/airbyte-integrations/connectors/source-amplitude/metadata.yaml
+++ b/airbyte-integrations/connectors/source-amplitude/metadata.yaml
@@ -18,6 +18,10 @@ data:
   icon: amplitude.svg
   license: MIT
   name: Amplitude
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-amplitude
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-appfollow/metadata.yaml b/airbyte-integrations/connectors/source-appfollow/metadata.yaml
index 7e9cb43f0cac0..ad5e49e07ca49 100644
--- a/airbyte-integrations/connectors/source-appfollow/metadata.yaml
+++ b/airbyte-integrations/connectors/source-appfollow/metadata.yaml
@@ -2,6 +2,10 @@ data:
   allowedHosts:
     hosts:
       - https://api.appfollow.io
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-appfollow
   registries:
     oss:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-apple-search-ads/metadata.yaml b/airbyte-integrations/connectors/source-apple-search-ads/metadata.yaml
index 1406f248390ed..bbbaecfeef944 100644
--- a/airbyte-integrations/connectors/source-apple-search-ads/metadata.yaml
+++ b/airbyte-integrations/connectors/source-apple-search-ads/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: apple.svg
   license: MIT
   name: Apple Search Ads
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-apple-search-ads
   registries:
     cloud:
       enabled: false
diff --git a/airbyte-integrations/connectors/source-appsflyer/metadata.yaml b/airbyte-integrations/connectors/source-appsflyer/metadata.yaml
index 4f3c263c6cbbc..21d47e8efcbdd 100644
--- a/airbyte-integrations/connectors/source-appsflyer/metadata.yaml
+++ b/airbyte-integrations/connectors/source-appsflyer/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: appsflyer.svg
   license: MIT
   name: AppsFlyer
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-appsflyer
   registries:
     cloud:
       enabled: false
diff --git a/airbyte-integrations/connectors/source-appstore-singer/metadata.yaml b/airbyte-integrations/connectors/source-appstore-singer/metadata.yaml
index cb0d55be57b36..703a0000210f9 100644
--- a/airbyte-integrations/connectors/source-appstore-singer/metadata.yaml
+++ b/airbyte-integrations/connectors/source-appstore-singer/metadata.yaml
@@ -8,6 +8,11 @@ data:
   icon: appstore.svg
   license: MIT
   name: Appstore
+  remoteRegistries:
+    pypi:
+      enabled: false
+      # TODO: Set enabled=true after `airbyte-lib-validate-source` is passing.
+      packageName: airbyte-source-appstore-singer
   registries:
     cloud:
       enabled: false
diff --git a/airbyte-integrations/connectors/source-asana/metadata.yaml b/airbyte-integrations/connectors/source-asana/metadata.yaml
index d3a4dd21bda35..ae99033996f82 100644
--- a/airbyte-integrations/connectors/source-asana/metadata.yaml
+++ b/airbyte-integrations/connectors/source-asana/metadata.yaml
@@ -15,6 +15,10 @@ data:
   icon: asana.svg
   license: MIT
   name: Asana
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-asana
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-ashby/metadata.yaml b/airbyte-integrations/connectors/source-ashby/metadata.yaml
index 510c053762408..94a4355863a36 100644
--- a/airbyte-integrations/connectors/source-ashby/metadata.yaml
+++ b/airbyte-integrations/connectors/source-ashby/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: ashby.svg
   license: MIT
   name: Ashby
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-ashby
   registries:
     cloud:
       enabled: false
diff --git a/airbyte-integrations/connectors/source-auth0/metadata.yaml b/airbyte-integrations/connectors/source-auth0/metadata.yaml
index 9566ee9d78002..21016c9467fd4 100644
--- a/airbyte-integrations/connectors/source-auth0/metadata.yaml
+++ b/airbyte-integrations/connectors/source-auth0/metadata.yaml
@@ -17,6 +17,10 @@ data:
   icon: auth0.svg
   license: MIT
   name: Auth0
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-auth0
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-aws-cloudtrail/metadata.yaml b/airbyte-integrations/connectors/source-aws-cloudtrail/metadata.yaml
index 3b3240c49425e..f4d483e04c68b 100644
--- a/airbyte-integrations/connectors/source-aws-cloudtrail/metadata.yaml
+++ b/airbyte-integrations/connectors/source-aws-cloudtrail/metadata.yaml
@@ -12,6 +12,10 @@ data:
   icon: awscloudtrail.svg
   license: MIT
   name: AWS CloudTrail
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-aws-cloudtrail
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-azure-blob-storage/metadata.yaml b/airbyte-integrations/connectors/source-azure-blob-storage/metadata.yaml
index 839510e2e1598..14923e9a8c79b 100644
--- a/airbyte-integrations/connectors/source-azure-blob-storage/metadata.yaml
+++ b/airbyte-integrations/connectors/source-azure-blob-storage/metadata.yaml
@@ -14,6 +14,11 @@ data:
   icon: azureblobstorage.svg
   license: MIT
   name: Azure Blob Storage
+  remoteRegistries:
+    pypi:
+      enabled: false
+      # TODO: Set enabled=true after `airbyte-lib-validate-source` is passing.
+      packageName: airbyte-source-azure-blob-storage
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-azure-table/metadata.yaml b/airbyte-integrations/connectors/source-azure-table/metadata.yaml
index 06efb503b20c2..6fa88db581247 100644
--- a/airbyte-integrations/connectors/source-azure-table/metadata.yaml
+++ b/airbyte-integrations/connectors/source-azure-table/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: azureblobstorage.svg
   license: MIT
   name: Azure Table Storage
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-azure-table
   registries:
     cloud:
       enabled: true

From 8cef86901b98a3947ed4ef681b90d0cdcbf58504 Mon Sep 17 00:00:00 2001
From: Maxime Carbonneau-Leclerc <3360483+maxi297@users.noreply.github.com>
Date: Tue, 30 Jan 2024 08:45:49 -0500
Subject: [PATCH 20/96] Emit state when no partitions are generated for ccdk
 (#34605)

---
 .../concurrent_read_processor.py               | 14 +++++++-------
 .../streams/concurrent/abstract_stream.py      |  8 ++++++++
 .../sources/streams/concurrent/adapters.py     |  1 +
 .../sources/streams/concurrent/cursor.py       | 18 ++++++++++++++++++
 .../streams/concurrent/default_stream.py       |  7 +++++++
 .../scenarios/incremental_scenarios.py         |  3 +++
 .../scenarios/stream_facade_scenarios.py       |  2 ++
 ...thread_based_concurrent_stream_scenarios.py |  8 ++++++++
 .../test_concurrent_read_processor.py          | 17 ++++++++++++-----
 .../streams/concurrent/test_default_stream.py  |  7 ++++++-
 .../concurrent/test_partition_enqueuer.py      |  2 +-
 .../sources/test_concurrent_source.py          |  5 +++++
 12 files changed, 78 insertions(+), 14 deletions(-)

diff --git a/airbyte-cdk/python/airbyte_cdk/sources/concurrent_source/concurrent_read_processor.py b/airbyte-cdk/python/airbyte_cdk/sources/concurrent_source/concurrent_read_processor.py
index acfc0c039694f..24ac315c526e5 100644
--- a/airbyte-cdk/python/airbyte_cdk/sources/concurrent_source/concurrent_read_processor.py
+++ b/airbyte-cdk/python/airbyte_cdk/sources/concurrent_source/concurrent_read_processor.py
@@ -66,14 +66,12 @@ def on_partition_generation_completed(self, sentinel: PartitionGenerationComplet
         """
         stream_name = sentinel.stream.name
         self._streams_currently_generating_partitions.remove(sentinel.stream.name)
-        ret = []
         # It is possible for the stream to already be done if no partitions were generated
         # If the partition generation process was completed and there are no partitions left to process, the stream is done
         if self._is_stream_done(stream_name) or len(self._streams_to_running_partitions[stream_name]) == 0:
-            ret.append(self._on_stream_is_done(stream_name))
+            yield from self._on_stream_is_done(stream_name)
         if self._stream_instances_to_start_partition_generation:
-            ret.append(self.start_next_partition_generator())
-        return ret
+            yield self.start_next_partition_generator()
 
     def on_partition(self, partition: Partition) -> None:
         """
@@ -102,7 +100,7 @@ def on_partition_complete_sentinel(self, sentinel: PartitionCompleteSentinel) ->
             partitions_running.remove(partition)
             # If all partitions were generated and this was the last one, the stream is done
             if partition.stream_name() not in self._streams_currently_generating_partitions and len(partitions_running) == 0:
-                yield self._on_stream_is_done(partition.stream_name())
+                yield from self._on_stream_is_done(partition.stream_name())
         yield from self._message_repository.consume_queue()
 
     def on_record(self, record: Record) -> Iterable[AirbyteMessage]:
@@ -171,13 +169,15 @@ def is_done(self) -> bool:
     def _is_stream_done(self, stream_name: str) -> bool:
         return stream_name in self._streams_done
 
-    def _on_stream_is_done(self, stream_name: str) -> AirbyteMessage:
+    def _on_stream_is_done(self, stream_name: str) -> Iterable[AirbyteMessage]:
         self._logger.info(f"Read {self._record_counter[stream_name]} records from {stream_name} stream")
         self._logger.info(f"Marking stream {stream_name} as STOPPED")
         stream = self._stream_name_to_instance[stream_name]
+        stream.cursor.ensure_at_least_one_state_emitted()
+        yield from self._message_repository.consume_queue()
         self._logger.info(f"Finished syncing {stream.name}")
         self._streams_done.add(stream_name)
-        return stream_status_as_airbyte_message(stream.as_airbyte_stream(), AirbyteStreamStatus.COMPLETE)
+        yield stream_status_as_airbyte_message(stream.as_airbyte_stream(), AirbyteStreamStatus.COMPLETE)
 
     def _stop_streams(self) -> Iterable[AirbyteMessage]:
         self._thread_pool_manager.shutdown()
diff --git a/airbyte-cdk/python/airbyte_cdk/sources/streams/concurrent/abstract_stream.py b/airbyte-cdk/python/airbyte_cdk/sources/streams/concurrent/abstract_stream.py
index d98e7a7b54983..d48c32c48dbef 100644
--- a/airbyte-cdk/python/airbyte_cdk/sources/streams/concurrent/abstract_stream.py
+++ b/airbyte-cdk/python/airbyte_cdk/sources/streams/concurrent/abstract_stream.py
@@ -7,6 +7,7 @@
 
 from airbyte_cdk.models import AirbyteStream
 from airbyte_cdk.sources.streams.concurrent.availability_strategy import StreamAvailability
+from airbyte_cdk.sources.streams.concurrent.cursor import Cursor
 from airbyte_cdk.sources.streams.concurrent.partitions.partition import Partition
 from deprecated.classic import deprecated
 
@@ -81,3 +82,10 @@ def log_stream_sync_configuration(self) -> None:
         """
         Logs the stream's configuration for debugging purposes.
         """
+
+    @property
+    @abstractmethod
+    def cursor(self) -> Cursor:
+        """
+        :return: The cursor associated with this stream.
+        """
diff --git a/airbyte-cdk/python/airbyte_cdk/sources/streams/concurrent/adapters.py b/airbyte-cdk/python/airbyte_cdk/sources/streams/concurrent/adapters.py
index ba13a467238d4..86542618354f5 100644
--- a/airbyte-cdk/python/airbyte_cdk/sources/streams/concurrent/adapters.py
+++ b/airbyte-cdk/python/airbyte_cdk/sources/streams/concurrent/adapters.py
@@ -89,6 +89,7 @@ def create_from_stream(
                 primary_key=pk,
                 cursor_field=cursor_field,
                 logger=logger,
+                cursor=cursor,
             ),
             stream,
             cursor,
diff --git a/airbyte-cdk/python/airbyte_cdk/sources/streams/concurrent/cursor.py b/airbyte-cdk/python/airbyte_cdk/sources/streams/concurrent/cursor.py
index 282498db17835..e63358b715d54 100644
--- a/airbyte-cdk/python/airbyte_cdk/sources/streams/concurrent/cursor.py
+++ b/airbyte-cdk/python/airbyte_cdk/sources/streams/concurrent/cursor.py
@@ -56,6 +56,14 @@ def close_partition(self, partition: Partition) -> None:
         """
         raise NotImplementedError()
 
+    @abstractmethod
+    def ensure_at_least_one_state_emitted(self) -> None:
+        """
+        State messages are emitted when a partition is closed. However, the platform expects at least one state to be emitted per sync per
+        stream. Hence, if no partitions are generated, this method needs to be called.
+        """
+        raise NotImplementedError()
+
 
 class NoopCursor(Cursor):
     @property
@@ -68,6 +76,9 @@ def observe(self, record: Record) -> None:
     def close_partition(self, partition: Partition) -> None:
         pass
 
+    def ensure_at_least_one_state_emitted(self) -> None:
+        pass
+
 
 class ConcurrentCursor(Cursor):
     _START_BOUNDARY = 0
@@ -179,3 +190,10 @@ def _extract_from_slice(self, partition: Partition, key: str) -> Comparable:
             return self._connector_state_converter.parse_value(_slice[key])  # type: ignore  # we expect the devs to specify a key that would return a Comparable
         except KeyError as exception:
             raise KeyError(f"Partition is expected to have key `{key}` but could not be found") from exception
+
+    def ensure_at_least_one_state_emitted(self) -> None:
+        """
+        The platform expect to have at least one state message on successful syncs. Hence, whatever happens, we expect this method to be
+        called.
+        """
+        self._emit_state_message()
diff --git a/airbyte-cdk/python/airbyte_cdk/sources/streams/concurrent/default_stream.py b/airbyte-cdk/python/airbyte_cdk/sources/streams/concurrent/default_stream.py
index 8606d273bb4f5..3e839cb3959ef 100644
--- a/airbyte-cdk/python/airbyte_cdk/sources/streams/concurrent/default_stream.py
+++ b/airbyte-cdk/python/airbyte_cdk/sources/streams/concurrent/default_stream.py
@@ -9,6 +9,7 @@
 from airbyte_cdk.models import AirbyteStream, SyncMode
 from airbyte_cdk.sources.streams.concurrent.abstract_stream import AbstractStream
 from airbyte_cdk.sources.streams.concurrent.availability_strategy import AbstractAvailabilityStrategy, StreamAvailability
+from airbyte_cdk.sources.streams.concurrent.cursor import Cursor, NoopCursor
 from airbyte_cdk.sources.streams.concurrent.partitions.partition import Partition
 from airbyte_cdk.sources.streams.concurrent.partitions.partition_generator import PartitionGenerator
 
@@ -23,6 +24,7 @@ def __init__(
         primary_key: List[str],
         cursor_field: Optional[str],
         logger: Logger,
+        cursor: Optional[Cursor],
         namespace: Optional[str] = None,
     ) -> None:
         self._stream_partition_generator = partition_generator
@@ -32,6 +34,7 @@ def __init__(
         self._primary_key = primary_key
         self._cursor_field = cursor_field
         self._logger = logger
+        self._cursor = cursor or NoopCursor()
         self._namespace = namespace
 
     def generate_partitions(self) -> Iterable[Partition]:
@@ -77,3 +80,7 @@ def log_stream_sync_configuration(self) -> None:
                 "cursor_field": self.cursor_field,
             },
         )
+
+    @property
+    def cursor(self) -> Cursor:
+        return self._cursor
diff --git a/airbyte-cdk/python/unit_tests/sources/streams/concurrent/scenarios/incremental_scenarios.py b/airbyte-cdk/python/unit_tests/sources/streams/concurrent/scenarios/incremental_scenarios.py
index 72a0425bc0989..fd8c2ed9ac564 100644
--- a/airbyte-cdk/python/unit_tests/sources/streams/concurrent/scenarios/incremental_scenarios.py
+++ b/airbyte-cdk/python/unit_tests/sources/streams/concurrent/scenarios/incremental_scenarios.py
@@ -76,6 +76,7 @@
             {"data": {"id": "3", "cursor_field": 2}, "stream": "stream1"},
             {"data": {"id": "4", "cursor_field": 3}, "stream": "stream1"},
             {"stream1": {"cursor_field": 2}},
+            {"stream1": {"cursor_field": 2}},  # see Cursor.ensure_at_least_one_state_emitted
         ]
     )
     .set_log_levels({"ERROR", "WARN", "WARNING", "INFO", "DEBUG"})
@@ -152,6 +153,7 @@
             {"data": {"id": "3", "cursor_field": 2}, "stream": "stream1"},
             {"data": {"id": "4", "cursor_field": 3}, "stream": "stream1"},
             {"stream1": {"cursor_field": 2}},
+            {"stream1": {"cursor_field": 2}},  # see Cursor.ensure_at_least_one_state_emitted
         ]
     )
     .set_log_levels({"ERROR", "WARN", "WARNING", "INFO", "DEBUG"})
@@ -239,6 +241,7 @@
             {"data": {"id": "3", "cursor_field": 2}, "stream": "stream1"},
             {"data": {"id": "4", "cursor_field": 3}, "stream": "stream1"},
             {"stream1": {"cursor_field": 2}},
+            {"stream1": {"cursor_field": 2}},  # see Cursor.ensure_at_least_one_state_emitted
         ]
     )
     .set_log_levels({"ERROR", "WARN", "WARNING", "INFO", "DEBUG"})
diff --git a/airbyte-cdk/python/unit_tests/sources/streams/concurrent/scenarios/stream_facade_scenarios.py b/airbyte-cdk/python/unit_tests/sources/streams/concurrent/scenarios/stream_facade_scenarios.py
index ae66d3a44374a..2080126a509e9 100644
--- a/airbyte-cdk/python/unit_tests/sources/streams/concurrent/scenarios/stream_facade_scenarios.py
+++ b/airbyte-cdk/python/unit_tests/sources/streams/concurrent/scenarios/stream_facade_scenarios.py
@@ -361,6 +361,7 @@
             {"data": {"id": "3", "cursor_field": 2}, "stream": "stream1"},
             {"data": {"id": "4", "cursor_field": 3}, "stream": "stream1"},
             {"stream1": {"cursor_field": 2}},
+            {"stream1": {"cursor_field": 2}},  # see Cursor.ensure_at_least_one_state_emitted
         ]
     )
     .set_log_levels({"ERROR", "WARN", "WARNING", "INFO", "DEBUG"})
@@ -403,6 +404,7 @@
             {"data": {"id": "1", "cursor_field": 0}, "stream": "stream1"},
             {"data": {"id": "2", "cursor_field": 3}, "stream": "stream1"},
             {"stream1": {"cursor_field": 3}},
+            {"stream1": {"cursor_field": 3}},  # see Cursor.ensure_at_least_one_state_emitted
         ]
     )
     .set_log_levels({"ERROR", "WARN", "WARNING", "INFO", "DEBUG"})
diff --git a/airbyte-cdk/python/unit_tests/sources/streams/concurrent/scenarios/thread_based_concurrent_stream_scenarios.py b/airbyte-cdk/python/unit_tests/sources/streams/concurrent/scenarios/thread_based_concurrent_stream_scenarios.py
index 2f4ab9b9fccba..e1eb81445d4a2 100644
--- a/airbyte-cdk/python/unit_tests/sources/streams/concurrent/scenarios/thread_based_concurrent_stream_scenarios.py
+++ b/airbyte-cdk/python/unit_tests/sources/streams/concurrent/scenarios/thread_based_concurrent_stream_scenarios.py
@@ -4,6 +4,7 @@
 import logging
 
 from airbyte_cdk.sources.message import InMemoryMessageRepository
+from airbyte_cdk.sources.streams.concurrent.cursor import NoopCursor
 from airbyte_cdk.sources.streams.concurrent.default_stream import DefaultStream
 from airbyte_cdk.sources.streams.concurrent.partitions.record import Record
 from unit_tests.sources.file_based.scenarios.scenario_builder import TestScenarioBuilder
@@ -29,6 +30,7 @@
     primary_key=[],
     cursor_field=None,
     logger=logging.getLogger("test_logger"),
+    cursor=NoopCursor(),
 )
 
 _id_only_stream_with_slice_logger = DefaultStream(
@@ -46,6 +48,7 @@
     primary_key=[],
     cursor_field=None,
     logger=logging.getLogger("test_logger"),
+    cursor=NoopCursor(),
 )
 
 _id_only_stream_with_primary_key = DefaultStream(
@@ -63,6 +66,7 @@
     primary_key=["id"],
     cursor_field=None,
     logger=logging.getLogger("test_logger"),
+    cursor=NoopCursor(),
 )
 
 _id_only_stream_multiple_partitions = DefaultStream(
@@ -83,6 +87,7 @@
     primary_key=[],
     cursor_field=None,
     logger=logging.getLogger("test_logger"),
+    cursor=NoopCursor(),
 )
 
 _id_only_stream_multiple_partitions_concurrency_level_two = DefaultStream(
@@ -103,6 +108,7 @@
     primary_key=[],
     cursor_field=None,
     logger=logging.getLogger("test_logger"),
+    cursor=NoopCursor(),
 )
 
 _stream_raising_exception = DefaultStream(
@@ -120,6 +126,7 @@
     primary_key=[],
     cursor_field=None,
     logger=logging.getLogger("test_logger"),
+    cursor=NoopCursor(),
 )
 
 test_concurrent_cdk_single_stream = (
@@ -246,6 +253,7 @@
                     primary_key=[],
                     cursor_field=None,
                     logger=logging.getLogger("test_logger"),
+                    cursor=NoopCursor(),
                 ),
             ]
         )
diff --git a/airbyte-cdk/python/unit_tests/sources/streams/concurrent/test_concurrent_read_processor.py b/airbyte-cdk/python/unit_tests/sources/streams/concurrent/test_concurrent_read_processor.py
index e33ce5b4df729..f03fe0c0eb433 100644
--- a/airbyte-cdk/python/unit_tests/sources/streams/concurrent/test_concurrent_read_processor.py
+++ b/airbyte-cdk/python/unit_tests/sources/streams/concurrent/test_concurrent_read_processor.py
@@ -3,7 +3,7 @@
 #
 import logging
 import unittest
-from unittest.mock import Mock
+from unittest.mock import Mock, call
 
 import freezegun
 from airbyte_cdk.models import (
@@ -32,6 +32,7 @@
 
 _STREAM_NAME = "stream"
 _ANOTHER_STREAM_NAME = "stream2"
+_ANY_AIRBYTE_MESSAGE = Mock(spec=AirbyteMessage)
 
 
 class TestConcurrentReadProcessor(unittest.TestCase):
@@ -110,6 +111,10 @@ def test_handle_partition_done_no_other_streams_to_generate_partitions_for(self)
 
     @freezegun.freeze_time("2020-01-01T00:00:00")
     def test_handle_last_stream_partition_done(self):
+        in_order_validation_mock = Mock()
+        in_order_validation_mock.attach_mock(self._another_stream, "_another_stream")
+        in_order_validation_mock.attach_mock(self._message_repository, '_message_repository')
+        self._message_repository.consume_queue.return_value = iter([_ANY_AIRBYTE_MESSAGE])
         stream_instances_to_read_from = [self._another_stream]
 
         handler = ConcurrentReadProcessor(
@@ -124,9 +129,10 @@ def test_handle_last_stream_partition_done(self):
         handler.start_next_partition_generator()
 
         sentinel = PartitionGenerationCompletedSentinel(self._another_stream)
-        messages = handler.on_partition_generation_completed(sentinel)
+        messages = list(handler.on_partition_generation_completed(sentinel))
 
         expected_messages = [
+            _ANY_AIRBYTE_MESSAGE,
             AirbyteMessage(
                 type=MessageType.TRACE,
                 trace=AirbyteTraceMessage(
@@ -140,6 +146,7 @@ def test_handle_last_stream_partition_done(self):
             )
         ]
         assert expected_messages == messages
+        assert in_order_validation_mock.mock_calls.index(call._another_stream.cursor.ensure_at_least_one_state_emitted) < in_order_validation_mock.mock_calls.index(call._message_repository.consume_queue)
 
     def test_handle_partition(self):
         stream_instances_to_read_from = [self._another_stream]
@@ -236,7 +243,7 @@ def test_handle_on_partition_complete_sentinel_yields_status_message_if_the_stre
         )
         handler.start_next_partition_generator()
         handler.on_partition(self._a_closed_partition)
-        handler.on_partition_generation_completed(PartitionGenerationCompletedSentinel(self._another_stream))
+        list(handler.on_partition_generation_completed(PartitionGenerationCompletedSentinel(self._another_stream)))
 
         sentinel = PartitionCompleteSentinel(self._a_closed_partition)
 
@@ -543,8 +550,8 @@ def test_on_exception_does_not_stop_streams_that_are_already_done(self):
 
         handler.start_next_partition_generator()
         handler.on_partition(self._an_open_partition)
-        handler.on_partition_generation_completed(PartitionGenerationCompletedSentinel(self._stream))
-        handler.on_partition_generation_completed(PartitionGenerationCompletedSentinel(self._another_stream))
+        list(handler.on_partition_generation_completed(PartitionGenerationCompletedSentinel(self._stream)))
+        list(handler.on_partition_generation_completed(PartitionGenerationCompletedSentinel(self._another_stream)))
 
         another_stream = Mock(spec=AbstractStream)
         another_stream.name = _STREAM_NAME
diff --git a/airbyte-cdk/python/unit_tests/sources/streams/concurrent/test_default_stream.py b/airbyte-cdk/python/unit_tests/sources/streams/concurrent/test_default_stream.py
index 818c2862bb8b2..fb40368d98b37 100644
--- a/airbyte-cdk/python/unit_tests/sources/streams/concurrent/test_default_stream.py
+++ b/airbyte-cdk/python/unit_tests/sources/streams/concurrent/test_default_stream.py
@@ -6,7 +6,7 @@
 
 from airbyte_cdk.models import AirbyteStream, SyncMode
 from airbyte_cdk.sources.streams.concurrent.availability_strategy import STREAM_AVAILABLE
-from airbyte_cdk.sources.streams.concurrent.cursor import Cursor
+from airbyte_cdk.sources.streams.concurrent.cursor import Cursor, NoopCursor
 from airbyte_cdk.sources.streams.concurrent.default_stream import DefaultStream
 
 
@@ -28,6 +28,7 @@ def setUp(self):
             self._primary_key,
             self._cursor_field,
             self._logger,
+            NoopCursor(),
         )
 
     def test_get_json_schema(self):
@@ -88,6 +89,7 @@ def test_as_airbyte_stream_with_primary_key(self):
             ["id"],
             self._cursor_field,
             self._logger,
+            NoopCursor(),
         )
 
         expected_airbyte_stream = AirbyteStream(
@@ -119,6 +121,7 @@ def test_as_airbyte_stream_with_composite_primary_key(self):
             ["id_a", "id_b"],
             self._cursor_field,
             self._logger,
+            NoopCursor(),
         )
 
         expected_airbyte_stream = AirbyteStream(
@@ -150,6 +153,7 @@ def test_as_airbyte_stream_with_a_cursor(self):
             self._primary_key,
             "date",
             self._logger,
+            NoopCursor(),
         )
 
         expected_airbyte_stream = AirbyteStream(
@@ -174,6 +178,7 @@ def test_as_airbyte_stream_with_namespace(self):
             self._primary_key,
             self._cursor_field,
             self._logger,
+            NoopCursor(),
             namespace="test",
         )
         expected_airbyte_stream = AirbyteStream(
diff --git a/airbyte-cdk/python/unit_tests/sources/streams/concurrent/test_partition_enqueuer.py b/airbyte-cdk/python/unit_tests/sources/streams/concurrent/test_partition_enqueuer.py
index c3ce277fb8c70..5b832adeaec04 100644
--- a/airbyte-cdk/python/unit_tests/sources/streams/concurrent/test_partition_enqueuer.py
+++ b/airbyte-cdk/python/unit_tests/sources/streams/concurrent/test_partition_enqueuer.py
@@ -32,7 +32,7 @@ def test_given_no_partitions_when_generate_partitions_then_do_not_wait(self, moc
 
         assert mocked_sleep.call_count == 0
 
-    def test_given_partitions_when_generate_partitions_then_only_push_sentinel(self):
+    def test_given_no_partitions_when_generate_partitions_then_only_push_sentinel(self):
         self._thread_pool_manager.prune_to_validate_has_reached_futures_limit.return_value = True
         stream = self._a_stream([])
 
diff --git a/airbyte-cdk/python/unit_tests/sources/test_concurrent_source.py b/airbyte-cdk/python/unit_tests/sources/test_concurrent_source.py
index ca5c669a27c6c..ebd082a2b1523 100644
--- a/airbyte-cdk/python/unit_tests/sources/test_concurrent_source.py
+++ b/airbyte-cdk/python/unit_tests/sources/test_concurrent_source.py
@@ -12,6 +12,7 @@
 from airbyte_cdk.sources.message import InMemoryMessageRepository, MessageRepository
 from airbyte_cdk.sources.streams.concurrent.abstract_stream import AbstractStream
 from airbyte_cdk.sources.streams.concurrent.availability_strategy import StreamAvailability, StreamAvailable, StreamUnavailable
+from airbyte_cdk.sources.streams.concurrent.cursor import Cursor, NoopCursor
 from airbyte_cdk.sources.streams.concurrent.partitions.partition import Partition
 from airbyte_cdk.sources.streams.concurrent.partitions.record import Record
 from airbyte_protocol.models import AirbyteStream
@@ -72,6 +73,10 @@ def as_airbyte_stream(self) -> AirbyteStream:
     def log_stream_sync_configuration(self) -> None:
         raise NotImplementedError
 
+    @property
+    def cursor(self) -> Cursor:
+        return NoopCursor()
+
 
 class _MockPartition(Partition):
     def __init__(self, name: str):

From 8932636e399d85909d681fc57e5aec18440bdb80 Mon Sep 17 00:00:00 2001
From: Maxime Carbonneau-Leclerc <3360483+maxi297@users.noreply.github.com>
Date: Tue, 30 Jan 2024 08:46:03 -0500
Subject: [PATCH 21/96] Have StateBuilder return our actual state object and
 not simply a dict (#34625)

---
 .../airbyte_cdk/test/entrypoint_wrapper.py    |  15 +-
 .../python/airbyte_cdk/test/state_builder.py  |  12 +-
 .../scenarios/incremental_scenarios.py        | 179 +++++-------------
 .../scenarios/incremental_scenarios.py        |  19 +-
 .../test/test_entrypoint_wrapper.py           |   3 +-
 5 files changed, 79 insertions(+), 149 deletions(-)

diff --git a/airbyte-cdk/python/airbyte_cdk/test/entrypoint_wrapper.py b/airbyte-cdk/python/airbyte_cdk/test/entrypoint_wrapper.py
index 06d5e0ebeb209..612b2742ea1e8 100644
--- a/airbyte-cdk/python/airbyte_cdk/test/entrypoint_wrapper.py
+++ b/airbyte-cdk/python/airbyte_cdk/test/entrypoint_wrapper.py
@@ -26,7 +26,16 @@
 from airbyte_cdk.exception_handler import assemble_uncaught_exception
 from airbyte_cdk.logger import AirbyteLogFormatter
 from airbyte_cdk.sources import Source
-from airbyte_protocol.models import AirbyteLogMessage, AirbyteMessage, AirbyteStreamStatus, ConfiguredAirbyteCatalog, Level, TraceType, Type
+from airbyte_protocol.models import (
+    AirbyteLogMessage,
+    AirbyteMessage,
+    AirbyteStateMessage,
+    AirbyteStreamStatus,
+    ConfiguredAirbyteCatalog,
+    Level,
+    TraceType,
+    Type,
+)
 from pydantic.error_wrappers import ValidationError
 
 
@@ -104,7 +113,7 @@ def read(
     source: Source,
     config: Mapping[str, Any],
     catalog: ConfiguredAirbyteCatalog,
-    state: Optional[Any] = None,
+    state: Optional[List[AirbyteStateMessage]] = None,
     expecting_exception: bool = False,
 ) -> EntrypointOutput:
     """
@@ -133,7 +142,7 @@ def read(
             args.extend(
                 [
                     "--state",
-                    make_file(tmp_directory_path / "state.json", state),
+                    make_file(tmp_directory_path / "state.json", f"[{','.join([stream_state.json() for stream_state in state])}]"),
                 ]
             )
         args.append("--debug")
diff --git a/airbyte-cdk/python/airbyte_cdk/test/state_builder.py b/airbyte-cdk/python/airbyte_cdk/test/state_builder.py
index 96c9a61611720..1c356afef8897 100644
--- a/airbyte-cdk/python/airbyte_cdk/test/state_builder.py
+++ b/airbyte-cdk/python/airbyte_cdk/test/state_builder.py
@@ -1,14 +1,16 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 
-from typing import Any, Dict, List
+from typing import Any, List
+
+from airbyte_protocol.models import AirbyteStateMessage
 
 
 class StateBuilder:
     def __init__(self) -> None:
-        self._state: List[Dict[str, Any]] = []
+        self._state: List[AirbyteStateMessage] = []
 
     def with_stream_state(self, stream_name: str, state: Any) -> "StateBuilder":
-        self._state.append({
+        self._state.append(AirbyteStateMessage.parse_obj({
             "type": "STREAM",
             "stream": {
                 "stream_state": state,
@@ -16,8 +18,8 @@ def with_stream_state(self, stream_name: str, state: Any) -> "StateBuilder":
                     "name": stream_name
                 }
             }
-        })
+        }))
         return self
 
-    def build(self) -> List[Dict[str, Any]]:
+    def build(self) -> List[AirbyteStateMessage]:
         return self._state
diff --git a/airbyte-cdk/python/unit_tests/sources/file_based/scenarios/incremental_scenarios.py b/airbyte-cdk/python/unit_tests/sources/file_based/scenarios/incremental_scenarios.py
index 3c3195fbac610..6691ba6ba320e 100644
--- a/airbyte-cdk/python/unit_tests/sources/file_based/scenarios/incremental_scenarios.py
+++ b/airbyte-cdk/python/unit_tests/sources/file_based/scenarios/incremental_scenarios.py
@@ -2,6 +2,7 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
+from airbyte_cdk.test.state_builder import StateBuilder
 from unit_tests.sources.file_based.helpers import LowHistoryLimitCursor
 from unit_tests.sources.file_based.scenarios.file_based_source_builder import FileBasedSourceBuilder
 from unit_tests.sources.file_based.scenarios.scenario_builder import IncrementalScenarioConfig, TestScenarioBuilder
@@ -39,17 +40,9 @@
     )
     .set_incremental_scenario_config(
         IncrementalScenarioConfig(
-            input_state=[
-                {
-                    "type": "STREAM",
-                    "stream": {
-                        "stream_state": {
-                            "history": {"some_old_file.csv": "2023-06-01T03:54:07.000000Z"},
-                        },
-                        "stream_descriptor": {"name": "stream1"},
-                    },
-                }
-            ],
+            input_state=StateBuilder().with_stream_state("stream1", {
+                "history": {"some_old_file.csv": "2023-06-01T03:54:07.000000Z"},
+            }).build(),
         )
     )
     .set_expected_records(
@@ -140,17 +133,9 @@
     )
     .set_incremental_scenario_config(
         IncrementalScenarioConfig(
-            input_state=[
-                {
-                    "type": "STREAM",
-                    "stream": {
-                        "stream_state": {
-                            "history": {"a.csv": "2023-06-05T03:54:07.000000Z"},
-                        },
-                        "stream_descriptor": {"name": "stream1"},
-                    },
-                }
-            ],
+            input_state=StateBuilder().with_stream_state("stream1", {
+                "history": {"a.csv": "2023-06-05T03:54:07.000000Z"},
+            }).build(),
         )
     )
     .set_expected_records(
@@ -223,17 +208,9 @@
     )
     .set_incremental_scenario_config(
         IncrementalScenarioConfig(
-            input_state=[
-                {
-                    "type": "STREAM",
-                    "stream": {
-                        "stream_state": {
-                            "history": {"a.csv": "2023-06-01T03:54:07.000000Z"},
-                        },
-                        "stream_descriptor": {"name": "stream1"},
-                    },
-                }
-            ],
+            input_state=StateBuilder().with_stream_state("stream1", {
+                "history": {"a.csv": "2023-06-01T03:54:07.000000Z"},
+            }).build(),
         )
     )
     .set_expected_records(
@@ -377,7 +354,7 @@
     )
     .set_incremental_scenario_config(
         IncrementalScenarioConfig(
-            input_state=[],
+            input_state=StateBuilder().build(),
         )
     )
 ).build()
@@ -499,7 +476,7 @@
     )
     .set_incremental_scenario_config(
         IncrementalScenarioConfig(
-            input_state=[],
+            input_state=StateBuilder().build(),
         )
     )
 ).build()
@@ -593,15 +570,9 @@
     )
     .set_incremental_scenario_config(
         IncrementalScenarioConfig(
-            input_state=[
-                {
-                    "type": "STREAM",
-                    "stream": {
-                        "stream_state": {"history": {"recent_file.csv": "2023-07-15T23:59:59.000000Z"}},
-                        "stream_descriptor": {"name": "stream1"},
-                    },
-                }
-            ],
+            input_state=StateBuilder().with_stream_state("stream1", {
+                "history": {"recent_file.csv": "2023-07-15T23:59:59.000000Z"},
+            }).build(),
         )
     )
 ).build()
@@ -731,7 +702,7 @@
     )
     .set_incremental_scenario_config(
         IncrementalScenarioConfig(
-            input_state=[],
+            input_state=StateBuilder().build(),
         )
     )
 ).build()
@@ -891,7 +862,7 @@
     )
     .set_incremental_scenario_config(
         IncrementalScenarioConfig(
-            input_state=[],
+            input_state=StateBuilder().build(),
         )
     )
 ).build()
@@ -1035,15 +1006,9 @@
     )
     .set_incremental_scenario_config(
         IncrementalScenarioConfig(
-            input_state=[
-                {
-                    "type": "STREAM",
-                    "stream": {
-                        "stream_state": {"history": {"a.csv": "2023-06-05T03:54:07.000000Z"}},
-                        "stream_descriptor": {"name": "stream1"},
-                    },
-                }
-            ],
+            input_state=StateBuilder().with_stream_state("stream1", {
+                "history": {"a.csv": "2023-06-05T03:54:07.000000Z"},
+            }).build(),
         )
     )
 ).build()
@@ -1163,17 +1128,9 @@
     )
     .set_incremental_scenario_config(
         IncrementalScenarioConfig(
-            input_state=[
-                {
-                    "type": "STREAM",
-                    "stream": {
-                        "stream_state": {
-                            "history": {"a.csv": "2023-06-05T03:54:07.000000Z", "c.csv": "2023-06-06T03:54:07.000000Z"},
-                        },
-                        "stream_descriptor": {"name": "stream1"},
-                    },
-                }
-            ],
+            input_state=StateBuilder().with_stream_state("stream1", {
+                "history": {"a.csv": "2023-06-05T03:54:07.000000Z", "c.csv": "2023-06-06T03:54:07.000000Z"},
+            }).build(),
         )
     )
 ).build()
@@ -1348,21 +1305,13 @@
     )
     .set_incremental_scenario_config(
         IncrementalScenarioConfig(
-            input_state=[
-                {
-                    "type": "STREAM",
-                    "stream": {
-                        "stream_state": {
-                            "history": {
-                                "very_very_old_file.csv": "2023-06-01T03:54:07.000000Z",
-                                "very_old_file.csv": "2023-06-02T03:54:07.000000Z",
-                                "old_file_same_timestamp_as_a.csv": "2023-06-06T03:54:07.000000Z",
-                            },
-                        },
-                        "stream_descriptor": {"name": "stream1"},
-                    },
-                }
-            ],
+            input_state=StateBuilder().with_stream_state("stream1", {
+                "history": {
+                    "very_very_old_file.csv": "2023-06-01T03:54:07.000000Z",
+                    "very_old_file.csv": "2023-06-02T03:54:07.000000Z",
+                    "old_file_same_timestamp_as_a.csv": "2023-06-06T03:54:07.000000Z",
+                },
+            }).build(),
         )
     )
 ).build()
@@ -1546,7 +1495,7 @@
     )
     .set_incremental_scenario_config(
         IncrementalScenarioConfig(
-            input_state=[],
+            input_state=StateBuilder().build(),
         )
     )
 ).build()
@@ -1652,21 +1601,13 @@
     )
     .set_incremental_scenario_config(
         IncrementalScenarioConfig(
-            input_state=[
-                {
-                    "type": "STREAM",
-                    "stream": {
-                        "stream_state": {
-                            "history": {
-                                "b.csv": "2023-06-05T03:54:07.000000Z",
-                                "c.csv": "2023-06-05T03:54:07.000000Z",
-                                "d.csv": "2023-06-05T03:54:07.000000Z",
-                            },
-                        },
-                        "stream_descriptor": {"name": "stream1"},
-                    },
-                }
-            ],
+            input_state=StateBuilder().with_stream_state("stream1", {
+                "history": {
+                    "b.csv": "2023-06-05T03:54:07.000000Z",
+                    "c.csv": "2023-06-05T03:54:07.000000Z",
+                    "d.csv": "2023-06-05T03:54:07.000000Z",
+                },
+            }).build(),
         )
     )
 ).build()
@@ -1794,21 +1735,13 @@
     )
     .set_incremental_scenario_config(
         IncrementalScenarioConfig(
-            input_state=[
-                {
-                    "type": "STREAM",
-                    "stream": {
-                        "stream_state": {
-                            "history": {
-                                "c.csv": "2023-06-07T03:54:07.000000Z",
-                                "d.csv": "2023-06-08T03:54:07.000000Z",
-                                "e.csv": "2023-06-08T03:54:07.000000Z",
-                            },
-                        },
-                        "stream_descriptor": {"name": "stream1"},
-                    },
-                }
-            ],
+            input_state=StateBuilder().with_stream_state("stream1", {
+                "history": {
+                    "c.csv": "2023-06-07T03:54:07.000000Z",
+                    "d.csv": "2023-06-08T03:54:07.000000Z",
+                    "e.csv": "2023-06-08T03:54:07.000000Z",
+                },
+            }).build(),
         )
     )
 ).build()
@@ -1962,21 +1895,13 @@
     )
     .set_incremental_scenario_config(
         IncrementalScenarioConfig(
-            input_state=[
-                {
-                    "type": "STREAM",
-                    "stream": {
-                        "stream_state": {
-                            "history": {
-                                "old_file.csv": "2023-06-05T00:00:00.000000Z",
-                                "c.csv": "2023-06-07T03:54:07.000000Z",
-                                "d.csv": "2023-06-08T03:54:07.000000Z",
-                            },
-                        },
-                        "stream_descriptor": {"name": "stream1"},
-                    },
-                }
-            ],
+            input_state=StateBuilder().with_stream_state("stream1", {
+                "history": {
+                    "old_file.csv": "2023-06-05T00:00:00.000000Z",
+                    "c.csv": "2023-06-07T03:54:07.000000Z",
+                    "d.csv": "2023-06-08T03:54:07.000000Z",
+                },
+            }).build(),
         )
     )
 ).build()
diff --git a/airbyte-cdk/python/unit_tests/sources/streams/concurrent/scenarios/incremental_scenarios.py b/airbyte-cdk/python/unit_tests/sources/streams/concurrent/scenarios/incremental_scenarios.py
index fd8c2ed9ac564..08df8db39b7f8 100644
--- a/airbyte-cdk/python/unit_tests/sources/streams/concurrent/scenarios/incremental_scenarios.py
+++ b/airbyte-cdk/python/unit_tests/sources/streams/concurrent/scenarios/incremental_scenarios.py
@@ -3,6 +3,7 @@
 #
 from airbyte_cdk.sources.streams.concurrent.cursor import CursorField
 from airbyte_cdk.sources.streams.concurrent.state_converters.abstract_stream_state_converter import ConcurrencyCompatibleStateType
+from airbyte_cdk.test.state_builder import StateBuilder
 from unit_tests.sources.file_based.scenarios.scenario_builder import IncrementalScenarioConfig, TestScenarioBuilder
 from unit_tests.sources.streams.concurrent.scenarios.stream_facade_builder import StreamFacadeSourceBuilder
 from unit_tests.sources.streams.concurrent.scenarios.utils import MockStream
@@ -85,7 +86,7 @@
 )
 
 
-LEGACY_STATE = [{"type": "STREAM", "stream": {"stream_state": {"cursor_field": 0}, "stream_descriptor": {"name": "stream1"}}}]
+LEGACY_STATE = StateBuilder().with_stream_state("stream1", {"cursor_field": 0}).build()
 test_incremental_stream_without_slice_boundaries_with_legacy_state = (
     TestScenarioBuilder()
     .set_name("test_incremental_stream_without_slice_boundaries_with_legacy_state")
@@ -162,18 +163,10 @@
 )
 
 
-CONCURRENT_STATE = [
-    {
-        "type": "STREAM",
-        "stream": {
-            "stream_state": {
-                "slices": [{"start": 0, "end": 0}],
-                "state_type": ConcurrencyCompatibleStateType.date_range.value,
-            },
-            "stream_descriptor": {"name": "stream1"},
-        },
-    },
-]
+CONCURRENT_STATE = StateBuilder().with_stream_state("stream1", {
+    "slices": [{"start": 0, "end": 0}],
+    "state_type": ConcurrencyCompatibleStateType.date_range.value,
+}).build()
 test_incremental_stream_without_slice_boundaries_with_concurrent_state = (
     TestScenarioBuilder()
     .set_name("test_incremental_stream_without_slice_boundaries_with_concurrent_state")
diff --git a/airbyte-cdk/python/unit_tests/test/test_entrypoint_wrapper.py b/airbyte-cdk/python/unit_tests/test/test_entrypoint_wrapper.py
index 9f3256600b50f..08797e763d37f 100644
--- a/airbyte-cdk/python/unit_tests/test/test_entrypoint_wrapper.py
+++ b/airbyte-cdk/python/unit_tests/test/test_entrypoint_wrapper.py
@@ -9,6 +9,7 @@
 
 from airbyte_cdk.sources.abstract_source import AbstractSource
 from airbyte_cdk.test.entrypoint_wrapper import read
+from airbyte_cdk.test.state_builder import StateBuilder
 from airbyte_protocol.models import (
     AirbyteAnalyticsTraceMessage,
     AirbyteErrorTraceMessage,
@@ -91,7 +92,7 @@ def _a_status_message(stream_name: str, status: AirbyteStreamStatus) -> AirbyteM
         ]
     }
 )
-_A_STATE = {"state_key": "state_value"}
+_A_STATE = StateBuilder().with_stream_state(_A_STREAM_NAME, {"state_key": "state_value"}).build()
 _A_LOG_MESSAGE = "a log message"
 
 

From b7a39ceb3424933c438e58e7fde45fa86b8825ad Mon Sep 17 00:00:00 2001
From: Joe Reuter <joe@airbyte.io>
Date: Tue, 30 Jan 2024 15:28:52 +0100
Subject: [PATCH 22/96] Publish to pypi batch 2 (#34656)

---
 .../connectors/source-babelforce/metadata.yaml               | 4 ++++
 .../connectors/source-bamboo-hr/metadata.yaml                | 4 ++++
 .../connectors/source-bigcommerce/metadata.yaml              | 4 ++++
 .../connectors/source-bing-ads/metadata.yaml                 | 5 +++++
 .../connectors/source-braintree/metadata.yaml                | 4 ++++
 airbyte-integrations/connectors/source-braze/metadata.yaml   | 4 ++++
 .../connectors/source-breezometer/metadata.yaml              | 4 ++++
 .../connectors/source-callrail/metadata.yaml                 | 4 ++++
 .../connectors/source-captain-data/metadata.yaml             | 4 ++++
 airbyte-integrations/connectors/source-cart/metadata.yaml    | 4 ++++
 .../connectors/source-chargebee/metadata.yaml                | 4 ++++
 .../connectors/source-chargify/metadata.yaml                 | 4 ++++
 .../connectors/source-chartmogul/metadata.yaml               | 4 ++++
 .../connectors/source-clickup-api/metadata.yaml              | 4 ++++
 .../connectors/source-clockify/metadata.yaml                 | 4 ++++
 .../connectors/source-close-com/metadata.yaml                | 4 ++++
 airbyte-integrations/connectors/source-coda/metadata.yaml    | 4 ++++
 .../connectors/source-coin-api/metadata.yaml                 | 4 ++++
 .../connectors/source-coingecko-coins/metadata.yaml          | 4 ++++
 .../connectors/source-coinmarketcap/metadata.yaml            | 4 ++++
 20 files changed, 81 insertions(+)

diff --git a/airbyte-integrations/connectors/source-babelforce/metadata.yaml b/airbyte-integrations/connectors/source-babelforce/metadata.yaml
index f4f4e35ea4ba8..5e2159e65e2b3 100644
--- a/airbyte-integrations/connectors/source-babelforce/metadata.yaml
+++ b/airbyte-integrations/connectors/source-babelforce/metadata.yaml
@@ -2,6 +2,10 @@ data:
   allowedHosts:
     hosts:
       - ${region}.babelforce.com
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-babelforce
   registries:
     oss:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-bamboo-hr/metadata.yaml b/airbyte-integrations/connectors/source-bamboo-hr/metadata.yaml
index ea2b009e281fa..f5ac3969826fb 100644
--- a/airbyte-integrations/connectors/source-bamboo-hr/metadata.yaml
+++ b/airbyte-integrations/connectors/source-bamboo-hr/metadata.yaml
@@ -12,6 +12,10 @@ data:
   icon: bamboohr.svg
   license: MIT
   name: BambooHR
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-bamboo-hr
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-bigcommerce/metadata.yaml b/airbyte-integrations/connectors/source-bigcommerce/metadata.yaml
index fd54e9032d490..9a2a63d4a3e04 100644
--- a/airbyte-integrations/connectors/source-bigcommerce/metadata.yaml
+++ b/airbyte-integrations/connectors/source-bigcommerce/metadata.yaml
@@ -2,6 +2,10 @@ data:
   allowedHosts:
     hosts:
       - api.bigcommerce.com
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-bigcommerce
   registries:
     oss:
       enabled: false
diff --git a/airbyte-integrations/connectors/source-bing-ads/metadata.yaml b/airbyte-integrations/connectors/source-bing-ads/metadata.yaml
index 5420384149a1c..644186bafbf2a 100644
--- a/airbyte-integrations/connectors/source-bing-ads/metadata.yaml
+++ b/airbyte-integrations/connectors/source-bing-ads/metadata.yaml
@@ -23,6 +23,11 @@ data:
   icon: bingads.svg
   license: MIT
   name: Bing Ads
+  remoteRegistries:
+    pypi:
+      enabled: false
+      # TODO: Set enabled=true after `airbyte-lib-validate-source` is passing.
+      packageName: airbyte-source-bing-ads
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-braintree/metadata.yaml b/airbyte-integrations/connectors/source-braintree/metadata.yaml
index d2f0ca52f2bb2..5d948eee41b69 100644
--- a/airbyte-integrations/connectors/source-braintree/metadata.yaml
+++ b/airbyte-integrations/connectors/source-braintree/metadata.yaml
@@ -12,6 +12,10 @@ data:
   icon: braintree.svg
   license: MIT
   name: Braintree
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-braintree
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-braze/metadata.yaml b/airbyte-integrations/connectors/source-braze/metadata.yaml
index bde782b0dc7f5..e1fdcf539fd37 100644
--- a/airbyte-integrations/connectors/source-braze/metadata.yaml
+++ b/airbyte-integrations/connectors/source-braze/metadata.yaml
@@ -12,6 +12,10 @@ data:
   icon: braze.svg
   license: MIT
   name: Braze
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-braze
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-breezometer/metadata.yaml b/airbyte-integrations/connectors/source-breezometer/metadata.yaml
index b325179a45cac..16796af3c94f0 100644
--- a/airbyte-integrations/connectors/source-breezometer/metadata.yaml
+++ b/airbyte-integrations/connectors/source-breezometer/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: breezometer.svg
   license: MIT
   name: Breezometer
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-breezometer
   registries:
     cloud:
       enabled: false
diff --git a/airbyte-integrations/connectors/source-callrail/metadata.yaml b/airbyte-integrations/connectors/source-callrail/metadata.yaml
index d876058aa9c05..f0e46fadc35ab 100644
--- a/airbyte-integrations/connectors/source-callrail/metadata.yaml
+++ b/airbyte-integrations/connectors/source-callrail/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: callrail.svg
   license: MIT
   name: CallRail
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-callrail
   registries:
     cloud:
       enabled: false
diff --git a/airbyte-integrations/connectors/source-captain-data/metadata.yaml b/airbyte-integrations/connectors/source-captain-data/metadata.yaml
index 715cb3f3c9c1b..e5f9108699ad6 100644
--- a/airbyte-integrations/connectors/source-captain-data/metadata.yaml
+++ b/airbyte-integrations/connectors/source-captain-data/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: captain-data.svg
   license: MIT
   name: Captain Data
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-captain-data
   registries:
     cloud:
       enabled: false
diff --git a/airbyte-integrations/connectors/source-cart/metadata.yaml b/airbyte-integrations/connectors/source-cart/metadata.yaml
index d73ebd080df90..113417c673b0c 100644
--- a/airbyte-integrations/connectors/source-cart/metadata.yaml
+++ b/airbyte-integrations/connectors/source-cart/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: cart.svg
   license: MIT
   name: Cart.com
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-cart
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-chargebee/metadata.yaml b/airbyte-integrations/connectors/source-chargebee/metadata.yaml
index 9fa19f17b91f7..588d52fc51948 100644
--- a/airbyte-integrations/connectors/source-chargebee/metadata.yaml
+++ b/airbyte-integrations/connectors/source-chargebee/metadata.yaml
@@ -17,6 +17,10 @@ data:
   icon: chargebee.svg
   license: MIT
   name: Chargebee
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-chargebee
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-chargify/metadata.yaml b/airbyte-integrations/connectors/source-chargify/metadata.yaml
index cc211d82e70cb..ea6cf30059860 100644
--- a/airbyte-integrations/connectors/source-chargify/metadata.yaml
+++ b/airbyte-integrations/connectors/source-chargify/metadata.yaml
@@ -2,6 +2,10 @@ data:
   allowedHosts:
     hosts:
       - ${domain}
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-chargify
   registries:
     oss:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-chartmogul/metadata.yaml b/airbyte-integrations/connectors/source-chartmogul/metadata.yaml
index 42e6a35f9b9f8..3a68eecb886c5 100644
--- a/airbyte-integrations/connectors/source-chartmogul/metadata.yaml
+++ b/airbyte-integrations/connectors/source-chartmogul/metadata.yaml
@@ -20,6 +20,10 @@ data:
   icon: chartmogul.svg
   license: MIT
   name: Chartmogul
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-chartmogul
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-clickup-api/metadata.yaml b/airbyte-integrations/connectors/source-clickup-api/metadata.yaml
index a59f15841d5d5..dc76068faa848 100644
--- a/airbyte-integrations/connectors/source-clickup-api/metadata.yaml
+++ b/airbyte-integrations/connectors/source-clickup-api/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: clickup.svg
   license: MIT
   name: ClickUp
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-clickup-api
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-clockify/metadata.yaml b/airbyte-integrations/connectors/source-clockify/metadata.yaml
index 90baae2689d83..be84351777796 100644
--- a/airbyte-integrations/connectors/source-clockify/metadata.yaml
+++ b/airbyte-integrations/connectors/source-clockify/metadata.yaml
@@ -2,6 +2,10 @@ data:
   allowedHosts:
     hosts:
       - api.clockify.me
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-clockify
   registries:
     oss:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-close-com/metadata.yaml b/airbyte-integrations/connectors/source-close-com/metadata.yaml
index ccb09a7823a91..ad645a347058d 100644
--- a/airbyte-integrations/connectors/source-close-com/metadata.yaml
+++ b/airbyte-integrations/connectors/source-close-com/metadata.yaml
@@ -15,6 +15,10 @@ data:
   icon: close.svg
   license: MIT
   name: Close.com
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-close-com
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-coda/metadata.yaml b/airbyte-integrations/connectors/source-coda/metadata.yaml
index c16c1748fef9e..4fcb66aba68c6 100644
--- a/airbyte-integrations/connectors/source-coda/metadata.yaml
+++ b/airbyte-integrations/connectors/source-coda/metadata.yaml
@@ -2,6 +2,10 @@ data:
   allowedHosts:
     hosts:
       - https://coda.io/
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-coda
   registries:
     oss:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-coin-api/metadata.yaml b/airbyte-integrations/connectors/source-coin-api/metadata.yaml
index fc65c06c61c25..039073ce42f83 100644
--- a/airbyte-integrations/connectors/source-coin-api/metadata.yaml
+++ b/airbyte-integrations/connectors/source-coin-api/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: coinapi.svg
   license: MIT
   name: Coin API
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-coin-api
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-coingecko-coins/metadata.yaml b/airbyte-integrations/connectors/source-coingecko-coins/metadata.yaml
index b7619d147910b..ac0035a6f5ff9 100644
--- a/airbyte-integrations/connectors/source-coingecko-coins/metadata.yaml
+++ b/airbyte-integrations/connectors/source-coingecko-coins/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: coingeckocoins.svg
   license: MIT
   name: CoinGecko Coins
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-coingecko-coins
   registries:
     cloud:
       enabled: false # Did not pass acceptance tests
diff --git a/airbyte-integrations/connectors/source-coinmarketcap/metadata.yaml b/airbyte-integrations/connectors/source-coinmarketcap/metadata.yaml
index a73b7184a363d..d12360ad75991 100644
--- a/airbyte-integrations/connectors/source-coinmarketcap/metadata.yaml
+++ b/airbyte-integrations/connectors/source-coinmarketcap/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: coinmarketcap.svg
   license: MIT
   name: CoinMarketCap
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-coinmarketcap
   registries:
     cloud:
       enabled: true

From 6a6b89cd814ea9cf21ff98f0c08b18f671b59406 Mon Sep 17 00:00:00 2001
From: Maxime Carbonneau-Leclerc <3360483+maxi297@users.noreply.github.com>
Date: Tue, 30 Jan 2024 10:03:00 -0500
Subject: [PATCH 23/96] Fix Cursor interface change + FileBased change at the
 same time (#34653)

---
 .../sources/file_based/stream/concurrent/adapters.py           | 1 +
 .../airbyte_cdk/sources/file_based/stream/concurrent/cursor.py | 3 +++
 2 files changed, 4 insertions(+)

diff --git a/airbyte-cdk/python/airbyte_cdk/sources/file_based/stream/concurrent/adapters.py b/airbyte-cdk/python/airbyte_cdk/sources/file_based/stream/concurrent/adapters.py
index 731b046217050..404b7b4ab09ce 100644
--- a/airbyte-cdk/python/airbyte_cdk/sources/file_based/stream/concurrent/adapters.py
+++ b/airbyte-cdk/python/airbyte_cdk/sources/file_based/stream/concurrent/adapters.py
@@ -78,6 +78,7 @@ def create_from_stream(
                 cursor_field=cursor_field,
                 logger=logger,
                 namespace=stream.namespace,
+                cursor=cursor,
             ),
             stream,
             cursor,
diff --git a/airbyte-cdk/python/airbyte_cdk/sources/file_based/stream/concurrent/cursor.py b/airbyte-cdk/python/airbyte_cdk/sources/file_based/stream/concurrent/cursor.py
index a0fd47044f3d7..f91e3a16f3b94 100644
--- a/airbyte-cdk/python/airbyte_cdk/sources/file_based/stream/concurrent/cursor.py
+++ b/airbyte-cdk/python/airbyte_cdk/sources/file_based/stream/concurrent/cursor.py
@@ -83,5 +83,8 @@ def observe(self, record: Record) -> None:
     def close_partition(self, partition: Partition) -> None:
         return None
 
+    def ensure_at_least_one_state_emitted(self) -> None:
+        return None
+
     def set_pending_partitions(self, partitions: Iterable[Partition]) -> None:
         return None

From e3c14c78e1bfecc02f2edb0192e599543b932d47 Mon Sep 17 00:00:00 2001
From: Joe Reuter <joe@airbyte.io>
Date: Tue, 30 Jan 2024 16:06:23 +0100
Subject: [PATCH 24/96] Publish to pypi batch3 (#34657)

---
 airbyte-integrations/connectors/source-commcare/metadata.yaml | 4 ++++
 .../connectors/source-commercetools/metadata.yaml             | 4 ++++
 .../connectors/source-configcat/metadata.yaml                 | 4 ++++
 .../connectors/source-confluence/metadata.yaml                | 4 ++++
 .../connectors/source-convertkit/metadata.yaml                | 4 ++++
 airbyte-integrations/connectors/source-convex/metadata.yaml   | 4 ++++
 airbyte-integrations/connectors/source-copper/metadata.yaml   | 4 ++++
 airbyte-integrations/connectors/source-courier/metadata.yaml  | 4 ++++
 .../connectors/source-customer-io/metadata.yaml               | 4 ++++
 airbyte-integrations/connectors/source-datadog/metadata.yaml  | 4 ++++
 .../connectors/source-datascope/metadata.yaml                 | 4 ++++
 .../connectors/source-delighted/metadata.yaml                 | 4 ++++
 airbyte-integrations/connectors/source-dixa/metadata.yaml     | 4 ++++
 .../connectors/source-dockerhub/metadata.yaml                 | 4 ++++
 airbyte-integrations/connectors/source-dremio/metadata.yaml   | 4 ++++
 airbyte-integrations/connectors/source-drift/metadata.yaml    | 4 ++++
 airbyte-integrations/connectors/source-dv-360/metadata.yaml   | 4 ++++
 .../connectors/source-emailoctopus/metadata.yaml              | 4 ++++
 airbyte-integrations/connectors/source-everhour/metadata.yaml | 4 ++++
 .../connectors/source-exchange-rates/metadata.yaml            | 4 ++++
 20 files changed, 80 insertions(+)

diff --git a/airbyte-integrations/connectors/source-commcare/metadata.yaml b/airbyte-integrations/connectors/source-commcare/metadata.yaml
index e1bc67ca7ec88..3e78f837b0e19 100644
--- a/airbyte-integrations/connectors/source-commcare/metadata.yaml
+++ b/airbyte-integrations/connectors/source-commcare/metadata.yaml
@@ -7,6 +7,10 @@ data:
   githubIssueLabel: source-commcare
   license: MIT
   name: Commcare
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-commcare
   registries:
     cloud:
       enabled: false
diff --git a/airbyte-integrations/connectors/source-commercetools/metadata.yaml b/airbyte-integrations/connectors/source-commercetools/metadata.yaml
index 5af0802c2c0ec..f28b88a916c96 100644
--- a/airbyte-integrations/connectors/source-commercetools/metadata.yaml
+++ b/airbyte-integrations/connectors/source-commercetools/metadata.yaml
@@ -3,6 +3,10 @@ data:
     hosts:
       - auth.${region}.${host}.commercetools.com
       - api.${region}.${host}.commercetools.com
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-commercetools
   registries:
     oss:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-configcat/metadata.yaml b/airbyte-integrations/connectors/source-configcat/metadata.yaml
index b4725144c2f17..3c1f707095be5 100644
--- a/airbyte-integrations/connectors/source-configcat/metadata.yaml
+++ b/airbyte-integrations/connectors/source-configcat/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: configcat.svg
   license: MIT
   name: ConfigCat
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-configcat
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-confluence/metadata.yaml b/airbyte-integrations/connectors/source-confluence/metadata.yaml
index 87d324b5ebecc..be0b48fb334ae 100644
--- a/airbyte-integrations/connectors/source-confluence/metadata.yaml
+++ b/airbyte-integrations/connectors/source-confluence/metadata.yaml
@@ -5,6 +5,10 @@ data:
   allowedHosts:
     hosts:
       - ${subdomain}.atlassian.net
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-confluence
   registries:
     oss:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-convertkit/metadata.yaml b/airbyte-integrations/connectors/source-convertkit/metadata.yaml
index 66d558a615f64..8a0327f0580c3 100644
--- a/airbyte-integrations/connectors/source-convertkit/metadata.yaml
+++ b/airbyte-integrations/connectors/source-convertkit/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: convertkit.svg
   license: MIT
   name: ConvertKit
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-convertkit
   registries:
     cloud:
       enabled: false
diff --git a/airbyte-integrations/connectors/source-convex/metadata.yaml b/airbyte-integrations/connectors/source-convex/metadata.yaml
index b58c7a7b40dd1..14d34525a6414 100644
--- a/airbyte-integrations/connectors/source-convex/metadata.yaml
+++ b/airbyte-integrations/connectors/source-convex/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: convex.svg
   license: MIT
   name: Convex
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-convex
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-copper/metadata.yaml b/airbyte-integrations/connectors/source-copper/metadata.yaml
index 283dd98e3a15f..6298afd8c8b56 100644
--- a/airbyte-integrations/connectors/source-copper/metadata.yaml
+++ b/airbyte-integrations/connectors/source-copper/metadata.yaml
@@ -2,6 +2,10 @@ data:
   allowedHosts:
     hosts:
       - https://api.copper.com/
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-copper
   registries:
     oss:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-courier/metadata.yaml b/airbyte-integrations/connectors/source-courier/metadata.yaml
index d2badc1d80db9..fac285152d97b 100644
--- a/airbyte-integrations/connectors/source-courier/metadata.yaml
+++ b/airbyte-integrations/connectors/source-courier/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: courier.svg
   license: MIT
   name: Courier
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-courier
   registries:
     cloud:
       enabled: false
diff --git a/airbyte-integrations/connectors/source-customer-io/metadata.yaml b/airbyte-integrations/connectors/source-customer-io/metadata.yaml
index 3cf0252a2512a..6bb0d1e261765 100644
--- a/airbyte-integrations/connectors/source-customer-io/metadata.yaml
+++ b/airbyte-integrations/connectors/source-customer-io/metadata.yaml
@@ -2,6 +2,10 @@ data:
   allowedHosts:
     hosts:
       - https://api.customer.io/v1/
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-customer-io
   registries:
     oss:
       enabled: false
diff --git a/airbyte-integrations/connectors/source-datadog/metadata.yaml b/airbyte-integrations/connectors/source-datadog/metadata.yaml
index 88bef85da8ba6..da27ba470328a 100644
--- a/airbyte-integrations/connectors/source-datadog/metadata.yaml
+++ b/airbyte-integrations/connectors/source-datadog/metadata.yaml
@@ -6,6 +6,10 @@ data:
       - us5.datadoghq.com
       - datadoghq.eu
       - ddog-gov.com
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-datadog
   registries:
     oss:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-datascope/metadata.yaml b/airbyte-integrations/connectors/source-datascope/metadata.yaml
index 2d61ac39b220f..2649a980d2dd8 100644
--- a/airbyte-integrations/connectors/source-datascope/metadata.yaml
+++ b/airbyte-integrations/connectors/source-datascope/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: datascope.svg
   license: MIT
   name: Datascope
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-datascope
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-delighted/metadata.yaml b/airbyte-integrations/connectors/source-delighted/metadata.yaml
index 2a050c2b4814e..c9d006b900ee4 100644
--- a/airbyte-integrations/connectors/source-delighted/metadata.yaml
+++ b/airbyte-integrations/connectors/source-delighted/metadata.yaml
@@ -15,6 +15,10 @@ data:
   icon: delighted.svg
   license: MIT
   name: Delighted
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-delighted
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-dixa/metadata.yaml b/airbyte-integrations/connectors/source-dixa/metadata.yaml
index 9d45d0bb45f72..bb4821ee8c81e 100644
--- a/airbyte-integrations/connectors/source-dixa/metadata.yaml
+++ b/airbyte-integrations/connectors/source-dixa/metadata.yaml
@@ -2,6 +2,10 @@ data:
   allowedHosts:
     hosts:
       - exports.dixa.io
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-dixa
   registries:
     oss:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-dockerhub/metadata.yaml b/airbyte-integrations/connectors/source-dockerhub/metadata.yaml
index e0b403736301e..7800c7d8f8d94 100644
--- a/airbyte-integrations/connectors/source-dockerhub/metadata.yaml
+++ b/airbyte-integrations/connectors/source-dockerhub/metadata.yaml
@@ -3,6 +3,10 @@ data:
     hosts:
       - hub.docker.com
       - auth.docker.io
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-dockerhub
   registries:
     oss:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-dremio/metadata.yaml b/airbyte-integrations/connectors/source-dremio/metadata.yaml
index 4315e72f6be35..406e3707fdda9 100644
--- a/airbyte-integrations/connectors/source-dremio/metadata.yaml
+++ b/airbyte-integrations/connectors/source-dremio/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: dremio.svg
   license: MIT
   name: Dremio
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-dremio
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-drift/metadata.yaml b/airbyte-integrations/connectors/source-drift/metadata.yaml
index 12e3531ac2c31..e22ab893eae5a 100644
--- a/airbyte-integrations/connectors/source-drift/metadata.yaml
+++ b/airbyte-integrations/connectors/source-drift/metadata.yaml
@@ -2,6 +2,10 @@ data:
   allowedHosts:
     hosts:
       - https://driftapi.com/
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-drift
   registries:
     oss:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-dv-360/metadata.yaml b/airbyte-integrations/connectors/source-dv-360/metadata.yaml
index acaa90cec05d2..8092f2fce14c9 100644
--- a/airbyte-integrations/connectors/source-dv-360/metadata.yaml
+++ b/airbyte-integrations/connectors/source-dv-360/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: dv360.svg
   license: MIT
   name: DV 360
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-dv-360
   registries:
     cloud:
       enabled: false
diff --git a/airbyte-integrations/connectors/source-emailoctopus/metadata.yaml b/airbyte-integrations/connectors/source-emailoctopus/metadata.yaml
index 6b3d334201079..55a5037b7c051 100644
--- a/airbyte-integrations/connectors/source-emailoctopus/metadata.yaml
+++ b/airbyte-integrations/connectors/source-emailoctopus/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: emailoctopus.svg
   license: MIT
   name: EmailOctopus
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-emailoctopus
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-everhour/metadata.yaml b/airbyte-integrations/connectors/source-everhour/metadata.yaml
index a41a9283a3d19..edc9128f054fd 100644
--- a/airbyte-integrations/connectors/source-everhour/metadata.yaml
+++ b/airbyte-integrations/connectors/source-everhour/metadata.yaml
@@ -11,6 +11,10 @@ data:
   icon: everhour.svg
   license: MIT
   name: Everhour
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-everhour
   registries:
     cloud:
       enabled: false
diff --git a/airbyte-integrations/connectors/source-exchange-rates/metadata.yaml b/airbyte-integrations/connectors/source-exchange-rates/metadata.yaml
index 20d3fa38cb7c6..32efbf5e53ff3 100644
--- a/airbyte-integrations/connectors/source-exchange-rates/metadata.yaml
+++ b/airbyte-integrations/connectors/source-exchange-rates/metadata.yaml
@@ -3,6 +3,10 @@ data:
     hosts:
       - ${subdomain}.apilayer.com
       - apilayer.com
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-exchange-rates
   registries:
     oss:
       enabled: true

From e808c5115935cd08cf199ce8a7bc8002dd3cf187 Mon Sep 17 00:00:00 2001
From: maxi297 <maxi297@users.noreply.github.com>
Date: Tue, 30 Jan 2024 15:11:50 +0000
Subject: [PATCH 25/96] =?UTF-8?q?=F0=9F=A4=96=20Bump=20patch=20version=20o?=
 =?UTF-8?q?f=20Python=20CDK?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 airbyte-cdk/python/.bumpversion.cfg | 2 +-
 airbyte-cdk/python/CHANGELOG.md     | 3 +++
 airbyte-cdk/python/Dockerfile       | 2 +-
 airbyte-cdk/python/setup.py         | 2 +-
 4 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/airbyte-cdk/python/.bumpversion.cfg b/airbyte-cdk/python/.bumpversion.cfg
index 3d97cc1d483b0..984be1fe90a0f 100644
--- a/airbyte-cdk/python/.bumpversion.cfg
+++ b/airbyte-cdk/python/.bumpversion.cfg
@@ -1,5 +1,5 @@
 [bumpversion]
-current_version = 0.60.0
+current_version = 0.60.1
 commit = False
 
 [bumpversion:file:setup.py]
diff --git a/airbyte-cdk/python/CHANGELOG.md b/airbyte-cdk/python/CHANGELOG.md
index 84029d9910e22..822a7c75e2ea6 100644
--- a/airbyte-cdk/python/CHANGELOG.md
+++ b/airbyte-cdk/python/CHANGELOG.md
@@ -1,5 +1,8 @@
 # Changelog
 
+## 0.60.1
+Emit state when no partitions are generated for ccdk and update StateBuilder
+
 ## 0.60.0
 File-based CDK: run full refresh syncs with concurrency
 
diff --git a/airbyte-cdk/python/Dockerfile b/airbyte-cdk/python/Dockerfile
index 54d7fecf5ac1f..759d20f4c61a0 100644
--- a/airbyte-cdk/python/Dockerfile
+++ b/airbyte-cdk/python/Dockerfile
@@ -32,5 +32,5 @@ ENV AIRBYTE_ENTRYPOINT "python /airbyte/integration_code/main.py"
 ENTRYPOINT ["python", "/airbyte/integration_code/main.py"]
 
 # needs to be the same as CDK
-LABEL io.airbyte.version=0.60.0
+LABEL io.airbyte.version=0.60.1
 LABEL io.airbyte.name=airbyte/source-declarative-manifest
diff --git a/airbyte-cdk/python/setup.py b/airbyte-cdk/python/setup.py
index 4cae309ddfe1f..9082b99b5a9bc 100644
--- a/airbyte-cdk/python/setup.py
+++ b/airbyte-cdk/python/setup.py
@@ -36,7 +36,7 @@
     name="airbyte-cdk",
     # The version of the airbyte-cdk package is used at runtime to validate manifests. That validation must be
     # updated if our semver format changes such as using release candidate versions.
-    version="0.60.0",
+    version="0.60.1",
     description="A framework for writing Airbyte Connectors.",
     long_description=README,
     long_description_content_type="text/markdown",

From 15efffe16af6131c77ddde875e050328684df806 Mon Sep 17 00:00:00 2001
From: Joe Reuter <joe@airbyte.io>
Date: Tue, 30 Jan 2024 16:28:42 +0100
Subject: [PATCH 26/96] Revert "Publish to pypi batch3 (#34657)" (#34659)

---
 airbyte-integrations/connectors/source-commcare/metadata.yaml | 4 ----
 .../connectors/source-commercetools/metadata.yaml             | 4 ----
 .../connectors/source-configcat/metadata.yaml                 | 4 ----
 .../connectors/source-confluence/metadata.yaml                | 4 ----
 .../connectors/source-convertkit/metadata.yaml                | 4 ----
 airbyte-integrations/connectors/source-convex/metadata.yaml   | 4 ----
 airbyte-integrations/connectors/source-copper/metadata.yaml   | 4 ----
 airbyte-integrations/connectors/source-courier/metadata.yaml  | 4 ----
 .../connectors/source-customer-io/metadata.yaml               | 4 ----
 airbyte-integrations/connectors/source-datadog/metadata.yaml  | 4 ----
 .../connectors/source-datascope/metadata.yaml                 | 4 ----
 .../connectors/source-delighted/metadata.yaml                 | 4 ----
 airbyte-integrations/connectors/source-dixa/metadata.yaml     | 4 ----
 .../connectors/source-dockerhub/metadata.yaml                 | 4 ----
 airbyte-integrations/connectors/source-dremio/metadata.yaml   | 4 ----
 airbyte-integrations/connectors/source-drift/metadata.yaml    | 4 ----
 airbyte-integrations/connectors/source-dv-360/metadata.yaml   | 4 ----
 .../connectors/source-emailoctopus/metadata.yaml              | 4 ----
 airbyte-integrations/connectors/source-everhour/metadata.yaml | 4 ----
 .../connectors/source-exchange-rates/metadata.yaml            | 4 ----
 20 files changed, 80 deletions(-)

diff --git a/airbyte-integrations/connectors/source-commcare/metadata.yaml b/airbyte-integrations/connectors/source-commcare/metadata.yaml
index 3e78f837b0e19..e1bc67ca7ec88 100644
--- a/airbyte-integrations/connectors/source-commcare/metadata.yaml
+++ b/airbyte-integrations/connectors/source-commcare/metadata.yaml
@@ -7,10 +7,6 @@ data:
   githubIssueLabel: source-commcare
   license: MIT
   name: Commcare
-  remoteRegistries:
-    pypi:
-      enabled: true
-      packageName: airbyte-source-commcare
   registries:
     cloud:
       enabled: false
diff --git a/airbyte-integrations/connectors/source-commercetools/metadata.yaml b/airbyte-integrations/connectors/source-commercetools/metadata.yaml
index f28b88a916c96..5af0802c2c0ec 100644
--- a/airbyte-integrations/connectors/source-commercetools/metadata.yaml
+++ b/airbyte-integrations/connectors/source-commercetools/metadata.yaml
@@ -3,10 +3,6 @@ data:
     hosts:
       - auth.${region}.${host}.commercetools.com
       - api.${region}.${host}.commercetools.com
-  remoteRegistries:
-    pypi:
-      enabled: true
-      packageName: airbyte-source-commercetools
   registries:
     oss:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-configcat/metadata.yaml b/airbyte-integrations/connectors/source-configcat/metadata.yaml
index 3c1f707095be5..b4725144c2f17 100644
--- a/airbyte-integrations/connectors/source-configcat/metadata.yaml
+++ b/airbyte-integrations/connectors/source-configcat/metadata.yaml
@@ -8,10 +8,6 @@ data:
   icon: configcat.svg
   license: MIT
   name: ConfigCat
-  remoteRegistries:
-    pypi:
-      enabled: true
-      packageName: airbyte-source-configcat
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-confluence/metadata.yaml b/airbyte-integrations/connectors/source-confluence/metadata.yaml
index be0b48fb334ae..87d324b5ebecc 100644
--- a/airbyte-integrations/connectors/source-confluence/metadata.yaml
+++ b/airbyte-integrations/connectors/source-confluence/metadata.yaml
@@ -5,10 +5,6 @@ data:
   allowedHosts:
     hosts:
       - ${subdomain}.atlassian.net
-  remoteRegistries:
-    pypi:
-      enabled: true
-      packageName: airbyte-source-confluence
   registries:
     oss:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-convertkit/metadata.yaml b/airbyte-integrations/connectors/source-convertkit/metadata.yaml
index 8a0327f0580c3..66d558a615f64 100644
--- a/airbyte-integrations/connectors/source-convertkit/metadata.yaml
+++ b/airbyte-integrations/connectors/source-convertkit/metadata.yaml
@@ -8,10 +8,6 @@ data:
   icon: convertkit.svg
   license: MIT
   name: ConvertKit
-  remoteRegistries:
-    pypi:
-      enabled: true
-      packageName: airbyte-source-convertkit
   registries:
     cloud:
       enabled: false
diff --git a/airbyte-integrations/connectors/source-convex/metadata.yaml b/airbyte-integrations/connectors/source-convex/metadata.yaml
index 14d34525a6414..b58c7a7b40dd1 100644
--- a/airbyte-integrations/connectors/source-convex/metadata.yaml
+++ b/airbyte-integrations/connectors/source-convex/metadata.yaml
@@ -8,10 +8,6 @@ data:
   icon: convex.svg
   license: MIT
   name: Convex
-  remoteRegistries:
-    pypi:
-      enabled: true
-      packageName: airbyte-source-convex
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-copper/metadata.yaml b/airbyte-integrations/connectors/source-copper/metadata.yaml
index 6298afd8c8b56..283dd98e3a15f 100644
--- a/airbyte-integrations/connectors/source-copper/metadata.yaml
+++ b/airbyte-integrations/connectors/source-copper/metadata.yaml
@@ -2,10 +2,6 @@ data:
   allowedHosts:
     hosts:
       - https://api.copper.com/
-  remoteRegistries:
-    pypi:
-      enabled: true
-      packageName: airbyte-source-copper
   registries:
     oss:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-courier/metadata.yaml b/airbyte-integrations/connectors/source-courier/metadata.yaml
index fac285152d97b..d2badc1d80db9 100644
--- a/airbyte-integrations/connectors/source-courier/metadata.yaml
+++ b/airbyte-integrations/connectors/source-courier/metadata.yaml
@@ -8,10 +8,6 @@ data:
   icon: courier.svg
   license: MIT
   name: Courier
-  remoteRegistries:
-    pypi:
-      enabled: true
-      packageName: airbyte-source-courier
   registries:
     cloud:
       enabled: false
diff --git a/airbyte-integrations/connectors/source-customer-io/metadata.yaml b/airbyte-integrations/connectors/source-customer-io/metadata.yaml
index 6bb0d1e261765..3cf0252a2512a 100644
--- a/airbyte-integrations/connectors/source-customer-io/metadata.yaml
+++ b/airbyte-integrations/connectors/source-customer-io/metadata.yaml
@@ -2,10 +2,6 @@ data:
   allowedHosts:
     hosts:
       - https://api.customer.io/v1/
-  remoteRegistries:
-    pypi:
-      enabled: true
-      packageName: airbyte-source-customer-io
   registries:
     oss:
       enabled: false
diff --git a/airbyte-integrations/connectors/source-datadog/metadata.yaml b/airbyte-integrations/connectors/source-datadog/metadata.yaml
index da27ba470328a..88bef85da8ba6 100644
--- a/airbyte-integrations/connectors/source-datadog/metadata.yaml
+++ b/airbyte-integrations/connectors/source-datadog/metadata.yaml
@@ -6,10 +6,6 @@ data:
       - us5.datadoghq.com
       - datadoghq.eu
       - ddog-gov.com
-  remoteRegistries:
-    pypi:
-      enabled: true
-      packageName: airbyte-source-datadog
   registries:
     oss:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-datascope/metadata.yaml b/airbyte-integrations/connectors/source-datascope/metadata.yaml
index 2649a980d2dd8..2d61ac39b220f 100644
--- a/airbyte-integrations/connectors/source-datascope/metadata.yaml
+++ b/airbyte-integrations/connectors/source-datascope/metadata.yaml
@@ -8,10 +8,6 @@ data:
   icon: datascope.svg
   license: MIT
   name: Datascope
-  remoteRegistries:
-    pypi:
-      enabled: true
-      packageName: airbyte-source-datascope
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-delighted/metadata.yaml b/airbyte-integrations/connectors/source-delighted/metadata.yaml
index c9d006b900ee4..2a050c2b4814e 100644
--- a/airbyte-integrations/connectors/source-delighted/metadata.yaml
+++ b/airbyte-integrations/connectors/source-delighted/metadata.yaml
@@ -15,10 +15,6 @@ data:
   icon: delighted.svg
   license: MIT
   name: Delighted
-  remoteRegistries:
-    pypi:
-      enabled: true
-      packageName: airbyte-source-delighted
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-dixa/metadata.yaml b/airbyte-integrations/connectors/source-dixa/metadata.yaml
index bb4821ee8c81e..9d45d0bb45f72 100644
--- a/airbyte-integrations/connectors/source-dixa/metadata.yaml
+++ b/airbyte-integrations/connectors/source-dixa/metadata.yaml
@@ -2,10 +2,6 @@ data:
   allowedHosts:
     hosts:
       - exports.dixa.io
-  remoteRegistries:
-    pypi:
-      enabled: true
-      packageName: airbyte-source-dixa
   registries:
     oss:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-dockerhub/metadata.yaml b/airbyte-integrations/connectors/source-dockerhub/metadata.yaml
index 7800c7d8f8d94..e0b403736301e 100644
--- a/airbyte-integrations/connectors/source-dockerhub/metadata.yaml
+++ b/airbyte-integrations/connectors/source-dockerhub/metadata.yaml
@@ -3,10 +3,6 @@ data:
     hosts:
       - hub.docker.com
       - auth.docker.io
-  remoteRegistries:
-    pypi:
-      enabled: true
-      packageName: airbyte-source-dockerhub
   registries:
     oss:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-dremio/metadata.yaml b/airbyte-integrations/connectors/source-dremio/metadata.yaml
index 406e3707fdda9..4315e72f6be35 100644
--- a/airbyte-integrations/connectors/source-dremio/metadata.yaml
+++ b/airbyte-integrations/connectors/source-dremio/metadata.yaml
@@ -8,10 +8,6 @@ data:
   icon: dremio.svg
   license: MIT
   name: Dremio
-  remoteRegistries:
-    pypi:
-      enabled: true
-      packageName: airbyte-source-dremio
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-drift/metadata.yaml b/airbyte-integrations/connectors/source-drift/metadata.yaml
index e22ab893eae5a..12e3531ac2c31 100644
--- a/airbyte-integrations/connectors/source-drift/metadata.yaml
+++ b/airbyte-integrations/connectors/source-drift/metadata.yaml
@@ -2,10 +2,6 @@ data:
   allowedHosts:
     hosts:
       - https://driftapi.com/
-  remoteRegistries:
-    pypi:
-      enabled: true
-      packageName: airbyte-source-drift
   registries:
     oss:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-dv-360/metadata.yaml b/airbyte-integrations/connectors/source-dv-360/metadata.yaml
index 8092f2fce14c9..acaa90cec05d2 100644
--- a/airbyte-integrations/connectors/source-dv-360/metadata.yaml
+++ b/airbyte-integrations/connectors/source-dv-360/metadata.yaml
@@ -8,10 +8,6 @@ data:
   icon: dv360.svg
   license: MIT
   name: DV 360
-  remoteRegistries:
-    pypi:
-      enabled: true
-      packageName: airbyte-source-dv-360
   registries:
     cloud:
       enabled: false
diff --git a/airbyte-integrations/connectors/source-emailoctopus/metadata.yaml b/airbyte-integrations/connectors/source-emailoctopus/metadata.yaml
index 55a5037b7c051..6b3d334201079 100644
--- a/airbyte-integrations/connectors/source-emailoctopus/metadata.yaml
+++ b/airbyte-integrations/connectors/source-emailoctopus/metadata.yaml
@@ -8,10 +8,6 @@ data:
   icon: emailoctopus.svg
   license: MIT
   name: EmailOctopus
-  remoteRegistries:
-    pypi:
-      enabled: true
-      packageName: airbyte-source-emailoctopus
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-everhour/metadata.yaml b/airbyte-integrations/connectors/source-everhour/metadata.yaml
index edc9128f054fd..a41a9283a3d19 100644
--- a/airbyte-integrations/connectors/source-everhour/metadata.yaml
+++ b/airbyte-integrations/connectors/source-everhour/metadata.yaml
@@ -11,10 +11,6 @@ data:
   icon: everhour.svg
   license: MIT
   name: Everhour
-  remoteRegistries:
-    pypi:
-      enabled: true
-      packageName: airbyte-source-everhour
   registries:
     cloud:
       enabled: false
diff --git a/airbyte-integrations/connectors/source-exchange-rates/metadata.yaml b/airbyte-integrations/connectors/source-exchange-rates/metadata.yaml
index 32efbf5e53ff3..20d3fa38cb7c6 100644
--- a/airbyte-integrations/connectors/source-exchange-rates/metadata.yaml
+++ b/airbyte-integrations/connectors/source-exchange-rates/metadata.yaml
@@ -3,10 +3,6 @@ data:
     hosts:
       - ${subdomain}.apilayer.com
       - apilayer.com
-  remoteRegistries:
-    pypi:
-      enabled: true
-      packageName: airbyte-source-exchange-rates
   registries:
     oss:
       enabled: true

From ae3a028b435ea0b8590dd522491c5a5e0a38b048 Mon Sep 17 00:00:00 2001
From: Joe Reuter <joe@airbyte.io>
Date: Tue, 30 Jan 2024 18:02:55 +0100
Subject: [PATCH 27/96] airbyte-lib: Prepare for published connectors (#34651)

---
 airbyte-lib/airbyte_lib/_executor.py                        | 6 +++---
 .../tests/integration_tests/fixtures/source-broken/setup.py | 4 ++--
 .../tests/integration_tests/fixtures/source-test/setup.py   | 4 ++--
 3 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/airbyte-lib/airbyte_lib/_executor.py b/airbyte-lib/airbyte_lib/_executor.py
index a43d56249163d..45cb03cf29df8 100644
--- a/airbyte-lib/airbyte_lib/_executor.py
+++ b/airbyte-lib/airbyte_lib/_executor.py
@@ -147,8 +147,7 @@ def __init__(
 
         # This is a temporary install path that will be replaced with a proper package
         # name once they are published.
-        # TODO: Replace with `f"airbyte-{self.name}"`
-        self.pip_url = pip_url or f"../airbyte-integrations/connectors/{self.name}"
+        self.pip_url = pip_url or f"airbyte-{self.name}"
         self.install_root = install_root or Path.cwd()
 
     def _get_venv_name(self) -> str:
@@ -239,11 +238,12 @@ def _get_installed_version(
             return None
 
         try:
+            package_name = f"airbyte-{connector_name}"
             return subprocess.check_output(
                 [
                     self.interpreter_path,
                     "-c",
-                    f"from importlib.metadata import version; print(version('{connector_name}'))",
+                    f"from importlib.metadata import version; print(version('{package_name}'))",
                 ],
                 universal_newlines=True,
             ).strip()
diff --git a/airbyte-lib/tests/integration_tests/fixtures/source-broken/setup.py b/airbyte-lib/tests/integration_tests/fixtures/source-broken/setup.py
index 0a565f98e08ba..516112718b7e9 100644
--- a/airbyte-lib/tests/integration_tests/fixtures/source-broken/setup.py
+++ b/airbyte-lib/tests/integration_tests/fixtures/source-broken/setup.py
@@ -3,10 +3,10 @@
 #
 
 
-from setuptools import find_packages, setup
+from setuptools import setup
 
 setup(
-    name="source_broken",
+    name="airbyte-source-broken",
     version="0.0.1",
     description="Test Soutce",
     author="Airbyte",
diff --git a/airbyte-lib/tests/integration_tests/fixtures/source-test/setup.py b/airbyte-lib/tests/integration_tests/fixtures/source-test/setup.py
index 348e0c28a2547..0035f1eda76a2 100644
--- a/airbyte-lib/tests/integration_tests/fixtures/source-test/setup.py
+++ b/airbyte-lib/tests/integration_tests/fixtures/source-test/setup.py
@@ -3,10 +3,10 @@
 #
 
 
-from setuptools import find_packages, setup
+from setuptools import setup
 
 setup(
-    name="source_test",
+    name="airbyte-source-test",
     version="0.0.1",
     description="Test Soutce",
     author="Airbyte",

From 4ccdf362d59f85b5946903915bc3931f6e3a6a4b Mon Sep 17 00:00:00 2001
From: Joe Reuter <joe@airbyte.io>
Date: Tue, 30 Jan 2024 18:30:48 +0100
Subject: [PATCH 28/96] Recreate pypi publish batch3 (#34660)

---
 airbyte-integrations/connectors/source-commcare/metadata.yaml | 4 ++++
 .../connectors/source-commercetools/metadata.yaml             | 4 ++++
 .../connectors/source-configcat/metadata.yaml                 | 4 ++++
 .../connectors/source-confluence/metadata.yaml                | 4 ++++
 .../connectors/source-convertkit/metadata.yaml                | 4 ++++
 airbyte-integrations/connectors/source-convex/metadata.yaml   | 4 ++++
 airbyte-integrations/connectors/source-copper/metadata.yaml   | 4 ++++
 airbyte-integrations/connectors/source-courier/metadata.yaml  | 4 ++++
 .../connectors/source-customer-io/metadata.yaml               | 4 ++++
 airbyte-integrations/connectors/source-datadog/metadata.yaml  | 4 ++++
 .../connectors/source-datascope/metadata.yaml                 | 4 ++++
 .../connectors/source-delighted/metadata.yaml                 | 4 ++++
 airbyte-integrations/connectors/source-dixa/metadata.yaml     | 4 ++++
 .../connectors/source-dockerhub/metadata.yaml                 | 4 ++++
 airbyte-integrations/connectors/source-dremio/metadata.yaml   | 4 ++++
 airbyte-integrations/connectors/source-drift/metadata.yaml    | 4 ++++
 airbyte-integrations/connectors/source-dv-360/metadata.yaml   | 4 ++++
 .../connectors/source-emailoctopus/metadata.yaml              | 4 ++++
 airbyte-integrations/connectors/source-everhour/metadata.yaml | 4 ++++
 .../connectors/source-exchange-rates/metadata.yaml            | 4 ++++
 20 files changed, 80 insertions(+)

diff --git a/airbyte-integrations/connectors/source-commcare/metadata.yaml b/airbyte-integrations/connectors/source-commcare/metadata.yaml
index e1bc67ca7ec88..3e78f837b0e19 100644
--- a/airbyte-integrations/connectors/source-commcare/metadata.yaml
+++ b/airbyte-integrations/connectors/source-commcare/metadata.yaml
@@ -7,6 +7,10 @@ data:
   githubIssueLabel: source-commcare
   license: MIT
   name: Commcare
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-commcare
   registries:
     cloud:
       enabled: false
diff --git a/airbyte-integrations/connectors/source-commercetools/metadata.yaml b/airbyte-integrations/connectors/source-commercetools/metadata.yaml
index 5af0802c2c0ec..f28b88a916c96 100644
--- a/airbyte-integrations/connectors/source-commercetools/metadata.yaml
+++ b/airbyte-integrations/connectors/source-commercetools/metadata.yaml
@@ -3,6 +3,10 @@ data:
     hosts:
       - auth.${region}.${host}.commercetools.com
       - api.${region}.${host}.commercetools.com
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-commercetools
   registries:
     oss:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-configcat/metadata.yaml b/airbyte-integrations/connectors/source-configcat/metadata.yaml
index b4725144c2f17..3c1f707095be5 100644
--- a/airbyte-integrations/connectors/source-configcat/metadata.yaml
+++ b/airbyte-integrations/connectors/source-configcat/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: configcat.svg
   license: MIT
   name: ConfigCat
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-configcat
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-confluence/metadata.yaml b/airbyte-integrations/connectors/source-confluence/metadata.yaml
index 87d324b5ebecc..be0b48fb334ae 100644
--- a/airbyte-integrations/connectors/source-confluence/metadata.yaml
+++ b/airbyte-integrations/connectors/source-confluence/metadata.yaml
@@ -5,6 +5,10 @@ data:
   allowedHosts:
     hosts:
       - ${subdomain}.atlassian.net
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-confluence
   registries:
     oss:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-convertkit/metadata.yaml b/airbyte-integrations/connectors/source-convertkit/metadata.yaml
index 66d558a615f64..8a0327f0580c3 100644
--- a/airbyte-integrations/connectors/source-convertkit/metadata.yaml
+++ b/airbyte-integrations/connectors/source-convertkit/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: convertkit.svg
   license: MIT
   name: ConvertKit
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-convertkit
   registries:
     cloud:
       enabled: false
diff --git a/airbyte-integrations/connectors/source-convex/metadata.yaml b/airbyte-integrations/connectors/source-convex/metadata.yaml
index b58c7a7b40dd1..14d34525a6414 100644
--- a/airbyte-integrations/connectors/source-convex/metadata.yaml
+++ b/airbyte-integrations/connectors/source-convex/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: convex.svg
   license: MIT
   name: Convex
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-convex
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-copper/metadata.yaml b/airbyte-integrations/connectors/source-copper/metadata.yaml
index 283dd98e3a15f..6298afd8c8b56 100644
--- a/airbyte-integrations/connectors/source-copper/metadata.yaml
+++ b/airbyte-integrations/connectors/source-copper/metadata.yaml
@@ -2,6 +2,10 @@ data:
   allowedHosts:
     hosts:
       - https://api.copper.com/
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-copper
   registries:
     oss:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-courier/metadata.yaml b/airbyte-integrations/connectors/source-courier/metadata.yaml
index d2badc1d80db9..fac285152d97b 100644
--- a/airbyte-integrations/connectors/source-courier/metadata.yaml
+++ b/airbyte-integrations/connectors/source-courier/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: courier.svg
   license: MIT
   name: Courier
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-courier
   registries:
     cloud:
       enabled: false
diff --git a/airbyte-integrations/connectors/source-customer-io/metadata.yaml b/airbyte-integrations/connectors/source-customer-io/metadata.yaml
index 3cf0252a2512a..6bb0d1e261765 100644
--- a/airbyte-integrations/connectors/source-customer-io/metadata.yaml
+++ b/airbyte-integrations/connectors/source-customer-io/metadata.yaml
@@ -2,6 +2,10 @@ data:
   allowedHosts:
     hosts:
       - https://api.customer.io/v1/
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-customer-io
   registries:
     oss:
       enabled: false
diff --git a/airbyte-integrations/connectors/source-datadog/metadata.yaml b/airbyte-integrations/connectors/source-datadog/metadata.yaml
index 88bef85da8ba6..da27ba470328a 100644
--- a/airbyte-integrations/connectors/source-datadog/metadata.yaml
+++ b/airbyte-integrations/connectors/source-datadog/metadata.yaml
@@ -6,6 +6,10 @@ data:
       - us5.datadoghq.com
       - datadoghq.eu
       - ddog-gov.com
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-datadog
   registries:
     oss:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-datascope/metadata.yaml b/airbyte-integrations/connectors/source-datascope/metadata.yaml
index 2d61ac39b220f..2649a980d2dd8 100644
--- a/airbyte-integrations/connectors/source-datascope/metadata.yaml
+++ b/airbyte-integrations/connectors/source-datascope/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: datascope.svg
   license: MIT
   name: Datascope
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-datascope
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-delighted/metadata.yaml b/airbyte-integrations/connectors/source-delighted/metadata.yaml
index 2a050c2b4814e..c9d006b900ee4 100644
--- a/airbyte-integrations/connectors/source-delighted/metadata.yaml
+++ b/airbyte-integrations/connectors/source-delighted/metadata.yaml
@@ -15,6 +15,10 @@ data:
   icon: delighted.svg
   license: MIT
   name: Delighted
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-delighted
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-dixa/metadata.yaml b/airbyte-integrations/connectors/source-dixa/metadata.yaml
index 9d45d0bb45f72..bb4821ee8c81e 100644
--- a/airbyte-integrations/connectors/source-dixa/metadata.yaml
+++ b/airbyte-integrations/connectors/source-dixa/metadata.yaml
@@ -2,6 +2,10 @@ data:
   allowedHosts:
     hosts:
       - exports.dixa.io
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-dixa
   registries:
     oss:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-dockerhub/metadata.yaml b/airbyte-integrations/connectors/source-dockerhub/metadata.yaml
index e0b403736301e..7800c7d8f8d94 100644
--- a/airbyte-integrations/connectors/source-dockerhub/metadata.yaml
+++ b/airbyte-integrations/connectors/source-dockerhub/metadata.yaml
@@ -3,6 +3,10 @@ data:
     hosts:
       - hub.docker.com
       - auth.docker.io
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-dockerhub
   registries:
     oss:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-dremio/metadata.yaml b/airbyte-integrations/connectors/source-dremio/metadata.yaml
index 4315e72f6be35..406e3707fdda9 100644
--- a/airbyte-integrations/connectors/source-dremio/metadata.yaml
+++ b/airbyte-integrations/connectors/source-dremio/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: dremio.svg
   license: MIT
   name: Dremio
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-dremio
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-drift/metadata.yaml b/airbyte-integrations/connectors/source-drift/metadata.yaml
index 12e3531ac2c31..e22ab893eae5a 100644
--- a/airbyte-integrations/connectors/source-drift/metadata.yaml
+++ b/airbyte-integrations/connectors/source-drift/metadata.yaml
@@ -2,6 +2,10 @@ data:
   allowedHosts:
     hosts:
       - https://driftapi.com/
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-drift
   registries:
     oss:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-dv-360/metadata.yaml b/airbyte-integrations/connectors/source-dv-360/metadata.yaml
index acaa90cec05d2..8092f2fce14c9 100644
--- a/airbyte-integrations/connectors/source-dv-360/metadata.yaml
+++ b/airbyte-integrations/connectors/source-dv-360/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: dv360.svg
   license: MIT
   name: DV 360
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-dv-360
   registries:
     cloud:
       enabled: false
diff --git a/airbyte-integrations/connectors/source-emailoctopus/metadata.yaml b/airbyte-integrations/connectors/source-emailoctopus/metadata.yaml
index 6b3d334201079..55a5037b7c051 100644
--- a/airbyte-integrations/connectors/source-emailoctopus/metadata.yaml
+++ b/airbyte-integrations/connectors/source-emailoctopus/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: emailoctopus.svg
   license: MIT
   name: EmailOctopus
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-emailoctopus
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-everhour/metadata.yaml b/airbyte-integrations/connectors/source-everhour/metadata.yaml
index a41a9283a3d19..edc9128f054fd 100644
--- a/airbyte-integrations/connectors/source-everhour/metadata.yaml
+++ b/airbyte-integrations/connectors/source-everhour/metadata.yaml
@@ -11,6 +11,10 @@ data:
   icon: everhour.svg
   license: MIT
   name: Everhour
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-everhour
   registries:
     cloud:
       enabled: false
diff --git a/airbyte-integrations/connectors/source-exchange-rates/metadata.yaml b/airbyte-integrations/connectors/source-exchange-rates/metadata.yaml
index 20d3fa38cb7c6..32efbf5e53ff3 100644
--- a/airbyte-integrations/connectors/source-exchange-rates/metadata.yaml
+++ b/airbyte-integrations/connectors/source-exchange-rates/metadata.yaml
@@ -3,6 +3,10 @@ data:
     hosts:
       - ${subdomain}.apilayer.com
       - apilayer.com
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-exchange-rates
   registries:
     oss:
       enabled: true

From 4136e9caab36926cd786615a7f68ff0406d04ab2 Mon Sep 17 00:00:00 2001
From: Ryan Waskewich <156025126+rwask@users.noreply.github.com>
Date: Tue, 30 Jan 2024 12:38:00 -0500
Subject: [PATCH 29/96] Update cdc.md - Add MongoDB support (#34671)

---
 docs/understanding-airbyte/cdc.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/docs/understanding-airbyte/cdc.md b/docs/understanding-airbyte/cdc.md
index ee42b9a460b85..fa012c6d53669 100644
--- a/docs/understanding-airbyte/cdc.md
+++ b/docs/understanding-airbyte/cdc.md
@@ -33,7 +33,7 @@ We add some metadata columns for CDC sources:
 * [Postgres](../integrations/sources/postgres.md) \(For a quick video overview of CDC on Postgres, click [here](https://www.youtube.com/watch?v=NMODvLgZvuE&ab_channel=Airbyte)\)
 * [MySQL](../integrations/sources/mysql.md)
 * [Microsoft SQL Server / MSSQL](../integrations/sources/mssql.md)
-
+* [MongoDB](../integrations/sources/mongodb-v2.md) \(More information on [Mongodb CDC: How to Sync in Near Real-Time](https://airbyte.com/data-engineering-resources/mongodb-cdc)\)
 ## Coming Soon
 
 * Oracle DB

From 82b7e5d532d78703fec8de9d7a6d304e2a9e4f32 Mon Sep 17 00:00:00 2001
From: Catherine Noll <clnoll@users.noreply.github.com>
Date: Tue, 30 Jan 2024 13:30:02 -0500
Subject: [PATCH 30/96] Pin file-based sources to airbyte-cdk version 0.59.2 
 (#34661)

---
 .../source-azure-blob-storage/metadata.yaml   |  2 +-
 .../source-azure-blob-storage/setup.py        |  2 +-
 .../connectors/source-gcs/metadata.yaml       |  2 +-
 .../connectors/source-gcs/setup.py            |  2 +-
 .../source-google-drive/metadata.yaml         |  2 +-
 .../connectors/source-google-drive/setup.py   |  2 +-
 .../source-microsoft-onedrive/metadata.yaml   |  2 +-
 .../source-microsoft-onedrive/setup.py        |  2 +-
 .../sources/azure-blob-storage.md             | 23 ++++++++++---------
 docs/integrations/sources/gcs.md              |  1 +
 docs/integrations/sources/google-drive.md     |  3 ++-
 .../sources/microsoft-onedrive.md             |  1 +
 12 files changed, 24 insertions(+), 20 deletions(-)

diff --git a/airbyte-integrations/connectors/source-azure-blob-storage/metadata.yaml b/airbyte-integrations/connectors/source-azure-blob-storage/metadata.yaml
index 14923e9a8c79b..eca1b2e4c108d 100644
--- a/airbyte-integrations/connectors/source-azure-blob-storage/metadata.yaml
+++ b/airbyte-integrations/connectors/source-azure-blob-storage/metadata.yaml
@@ -7,7 +7,7 @@ data:
   connectorSubtype: file
   connectorType: source
   definitionId: fdaaba68-4875-4ed9-8fcd-4ae1e0a25093
-  dockerImageTag: 0.3.1
+  dockerImageTag: 0.3.2
   dockerRepository: airbyte/source-azure-blob-storage
   documentationUrl: https://docs.airbyte.com/integrations/sources/azure-blob-storage
   githubIssueLabel: source-azure-blob-storage
diff --git a/airbyte-integrations/connectors/source-azure-blob-storage/setup.py b/airbyte-integrations/connectors/source-azure-blob-storage/setup.py
index b22b1d7c6be6c..5260ac12c058b 100644
--- a/airbyte-integrations/connectors/source-azure-blob-storage/setup.py
+++ b/airbyte-integrations/connectors/source-azure-blob-storage/setup.py
@@ -6,7 +6,7 @@
 from setuptools import find_packages, setup
 
 MAIN_REQUIREMENTS = [
-    "airbyte-cdk[file-based]>=0.57.7",
+    "airbyte-cdk[file-based]==0.59.2",  # pinned until compatible with https://github.com/airbytehq/airbyte/pull/34411
     "smart_open[azure]",
     "pytz",
 ]
diff --git a/airbyte-integrations/connectors/source-gcs/metadata.yaml b/airbyte-integrations/connectors/source-gcs/metadata.yaml
index 1ed2d67577834..b303f6085b7a3 100644
--- a/airbyte-integrations/connectors/source-gcs/metadata.yaml
+++ b/airbyte-integrations/connectors/source-gcs/metadata.yaml
@@ -7,7 +7,7 @@ data:
   connectorSubtype: file
   connectorType: source
   definitionId: 2a8c41ae-8c23-4be0-a73f-2ab10ca1a820
-  dockerImageTag: 0.3.4
+  dockerImageTag: 0.3.5
   dockerRepository: airbyte/source-gcs
   documentationUrl: https://docs.airbyte.com/integrations/sources/gcs
   githubIssueLabel: source-gcs
diff --git a/airbyte-integrations/connectors/source-gcs/setup.py b/airbyte-integrations/connectors/source-gcs/setup.py
index 0f576ec930cc4..830498574d7a5 100644
--- a/airbyte-integrations/connectors/source-gcs/setup.py
+++ b/airbyte-integrations/connectors/source-gcs/setup.py
@@ -6,7 +6,7 @@
 from setuptools import find_packages, setup
 
 MAIN_REQUIREMENTS = [
-    "airbyte-cdk[file-based]>=0.55.5",
+    "airbyte-cdk[file-based]==0.59.2",  # pinned until compatible with https://github.com/airbytehq/airbyte/pull/34411
     "google-cloud-storage==2.12.0",
     "smart-open[s3]==5.1.0",
     "pandas==1.5.3",
diff --git a/airbyte-integrations/connectors/source-google-drive/metadata.yaml b/airbyte-integrations/connectors/source-google-drive/metadata.yaml
index bf40629baae06..6f4839d112c9b 100644
--- a/airbyte-integrations/connectors/source-google-drive/metadata.yaml
+++ b/airbyte-integrations/connectors/source-google-drive/metadata.yaml
@@ -7,7 +7,7 @@ data:
   connectorSubtype: file
   connectorType: source
   definitionId: 9f8dda77-1048-4368-815b-269bf54ee9b8
-  dockerImageTag: 0.0.6
+  dockerImageTag: 0.0.7
   dockerRepository: airbyte/source-google-drive
   githubIssueLabel: source-google-drive
   icon: google-drive.svg
diff --git a/airbyte-integrations/connectors/source-google-drive/setup.py b/airbyte-integrations/connectors/source-google-drive/setup.py
index 0eade80fe5ca8..858c7019384a8 100644
--- a/airbyte-integrations/connectors/source-google-drive/setup.py
+++ b/airbyte-integrations/connectors/source-google-drive/setup.py
@@ -6,7 +6,7 @@
 from setuptools import find_packages, setup
 
 MAIN_REQUIREMENTS = [
-    "airbyte-cdk[file-based]>=0.57.7",
+    "airbyte-cdk[file-based]==0.59.2",  # pinned until compatible with https://github.com/airbytehq/airbyte/pull/34411
     "google-api-python-client==2.104.0",
     "google-auth-httplib2==0.1.1",
     "google-auth-oauthlib==1.1.0",
diff --git a/airbyte-integrations/connectors/source-microsoft-onedrive/metadata.yaml b/airbyte-integrations/connectors/source-microsoft-onedrive/metadata.yaml
index f1b3317b475c5..b6ef12226f711 100644
--- a/airbyte-integrations/connectors/source-microsoft-onedrive/metadata.yaml
+++ b/airbyte-integrations/connectors/source-microsoft-onedrive/metadata.yaml
@@ -16,7 +16,7 @@ data:
   connectorSubtype: api
   connectorType: source
   definitionId: 01d1c685-fd4a-4837-8f4c-93fe5a0d2188
-  dockerImageTag: 0.1.3
+  dockerImageTag: 0.1.4
   dockerRepository: airbyte/source-microsoft-onedrive
   githubIssueLabel: source-microsoft-onedrive
   icon: microsoft-onedrive.svg
diff --git a/airbyte-integrations/connectors/source-microsoft-onedrive/setup.py b/airbyte-integrations/connectors/source-microsoft-onedrive/setup.py
index 8709208c5be2e..bc93b53a40044 100644
--- a/airbyte-integrations/connectors/source-microsoft-onedrive/setup.py
+++ b/airbyte-integrations/connectors/source-microsoft-onedrive/setup.py
@@ -6,7 +6,7 @@
 from setuptools import find_packages, setup
 
 MAIN_REQUIREMENTS = [
-    "airbyte-cdk[file-based]>=0.57.5",
+    "airbyte-cdk[file-based]==0.59.2",  # pinned until compatible with https://github.com/airbytehq/airbyte/pull/34411
     "msal~=1.25.0",
     "Office365-REST-Python-Client~=2.5.2",
     "smart-open~=6.4.0",
diff --git a/docs/integrations/sources/azure-blob-storage.md b/docs/integrations/sources/azure-blob-storage.md
index 0a6dc5e5e8f7a..01d082c71ca0b 100644
--- a/docs/integrations/sources/azure-blob-storage.md
+++ b/docs/integrations/sources/azure-blob-storage.md
@@ -191,14 +191,15 @@ To perform the text extraction from PDF and Docx files, the connector uses the [
 
 ## Changelog
 
-| Version | Date       | Pull Request                                             | Subject                                                                         |
-|:--------|:-----------|:---------------------------------------------------------|:--------------------------------------------------------------------------------|
-| 0.3.1   | 2024-01-10 | [34084](https://github.com/airbytehq/airbyte/pull/34084)  | Fix bug for running check with document file format          |
-| 0.3.0   | 2023-12-14 | [33411](https://github.com/airbytehq/airbyte/pull/33411)  | Bump CDK version to auto-set primary key for document file streams and support raw txt files         |
-| 0.2.5   | 2023-12-06 | [33187](https://github.com/airbytehq/airbyte/pull/33187) | Bump CDK version to hide source-defined primary key                             |
-| 0.2.4   | 2023-11-16 | [32608](https://github.com/airbytehq/airbyte/pull/32608) | Improve document file type parser                                               |
-| 0.2.3   | 2023-11-13 | [32357](https://github.com/airbytehq/airbyte/pull/32357) | Improve spec schema                                                             |
-| 0.2.2   | 2023-10-30 | [31904](https://github.com/airbytehq/airbyte/pull/31904) | Update CDK to support document file types                                       |
-| 0.2.1   | 2023-10-18 | [31543](https://github.com/airbytehq/airbyte/pull/31543) | Base image migration: remove Dockerfile and use the python-connector-base image |
-| 0.2.0   | 2023-10-10 | https://github.com/airbytehq/airbyte/pull/31336          | Migrate to File-based CDK. Add support of CSV, Parquet and Avro files           |
-| 0.1.0   | 2023-02-17 | https://github.com/airbytehq/airbyte/pull/23222          | Initial release with full-refresh and incremental sync with JSONL files         |
\ No newline at end of file
+| Version | Date       | Pull Request                                             | Subject                                                                                      |
+|:--------|:-----------|:---------------------------------------------------------|:---------------------------------------------------------------------------------------------|
+| 0.3.2   | 2024-01-30 | [34661](https://github.com/airbytehq/airbyte/pull/34661)  | Pin CDK version until upgrade for compatibility with the Concurrent CDK                      |
+| 0.3.1   | 2024-01-10 | [34084](https://github.com/airbytehq/airbyte/pull/34084)  | Fix bug for running check with document file format                                          |
+| 0.3.0   | 2023-12-14 | [33411](https://github.com/airbytehq/airbyte/pull/33411)  | Bump CDK version to auto-set primary key for document file streams and support raw txt files |
+| 0.2.5   | 2023-12-06 | [33187](https://github.com/airbytehq/airbyte/pull/33187) | Bump CDK version to hide source-defined primary key                                          |
+| 0.2.4   | 2023-11-16 | [32608](https://github.com/airbytehq/airbyte/pull/32608) | Improve document file type parser                                                            |
+| 0.2.3   | 2023-11-13 | [32357](https://github.com/airbytehq/airbyte/pull/32357) | Improve spec schema                                                                          |
+| 0.2.2   | 2023-10-30 | [31904](https://github.com/airbytehq/airbyte/pull/31904) | Update CDK to support document file types                                                    |
+| 0.2.1   | 2023-10-18 | [31543](https://github.com/airbytehq/airbyte/pull/31543) | Base image migration: remove Dockerfile and use the python-connector-base image              |
+| 0.2.0   | 2023-10-10 | https://github.com/airbytehq/airbyte/pull/31336          | Migrate to File-based CDK. Add support of CSV, Parquet and Avro files                        |
+| 0.1.0   | 2023-02-17 | https://github.com/airbytehq/airbyte/pull/23222          | Initial release with full-refresh and incremental sync with JSONL files                      |
\ No newline at end of file
diff --git a/docs/integrations/sources/gcs.md b/docs/integrations/sources/gcs.md
index 5c93e1366c16a..58e24a17dcc4a 100644
--- a/docs/integrations/sources/gcs.md
+++ b/docs/integrations/sources/gcs.md
@@ -148,6 +148,7 @@ Leaving this field blank (default option) will disallow escaping.
 
 | Version | Date       | Pull Request                                             | Subject                                             |
 |:--------|:-----------|:---------------------------------------------------------|:----------------------------------------------------|
+| 0.3.5   | 2024-01-30 | [34661](https://github.com/airbytehq/airbyte/pull/34661)  | Pin CDK version until upgrade for compatibility with the Concurrent CDK                      |
 | 0.3.4   | 2024-01-11 | [34158](https://github.com/airbytehq/airbyte/pull/34158) | Fix issue in stream reader for document file type parser |
 | 0.3.3   | 2023-12-06 | [33187](https://github.com/airbytehq/airbyte/pull/33187) | Bump CDK version to hide source-defined primary key |
 | 0.3.2   | 2023-11-16 | [32608](https://github.com/airbytehq/airbyte/pull/32608) | Improve document file type parser                   |
diff --git a/docs/integrations/sources/google-drive.md b/docs/integrations/sources/google-drive.md
index cc0a92099b4ef..ca98dfb3129e2 100644
--- a/docs/integrations/sources/google-drive.md
+++ b/docs/integrations/sources/google-drive.md
@@ -247,7 +247,8 @@ Before parsing each document, the connector exports Google Document files to Doc
 
 | Version | Date       | Pull Request                                              | Subject                                                      |
 |---------|------------|-----------------------------------------------------------|--------------------------------------------------------------|
-| 0.0.6 | 2023-12-16 | [33414](https://github.com/airbytehq/airbyte/pull/33414) | Prepare for airbyte-lib |
+| 0.0.7   | 2024-01-30 | [34661](https://github.com/airbytehq/airbyte/pull/34661)  | Pin CDK version until upgrade for compatibility with the Concurrent CDK                      |
+| 0.0.6   | 2023-12-16 | [33414](https://github.com/airbytehq/airbyte/pull/33414) | Prepare for airbyte-lib |
 | 0.0.5   | 2023-12-14 | [33411](https://github.com/airbytehq/airbyte/pull/33411)  | Bump CDK version to auto-set primary key for document file streams and support raw txt files          |
 | 0.0.4   | 2023-12-06 | [33187](https://github.com/airbytehq/airbyte/pull/33187)  | Bump CDK version to hide source-defined primary key          |
 | 0.0.3   | 2023-11-16 | [31458](https://github.com/airbytehq/airbyte/pull/31458)  | Improve folder id input and update document file type parser |
diff --git a/docs/integrations/sources/microsoft-onedrive.md b/docs/integrations/sources/microsoft-onedrive.md
index 6446c72bcb3bc..4697bce4734cb 100644
--- a/docs/integrations/sources/microsoft-onedrive.md
+++ b/docs/integrations/sources/microsoft-onedrive.md
@@ -121,6 +121,7 @@ The connector is restricted by normal Microsoft Graph [requests limitation](http
 
 | Version | Date       | Pull Request                                             | Subject                   |
 |:--------|:-----------|:---------------------------------------------------------|:--------------------------|
+| 0.1.4   | 2024-01-30 | [34661](https://github.com/airbytehq/airbyte/pull/34661)  | Pin CDK version until upgrade for compatibility with the Concurrent CDK                      |
 | 0.1.3   | 2024-01-24 | [34478](https://github.com/airbytehq/airbyte/pull/34478) | Fix OAuth                 |
 | 0.1.2   | 2021-12-22 | [33745](https://github.com/airbytehq/airbyte/pull/33745) | Add ql and sl to metadata |
 | 0.1.1   | 2021-12-15 | [33758](https://github.com/airbytehq/airbyte/pull/33758) | Fix for docs name         |

From 7f2fddf8f47de7cc5cb24a68fad7ceb9d0655f3a Mon Sep 17 00:00:00 2001
From: Marius Posta <marius@airbyte.io>
Date: Tue, 30 Jan 2024 10:55:11 -0800
Subject: [PATCH 31/96] Fix log4j-slf4j-impl version conflicts (#34669)

Co-authored-by: Edward Gao <edward.gao@airbyte.io>
---
 airbyte-cdk/java/airbyte-cdk/README.md | 1 +
 deps.toml                              | 5 +++--
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/airbyte-cdk/java/airbyte-cdk/README.md b/airbyte-cdk/java/airbyte-cdk/README.md
index 83d867eadf1e1..b8e2addd56a2b 100644
--- a/airbyte-cdk/java/airbyte-cdk/README.md
+++ b/airbyte-cdk/java/airbyte-cdk/README.md
@@ -166,6 +166,7 @@ MavenLocal debugging steps:
 
 | Version | Date       | Pull Request                                               | Subject                                                                                                                                                        |
 |:--------|:-----------|:-----------------------------------------------------------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| 0.16.3  | 2024-01-30 | [\#34669](https://github.com/airbytehq/airbyte/pull/34669) | Fix org.apache.logging.log4j:log4j-slf4j-impl version conflicts.                                                                                               |
 | 0.16.2  | 2024-01-29 | [\#34630](https://github.com/airbytehq/airbyte/pull/34630) | expose NamingTransformer to sub-classes in destinations JdbcSqlGenerator.                                                                                      |
 | 0.16.1  | 2024-01-29 | [\#34533](https://github.com/airbytehq/airbyte/pull/34533) | Add a safe method to execute DatabaseMetadata's Resultset returning queries.                                                                                   |
 | 0.16.0  | 2024-01-26 | [\#34573](https://github.com/airbytehq/airbyte/pull/34573) | Untangle Debezium harness dependencies.                                                                                                                        |
diff --git a/deps.toml b/deps.toml
index 7c1f15650f726..3ffa1193f4ace 100644
--- a/deps.toml
+++ b/deps.toml
@@ -81,7 +81,8 @@ kotlinx-cli-jvm = { module = "org.jetbrains.kotlinx:kotlinx-cli-jvm", version =
 launchdarkly = { module = "com.launchdarkly:launchdarkly-java-server-sdk", version = "6.0.1" }
 log4j-api = { module = "org.apache.logging.log4j:log4j-api", version.ref = "log4j" }
 log4j-core = { module = "org.apache.logging.log4j:log4j-core", version.ref = "log4j" }
-log4j-impl = { module = "org.apache.logging.log4j:log4j-slf4j2-impl", version.ref = "log4j" }
+log4j-slf4j2-impl = { module = "org.apache.logging.log4j:log4j-slf4j2-impl", version.ref = "log4j" }
+log4j-slf4j-impl = { module = "org.apache.logging.log4j:log4j-slf4j-impl", version.ref = "log4j" }
 log4j-over-slf4j = { module = "org.slf4j:log4j-over-slf4j", version.ref = "slf4j" }
 log4j-web = { module = "org.apache.logging.log4j:log4j-web", version.ref = "log4j" }
 lombok = { module = "org.projectlombok:lombok", version.ref = "lombok" }
@@ -117,7 +118,7 @@ apache = ["apache-commons", "apache-commons-lang"]
 datadog = ["datadog-trace-api", "datadog-trace-ot"]
 jackson = ["jackson-databind", "jackson-annotations", "jackson-dataformat", "jackson-datatype"]
 junit = ["junit-jupiter-api", "junit-jupiter-params", "mockito-junit-jupiter"]
-log4j = ["log4j-api", "log4j-core", "log4j-impl", "log4j-web"]
+log4j = ["log4j-api", "log4j-core", "log4j-slf4j-impl", "log4j-slf4j2-impl", "log4j-web"]
 slf4j = ["jul-to-slf4j", "jcl-over-slf4j", "log4j-over-slf4j"]
 temporal = ["temporal-sdk", "temporal-serviceclient"]
 

From c391e2ecf3481540339013e939a038a70a8ae2f2 Mon Sep 17 00:00:00 2001
From: "Aaron (\"AJ\") Steers" <aj@airbyte.io>
Date: Tue, 30 Jan 2024 11:06:43 -0800
Subject: [PATCH 32/96] Source Faker: Declare primary keys (#34644)

---
 airbyte-integrations/connectors/source-faker/Dockerfile     | 2 +-
 airbyte-integrations/connectors/source-faker/metadata.yaml  | 5 ++++-
 .../connectors/source-faker/source_faker/streams.py         | 6 +++---
 docs/integrations/sources/faker-migrations.md               | 5 +++++
 docs/integrations/sources/faker.md                          | 1 +
 5 files changed, 14 insertions(+), 5 deletions(-)

diff --git a/airbyte-integrations/connectors/source-faker/Dockerfile b/airbyte-integrations/connectors/source-faker/Dockerfile
index 9db110142dbc6..3e2d98e541690 100644
--- a/airbyte-integrations/connectors/source-faker/Dockerfile
+++ b/airbyte-integrations/connectors/source-faker/Dockerfile
@@ -34,5 +34,5 @@ COPY source_faker ./source_faker
 ENV AIRBYTE_ENTRYPOINT "python /airbyte/integration_code/main.py"
 ENTRYPOINT ["python", "/airbyte/integration_code/main.py"]
 
-LABEL io.airbyte.version=5.0.2
+LABEL io.airbyte.version=6.0.0
 LABEL io.airbyte.name=airbyte/source-faker
diff --git a/airbyte-integrations/connectors/source-faker/metadata.yaml b/airbyte-integrations/connectors/source-faker/metadata.yaml
index e228708b816ee..f91929582dc7c 100644
--- a/airbyte-integrations/connectors/source-faker/metadata.yaml
+++ b/airbyte-integrations/connectors/source-faker/metadata.yaml
@@ -7,7 +7,7 @@ data:
   connectorSubtype: api
   connectorType: source
   definitionId: dfd88b22-b603-4c3d-aad7-3701784586b1
-  dockerImageTag: 5.0.2
+  dockerImageTag: 6.0.0
   dockerRepository: airbyte/source-faker
   documentationUrl: https://docs.airbyte.com/integrations/sources/faker
   githubIssueLabel: source-faker
@@ -30,6 +30,9 @@ data:
           ID and products.year fields are changing to be integers instead of
           floats.
         upgradeDeadline: "2023-08-31"
+      6.0.0:
+        message: Declare 'id' columns as primary keys.
+        upgradeDeadline: "2024-04-01"
   resourceRequirements:
     jobSpecific:
       - jobType: sync
diff --git a/airbyte-integrations/connectors/source-faker/source_faker/streams.py b/airbyte-integrations/connectors/source-faker/source_faker/streams.py
index 002866ba7c54c..9b015e94851b5 100644
--- a/airbyte-integrations/connectors/source-faker/source_faker/streams.py
+++ b/airbyte-integrations/connectors/source-faker/source_faker/streams.py
@@ -15,7 +15,7 @@
 
 
 class Products(Stream, IncrementalMixin):
-    primary_key = None
+    primary_key = "id"
     cursor_field = "updated_at"
 
     def __init__(self, count: int, seed: int, parallelism: int, records_per_slice: int, always_updated: bool, **kwargs):
@@ -65,7 +65,7 @@ def read_records(self, **kwargs) -> Iterable[Mapping[str, Any]]:
 
 
 class Users(Stream, IncrementalMixin):
-    primary_key = None
+    primary_key = "id"
     cursor_field = "updated_at"
 
     def __init__(self, count: int, seed: int, parallelism: int, records_per_slice: int, always_updated: bool, **kwargs):
@@ -125,7 +125,7 @@ def read_records(self, **kwargs) -> Iterable[Mapping[str, Any]]:
 
 
 class Purchases(Stream, IncrementalMixin):
-    primary_key = None
+    primary_key = "id"
     cursor_field = "updated_at"
 
     def __init__(self, count: int, seed: int, parallelism: int, records_per_slice: int, always_updated: bool, **kwargs):
diff --git a/docs/integrations/sources/faker-migrations.md b/docs/integrations/sources/faker-migrations.md
index 46dc3247f93fc..7eac0a780b1f0 100644
--- a/docs/integrations/sources/faker-migrations.md
+++ b/docs/integrations/sources/faker-migrations.md
@@ -1,6 +1,11 @@
 # Sample Data (Faker) Migration Guide
 
+## Upgrading to 6.0.0
+
+All streams (`users`, `products`, and `purchases`) now properly declare `id` as their respective primary keys. Existing sync jobs should still work as expected but you may need to reset your sync and/or update write mode after upgrading to the latest connector version.
+
 ## Upgrading to 5.0.0
+
 Some columns are narrowing from `number` to `integer`. You may need to force normalization to rebuild your destination tables by manually dropping the SCD and final tables, refreshing the connection schema (skipping the reset), and running a sync. Alternatively, you can just run a reset.
 
 ## Upgrading to 4.0.0
diff --git a/docs/integrations/sources/faker.md b/docs/integrations/sources/faker.md
index 39a58897e1242..7dc02edaebbf4 100644
--- a/docs/integrations/sources/faker.md
+++ b/docs/integrations/sources/faker.md
@@ -101,6 +101,7 @@ None!
 
 | Version | Date       | Pull Request                                                                                                          | Subject                                                                                                         |
 | :------ | :--------- | :-------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------- |
+| 6.0.0   | 2024-01-30 | [34644](https://github.com/airbytehq/airbyte/pull/34644)                                                              | Declare 'id' columns as primary keys.                                                                                    |
 | 5.0.2   | 2024-01-17 | [34344](https://github.com/airbytehq/airbyte/pull/34344)                                                              | Ensure unique state messages                                                                                    |
 | 5.0.1   | 2023-01-08 | [34033](https://github.com/airbytehq/airbyte/pull/34033)                                                              | Add standard entrypoints for usage with AirbyteLib                                                              |
 | 5.0.0   | 2023-08-08 | [29213](https://github.com/airbytehq/airbyte/pull/29213)                                                              | Change all `*id` fields and `products.year` to be integer                                                       |

From d13b7c9e4bdc993d3c29ac220a283270fe7f939f Mon Sep 17 00:00:00 2001
From: Joe Bell <joseph.bell@airbyte.io>
Date: Tue, 30 Jan 2024 11:42:44 -0800
Subject: [PATCH 33/96] Destination Redshift - Bump CDK version to 0.16.3
 (#34680)

---
 .../destination-redshift/build.gradle         |   2 +-
 .../destination-redshift/metadata.yaml        |   2 +-
 docs/integrations/destinations/redshift.md    | 177 +++++++++---------
 3 files changed, 91 insertions(+), 90 deletions(-)

diff --git a/airbyte-integrations/connectors/destination-redshift/build.gradle b/airbyte-integrations/connectors/destination-redshift/build.gradle
index 857afce64bd39..ab30bd170f23e 100644
--- a/airbyte-integrations/connectors/destination-redshift/build.gradle
+++ b/airbyte-integrations/connectors/destination-redshift/build.gradle
@@ -4,7 +4,7 @@ plugins {
 }
 
 airbyteJavaConnector {
-    cdkVersionRequired = '0.16.1'
+    cdkVersionRequired = '0.16.3'
     features = ['db-destinations', 's3-destinations', 'typing-deduping']
     useLocalCdk = false
 }
diff --git a/airbyte-integrations/connectors/destination-redshift/metadata.yaml b/airbyte-integrations/connectors/destination-redshift/metadata.yaml
index ef63184d6de87..b43e36361d806 100644
--- a/airbyte-integrations/connectors/destination-redshift/metadata.yaml
+++ b/airbyte-integrations/connectors/destination-redshift/metadata.yaml
@@ -5,7 +5,7 @@ data:
   connectorSubtype: database
   connectorType: destination
   definitionId: f7a7d195-377f-cf5b-70a5-be6b819019dc
-  dockerImageTag: 2.1.4
+  dockerImageTag: 2.1.5
   dockerRepository: airbyte/destination-redshift
   documentationUrl: https://docs.airbyte.com/integrations/destinations/redshift
   githubIssueLabel: destination-redshift
diff --git a/docs/integrations/destinations/redshift.md b/docs/integrations/destinations/redshift.md
index b93377f3102ec..a90b4d3968a1b 100644
--- a/docs/integrations/destinations/redshift.md
+++ b/docs/integrations/destinations/redshift.md
@@ -235,91 +235,92 @@ Each stream will be output into its own raw table in Redshift. Each table will c
 
 ## Changelog
 
-| Version | Date       | Pull Request                                               | Subject                                                                                                                                                                                                          |
-|:--------|:-----------|:-----------------------------------------------------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| 2.1.4   | 2024-01-29 | [34634](https://github.com/airbytehq/airbyte/pull/34634)   | Use lowercase raw schema and table in T+D [CDK changes](https://github.com/airbytehq/airbyte/pull/34533)                                                                                                         |
-| 2.1.3   | 2024-01-26 | [34544](https://github.com/airbytehq/airbyte/pull/34544)   | Proper string-escaping in raw tables                                                                                                                                                                             |
-| 2.1.2   | 2024-01-24 | [34451](https://github.com/airbytehq/airbyte/pull/34451)   | Improve logging for unparseable input                                                                                                                                                                            |
-| 2.1.1   | 2024-01-24 | [34458](https://github.com/airbytehq/airbyte/pull/34458)   | Improve error reporting                                                                                                                                                                                          |
-| 2.1.0   | 2024-01-24 | [34467](https://github.com/airbytehq/airbyte/pull/34467)   | Upgrade CDK to 0.14.0                                                                                                                                                                                            |
-| 2.0.0   | 2024-01-23 | [\#34077](https://github.com/airbytehq/airbyte/pull/34077) | Destinations V2                                                                                                                                                                                                  |
-| 0.8.0   | 2024-01-18 | [\#34236](https://github.com/airbytehq/airbyte/pull/34236) | Upgrade CDK to 0.13.0                                                                                                                                                                                            |
-| 0.7.15  | 2024-01-11 | [\#34186](https://github.com/airbytehq/airbyte/pull/34186) | Update check method with svv_table_info permission check, fix bug where s3 staging files were not being deleted.                                                                                                 |
-| 0.7.14  | 2024-01-08 | [\#34014](https://github.com/airbytehq/airbyte/pull/34014) | Update order of options in spec                                                                                                                                                                                  |
-| 0.7.13  | 2024-01-05 | [\#33948](https://github.com/airbytehq/airbyte/pull/33948) | Fix NPE when prepare tables fail; Add case sensitive session for super; Bastion heartbeats added                                                                                                                 |
-| 0.7.12  | 2024-01-03 | [\#33924](https://github.com/airbytehq/airbyte/pull/33924) | Add new ap-southeast-3 AWS region                                                                                                                                                                                |
-| 0.7.11  | 2024-01-04 | [\#33730](https://github.com/airbytehq/airbyte/pull/33730) | Internal code structure changes                                                                                                                                                                                  |
-| 0.7.10  | 2024-01-04 | [\#33728](https://github.com/airbytehq/airbyte/pull/33728) | Allow users to disable final table creation                                                                                                                                                                      |
-| 0.7.9   | 2024-01-03 | [\#33877](https://github.com/airbytehq/airbyte/pull/33877) | Fix Jooq StackOverflowError                                                                                                                                                                                      |
-| 0.7.8   | 2023-12-28 | [\#33788](https://github.com/airbytehq/airbyte/pull/33788) | Thread-safe fix for file part names (s3 staging files)                                                                                                                                                           |
-| 0.7.7   | 2024-01-04 | [\#33728](https://github.com/airbytehq/airbyte/pull/33728) | Add option to only type and dedupe at the end of the sync                                                                                                                                                        |
-| 0.7.6   | 2023-12-20 | [\#33704](https://github.com/airbytehq/airbyte/pull/33704) | Only run T+D on a stream if it had any records during the sync                                                                                                                                                   |
-| 0.7.5   | 2023-12-18 | [\#33124](https://github.com/airbytehq/airbyte/pull/33124) | Make Schema Creation Separate from Table Creation                                                                                                                                                                |
-| 0.7.4   | 2023-12-13 | [\#33369](https://github.com/airbytehq/airbyte/pull/33369) | Use jdbc common sql implementation                                                                                                                                                                               |
-| 0.7.3   | 2023-12-12 | [\#33367](https://github.com/airbytehq/airbyte/pull/33367) | DV2: fix migration logic                                                                                                                                                                                         |
-| 0.7.2   | 2023-12-11 | [\#33335](https://github.com/airbytehq/airbyte/pull/33335) | DV2: improve data type mapping                                                                                                                                                                                   |
-| 0.7.1   | 2023-12-11 | [\#33307](https://github.com/airbytehq/airbyte/pull/33307) | ~DV2: improve data type mapping~ No changes                                                                                                                                                                      |
-| 0.7.0   | 2023-12-05 | [\#32326](https://github.com/airbytehq/airbyte/pull/32326) | Opt in beta for v2 destination                                                                                                                                                                                   |
-| 0.6.11  | 2023-11-29 | [\#32888](https://github.com/airbytehq/airbyte/pull/32888) | Use the new async framework.                                                                                                                                                                                     |
-| 0.6.10  | 2023-11-06 | [\#32193](https://github.com/airbytehq/airbyte/pull/32193) | Adopt java CDK version 0.4.1.                                                                                                                                                                                    |
-| 0.6.9   | 2023-10-10 | [\#31083](https://github.com/airbytehq/airbyte/pull/31083) | Fix precision of numeric values in async destinations                                                                                                                                                            |
-| 0.6.8   | 2023-10-10 | [\#31218](https://github.com/airbytehq/airbyte/pull/31218) | Clarify configuration groups                                                                                                                                                                                     |
-| 0.6.7   | 2023-10-06 | [\#31153](https://github.com/airbytehq/airbyte/pull/31153) | Increase jvm GC retries                                                                                                                                                                                          |
-| 0.6.6   | 2023-10-06 | [\#31129](https://github.com/airbytehq/airbyte/pull/31129) | Reduce async buffer size                                                                                                                                                                                         |
-| 0.6.5   | 2023-08-18 | [\#28619](https://github.com/airbytehq/airbyte/pull/29640) | Fix duplicate staging object names in concurrent environment (e.g. async)                                                                                                                                        |
-| 0.6.4   | 2023-08-10 | [\#28619](https://github.com/airbytehq/airbyte/pull/28619) | Use async method for staging                                                                                                                                                                                     |
-| 0.6.3   | 2023-08-07 | [\#29188](https://github.com/airbytehq/airbyte/pull/29188) | Internal code refactoring                                                                                                                                                                                        |
-| 0.6.2   | 2023-07-24 | [\#28618](https://github.com/airbytehq/airbyte/pull/28618) | Add hooks in preparation for destinations v2 implementation                                                                                                                                                      |
-| 0.6.1   | 2023-07-14 | [\#28345](https://github.com/airbytehq/airbyte/pull/28345) | Increment patch to trigger a rebuild                                                                                                                                                                             |
-| 0.6.0   | 2023-06-27 | [\#27993](https://github.com/airbytehq/airbyte/pull/27993) | destination-redshift will fail syncs if records or properties are too large, rather than silently skipping records and succeeding                                                                                |
-| 0.5.0   | 2023-06-27 | [\#27781](https://github.com/airbytehq/airbyte/pull/27781) | License Update: Elv2                                                                                                                                                                                             |
-| 0.4.9   | 2023-06-21 | [\#27555](https://github.com/airbytehq/airbyte/pull/27555) | Reduce image size                                                                                                                                                                                                |
-| 0.4.8   | 2023-05-17 | [\#26165](https://github.com/airbytehq/airbyte/pull/26165) | Internal code change for future development (install normalization packages inside connector)                                                                                                                    |
-| 0.4.7   | 2023-05-01 | [\#25698](https://github.com/airbytehq/airbyte/pull/25698) | Remove old VARCHAR to SUPER migration Java functionality                                                                                                                                                         |
-| 0.4.6   | 2023-04-27 | [\#25346](https://github.com/airbytehq/airbyte/pull/25346) | Internal code cleanup                                                                                                                                                                                            |
-| 0.4.5   | 2023-03-30 | [\#24736](https://github.com/airbytehq/airbyte/pull/24736) | Improve behavior when throttled by AWS API                                                                                                                                                                       |
-| 0.4.4   | 2023-03-29 | [\#24671](https://github.com/airbytehq/airbyte/pull/24671) | Fail faster in certain error cases                                                                                                                                                                               |
-| 0.4.3   | 2023-03-17 | [\#23788](https://github.com/airbytehq/airbyte/pull/23788) | S3-Parquet: added handler to process null values in arrays                                                                                                                                                       |
-| 0.4.2   | 2023-03-10 | [\#23931](https://github.com/airbytehq/airbyte/pull/23931) | Added support for periodic buffer flush                                                                                                                                                                          |
-| 0.4.1   | 2023-03-10 | [\#23466](https://github.com/airbytehq/airbyte/pull/23466) | Changed S3 Avro type from Int to Long                                                                                                                                                                            |
-| 0.4.0   | 2023-02-28 | [\#23523](https://github.com/airbytehq/airbyte/pull/23523) | Add SSH Bastion Host configuration options                                                                                                                                                                       |
-| 0.3.56  | 2023-01-26 | [\#21890](https://github.com/airbytehq/airbyte/pull/21890) | Fixed configurable parameter for number of file buffers                                                                                                                                                          |
-| 0.3.55  | 2023-01-26 | [\#20631](https://github.com/airbytehq/airbyte/pull/20631) | Added support for destination checkpointing with staging                                                                                                                                                         |
-| 0.3.54  | 2023-01-18 | [\#21087](https://github.com/airbytehq/airbyte/pull/21087) | Wrap Authentication Errors as Config Exceptions                                                                                                                                                                  |
-| 0.3.53  | 2023-01-03 | [\#17273](https://github.com/airbytehq/airbyte/pull/17273) | Flatten JSON arrays to fix maximum size check for SUPER field                                                                                                                                                    |
-| 0.3.52  | 2022-12-30 | [\#20879](https://github.com/airbytehq/airbyte/pull/20879) | Added configurable parameter for number of file buffers (⛔ this version has a bug and will not work; use `0.3.56` instead)                                                                                       |
-| 0.3.51  | 2022-10-26 | [\#18434](https://github.com/airbytehq/airbyte/pull/18434) | Fix empty S3 bucket path handling                                                                                                                                                                                |
-| 0.3.50  | 2022-09-14 | [\#15668](https://github.com/airbytehq/airbyte/pull/15668) | Wrap logs in AirbyteLogMessage                                                                                                                                                                                   |
-| 0.3.49  | 2022-09-01 | [\#16243](https://github.com/airbytehq/airbyte/pull/16243) | Fix Json to Avro conversion when there is field name clash from combined restrictions (`anyOf`, `oneOf`, `allOf` fields)                                                                                         |
-| 0.3.48  | 2022-09-01 |                                                            | Added JDBC URL params                                                                                                                                                                                            |
-| 0.3.47  | 2022-07-15 | [\#14494](https://github.com/airbytehq/airbyte/pull/14494) | Make S3 output filename configurable.                                                                                                                                                                            |
-| 0.3.46  | 2022-06-27 | [\#14190](https://github.com/airbytehq/airbyte/pull/13916) | Correctly cleanup S3 bucket when using a configured bucket path for S3 staging operations.                                                                                                                       |
-| 0.3.45  | 2022-06-25 | [\#13916](https://github.com/airbytehq/airbyte/pull/13916) | Use the configured bucket path for S3 staging operations.                                                                                                                                                        |
-| 0.3.44  | 2022-06-24 | [\#14114](https://github.com/airbytehq/airbyte/pull/14114) | Remove "additionalProperties": false from specs for connectors with staging                                                                                                                                      |
-| 0.3.43  | 2022-06-24 | [\#13690](https://github.com/airbytehq/airbyte/pull/13690) | Improved discovery for NOT SUPER column                                                                                                                                                                          |
-| 0.3.42  | 2022-06-21 | [\#14013](https://github.com/airbytehq/airbyte/pull/14013) | Add an option to use encryption with staging in Redshift Destination                                                                                                                                             |
-| 0.3.40  | 2022-06-17 | [\#13753](https://github.com/airbytehq/airbyte/pull/13753) | Deprecate and remove PART\*SIZE_MB fields from connectors based on StreamTransferManager                                                                                                                         |
-| 0.3.39  | 2022-06-02 | [\#13415](https://github.com/airbytehq/airbyte/pull/13415) | Add dropdown to select Uploading Method. <br /> **PLEASE NOTICE**: After this update your **uploading method** will be set to **Standard**, you will need to reconfigure the method to use **S3 Staging** again. |
-| 0.3.37  | 2022-05-23 | [\#13090](https://github.com/airbytehq/airbyte/pull/13090) | Removed redshiftDataTmpTableMode. Some refactoring.                                                                                                                                                              |
-| 0.3.36  | 2022-05-23 | [\#12820](https://github.com/airbytehq/airbyte/pull/12820) | Improved 'check' operation performance                                                                                                                                                                           |
-| 0.3.35  | 2022-05-18 | [\#12940](https://github.com/airbytehq/airbyte/pull/12940) | Fixed maximum record size for SUPER type                                                                                                                                                                         |
-| 0.3.34  | 2022-05-16 | [\#12869](https://github.com/airbytehq/airbyte/pull/12869) | Fixed NPE in S3 staging check                                                                                                                                                                                    |
-| 0.3.33  | 2022-05-04 | [\#12601](https://github.com/airbytehq/airbyte/pull/12601) | Apply buffering strategy for S3 staging                                                                                                                                                                          |
-| 0.3.32  | 2022-04-20 | [\#12085](https://github.com/airbytehq/airbyte/pull/12085) | Fixed bug with switching between INSERT and COPY config                                                                                                                                                          |
-| 0.3.31  | 2022-04-19 | [\#12064](https://github.com/airbytehq/airbyte/pull/12064) | Added option to support SUPER datatype in \_airbyte_raw\*\*\* table                                                                                                                                              |
-| 0.3.29  | 2022-04-05 | [\#11729](https://github.com/airbytehq/airbyte/pull/11729) | Fixed bug with dashes in schema name                                                                                                                                                                             |
-| 0.3.28  | 2022-03-18 | [\#11254](https://github.com/airbytehq/airbyte/pull/11254) | Fixed missing records during S3 staging                                                                                                                                                                          |
-| 0.3.27  | 2022-02-25 | [\#10421](https://github.com/airbytehq/airbyte/pull/10421) | Refactor JDBC parameters handling                                                                                                                                                                                |
-| 0.3.25  | 2022-02-14 | [\#9920](https://github.com/airbytehq/airbyte/pull/9920)   | Updated the size of staging files for S3 staging. Also, added closure of S3 writers to staging files when data has been written to an staging file.                                                              |
-| 0.3.24  | 2022-02-14 | [\#10256](https://github.com/airbytehq/airbyte/pull/10256) | Add `-XX:+ExitOnOutOfMemoryError` JVM option                                                                                                                                                                     |
-| 0.3.23  | 2021-12-16 | [\#8855](https://github.com/airbytehq/airbyte/pull/8855)   | Add `purgeStagingData` option to enable/disable deleting the staging data                                                                                                                                        |
-| 0.3.22  | 2021-12-15 | [\#8607](https://github.com/airbytehq/airbyte/pull/8607)   | Accept a path for the staging data                                                                                                                                                                               |
-| 0.3.21  | 2021-12-10 | [\#8562](https://github.com/airbytehq/airbyte/pull/8562)   | Moving classes around for better dependency management                                                                                                                                                           |
-| 0.3.20  | 2021-11-08 | [\#7719](https://github.com/airbytehq/airbyte/pull/7719)   | Improve handling of wide rows by buffering records based on their byte size rather than their count                                                                                                              |
-| 0.3.19  | 2021-10-21 | [\#7234](https://github.com/airbytehq/airbyte/pull/7234)   | Allow SSL traffic only                                                                                                                                                                                           |
-| 0.3.17  | 2021-10-12 | [\#6965](https://github.com/airbytehq/airbyte/pull/6965)   | Added SSL Support                                                                                                                                                                                                |
-| 0.3.16  | 2021-10-11 | [\#6949](https://github.com/airbytehq/airbyte/pull/6949)   | Each stream was split into files of 10,000 records each for copying using S3 or GCS                                                                                                                              |
-| 0.3.14  | 2021-10-08 | [\#5924](https://github.com/airbytehq/airbyte/pull/5924)   | Fixed AWS S3 Staging COPY is writing records from different table in the same raw table                                                                                                                          |
-| 0.3.13  | 2021-09-02 | [\#5745](https://github.com/airbytehq/airbyte/pull/5745)   | Disable STATUPDATE flag when using S3 staging to speed up performance                                                                                                                                            |
-| 0.3.12  | 2021-07-21 | [\#3555](https://github.com/airbytehq/airbyte/pull/3555)   | Enable partial checkpointing for halfway syncs                                                                                                                                                                   |
-| 0.3.11  | 2021-07-20 | [\#4874](https://github.com/airbytehq/airbyte/pull/4874)   | allow `additionalProperties` in connector spec                                                                                                                                                                   |
+| Version | Date       | Pull Request                                                | Subject                                                                                                                                                                                                          |
+|:--------|:-----------|:------------------------------------------------------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| 2.1.5   | 2024-01-30 | [\#34680](https://github.com/airbytehq/airbyte/pull/34680)  | Update to CDK version 0.16.3                                                                                                                                                                                     |
+| 2.1.4   | 2024-01-29 | [\#34634](https://github.com/airbytehq/airbyte/pull/34634)  | Use lowercase raw schema and table in T+D [CDK changes](https://github.com/airbytehq/airbyte/pull/34533)                                                                                                         |
+| 2.1.3   | 2024-01-26 | [\#34544](https://github.com/airbytehq/airbyte/pull/34544)  | Proper string-escaping in raw tables                                                                                                                                                                             |
+| 2.1.2   | 2024-01-24 | [\#34451](https://github.com/airbytehq/airbyte/pull/34451)  | Improve logging for unparseable input                                                                                                                                                                            |
+| 2.1.1   | 2024-01-24 | [\#34458](https://github.com/airbytehq/airbyte/pull/34458)  | Improve error reporting                                                                                                                                                                                          |
+| 2.1.0   | 2024-01-24 | [\#34467](https://github.com/airbytehq/airbyte/pull/34467)  | Upgrade CDK to 0.14.0                                                                                                                                                                                            |
+| 2.0.0   | 2024-01-23 | [\#34077](https://github.com/airbytehq/airbyte/pull/34077)  | Destinations V2                                                                                                                                                                                                  |
+| 0.8.0   | 2024-01-18 | [\#34236](https://github.com/airbytehq/airbyte/pull/34236)  | Upgrade CDK to 0.13.0                                                                                                                                                                                            |
+| 0.7.15  | 2024-01-11 | [\#34186](https://github.com/airbytehq/airbyte/pull/34186)  | Update check method with svv_table_info permission check, fix bug where s3 staging files were not being deleted.                                                                                                 |
+| 0.7.14  | 2024-01-08 | [\#34014](https://github.com/airbytehq/airbyte/pull/34014)  | Update order of options in spec                                                                                                                                                                                  |
+| 0.7.13  | 2024-01-05 | [\#33948](https://github.com/airbytehq/airbyte/pull/33948)  | Fix NPE when prepare tables fail; Add case sensitive session for super; Bastion heartbeats added                                                                                                                 |
+| 0.7.12  | 2024-01-03 | [\#33924](https://github.com/airbytehq/airbyte/pull/33924)  | Add new ap-southeast-3 AWS region                                                                                                                                                                                |
+| 0.7.11  | 2024-01-04 | [\#33730](https://github.com/airbytehq/airbyte/pull/33730)  | Internal code structure changes                                                                                                                                                                                  |
+| 0.7.10  | 2024-01-04 | [\#33728](https://github.com/airbytehq/airbyte/pull/33728)  | Allow users to disable final table creation                                                                                                                                                                      |
+| 0.7.9   | 2024-01-03 | [\#33877](https://github.com/airbytehq/airbyte/pull/33877)  | Fix Jooq StackOverflowError                                                                                                                                                                                      |
+| 0.7.8   | 2023-12-28 | [\#33788](https://github.com/airbytehq/airbyte/pull/33788)  | Thread-safe fix for file part names (s3 staging files)                                                                                                                                                           |
+| 0.7.7   | 2024-01-04 | [\#33728](https://github.com/airbytehq/airbyte/pull/33728)  | Add option to only type and dedupe at the end of the sync                                                                                                                                                        |
+| 0.7.6   | 2023-12-20 | [\#33704](https://github.com/airbytehq/airbyte/pull/33704)  | Only run T+D on a stream if it had any records during the sync                                                                                                                                                   |
+| 0.7.5   | 2023-12-18 | [\#33124](https://github.com/airbytehq/airbyte/pull/33124)  | Make Schema Creation Separate from Table Creation                                                                                                                                                                |
+| 0.7.4   | 2023-12-13 | [\#33369](https://github.com/airbytehq/airbyte/pull/33369)  | Use jdbc common sql implementation                                                                                                                                                                               |
+| 0.7.3   | 2023-12-12 | [\#33367](https://github.com/airbytehq/airbyte/pull/33367)  | DV2: fix migration logic                                                                                                                                                                                         |
+| 0.7.2   | 2023-12-11 | [\#33335](https://github.com/airbytehq/airbyte/pull/33335)  | DV2: improve data type mapping                                                                                                                                                                                   |
+| 0.7.1   | 2023-12-11 | [\#33307](https://github.com/airbytehq/airbyte/pull/33307)  | ~DV2: improve data type mapping~ No changes                                                                                                                                                                      |
+| 0.7.0   | 2023-12-05 | [\#32326](https://github.com/airbytehq/airbyte/pull/32326)  | Opt in beta for v2 destination                                                                                                                                                                                   |
+| 0.6.11  | 2023-11-29 | [\#32888](https://github.com/airbytehq/airbyte/pull/32888)  | Use the new async framework.                                                                                                                                                                                     |
+| 0.6.10  | 2023-11-06 | [\#32193](https://github.com/airbytehq/airbyte/pull/32193)  | Adopt java CDK version 0.4.1.                                                                                                                                                                                    |
+| 0.6.9   | 2023-10-10 | [\#31083](https://github.com/airbytehq/airbyte/pull/31083)  | Fix precision of numeric values in async destinations                                                                                                                                                            |
+| 0.6.8   | 2023-10-10 | [\#31218](https://github.com/airbytehq/airbyte/pull/31218)  | Clarify configuration groups                                                                                                                                                                                     |
+| 0.6.7   | 2023-10-06 | [\#31153](https://github.com/airbytehq/airbyte/pull/31153)  | Increase jvm GC retries                                                                                                                                                                                          |
+| 0.6.6   | 2023-10-06 | [\#31129](https://github.com/airbytehq/airbyte/pull/31129)  | Reduce async buffer size                                                                                                                                                                                         |
+| 0.6.5   | 2023-08-18 | [\#28619](https://github.com/airbytehq/airbyte/pull/29640)  | Fix duplicate staging object names in concurrent environment (e.g. async)                                                                                                                                        |
+| 0.6.4   | 2023-08-10 | [\#28619](https://github.com/airbytehq/airbyte/pull/28619)  | Use async method for staging                                                                                                                                                                                     |
+| 0.6.3   | 2023-08-07 | [\#29188](https://github.com/airbytehq/airbyte/pull/29188)  | Internal code refactoring                                                                                                                                                                                        |
+| 0.6.2   | 2023-07-24 | [\#28618](https://github.com/airbytehq/airbyte/pull/28618)  | Add hooks in preparation for destinations v2 implementation                                                                                                                                                      |
+| 0.6.1   | 2023-07-14 | [\#28345](https://github.com/airbytehq/airbyte/pull/28345)  | Increment patch to trigger a rebuild                                                                                                                                                                             |
+| 0.6.0   | 2023-06-27 | [\#27993](https://github.com/airbytehq/airbyte/pull/27993)  | destination-redshift will fail syncs if records or properties are too large, rather than silently skipping records and succeeding                                                                                |
+| 0.5.0   | 2023-06-27 | [\#27781](https://github.com/airbytehq/airbyte/pull/27781)  | License Update: Elv2                                                                                                                                                                                             |
+| 0.4.9   | 2023-06-21 | [\#27555](https://github.com/airbytehq/airbyte/pull/27555)  | Reduce image size                                                                                                                                                                                                |
+| 0.4.8   | 2023-05-17 | [\#26165](https://github.com/airbytehq/airbyte/pull/26165)  | Internal code change for future development (install normalization packages inside connector)                                                                                                                    |
+| 0.4.7   | 2023-05-01 | [\#25698](https://github.com/airbytehq/airbyte/pull/25698)  | Remove old VARCHAR to SUPER migration Java functionality                                                                                                                                                         |
+| 0.4.6   | 2023-04-27 | [\#25346](https://github.com/airbytehq/airbyte/pull/25346)  | Internal code cleanup                                                                                                                                                                                            |
+| 0.4.5   | 2023-03-30 | [\#24736](https://github.com/airbytehq/airbyte/pull/24736)  | Improve behavior when throttled by AWS API                                                                                                                                                                       |
+| 0.4.4   | 2023-03-29 | [\#24671](https://github.com/airbytehq/airbyte/pull/24671)  | Fail faster in certain error cases                                                                                                                                                                               |
+| 0.4.3   | 2023-03-17 | [\#23788](https://github.com/airbytehq/airbyte/pull/23788)  | S3-Parquet: added handler to process null values in arrays                                                                                                                                                       |
+| 0.4.2   | 2023-03-10 | [\#23931](https://github.com/airbytehq/airbyte/pull/23931)  | Added support for periodic buffer flush                                                                                                                                                                          |
+| 0.4.1   | 2023-03-10 | [\#23466](https://github.com/airbytehq/airbyte/pull/23466)  | Changed S3 Avro type from Int to Long                                                                                                                                                                            |
+| 0.4.0   | 2023-02-28 | [\#23523](https://github.com/airbytehq/airbyte/pull/23523)  | Add SSH Bastion Host configuration options                                                                                                                                                                       |
+| 0.3.56  | 2023-01-26 | [\#21890](https://github.com/airbytehq/airbyte/pull/21890)  | Fixed configurable parameter for number of file buffers                                                                                                                                                          |
+| 0.3.55  | 2023-01-26 | [\#20631](https://github.com/airbytehq/airbyte/pull/20631)  | Added support for destination checkpointing with staging                                                                                                                                                         |
+| 0.3.54  | 2023-01-18 | [\#21087](https://github.com/airbytehq/airbyte/pull/21087)  | Wrap Authentication Errors as Config Exceptions                                                                                                                                                                  |
+| 0.3.53  | 2023-01-03 | [\#17273](https://github.com/airbytehq/airbyte/pull/17273)  | Flatten JSON arrays to fix maximum size check for SUPER field                                                                                                                                                    |
+| 0.3.52  | 2022-12-30 | [\#20879](https://github.com/airbytehq/airbyte/pull/20879)  | Added configurable parameter for number of file buffers (⛔ this version has a bug and will not work; use `0.3.56` instead)                                                                                       |
+| 0.3.51  | 2022-10-26 | [\#18434](https://github.com/airbytehq/airbyte/pull/18434)  | Fix empty S3 bucket path handling                                                                                                                                                                                |
+| 0.3.50  | 2022-09-14 | [\#15668](https://github.com/airbytehq/airbyte/pull/15668)  | Wrap logs in AirbyteLogMessage                                                                                                                                                                                   |
+| 0.3.49  | 2022-09-01 | [\#16243](https://github.com/airbytehq/airbyte/pull/16243)  | Fix Json to Avro conversion when there is field name clash from combined restrictions (`anyOf`, `oneOf`, `allOf` fields)                                                                                         |
+| 0.3.48  | 2022-09-01 |                                                             | Added JDBC URL params                                                                                                                                                                                            |
+| 0.3.47  | 2022-07-15 | [\#14494](https://github.com/airbytehq/airbyte/pull/14494)  | Make S3 output filename configurable.                                                                                                                                                                            |
+| 0.3.46  | 2022-06-27 | [\#14190](https://github.com/airbytehq/airbyte/pull/13916)  | Correctly cleanup S3 bucket when using a configured bucket path for S3 staging operations.                                                                                                                       |
+| 0.3.45  | 2022-06-25 | [\#13916](https://github.com/airbytehq/airbyte/pull/13916)  | Use the configured bucket path for S3 staging operations.                                                                                                                                                        |
+| 0.3.44  | 2022-06-24 | [\#14114](https://github.com/airbytehq/airbyte/pull/14114)  | Remove "additionalProperties": false from specs for connectors with staging                                                                                                                                      |
+| 0.3.43  | 2022-06-24 | [\#13690](https://github.com/airbytehq/airbyte/pull/13690)  | Improved discovery for NOT SUPER column                                                                                                                                                                          |
+| 0.3.42  | 2022-06-21 | [\#14013](https://github.com/airbytehq/airbyte/pull/14013)  | Add an option to use encryption with staging in Redshift Destination                                                                                                                                             |
+| 0.3.40  | 2022-06-17 | [\#13753](https://github.com/airbytehq/airbyte/pull/13753)  | Deprecate and remove PART\*SIZE_MB fields from connectors based on StreamTransferManager                                                                                                                         |
+| 0.3.39  | 2022-06-02 | [\#13415](https://github.com/airbytehq/airbyte/pull/13415)  | Add dropdown to select Uploading Method. <br /> **PLEASE NOTICE**: After this update your **uploading method** will be set to **Standard**, you will need to reconfigure the method to use **S3 Staging** again. |
+| 0.3.37  | 2022-05-23 | [\#13090](https://github.com/airbytehq/airbyte/pull/13090)  | Removed redshiftDataTmpTableMode. Some refactoring.                                                                                                                                                              |
+| 0.3.36  | 2022-05-23 | [\#12820](https://github.com/airbytehq/airbyte/pull/12820)  | Improved 'check' operation performance                                                                                                                                                                           |
+| 0.3.35  | 2022-05-18 | [\#12940](https://github.com/airbytehq/airbyte/pull/12940)  | Fixed maximum record size for SUPER type                                                                                                                                                                         |
+| 0.3.34  | 2022-05-16 | [\#12869](https://github.com/airbytehq/airbyte/pull/12869)  | Fixed NPE in S3 staging check                                                                                                                                                                                    |
+| 0.3.33  | 2022-05-04 | [\#12601](https://github.com/airbytehq/airbyte/pull/12601)  | Apply buffering strategy for S3 staging                                                                                                                                                                          |
+| 0.3.32  | 2022-04-20 | [\#12085](https://github.com/airbytehq/airbyte/pull/12085)  | Fixed bug with switching between INSERT and COPY config                                                                                                                                                          |
+| 0.3.31  | 2022-04-19 | [\#12064](https://github.com/airbytehq/airbyte/pull/12064)  | Added option to support SUPER datatype in \_airbyte_raw\*\*\* table                                                                                                                                              |
+| 0.3.29  | 2022-04-05 | [\#11729](https://github.com/airbytehq/airbyte/pull/11729)  | Fixed bug with dashes in schema name                                                                                                                                                                             |
+| 0.3.28  | 2022-03-18 | [\#11254](https://github.com/airbytehq/airbyte/pull/11254)  | Fixed missing records during S3 staging                                                                                                                                                                          |
+| 0.3.27  | 2022-02-25 | [\#10421](https://github.com/airbytehq/airbyte/pull/10421)  | Refactor JDBC parameters handling                                                                                                                                                                                |
+| 0.3.25  | 2022-02-14 | [\#9920](https://github.com/airbytehq/airbyte/pull/9920)    | Updated the size of staging files for S3 staging. Also, added closure of S3 writers to staging files when data has been written to an staging file.                                                              |
+| 0.3.24  | 2022-02-14 | [\#10256](https://github.com/airbytehq/airbyte/pull/10256)  | Add `-XX:+ExitOnOutOfMemoryError` JVM option                                                                                                                                                                     |
+| 0.3.23  | 2021-12-16 | [\#8855](https://github.com/airbytehq/airbyte/pull/8855)    | Add `purgeStagingData` option to enable/disable deleting the staging data                                                                                                                                        |
+| 0.3.22  | 2021-12-15 | [\#8607](https://github.com/airbytehq/airbyte/pull/8607)    | Accept a path for the staging data                                                                                                                                                                               |
+| 0.3.21  | 2021-12-10 | [\#8562](https://github.com/airbytehq/airbyte/pull/8562)    | Moving classes around for better dependency management                                                                                                                                                           |
+| 0.3.20  | 2021-11-08 | [\#7719](https://github.com/airbytehq/airbyte/pull/7719)    | Improve handling of wide rows by buffering records based on their byte size rather than their count                                                                                                              |
+| 0.3.19  | 2021-10-21 | [\#7234](https://github.com/airbytehq/airbyte/pull/7234)    | Allow SSL traffic only                                                                                                                                                                                           |
+| 0.3.17  | 2021-10-12 | [\#6965](https://github.com/airbytehq/airbyte/pull/6965)    | Added SSL Support                                                                                                                                                                                                |
+| 0.3.16  | 2021-10-11 | [\#6949](https://github.com/airbytehq/airbyte/pull/6949)    | Each stream was split into files of 10,000 records each for copying using S3 or GCS                                                                                                                              |
+| 0.3.14  | 2021-10-08 | [\#5924](https://github.com/airbytehq/airbyte/pull/5924)    | Fixed AWS S3 Staging COPY is writing records from different table in the same raw table                                                                                                                          |
+| 0.3.13  | 2021-09-02 | [\#5745](https://github.com/airbytehq/airbyte/pull/5745)    | Disable STATUPDATE flag when using S3 staging to speed up performance                                                                                                                                            |
+| 0.3.12  | 2021-07-21 | [\#3555](https://github.com/airbytehq/airbyte/pull/3555)    | Enable partial checkpointing for halfway syncs                                                                                                                                                                   |
+| 0.3.11  | 2021-07-20 | [\#4874](https://github.com/airbytehq/airbyte/pull/4874)    | allow `additionalProperties` in connector spec                                                                                                                                                                   |

From 3bd0acd739b7127465dec96b5cac1dcefeb26489 Mon Sep 17 00:00:00 2001
From: Marcos Marx <marcosmarxm@users.noreply.github.com>
Date: Tue, 30 Jan 2024 19:43:34 -0300
Subject: [PATCH 34/96] Destination Teradata: make connector avaialble on
 Airbyte Cloud (#28667)

Co-authored-by: SatishChGit <satishchinthanippu@gmail.com>
Co-authored-by: evantahler <evan@airbyte.io>
---
 .../destination-teradata/metadata.yaml          |  5 ++---
 .../teradata/TeradataDestination.java           | 17 +++++++++++------
 .../teradata/TeradataSqlOperations.java         |  6 +++---
 .../TeradataDestinationAcceptanceTest.java      |  6 ++++++
 docs/integrations/destinations/teradata.md      | 16 +++++++++-------
 5 files changed, 31 insertions(+), 19 deletions(-)

diff --git a/airbyte-integrations/connectors/destination-teradata/metadata.yaml b/airbyte-integrations/connectors/destination-teradata/metadata.yaml
index 91738294ff4e3..de975748835f7 100644
--- a/airbyte-integrations/connectors/destination-teradata/metadata.yaml
+++ b/airbyte-integrations/connectors/destination-teradata/metadata.yaml
@@ -2,7 +2,7 @@ data:
   connectorSubtype: database
   connectorType: destination
   definitionId: 58e6f9da-904e-11ed-a1eb-0242ac120002
-  dockerImageTag: 0.1.3
+  dockerImageTag: 0.1.5
   dockerRepository: airbyte/destination-teradata
   githubIssueLabel: destination-teradata
   icon: teradata.svg
@@ -10,12 +10,11 @@ data:
   name: Teradata Vantage
   registries:
     cloud:
-      enabled: false
+      enabled: true
     oss:
       enabled: true
   releaseStage: alpha
   documentationUrl: https://docs.airbyte.com/integrations/destinations/teradata
-  supportsDbt: true
   tags:
     - language:java
   ab_internal:
diff --git a/airbyte-integrations/connectors/destination-teradata/src/main/java/io/airbyte/integrations/destination/teradata/TeradataDestination.java b/airbyte-integrations/connectors/destination-teradata/src/main/java/io/airbyte/integrations/destination/teradata/TeradataDestination.java
index 37fd84a973a66..55aa93c237b4b 100644
--- a/airbyte-integrations/connectors/destination-teradata/src/main/java/io/airbyte/integrations/destination/teradata/TeradataDestination.java
+++ b/airbyte-integrations/connectors/destination-teradata/src/main/java/io/airbyte/integrations/destination/teradata/TeradataDestination.java
@@ -49,6 +49,10 @@ public class TeradataDestination extends AbstractJdbcDestination implements Dest
 
   protected static final String CA_CERT_KEY = "ssl_ca_certificate";
 
+  protected static final String ENCRYPTDATA = "ENCRYPTDATA";
+
+  protected static final String ENCRYPTDATA_ON = "ON";
+
   public static void main(String[] args) throws Exception {
     new IntegrationRunner(new TeradataDestination()).run(args);
   }
@@ -57,6 +61,12 @@ public TeradataDestination() {
     super(DRIVER_CLASS, new StandardNameTransformer(), new TeradataSqlOperations());
   }
 
+  private static void createCertificateFile(String fileName, String fileValue) throws IOException {
+    try (final PrintWriter out = new PrintWriter(fileName, StandardCharsets.UTF_8)) {
+      out.print(fileValue);
+    }
+  }
+
   @Override
   protected Map<String, String> getDefaultConnectionProperties(final JsonNode config) {
     final Map<String, String> additionalParameters = new HashMap<>();
@@ -69,15 +79,10 @@ protected Map<String, String> getDefaultConnectionProperties(final JsonNode conf
         additionalParameters.put(PARAM_SSLMODE, REQUIRE);
       }
     }
+    additionalParameters.put(ENCRYPTDATA, ENCRYPTDATA_ON);
     return additionalParameters;
   }
 
-  private static void createCertificateFile(String fileName, String fileValue) throws IOException {
-    try (final PrintWriter out = new PrintWriter(fileName, StandardCharsets.UTF_8)) {
-      out.print(fileValue);
-    }
-  }
-
   private Map<String, String> obtainConnectionOptions(final JsonNode encryption) {
     final Map<String, String> additionalParameters = new HashMap<>();
     if (!encryption.isNull()) {
diff --git a/airbyte-integrations/connectors/destination-teradata/src/main/java/io/airbyte/integrations/destination/teradata/TeradataSqlOperations.java b/airbyte-integrations/connectors/destination-teradata/src/main/java/io/airbyte/integrations/destination/teradata/TeradataSqlOperations.java
index 85cf7dc27d53c..55522de02b66b 100644
--- a/airbyte-integrations/connectors/destination-teradata/src/main/java/io/airbyte/integrations/destination/teradata/TeradataSqlOperations.java
+++ b/airbyte-integrations/connectors/destination-teradata/src/main/java/io/airbyte/integrations/destination/teradata/TeradataSqlOperations.java
@@ -107,10 +107,10 @@ public void createTableIfNotExists(final JdbcDatabase database, final String sch
   @Override
   public String createTableQuery(final JdbcDatabase database, final String schemaName, final String tableName) {
     return String.format(
-        "CREATE SET TABLE %s.%s, FALLBACK ( \n" + "%s VARCHAR(256), \n" + "%s JSON, \n" + "%s TIMESTAMP(6) \n"
-            + ");\n",
+        "CREATE SET TABLE %s.%s, FALLBACK ( %s VARCHAR(256), %s JSON, %s TIMESTAMP(6)) " +
+            " UNIQUE PRIMARY INDEX (%s) ",
         schemaName, tableName, JavaBaseConstants.COLUMN_NAME_AB_ID, JavaBaseConstants.COLUMN_NAME_DATA,
-        JavaBaseConstants.COLUMN_NAME_EMITTED_AT);
+        JavaBaseConstants.COLUMN_NAME_EMITTED_AT, JavaBaseConstants.COLUMN_NAME_AB_ID);
   }
 
   @Override
diff --git a/airbyte-integrations/connectors/destination-teradata/src/test-integration/java/io/airbyte/integrations/destination/teradata/TeradataDestinationAcceptanceTest.java b/airbyte-integrations/connectors/destination-teradata/src/test-integration/java/io/airbyte/integrations/destination/teradata/TeradataDestinationAcceptanceTest.java
index c3fa9274ad986..ea6969b8c4400 100644
--- a/airbyte-integrations/connectors/destination-teradata/src/test-integration/java/io/airbyte/integrations/destination/teradata/TeradataDestinationAcceptanceTest.java
+++ b/airbyte-integrations/connectors/destination-teradata/src/test-integration/java/io/airbyte/integrations/destination/teradata/TeradataDestinationAcceptanceTest.java
@@ -179,6 +179,12 @@ public void testSecondSync() {
     // overrides test in coming releases
   }
 
+  @Override
+  @Test
+  public void testCustomDbtTransformations() throws Exception {
+    // overrides test in coming releases
+  }
+
   protected DataSource getDataSource(final JsonNode config) {
     final JsonNode jdbcConfig = destination.toJdbcConfig(config);
     return DataSourceFactory.create(jdbcConfig.get(JdbcUtils.USERNAME_KEY).asText(),
diff --git a/docs/integrations/destinations/teradata.md b/docs/integrations/destinations/teradata.md
index 74f2b89fd598b..8f6bfd22c0f2b 100644
--- a/docs/integrations/destinations/teradata.md
+++ b/docs/integrations/destinations/teradata.md
@@ -26,7 +26,7 @@ You'll need the following information to configure the Teradata destination:
 
 Each stream will be output into its own table in Teradata. Each table will contain 3 columns:
 
-- `_airbyte_ab_id`: a uuid assigned by Airbyte to each event that is processed. The column type in Teradata is `VARCHAR(256)`.
+- `_airbyte_ab_id`: a unique uuid assigned by Airbyte to each event that is processed. This is the primary index column. The column type in Teradata is `VARCHAR(256)`.
 - `_airbyte_emitted_at`: a timestamp representing when the event was pulled from the data source. The column type in Teradata is `TIMESTAMP(6)`.
 - `_airbyte_data`: a json blob representing with the event data. The column type in Teradata is `JSON`.
 
@@ -84,9 +84,11 @@ You can also use a pre-existing user but we highly recommend creating a dedicate
 
 ## CHANGELOG
 
-| Version | Date       | Pull Request                                    | Subject                          |
-| :------ | :--------- | :---------------------------------------------- | :------------------------------- |
-| 0.1.3   | 2023-08-17 | https://github.com/airbytehq/airbyte/pull/30740 | Enable custom DBT transformation |
-| 0.1.2   | 2023-08-09 | https://github.com/airbytehq/airbyte/pull/29174 | Small internal refactor          |
-| 0.1.1   | 2023-03-03 | https://github.com/airbytehq/airbyte/pull/21760 | Added SSL support                |
-| 0.1.0   | 2022-12-13 | https://github.com/airbytehq/airbyte/pull/20428 | New Destination Teradata Vantage |
+| Version | Date       | Pull Request                                    | Subject                                                 |
+|:--------|:-----------| :---------------------------------------------- |:--------------------------------------------------------|
+| 0.1.5   | 2024-01-12 | https://github.com/airbytehq/airbyte/pull/33872 | Added Primary Index on _airbyte_ab_id to fix NoPI issue |
+| 0.1.4   | 2023-12-04 | https://github.com/airbytehq/airbyte/pull/28667 | Make connector available on Airbyte Cloud               |
+| 0.1.3   | 2023-08-17 | https://github.com/airbytehq/airbyte/pull/30740 | Enable custom DBT transformation                        |
+| 0.1.2   | 2023-08-09 | https://github.com/airbytehq/airbyte/pull/29174 | Small internal refactor                                 |
+| 0.1.1   | 2023-03-03 | https://github.com/airbytehq/airbyte/pull/21760 | Added SSL support                                       |
+| 0.1.0   | 2022-12-13 | https://github.com/airbytehq/airbyte/pull/20428 | New Destination Teradata Vantage                        |
\ No newline at end of file

From 73cda9aca02fa5d51e23e3ccdbbe7c07b4744956 Mon Sep 17 00:00:00 2001
From: Rodi Reich Zilberman <867491+rodireich@users.noreply.github.com>
Date: Tue, 30 Jan 2024 15:58:57 -0800
Subject: [PATCH 35/96] Support resuming initial snapshot when id type is
 String, Int, Long (#34641)

---
 .../source-mongodb-v2/metadata.yaml           |  2 +-
 .../mongodb/InitialSnapshotHandler.java       | 13 +++-
 .../mongodb/InitialSnapshotHandlerTest.java   | 60 ++++++++++++++++++-
 docs/integrations/sources/mongodb-v2.md       |  3 +-
 4 files changed, 72 insertions(+), 6 deletions(-)

diff --git a/airbyte-integrations/connectors/source-mongodb-v2/metadata.yaml b/airbyte-integrations/connectors/source-mongodb-v2/metadata.yaml
index 0f4f93f719b80..469a031351f25 100644
--- a/airbyte-integrations/connectors/source-mongodb-v2/metadata.yaml
+++ b/airbyte-integrations/connectors/source-mongodb-v2/metadata.yaml
@@ -5,7 +5,7 @@ data:
   connectorSubtype: database
   connectorType: source
   definitionId: b2e713cd-cc36-4c0a-b5bd-b47cb8a0561e
-  dockerImageTag: 1.2.4
+  dockerImageTag: 1.2.5
   dockerRepository: airbyte/source-mongodb-v2
   documentationUrl: https://docs.airbyte.com/integrations/sources/mongodb-v2
   githubIssueLabel: source-mongodb-v2
diff --git a/airbyte-integrations/connectors/source-mongodb-v2/src/main/java/io/airbyte/integrations/source/mongodb/InitialSnapshotHandler.java b/airbyte-integrations/connectors/source-mongodb-v2/src/main/java/io/airbyte/integrations/source/mongodb/InitialSnapshotHandler.java
index 5d7d9ad725875..f9863945d8fd7 100644
--- a/airbyte-integrations/connectors/source-mongodb-v2/src/main/java/io/airbyte/integrations/source/mongodb/InitialSnapshotHandler.java
+++ b/airbyte-integrations/connectors/source-mongodb-v2/src/main/java/io/airbyte/integrations/source/mongodb/InitialSnapshotHandler.java
@@ -27,6 +27,10 @@
 import java.util.List;
 import java.util.Optional;
 import org.bson.BsonDocument;
+import org.bson.BsonInt32;
+import org.bson.BsonInt64;
+import org.bson.BsonObjectId;
+import org.bson.BsonString;
 import org.bson.Document;
 import org.bson.conversions.Bson;
 import org.bson.types.ObjectId;
@@ -86,8 +90,13 @@ public List<AutoCloseableIterator<AirbyteMessage>> getIterators(
           // "where _id > [last saved state] order by _id ASC".
           // If no state exists, it will create a query akin to "where 1=1 order by _id ASC"
           final Bson filter = existingState
-              // TODO add type support here when we add support for _id fields that are not ObjectId types
-              .map(state -> Filters.gt(MongoConstants.ID_FIELD, new ObjectId(state.id())))
+              .map(state -> Filters.gt(MongoConstants.ID_FIELD,
+                  switch (state.idType()) {
+            case STRING -> new BsonString(state.id());
+            case OBJECT_ID -> new BsonObjectId(new ObjectId(state.id()));
+            case INT -> new BsonInt32(Integer.parseInt(state.id()));
+            case LONG -> new BsonInt64(Long.parseLong(state.id()));
+          }))
               // if nothing was found, return a new BsonDocument
               .orElseGet(BsonDocument::new);
 
diff --git a/airbyte-integrations/connectors/source-mongodb-v2/src/test/java/io/airbyte/integrations/source/mongodb/InitialSnapshotHandlerTest.java b/airbyte-integrations/connectors/source-mongodb-v2/src/test/java/io/airbyte/integrations/source/mongodb/InitialSnapshotHandlerTest.java
index 919903c76575e..9ece697ec8fad 100644
--- a/airbyte-integrations/connectors/source-mongodb-v2/src/test/java/io/airbyte/integrations/source/mongodb/InitialSnapshotHandlerTest.java
+++ b/airbyte-integrations/connectors/source-mongodb-v2/src/test/java/io/airbyte/integrations/source/mongodb/InitialSnapshotHandlerTest.java
@@ -56,9 +56,11 @@ class InitialSnapshotHandlerTest {
   private static final String COLLECTION3 = "collection3";
 
   private static final String OBJECT_ID1_STRING = "64c0029d95ad260d69ef28a1";
+  private static final String OBJECT_ID2_STRING = "64c0029d95ad260d69ef28a2";
+  private static final String OBJECT_ID3_STRING = "64c0029d95ad260d69ef28a3";
   private static final ObjectId OBJECT_ID1 = new ObjectId(OBJECT_ID1_STRING);
-  private static final ObjectId OBJECT_ID2 = new ObjectId("64c0029d95ad260d69ef28a2");
-  private static final ObjectId OBJECT_ID3 = new ObjectId("64c0029d95ad260d69ef28a3");
+  private static final ObjectId OBJECT_ID2 = new ObjectId(OBJECT_ID2_STRING);
+  private static final ObjectId OBJECT_ID3 = new ObjectId(OBJECT_ID3_STRING);
   private static final ObjectId OBJECT_ID4 = new ObjectId("64c0029d95ad260d69ef28a4");
   private static final ObjectId OBJECT_ID5 = new ObjectId("64c0029d95ad260d69ef28a5");
   private static final ObjectId OBJECT_ID6 = new ObjectId("64c0029d95ad260d69ef28a6");
@@ -332,4 +334,58 @@ void testGetIteratorsWithOneEmptyCollection() {
     assertFalse(collection2.hasNext());
   }
 
+  @Test
+  void testGetIteratorsWithInitialStateNonDefaultIdType() {
+    insertDocuments(COLLECTION1, List.of(
+        new Document(Map.of(
+            CURSOR_FIELD, OBJECT_ID1_STRING,
+            NAME_FIELD, NAME1)),
+        new Document(Map.of(
+            CURSOR_FIELD, OBJECT_ID2_STRING,
+            NAME_FIELD, NAME2))));
+
+    insertDocuments(COLLECTION2, List.of(
+        new Document(Map.of(
+            CURSOR_FIELD, OBJECT_ID3_STRING,
+            NAME_FIELD, NAME3))));
+
+    final InitialSnapshotHandler initialSnapshotHandler = new InitialSnapshotHandler();
+    final MongoDbStateManager stateManager = mock(MongoDbStateManager.class);
+    when(stateManager.getStreamState(COLLECTION1, NAMESPACE))
+        .thenReturn(Optional.of(new MongoDbStreamState(OBJECT_ID1_STRING, null, IdType.STRING)));
+    final List<AutoCloseableIterator<AirbyteMessage>> iterators =
+        initialSnapshotHandler.getIterators(STREAMS, stateManager, mongoClient.getDatabase(DB_NAME), null, Instant.now(),
+            MongoConstants.CHECKPOINT_INTERVAL, true);
+
+    assertEquals(iterators.size(), 2, "Only two streams are configured as incremental, full refresh streams should be ignored");
+
+    final AutoCloseableIterator<AirbyteMessage> collection1 = iterators.get(0);
+    final AutoCloseableIterator<AirbyteMessage> collection2 = iterators.get(1);
+
+    // collection1, first document should be skipped
+    final AirbyteMessage collection1StreamMessage1 = collection1.next();
+    assertEquals(Type.RECORD, collection1StreamMessage1.getType());
+    assertEquals(COLLECTION1, collection1StreamMessage1.getRecord().getStream());
+    assertEquals(OBJECT_ID2.toString(), collection1StreamMessage1.getRecord().getData().get(CURSOR_FIELD).asText());
+    assertEquals(NAME2, collection1StreamMessage1.getRecord().getData().get(NAME_FIELD).asText());
+    assertConfiguredFieldsEqualsRecordDataFields(Set.of(CURSOR_FIELD, NAME_FIELD), collection1StreamMessage1.getRecord().getData());
+
+    final AirbyteMessage collection1SateMessage = collection1.next();
+    assertEquals(Type.STATE, collection1SateMessage.getType(), "State message is expected after all records in a stream are emitted");
+
+    assertFalse(collection1.hasNext());
+
+    // collection2, no documents should be skipped
+    final AirbyteMessage collection2StreamMessage1 = collection2.next();
+    assertEquals(Type.RECORD, collection2StreamMessage1.getType());
+    assertEquals(COLLECTION2, collection2StreamMessage1.getRecord().getStream());
+    assertEquals(OBJECT_ID3.toString(), collection2StreamMessage1.getRecord().getData().get(CURSOR_FIELD).asText());
+    assertConfiguredFieldsEqualsRecordDataFields(Set.of(CURSOR_FIELD), collection2StreamMessage1.getRecord().getData());
+
+    final AirbyteMessage collection2SateMessage = collection2.next();
+    assertEquals(Type.STATE, collection2SateMessage.getType(), "State message is expected after all records in a stream are emitted");
+
+    assertFalse(collection2.hasNext());
+  }
+
 }
diff --git a/docs/integrations/sources/mongodb-v2.md b/docs/integrations/sources/mongodb-v2.md
index cbffe3f8094c1..dfd5de71bb391 100644
--- a/docs/integrations/sources/mongodb-v2.md
+++ b/docs/integrations/sources/mongodb-v2.md
@@ -214,7 +214,8 @@ For more information regarding configuration parameters, please see [MongoDb Doc
 
 | Version | Date       | Pull Request                                             | Subject                                                                                                   |
 |:--------|:-----------|:---------------------------------------------------------|:----------------------------------------------------------------------------------------------------------|
-| 1.2.4 | 2024-01-26 | [34573](https://github.com/airbytehq/airbyte/pull/34573) | Adopt CDK v0.16.0. |
+| 1.2.5   | 2024-01-29 | [34573](https://github.com/airbytehq/airbyte/pull/34573) | Allow resuming an initial snapshot when Id type is not of default ObjectId .                              |
+| 1.2.4   | 2024-01-26 | [34573](https://github.com/airbytehq/airbyte/pull/34573) | Adopt CDK v0.16.0.                                                                                        |
 | 1.2.3   | 2024-01-18 | [34364](https://github.com/airbytehq/airbyte/pull/34364) | Add additional logging for resume token + reduce discovery size to 10.                                    |
 | 1.2.2   | 2024-01-16 | [34314](https://github.com/airbytehq/airbyte/pull/34314) | Reduce minimum document discovery size to 100.                                                            |
 | 1.2.1   | 2023-12-18 | [33549](https://github.com/airbytehq/airbyte/pull/33549) | Add logging to understand op log size.                                                                    |

From 1da8866d06897cd43d95dbb3ecf65fa4c8533a82 Mon Sep 17 00:00:00 2001
From: Joe Reuter <joe@airbyte.io>
Date: Wed, 31 Jan 2024 10:40:30 +0100
Subject: [PATCH 36/96] Publish to pypi batch4 (#34666)

---
 .../connectors/source-facebook-pages/metadata.yaml           | 4 ++++
 .../connectors/source-fastbill/metadata.yaml                 | 4 ++++
 airbyte-integrations/connectors/source-fauna/metadata.yaml   | 4 ++++
 airbyte-integrations/connectors/source-file/metadata.yaml    | 4 ++++
 .../source-firebase-realtime-database/metadata.yaml          | 4 ++++
 .../connectors/source-firebolt/metadata.yaml                 | 4 ++++
 .../connectors/source-flexport/metadata.yaml                 | 4 ++++
 .../connectors/source-freshcaller/metadata.yaml              | 4 ++++
 .../connectors/source-freshsales/metadata.yaml               | 4 ++++
 .../connectors/source-freshservice/metadata.yaml             | 4 ++++
 .../connectors/source-fullstory/metadata.yaml                | 4 ++++
 .../connectors/source-gainsight-px/metadata.yaml             | 4 ++++
 airbyte-integrations/connectors/source-gcs/metadata.yaml     | 5 +++++
 airbyte-integrations/connectors/source-genesys/metadata.yaml | 4 ++++
 airbyte-integrations/connectors/source-getlago/metadata.yaml | 4 ++++
 airbyte-integrations/connectors/source-github/metadata.yaml  | 4 ++++
 .../connectors/source-glassfrog/metadata.yaml                | 4 ++++
 airbyte-integrations/connectors/source-gnews/metadata.yaml   | 5 +++++
 .../connectors/source-gocardless/metadata.yaml               | 4 ++++
 airbyte-integrations/connectors/source-gong/metadata.yaml    | 4 ++++
 20 files changed, 82 insertions(+)

diff --git a/airbyte-integrations/connectors/source-facebook-pages/metadata.yaml b/airbyte-integrations/connectors/source-facebook-pages/metadata.yaml
index d8dd267fcc573..1101c253d8ce8 100644
--- a/airbyte-integrations/connectors/source-facebook-pages/metadata.yaml
+++ b/airbyte-integrations/connectors/source-facebook-pages/metadata.yaml
@@ -15,6 +15,10 @@ data:
   icon: facebook.svg
   license: ELv2
   name: Facebook Pages
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-facebook-pages
   registries:
     cloud:
       enabled: false # hide from cloud until https://github.com/airbytehq/airbyte/issues/25515 is finished
diff --git a/airbyte-integrations/connectors/source-fastbill/metadata.yaml b/airbyte-integrations/connectors/source-fastbill/metadata.yaml
index 9a6e795f561db..faf0afa338098 100644
--- a/airbyte-integrations/connectors/source-fastbill/metadata.yaml
+++ b/airbyte-integrations/connectors/source-fastbill/metadata.yaml
@@ -2,6 +2,10 @@ data:
   allowedHosts:
     hosts:
       - "*"
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-fastbill
   registries:
     cloud:
       enabled: false
diff --git a/airbyte-integrations/connectors/source-fauna/metadata.yaml b/airbyte-integrations/connectors/source-fauna/metadata.yaml
index 602dccd287e41..cf36ff0c13ece 100644
--- a/airbyte-integrations/connectors/source-fauna/metadata.yaml
+++ b/airbyte-integrations/connectors/source-fauna/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: fauna.svg
   license: MIT
   name: Fauna
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-fauna
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-file/metadata.yaml b/airbyte-integrations/connectors/source-file/metadata.yaml
index a2c748e050d3f..6d1fc12f20f1c 100644
--- a/airbyte-integrations/connectors/source-file/metadata.yaml
+++ b/airbyte-integrations/connectors/source-file/metadata.yaml
@@ -17,6 +17,10 @@ data:
   icon: file.svg
   license: MIT
   name: File (CSV, JSON, Excel, Feather, Parquet)
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-file
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-firebase-realtime-database/metadata.yaml b/airbyte-integrations/connectors/source-firebase-realtime-database/metadata.yaml
index abd8e66c3414a..3d694aa9f2f3d 100644
--- a/airbyte-integrations/connectors/source-firebase-realtime-database/metadata.yaml
+++ b/airbyte-integrations/connectors/source-firebase-realtime-database/metadata.yaml
@@ -10,6 +10,10 @@ data:
   githubIssueLabel: source-firebase-realtime-database
   license: MIT
   name: Firebase Realtime Database
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-firebase-realtime-database
   registries:
     cloud:
       enabled: false
diff --git a/airbyte-integrations/connectors/source-firebolt/metadata.yaml b/airbyte-integrations/connectors/source-firebolt/metadata.yaml
index d56f04699b78a..824d857b5d7e3 100644
--- a/airbyte-integrations/connectors/source-firebolt/metadata.yaml
+++ b/airbyte-integrations/connectors/source-firebolt/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: firebolt.svg
   license: MIT
   name: Firebolt
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-firebolt
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-flexport/metadata.yaml b/airbyte-integrations/connectors/source-flexport/metadata.yaml
index deb99f7ca238b..88b125bacb237 100644
--- a/airbyte-integrations/connectors/source-flexport/metadata.yaml
+++ b/airbyte-integrations/connectors/source-flexport/metadata.yaml
@@ -3,6 +3,10 @@ data:
     hosts:
       - api.flexport.com
       - flexport.com
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-flexport
   registries:
     oss:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-freshcaller/metadata.yaml b/airbyte-integrations/connectors/source-freshcaller/metadata.yaml
index ac2d4fb292611..15eaf3b06ea1c 100644
--- a/airbyte-integrations/connectors/source-freshcaller/metadata.yaml
+++ b/airbyte-integrations/connectors/source-freshcaller/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: freshcaller.svg
   license: MIT
   name: Freshcaller
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-freshcaller
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-freshsales/metadata.yaml b/airbyte-integrations/connectors/source-freshsales/metadata.yaml
index afb486eb0a956..5abeea00cab76 100644
--- a/airbyte-integrations/connectors/source-freshsales/metadata.yaml
+++ b/airbyte-integrations/connectors/source-freshsales/metadata.yaml
@@ -20,6 +20,10 @@ data:
   icon: freshsales.svg
   license: MIT
   name: Freshsales
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-freshsales
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-freshservice/metadata.yaml b/airbyte-integrations/connectors/source-freshservice/metadata.yaml
index 43c5dd48d13f5..7c2055f9a0dda 100644
--- a/airbyte-integrations/connectors/source-freshservice/metadata.yaml
+++ b/airbyte-integrations/connectors/source-freshservice/metadata.yaml
@@ -2,6 +2,10 @@ data:
   allowedHosts:
     hosts:
       - ${domain_name}/api/v2
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-freshservice
   registries:
     oss:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-fullstory/metadata.yaml b/airbyte-integrations/connectors/source-fullstory/metadata.yaml
index a645935c33eb1..c2083f3631c8c 100644
--- a/airbyte-integrations/connectors/source-fullstory/metadata.yaml
+++ b/airbyte-integrations/connectors/source-fullstory/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: fullstory.svg
   license: MIT
   name: Fullstory
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-fullstory
   registries:
     cloud:
       enabled: false
diff --git a/airbyte-integrations/connectors/source-gainsight-px/metadata.yaml b/airbyte-integrations/connectors/source-gainsight-px/metadata.yaml
index 2d340cc0adafd..0a65633f7dccd 100644
--- a/airbyte-integrations/connectors/source-gainsight-px/metadata.yaml
+++ b/airbyte-integrations/connectors/source-gainsight-px/metadata.yaml
@@ -2,6 +2,10 @@ data:
   allowedHosts:
     hosts:
       - api.aptrinsic.com/v1
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-gainsight-px
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-gcs/metadata.yaml b/airbyte-integrations/connectors/source-gcs/metadata.yaml
index b303f6085b7a3..d707202aa035d 100644
--- a/airbyte-integrations/connectors/source-gcs/metadata.yaml
+++ b/airbyte-integrations/connectors/source-gcs/metadata.yaml
@@ -14,6 +14,11 @@ data:
   icon: gcs.svg
   license: ELv2
   name: GCS
+  remoteRegistries:
+    pypi:
+      enabled: false
+      # TODO: Set enabled=true after `airbyte-lib-validate-source` is passing.
+      packageName: airbyte-source-gcs
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-genesys/metadata.yaml b/airbyte-integrations/connectors/source-genesys/metadata.yaml
index f6522beea79e4..0bad42c982d3c 100644
--- a/airbyte-integrations/connectors/source-genesys/metadata.yaml
+++ b/airbyte-integrations/connectors/source-genesys/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: genesys.svg
   license: MIT
   name: Genesys
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-genesys
   registries:
     cloud:
       enabled: false
diff --git a/airbyte-integrations/connectors/source-getlago/metadata.yaml b/airbyte-integrations/connectors/source-getlago/metadata.yaml
index 70779de3b0169..de14460248c02 100644
--- a/airbyte-integrations/connectors/source-getlago/metadata.yaml
+++ b/airbyte-integrations/connectors/source-getlago/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: getlago.svg
   license: MIT
   name: Lago
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-getlago
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-github/metadata.yaml b/airbyte-integrations/connectors/source-github/metadata.yaml
index 91e3e7878d7d7..0c9904bf27e8b 100644
--- a/airbyte-integrations/connectors/source-github/metadata.yaml
+++ b/airbyte-integrations/connectors/source-github/metadata.yaml
@@ -18,6 +18,10 @@ data:
   license: MIT
   maxSecondsBetweenMessages: 5400
   name: GitHub
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-github
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-glassfrog/metadata.yaml b/airbyte-integrations/connectors/source-glassfrog/metadata.yaml
index b75ae80dbeb8a..edf2c6a6fba6a 100644
--- a/airbyte-integrations/connectors/source-glassfrog/metadata.yaml
+++ b/airbyte-integrations/connectors/source-glassfrog/metadata.yaml
@@ -2,6 +2,10 @@ data:
   allowedHosts:
     hosts:
       - api.glassfrog.com
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-glassfrog
   registries:
     oss:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-gnews/metadata.yaml b/airbyte-integrations/connectors/source-gnews/metadata.yaml
index 0f8a7ba6b189d..3c2eb68602d90 100644
--- a/airbyte-integrations/connectors/source-gnews/metadata.yaml
+++ b/airbyte-integrations/connectors/source-gnews/metadata.yaml
@@ -8,6 +8,11 @@ data:
   icon: gnews.svg
   license: MIT
   name: GNews
+  remoteRegistries:
+    pypi:
+      enabled: false
+      # TODO: Set enabled=true after `airbyte-lib-validate-source` is passing.
+      packageName: airbyte-source-gnews
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-gocardless/metadata.yaml b/airbyte-integrations/connectors/source-gocardless/metadata.yaml
index d49af139e5755..3d8b577d174a9 100644
--- a/airbyte-integrations/connectors/source-gocardless/metadata.yaml
+++ b/airbyte-integrations/connectors/source-gocardless/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: gocardless.svg
   license: MIT
   name: GoCardless
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-gocardless
   registries:
     cloud:
       enabled: false
diff --git a/airbyte-integrations/connectors/source-gong/metadata.yaml b/airbyte-integrations/connectors/source-gong/metadata.yaml
index 08864fcb31901..42fb73e25f102 100644
--- a/airbyte-integrations/connectors/source-gong/metadata.yaml
+++ b/airbyte-integrations/connectors/source-gong/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: gong.svg
   license: MIT
   name: Gong
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-gong
   registries:
     cloud:
       enabled: false

From b8a806d3f8e9b44aaf64692be5299d9ecbc05292 Mon Sep 17 00:00:00 2001
From: Joe Reuter <joe@airbyte.io>
Date: Wed, 31 Jan 2024 12:08:50 +0100
Subject: [PATCH 37/96] airbyte-ci: Test pypi published properly (#34689)

---
 .github/actions/run-airbyte-ci/action.yml     |  5 +---
 airbyte-ci/connectors/pipelines/README.md     |  4 +++-
 .../airbyte_ci/connectors/publish/commands.py | 13 +++++++++--
 .../airbyte_ci/connectors/publish/context.py  |  4 +++-
 .../airbyte_ci/connectors/publish/pipeline.py |  2 +-
 .../airbyte_ci/poetry/publish/commands.py     |  3 ++-
 .../connectors/pipelines/pipelines/consts.py  |  1 +
 .../pipelines/pipelines/helpers/pip.py        | 20 ++++++----------
 .../contexts/python_registry_publish.py       |  3 +++
 .../connectors/pipelines/pyproject.toml       |  2 +-
 .../pipelines/tests/test_helpers/test_pip.py  | 23 +++++++++++++++++++
 .../tests/test_poetry/test_poetry_publish.py  |  1 +
 12 files changed, 57 insertions(+), 24 deletions(-)
 create mode 100644 airbyte-ci/connectors/pipelines/tests/test_helpers/test_pip.py

diff --git a/.github/actions/run-airbyte-ci/action.yml b/.github/actions/run-airbyte-ci/action.yml
index 753c041727e71..87d8b6c8f7878 100644
--- a/.github/actions/run-airbyte-ci/action.yml
+++ b/.github/actions/run-airbyte-ci/action.yml
@@ -79,10 +79,6 @@ inputs:
   python_registry_token:
     description: "Python registry API token to publish python package"
     required: false
-  python_registry_url:
-    description: "Python registry URL to publish python package"
-    default: "https://upload.pypi.org/legacy/"
-    required: false
 
 runs:
   using: "composite"
@@ -140,6 +136,7 @@ runs:
         PULL_REQUEST_NUMBER: ${{ github.event.pull_request.number }}
         PYTHON_REGISTRY_TOKEN: ${{ inputs.python_registry_token }}
         PYTHON_REGISTRY_URL: ${{ inputs.python_registry_url }}
+        PYTHON_REGISTRY_CHECK_URL: ${{ inputs.python_registry_check_url }}
         S3_BUILD_CACHE_ACCESS_KEY_ID: ${{ inputs.s3_build_cache_access_key_id }}
         S3_BUILD_CACHE_SECRET_KEY: ${{ inputs.s3_build_cache_secret_key }}
         SENTRY_DSN: ${{ inputs.sentry_dsn }}
diff --git a/airbyte-ci/connectors/pipelines/README.md b/airbyte-ci/connectors/pipelines/README.md
index 3e8ccd0745800..20490091b5202 100644
--- a/airbyte-ci/connectors/pipelines/README.md
+++ b/airbyte-ci/connectors/pipelines/README.md
@@ -397,6 +397,7 @@ Publish all connectors modified in the head commit: `airbyte-ci connectors --mod
 | `--ci-requirements`                  | False    |                                 |                                    | Output the CI requirements as a JSON payload. It is used to determine the CI runner to use.                                                                                               |
 | `--python-registry-token`            | False    |                                 | `PYTHON_REGISTRY_TOKEN`            | The API token to authenticate with the registry. For pypi, the `pypi-` prefix needs to be specified      |
 | `--python-registry-url`              | False    | https://upload.pypi.org/legacy/ | `PYTHON_REGISTRY_URL`              | The python registry to publish to. Defaults to main pypi                                                 |
+| `--python-registry-check-url`        | False    | https://pypi.org/pypi           | `PYTHON_REGISTRY_CHECK_URL`        | The python registry url to check whether a package is published already                                                 |
 
 
 I've added an empty "Default" column, and you can fill in the default values as needed.
@@ -421,7 +422,7 @@ flowchart TD
 
 If `remoteRegistries.pypi.enabled` in the connector metadata is set to `true`, the connector will be published to the python registry.
 To do so, the `--python-registry-token` and `--python-registry-url` options are used to authenticate with the registry and publish the connector.
-If the current version of the connector is already published to the registry, the publish will be skipped.
+If the current version of the connector is already published to the registry, the publish will be skipped (the `--python-registry-check-url` is used for the check).
 
 On a pre-release, the connector will be published as a `.dev<N>` version.
 
@@ -609,6 +610,7 @@ E.G.: running `pytest` on a specific test folder:
 
 | Version | PR                                                         | Description                                                                                                                |
 | ------- | ---------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- |
+| 3.10.0  | [#34606](https://github.com/airbytehq/airbyte/pull/34606)  | Allow configuration of separate check URL to check whether package exists already.                                         |
 | 3.9.0   | [#34606](https://github.com/airbytehq/airbyte/pull/34606)  | Allow configuration of python registry URL via environment variable.                                                       |
 | 3.8.1   | [#34607](https://github.com/airbytehq/airbyte/pull/34607)  | Improve gradle dependency cache volume protection.                                                                         |
 | 3.8.0   | [#34316](https://github.com/airbytehq/airbyte/pull/34316)  | Expose Dagger engine image name in `--ci-requirements` and add `--ci-requirements` to the `airbyte-ci` root command group. |
diff --git a/airbyte-ci/connectors/pipelines/pipelines/airbyte_ci/connectors/publish/commands.py b/airbyte-ci/connectors/pipelines/pipelines/airbyte_ci/connectors/publish/commands.py
index c5fbfc4144866..fc34936e248bf 100644
--- a/airbyte-ci/connectors/pipelines/pipelines/airbyte_ci/connectors/publish/commands.py
+++ b/airbyte-ci/connectors/pipelines/pipelines/airbyte_ci/connectors/publish/commands.py
@@ -11,7 +11,7 @@
 from pipelines.cli.click_decorators import click_ci_requirements_option
 from pipelines.cli.confirm_prompt import confirm
 from pipelines.cli.dagger_pipeline_command import DaggerPipelineCommand
-from pipelines.consts import DEFAULT_PYTHON_PACKAGE_REGISTRY_URL, ContextState
+from pipelines.consts import DEFAULT_PYTHON_PACKAGE_REGISTRY_CHECK_URL, DEFAULT_PYTHON_PACKAGE_REGISTRY_URL, ContextState
 from pipelines.helpers.utils import fail_if_missing_docker_hub_creds
 
 
@@ -67,11 +67,18 @@
 )
 @click.option(
     "--python-registry-url",
-    help="Which python registry registry to publish to. If not set, the default pypi is used. For test pypi, use https://test.pypi.org/legacy/",
+    help="Which python registry url to publish to. If not set, the default pypi is used. For test pypi, use https://test.pypi.org/legacy/",
     type=click.STRING,
     default=DEFAULT_PYTHON_PACKAGE_REGISTRY_URL,
     envvar="PYTHON_REGISTRY_URL",
 )
+@click.option(
+    "--python-registry-check-url",
+    help="Which url to check whether a certain version is published already. If not set, the default pypi is used. For test pypi, use https://test.pypi.org/pypi/",
+    type=click.STRING,
+    default=DEFAULT_PYTHON_PACKAGE_REGISTRY_CHECK_URL,
+    envvar="PYTHON_REGISTRY_CHECK_URL",
+)
 @click.pass_context
 async def publish(
     ctx: click.Context,
@@ -84,6 +91,7 @@ async def publish(
     slack_channel: str,
     python_registry_token: str,
     python_registry_url: str,
+    python_registry_check_url: str,
 ) -> bool:
     ctx.obj["spec_cache_gcs_credentials"] = spec_cache_gcs_credentials
     ctx.obj["spec_cache_bucket_name"] = spec_cache_bucket_name
@@ -126,6 +134,7 @@ async def publish(
                 use_local_cdk=ctx.obj.get("use_local_cdk"),
                 python_registry_token=python_registry_token,
                 python_registry_url=python_registry_url,
+                python_registry_check_url=python_registry_check_url,
             )
             for connector in ctx.obj["selected_connectors_with_modified_files"]
         ]
diff --git a/airbyte-ci/connectors/pipelines/pipelines/airbyte_ci/connectors/publish/context.py b/airbyte-ci/connectors/pipelines/pipelines/airbyte_ci/connectors/publish/context.py
index 55136809d8cee..a497629daec1a 100644
--- a/airbyte-ci/connectors/pipelines/pipelines/airbyte_ci/connectors/publish/context.py
+++ b/airbyte-ci/connectors/pipelines/pipelines/airbyte_ci/connectors/publish/context.py
@@ -37,6 +37,8 @@ def __init__(
         is_local: bool,
         git_branch: str,
         git_revision: str,
+        python_registry_url: str,
+        python_registry_check_url: str,
         gha_workflow_run_url: Optional[str] = None,
         dagger_logs_url: Optional[str] = None,
         pipeline_start_timestamp: Optional[int] = None,
@@ -47,7 +49,6 @@ def __init__(
         s3_build_cache_secret_key: Optional[str] = None,
         use_local_cdk: bool = False,
         python_registry_token: Optional[str] = None,
-        python_registry_url: Optional[str] = None,
     ) -> None:
         self.pre_release = pre_release
         self.spec_cache_bucket_name = spec_cache_bucket_name
@@ -56,6 +57,7 @@ def __init__(
         self.metadata_service_gcs_credentials = sanitize_gcs_credentials(metadata_service_gcs_credentials)
         self.python_registry_token = python_registry_token
         self.python_registry_url = python_registry_url
+        self.python_registry_check_url = python_registry_check_url
         pipeline_name = f"Publish {connector.technical_name}"
         pipeline_name = pipeline_name + " (pre-release)" if pre_release else pipeline_name
 
diff --git a/airbyte-ci/connectors/pipelines/pipelines/airbyte_ci/connectors/publish/pipeline.py b/airbyte-ci/connectors/pipelines/pipelines/airbyte_ci/connectors/publish/pipeline.py
index ac7514439cb0c..35f1a961d09ef 100644
--- a/airbyte-ci/connectors/pipelines/pipelines/airbyte_ci/connectors/publish/pipeline.py
+++ b/airbyte-ci/connectors/pipelines/pipelines/airbyte_ci/connectors/publish/pipeline.py
@@ -60,7 +60,7 @@ class CheckPythonRegistryPackageDoesNotExist(Step):
 
     async def _run(self) -> StepResult:
         is_published = is_package_published(
-            self.context.package_metadata.name, self.context.package_metadata.version, self.context.registry
+            self.context.package_metadata.name, self.context.package_metadata.version, self.context.registry_check_url
         )
         if is_published:
             return StepResult(
diff --git a/airbyte-ci/connectors/pipelines/pipelines/airbyte_ci/poetry/publish/commands.py b/airbyte-ci/connectors/pipelines/pipelines/airbyte_ci/poetry/publish/commands.py
index 16bded0b0c340..0eac52947bf13 100644
--- a/airbyte-ci/connectors/pipelines/pipelines/airbyte_ci/poetry/publish/commands.py
+++ b/airbyte-ci/connectors/pipelines/pipelines/airbyte_ci/poetry/publish/commands.py
@@ -14,7 +14,7 @@
 from pipelines.airbyte_ci.steps.python_registry import PublishToPythonRegistry
 from pipelines.cli.confirm_prompt import confirm
 from pipelines.cli.dagger_pipeline_command import DaggerPipelineCommand
-from pipelines.consts import DEFAULT_PYTHON_PACKAGE_REGISTRY_URL
+from pipelines.consts import DEFAULT_PYTHON_PACKAGE_REGISTRY_CHECK_URL, DEFAULT_PYTHON_PACKAGE_REGISTRY_URL
 from pipelines.models.contexts.click_pipeline_context import ClickPipelineContext, pass_pipeline_context
 from pipelines.models.contexts.python_registry_publish import PythonRegistryPublishContext
 from pipelines.models.steps import StepStatus
@@ -87,6 +87,7 @@ async def publish(
         ci_gcs_credentials=ctx.obj["ci_gcs_credentials"],
         python_registry_token=python_registry_token,
         registry=python_registry_url,
+        registry_check_url=DEFAULT_PYTHON_PACKAGE_REGISTRY_CHECK_URL,
         package_path=ctx.obj["package_path"],
         package_name=publish_name,
         version=publish_version,
diff --git a/airbyte-ci/connectors/pipelines/pipelines/consts.py b/airbyte-ci/connectors/pipelines/pipelines/consts.py
index 966c484b15f15..e9fe8ee5d1a5b 100644
--- a/airbyte-ci/connectors/pipelines/pipelines/consts.py
+++ b/airbyte-ci/connectors/pipelines/pipelines/consts.py
@@ -61,6 +61,7 @@
 STORAGE_DRIVER = "fuse-overlayfs"
 SETUP_PY_FILE_PATH = "setup.py"
 DEFAULT_PYTHON_PACKAGE_REGISTRY_URL = "https://upload.pypi.org/legacy/"
+DEFAULT_PYTHON_PACKAGE_REGISTRY_CHECK_URL = "https://pypi.org/pypi"
 
 
 class CIContext(str, Enum):
diff --git a/airbyte-ci/connectors/pipelines/pipelines/helpers/pip.py b/airbyte-ci/connectors/pipelines/pipelines/helpers/pip.py
index e8b1d0ed0dad2..5076e6b401ced 100644
--- a/airbyte-ci/connectors/pipelines/pipelines/helpers/pip.py
+++ b/airbyte-ci/connectors/pipelines/pipelines/helpers/pip.py
@@ -1,27 +1,21 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 
 from typing import Optional
-from urllib.parse import urlparse
 
 import requests  # type: ignore
 
 
 def is_package_published(package_name: Optional[str], version: Optional[str], registry_url: str) -> bool:
     """
-    Check if a package with a specific version is published on PyPI or Test PyPI.
-
-    :param package_name: The name of the package to check.
-    :param version: The version of the package.
-    :param test_pypi: Set to True to check on Test PyPI, False for regular PyPI.
-    :return: True if the package is found with the specified version, False otherwise.
+    Check if a package with a specific version is published on a python registry.
     """
     if not package_name or not version:
         return False
 
-    parsed_registry_url = urlparse(registry_url)
-    base_url = f"{parsed_registry_url.scheme}://{parsed_registry_url.netloc}"
-
-    url = f"{base_url}/{package_name}/{version}/json"
+    url = f"{registry_url}/{package_name}/{version}/json"
 
-    response = requests.get(url)
-    return response.status_code == 200
+    try:
+        response = requests.get(url)
+        return response.status_code == 200
+    except requests.exceptions.ConnectionError:
+        return False
diff --git a/airbyte-ci/connectors/pipelines/pipelines/models/contexts/python_registry_publish.py b/airbyte-ci/connectors/pipelines/pipelines/models/contexts/python_registry_publish.py
index a189b476b8921..2b406e0d78873 100644
--- a/airbyte-ci/connectors/pipelines/pipelines/models/contexts/python_registry_publish.py
+++ b/airbyte-ci/connectors/pipelines/pipelines/models/contexts/python_registry_publish.py
@@ -21,6 +21,7 @@ class PythonRegistryPublishContext(PipelineContext):
     def __init__(
         self,
         python_registry_token: str,
+        registry_check_url: str,
         package_path: str,
         report_output_prefix: str,
         is_local: bool,
@@ -38,6 +39,7 @@ def __init__(
     ) -> None:
         self.python_registry_token = python_registry_token
         self.registry = registry
+        self.registry_check_url = registry_check_url
         self.package_path = package_path
         self.package_metadata = PythonPackageMetadata(package_name, version)
 
@@ -87,6 +89,7 @@ async def from_publish_connector_context(
         pypi_context = cls(
             python_registry_token=str(connector_context.python_registry_token),
             registry=str(connector_context.python_registry_url),
+            registry_check_url=str(connector_context.python_registry_check_url),
             package_path=str(connector_context.connector.code_directory),
             package_name=current_metadata["remoteRegistries"]["pypi"]["packageName"],
             version=version,
diff --git a/airbyte-ci/connectors/pipelines/pyproject.toml b/airbyte-ci/connectors/pipelines/pyproject.toml
index 8828208d99dd3..5471d7d63c45f 100644
--- a/airbyte-ci/connectors/pipelines/pyproject.toml
+++ b/airbyte-ci/connectors/pipelines/pyproject.toml
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
 
 [tool.poetry]
 name = "pipelines"
-version = "3.9.0"
+version = "3.10.0"
 description = "Packaged maintained by the connector operations team to perform CI for connectors' pipelines"
 authors = ["Airbyte <contact@airbyte.io>"]
 
diff --git a/airbyte-ci/connectors/pipelines/tests/test_helpers/test_pip.py b/airbyte-ci/connectors/pipelines/tests/test_helpers/test_pip.py
new file mode 100644
index 0000000000000..26605c6758497
--- /dev/null
+++ b/airbyte-ci/connectors/pipelines/tests/test_helpers/test_pip.py
@@ -0,0 +1,23 @@
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+
+import pytest
+from pipelines.helpers.pip import is_package_published
+
+
+@pytest.mark.parametrize(
+    "package_name, version, registry_url, expected",
+    [
+        pytest.param(None, None, "https://pypi.org/pypi", False, id="package_name and version are None"),
+        pytest.param(None, "0.2.0", "https://pypi.org/pypi", False, id="package_name is None"),
+        pytest.param("airbyte-source-pokeapi", None, "https://pypi.org/pypi", False, id="version is None"),
+        pytest.param("airbyte-source-pokeapi", "0.2.0", "https://pypi.org/pypi", True, id="published on pypi"),
+        pytest.param("airbyte-source-pokeapi", "0.1.0", "https://pypi.org/pypi", False, id="version not published on pypi"),
+        pytest.param("airbyte-source-nonexisting", "0.1.0", "https://pypi.org/pypi", False, id="package not published on pypi"),
+        pytest.param("airbyte-source-pokeapi", "0.2.1", "https://test.pypi.org/pypi", True, id="published on test.pypi"),
+        pytest.param("airbyte-source-pokeapi", "0.1.0", "https://test.pypi.org/pypi", False, id="version not published on test.pypi"),
+        pytest.param("airbyte-source-nonexisting", "0.1.0", "https://test.pypi.org/pypi", False, id="package not published on test.pypi"),
+        pytest.param("airbyte-source-pokeapi", "0.2.0", "https://some-non-existing-host.com", False, id="host does not exist"),
+    ],
+)
+def test_is_package_published(package_name, version, registry_url, expected):
+    assert is_package_published(package_name, version, registry_url) == expected
diff --git a/airbyte-ci/connectors/pipelines/tests/test_poetry/test_poetry_publish.py b/airbyte-ci/connectors/pipelines/tests/test_poetry/test_poetry_publish.py
index ee345b4183809..69fb4699c989f 100644
--- a/airbyte-ci/connectors/pipelines/tests/test_poetry/test_poetry_publish.py
+++ b/airbyte-ci/connectors/pipelines/tests/test_poetry/test_poetry_publish.py
@@ -24,6 +24,7 @@ def context(dagger_client: Client):
         version="0.2.0",
         python_registry_token="test",
         package_name="test",
+        registry_check_url="http://local_registry:8080/",
         registry="http://local_registry:8080/",
         is_local=True,
         git_branch="test",

From b8e4871e30440514dd27dc19259b041063e1a202 Mon Sep 17 00:00:00 2001
From: Joe Reuter <joe@airbyte.io>
Date: Wed, 31 Jan 2024 12:10:46 +0100
Subject: [PATCH 38/96] Publish to pypi batch5 (#34668)

---
 .../connectors/source-google-analytics-v4/metadata.yaml      | 5 +++++
 .../connectors/source-google-directory/metadata.yaml         | 4 ++++
 .../source-google-pagespeed-insights/metadata.yaml           | 4 ++++
 .../connectors/source-google-search-console/metadata.yaml    | 5 +++++
 .../connectors/source-google-webfonts/metadata.yaml          | 4 ++++
 .../source-google-workspace-admin-reports/metadata.yaml      | 5 +++++
 .../connectors/source-greenhouse/metadata.yaml               | 4 ++++
 airbyte-integrations/connectors/source-gridly/metadata.yaml  | 4 ++++
 .../connectors/source-gutendex/metadata.yaml                 | 4 ++++
 airbyte-integrations/connectors/source-harness/metadata.yaml | 4 ++++
 airbyte-integrations/connectors/source-harvest/metadata.yaml | 4 ++++
 .../connectors/source-hellobaton/metadata.yaml               | 4 ++++
 .../connectors/source-hubplanner/metadata.yaml               | 4 ++++
 airbyte-integrations/connectors/source-hubspot/metadata.yaml | 4 ++++
 .../connectors/source-insightly/metadata.yaml                | 4 ++++
 .../connectors/source-instatus/metadata.yaml                 | 4 ++++
 .../connectors/source-intercom/metadata.yaml                 | 5 +++++
 .../connectors/source-intruder/metadata.yaml                 | 4 ++++
 .../connectors/source-ip2whois/metadata.yaml                 | 4 ++++
 airbyte-integrations/connectors/source-jira/metadata.yaml    | 4 ++++
 20 files changed, 84 insertions(+)

diff --git a/airbyte-integrations/connectors/source-google-analytics-v4/metadata.yaml b/airbyte-integrations/connectors/source-google-analytics-v4/metadata.yaml
index 0d3f2c4740fd5..9307c73d16b6e 100644
--- a/airbyte-integrations/connectors/source-google-analytics-v4/metadata.yaml
+++ b/airbyte-integrations/connectors/source-google-analytics-v4/metadata.yaml
@@ -20,6 +20,11 @@ data:
   icon: google-analytics.svg
   license: Elv2
   name: Google Analytics (Universal Analytics)
+  remoteRegistries:
+    pypi:
+      enabled: false
+      # TODO: Set enabled=true after `airbyte-lib-validate-source` is passing.
+      packageName: airbyte-source-google-analytics-v4
   registries:
     cloud:
       enabled: false
diff --git a/airbyte-integrations/connectors/source-google-directory/metadata.yaml b/airbyte-integrations/connectors/source-google-directory/metadata.yaml
index 9db4b72e67e85..eedf71a553af1 100644
--- a/airbyte-integrations/connectors/source-google-directory/metadata.yaml
+++ b/airbyte-integrations/connectors/source-google-directory/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: googledirectory.svg
   license: MIT
   name: Google Directory
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-google-directory
   registries:
     cloud:
       dockerImageTag: 0.2.1
diff --git a/airbyte-integrations/connectors/source-google-pagespeed-insights/metadata.yaml b/airbyte-integrations/connectors/source-google-pagespeed-insights/metadata.yaml
index 68f96b0db8e7b..2bfe25c5eeae5 100644
--- a/airbyte-integrations/connectors/source-google-pagespeed-insights/metadata.yaml
+++ b/airbyte-integrations/connectors/source-google-pagespeed-insights/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: google-pagespeed-insights.svg
   license: MIT
   name: Google PageSpeed Insights
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-google-pagespeed-insights
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-google-search-console/metadata.yaml b/airbyte-integrations/connectors/source-google-search-console/metadata.yaml
index e3d321483fd57..b64ccc2913d5f 100644
--- a/airbyte-integrations/connectors/source-google-search-console/metadata.yaml
+++ b/airbyte-integrations/connectors/source-google-search-console/metadata.yaml
@@ -17,6 +17,11 @@ data:
   icon: googlesearchconsole.svg
   license: Elv2
   name: Google Search Console
+  remoteRegistries:
+    pypi:
+      enabled: false
+      # TODO: Set enabled=true after `airbyte-lib-validate-source` is passing.
+      packageName: airbyte-source-google-search-console
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-google-webfonts/metadata.yaml b/airbyte-integrations/connectors/source-google-webfonts/metadata.yaml
index 58d9d4bd572fc..b60374d751b96 100644
--- a/airbyte-integrations/connectors/source-google-webfonts/metadata.yaml
+++ b/airbyte-integrations/connectors/source-google-webfonts/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: googleworkpace.svg
   license: MIT
   name: Google Webfonts
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-google-webfonts
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-google-workspace-admin-reports/metadata.yaml b/airbyte-integrations/connectors/source-google-workspace-admin-reports/metadata.yaml
index a0b5a4ca2007a..bfc8f0f6421e2 100644
--- a/airbyte-integrations/connectors/source-google-workspace-admin-reports/metadata.yaml
+++ b/airbyte-integrations/connectors/source-google-workspace-admin-reports/metadata.yaml
@@ -8,6 +8,11 @@ data:
   icon: googleworkpace.svg
   license: MIT
   name: Google Workspace Admin Reports
+  remoteRegistries:
+    pypi:
+      enabled: false
+      # TODO: Set enabled=true after `airbyte-lib-validate-source` is passing.
+      packageName: airbyte-source-google-workspace-admin-reports
   registries:
     cloud:
       dockerImageTag: 0.1.4
diff --git a/airbyte-integrations/connectors/source-greenhouse/metadata.yaml b/airbyte-integrations/connectors/source-greenhouse/metadata.yaml
index e732c0f18fa67..98cbce12ec273 100644
--- a/airbyte-integrations/connectors/source-greenhouse/metadata.yaml
+++ b/airbyte-integrations/connectors/source-greenhouse/metadata.yaml
@@ -17,6 +17,10 @@ data:
   icon: greenhouse.svg
   license: MIT
   name: Greenhouse
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-greenhouse
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-gridly/metadata.yaml b/airbyte-integrations/connectors/source-gridly/metadata.yaml
index 1c6747986c8cf..11a5a90d789f2 100644
--- a/airbyte-integrations/connectors/source-gridly/metadata.yaml
+++ b/airbyte-integrations/connectors/source-gridly/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: gridly.svg
   license: MIT
   name: Gridly
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-gridly
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-gutendex/metadata.yaml b/airbyte-integrations/connectors/source-gutendex/metadata.yaml
index 01e6a71bbaed1..6624a7e221bdf 100644
--- a/airbyte-integrations/connectors/source-gutendex/metadata.yaml
+++ b/airbyte-integrations/connectors/source-gutendex/metadata.yaml
@@ -7,6 +7,10 @@ data:
   githubIssueLabel: source-gutendex
   license: MIT
   name: Gutendex
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-gutendex
   registries:
     cloud:
       enabled: false
diff --git a/airbyte-integrations/connectors/source-harness/metadata.yaml b/airbyte-integrations/connectors/source-harness/metadata.yaml
index a33d83b938598..59b15a6a1b619 100644
--- a/airbyte-integrations/connectors/source-harness/metadata.yaml
+++ b/airbyte-integrations/connectors/source-harness/metadata.yaml
@@ -2,6 +2,10 @@ data:
   allowedHosts:
     hosts:
       - api.harness.io
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-harness
   registries:
     oss:
       enabled: false
diff --git a/airbyte-integrations/connectors/source-harvest/metadata.yaml b/airbyte-integrations/connectors/source-harvest/metadata.yaml
index 0bb7f453aea53..a1c6ee65ed77a 100644
--- a/airbyte-integrations/connectors/source-harvest/metadata.yaml
+++ b/airbyte-integrations/connectors/source-harvest/metadata.yaml
@@ -17,6 +17,10 @@ data:
   icon: harvest.svg
   license: MIT
   name: Harvest
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-harvest
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-hellobaton/metadata.yaml b/airbyte-integrations/connectors/source-hellobaton/metadata.yaml
index f01eb8e06ffee..183bf69ea8ad4 100644
--- a/airbyte-integrations/connectors/source-hellobaton/metadata.yaml
+++ b/airbyte-integrations/connectors/source-hellobaton/metadata.yaml
@@ -2,6 +2,10 @@ data:
   allowedHosts:
     hosts:
       - ${company}.hellobaton.com
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-hellobaton
   registries:
     oss:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-hubplanner/metadata.yaml b/airbyte-integrations/connectors/source-hubplanner/metadata.yaml
index 59487dacb6f16..b14c0ba4e0b19 100644
--- a/airbyte-integrations/connectors/source-hubplanner/metadata.yaml
+++ b/airbyte-integrations/connectors/source-hubplanner/metadata.yaml
@@ -2,6 +2,10 @@ data:
   allowedHosts:
     hosts:
       - "*" # Please change to the hostname of the source.
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-hubplanner
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-hubspot/metadata.yaml b/airbyte-integrations/connectors/source-hubspot/metadata.yaml
index e68f2ffd9280e..0a6414cf98bd4 100644
--- a/airbyte-integrations/connectors/source-hubspot/metadata.yaml
+++ b/airbyte-integrations/connectors/source-hubspot/metadata.yaml
@@ -17,6 +17,10 @@ data:
   icon: hubspot.svg
   license: ELv2
   name: HubSpot
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-hubspot
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-insightly/metadata.yaml b/airbyte-integrations/connectors/source-insightly/metadata.yaml
index 78f6fc859bf65..7fb79460cecdc 100644
--- a/airbyte-integrations/connectors/source-insightly/metadata.yaml
+++ b/airbyte-integrations/connectors/source-insightly/metadata.yaml
@@ -2,6 +2,10 @@ data:
   allowedHosts:
     hosts:
       - TODO # Please change to the hostname of the source.
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-insightly
   registries:
     oss:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-instatus/metadata.yaml b/airbyte-integrations/connectors/source-instatus/metadata.yaml
index 67980e6c3fb39..225e47a7158bb 100644
--- a/airbyte-integrations/connectors/source-instatus/metadata.yaml
+++ b/airbyte-integrations/connectors/source-instatus/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: instatus.svg
   license: MIT
   name: Instatus
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-instatus
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-intercom/metadata.yaml b/airbyte-integrations/connectors/source-intercom/metadata.yaml
index beb243445d313..8f86ceba16b3e 100644
--- a/airbyte-integrations/connectors/source-intercom/metadata.yaml
+++ b/airbyte-integrations/connectors/source-intercom/metadata.yaml
@@ -17,6 +17,11 @@ data:
   icon: intercom.svg
   license: MIT
   name: Intercom
+  remoteRegistries:
+    pypi:
+      enabled: false
+      # TODO: Set enabled=true after `airbyte-lib-validate-source` is passing.
+      packageName: airbyte-source-intercom
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-intruder/metadata.yaml b/airbyte-integrations/connectors/source-intruder/metadata.yaml
index a70265c693ff9..49d692755d429 100644
--- a/airbyte-integrations/connectors/source-intruder/metadata.yaml
+++ b/airbyte-integrations/connectors/source-intruder/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: intruder.svg
   license: MIT
   name: Intruder
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-intruder
   registries:
     cloud:
       enabled: false
diff --git a/airbyte-integrations/connectors/source-ip2whois/metadata.yaml b/airbyte-integrations/connectors/source-ip2whois/metadata.yaml
index a14ed278b3637..03866ecbd8ca5 100644
--- a/airbyte-integrations/connectors/source-ip2whois/metadata.yaml
+++ b/airbyte-integrations/connectors/source-ip2whois/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: ip2whois.svg
   license: MIT
   name: IP2Whois
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-ip2whois
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-jira/metadata.yaml b/airbyte-integrations/connectors/source-jira/metadata.yaml
index f10331aafc5dd..51eb24b0430a9 100644
--- a/airbyte-integrations/connectors/source-jira/metadata.yaml
+++ b/airbyte-integrations/connectors/source-jira/metadata.yaml
@@ -18,6 +18,10 @@ data:
   license: MIT
   maxSecondsBetweenMessages: 21600
   name: Jira
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-jira
   registries:
     cloud:
       enabled: true

From c881fe08006688f3beec882b4053cd8a808633a4 Mon Sep 17 00:00:00 2001
From: Joe Reuter <joe@airbyte.io>
Date: Wed, 31 Jan 2024 13:17:53 +0100
Subject: [PATCH 39/96] Publish to pypi batch6 (#34672)

---
 .../connectors/source-k6-cloud/metadata.yaml                 | 4 ++++
 airbyte-integrations/connectors/source-klarna/metadata.yaml  | 4 ++++
 .../connectors/source-klaus-api/metadata.yaml                | 4 ++++
 airbyte-integrations/connectors/source-klaviyo/metadata.yaml | 4 ++++
 .../connectors/source-kustomer-singer/metadata.yaml          | 5 +++++
 airbyte-integrations/connectors/source-kyriba/metadata.yaml  | 4 ++++
 airbyte-integrations/connectors/source-kyve/metadata.yaml    | 4 ++++
 .../connectors/source-launchdarkly/metadata.yaml             | 4 ++++
 airbyte-integrations/connectors/source-lemlist/metadata.yaml | 4 ++++
 .../connectors/source-lever-hiring/metadata.yaml             | 4 ++++
 .../connectors/source-linkedin-pages/metadata.yaml           | 4 ++++
 .../connectors/source-linnworks/metadata.yaml                | 5 +++++
 .../connectors/source-lokalise/metadata.yaml                 | 4 ++++
 airbyte-integrations/connectors/source-looker/metadata.yaml  | 4 ++++
 .../connectors/source-mailerlite/metadata.yaml               | 4 ++++
 .../connectors/source-mailersend/metadata.yaml               | 4 ++++
 airbyte-integrations/connectors/source-mailgun/metadata.yaml | 4 ++++
 .../connectors/source-mailjet-mail/metadata.yaml             | 4 ++++
 .../connectors/source-mailjet-sms/metadata.yaml              | 4 ++++
 airbyte-integrations/connectors/source-merge/metadata.yaml   | 4 ++++
 20 files changed, 82 insertions(+)

diff --git a/airbyte-integrations/connectors/source-k6-cloud/metadata.yaml b/airbyte-integrations/connectors/source-k6-cloud/metadata.yaml
index f62b94eacbf6e..f0c7664e3897b 100644
--- a/airbyte-integrations/connectors/source-k6-cloud/metadata.yaml
+++ b/airbyte-integrations/connectors/source-k6-cloud/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: k6cloud.svg
   license: MIT
   name: K6 Cloud
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-k6-cloud
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-klarna/metadata.yaml b/airbyte-integrations/connectors/source-klarna/metadata.yaml
index 8eff9ee1fc7b1..caf42f7076035 100644
--- a/airbyte-integrations/connectors/source-klarna/metadata.yaml
+++ b/airbyte-integrations/connectors/source-klarna/metadata.yaml
@@ -5,6 +5,10 @@ data:
       - api.playground.klarna.com
       - api-${config.region}.klarna.com
       - api-${config.region}.playground.klarna.com
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-klarna
   registries:
     oss:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-klaus-api/metadata.yaml b/airbyte-integrations/connectors/source-klaus-api/metadata.yaml
index 24e538bf888ae..2f4dbc01d8cf2 100644
--- a/airbyte-integrations/connectors/source-klaus-api/metadata.yaml
+++ b/airbyte-integrations/connectors/source-klaus-api/metadata.yaml
@@ -2,6 +2,10 @@ data:
   allowedHosts:
     hosts:
       - "*" # Please change to the hostname of the source.
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-klaus-api
   registries:
     oss:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-klaviyo/metadata.yaml b/airbyte-integrations/connectors/source-klaviyo/metadata.yaml
index 71bcca6adeb01..1844fa9c85d9b 100644
--- a/airbyte-integrations/connectors/source-klaviyo/metadata.yaml
+++ b/airbyte-integrations/connectors/source-klaviyo/metadata.yaml
@@ -14,6 +14,10 @@ data:
   icon: klaviyo.svg
   license: MIT
   name: Klaviyo
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-klaviyo
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-kustomer-singer/metadata.yaml b/airbyte-integrations/connectors/source-kustomer-singer/metadata.yaml
index ede0b9624645c..99cf6995426b5 100644
--- a/airbyte-integrations/connectors/source-kustomer-singer/metadata.yaml
+++ b/airbyte-integrations/connectors/source-kustomer-singer/metadata.yaml
@@ -8,6 +8,11 @@ data:
   icon: kustomer.svg
   license: MIT
   name: Kustomer
+  remoteRegistries:
+    pypi:
+      enabled: false
+      # TODO: Set enabled=true after `airbyte-lib-validate-source` is passing.
+      packageName: airbyte-source-kustomer-singer
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-kyriba/metadata.yaml b/airbyte-integrations/connectors/source-kyriba/metadata.yaml
index 347d7b22f2fa0..bed9c52b8527c 100644
--- a/airbyte-integrations/connectors/source-kyriba/metadata.yaml
+++ b/airbyte-integrations/connectors/source-kyriba/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: kyriba.svg
   license: MIT
   name: Kyriba
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-kyriba
   registries:
     cloud:
       enabled: false
diff --git a/airbyte-integrations/connectors/source-kyve/metadata.yaml b/airbyte-integrations/connectors/source-kyve/metadata.yaml
index 6f2b6cfc27ec9..c95fa5e333410 100644
--- a/airbyte-integrations/connectors/source-kyve/metadata.yaml
+++ b/airbyte-integrations/connectors/source-kyve/metadata.yaml
@@ -9,6 +9,10 @@ data:
   icon: icon.svg
   license: MIT
   name: KYVE
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-kyve
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-launchdarkly/metadata.yaml b/airbyte-integrations/connectors/source-launchdarkly/metadata.yaml
index d555160069419..c93a438bd591d 100644
--- a/airbyte-integrations/connectors/source-launchdarkly/metadata.yaml
+++ b/airbyte-integrations/connectors/source-launchdarkly/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: launchdarkly.svg
   license: MIT
   name: LaunchDarkly
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-launchdarkly
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-lemlist/metadata.yaml b/airbyte-integrations/connectors/source-lemlist/metadata.yaml
index cf4bd7c33ff89..6fbfb68fb7609 100644
--- a/airbyte-integrations/connectors/source-lemlist/metadata.yaml
+++ b/airbyte-integrations/connectors/source-lemlist/metadata.yaml
@@ -2,6 +2,10 @@ data:
   allowedHosts:
     hosts:
       - api.lemlist.com
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-lemlist
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-lever-hiring/metadata.yaml b/airbyte-integrations/connectors/source-lever-hiring/metadata.yaml
index 9a49336207cba..93c0e331a63b1 100644
--- a/airbyte-integrations/connectors/source-lever-hiring/metadata.yaml
+++ b/airbyte-integrations/connectors/source-lever-hiring/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: leverhiring.svg
   license: MIT
   name: Lever Hiring
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-lever-hiring
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-linkedin-pages/metadata.yaml b/airbyte-integrations/connectors/source-linkedin-pages/metadata.yaml
index f2c1338be5328..f5d1196e7b6c1 100644
--- a/airbyte-integrations/connectors/source-linkedin-pages/metadata.yaml
+++ b/airbyte-integrations/connectors/source-linkedin-pages/metadata.yaml
@@ -12,6 +12,10 @@ data:
   icon: linkedin.svg
   license: MIT
   name: LinkedIn Pages
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-linkedin-pages
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-linnworks/metadata.yaml b/airbyte-integrations/connectors/source-linnworks/metadata.yaml
index 326dbedaa2708..a40652bfd7ff3 100644
--- a/airbyte-integrations/connectors/source-linnworks/metadata.yaml
+++ b/airbyte-integrations/connectors/source-linnworks/metadata.yaml
@@ -8,6 +8,11 @@ data:
   icon: linnworks.svg
   license: MIT
   name: Linnworks
+  remoteRegistries:
+    pypi:
+      enabled: false
+      # TODO: Set enabled=true after `airbyte-lib-validate-source` is passing.
+      packageName: airbyte-source-linnworks
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-lokalise/metadata.yaml b/airbyte-integrations/connectors/source-lokalise/metadata.yaml
index 079f05bcb4f63..2f222da3c397c 100644
--- a/airbyte-integrations/connectors/source-lokalise/metadata.yaml
+++ b/airbyte-integrations/connectors/source-lokalise/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: lokalise.svg
   license: MIT
   name: Lokalise
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-lokalise
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-looker/metadata.yaml b/airbyte-integrations/connectors/source-looker/metadata.yaml
index 10e3a4cfe0797..3d2415c0cd294 100644
--- a/airbyte-integrations/connectors/source-looker/metadata.yaml
+++ b/airbyte-integrations/connectors/source-looker/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: looker.svg
   license: MIT
   name: Looker
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-looker
   registries:
     cloud:
       enabled: false
diff --git a/airbyte-integrations/connectors/source-mailerlite/metadata.yaml b/airbyte-integrations/connectors/source-mailerlite/metadata.yaml
index fae3ac67fb615..b89c174e8d0f5 100644
--- a/airbyte-integrations/connectors/source-mailerlite/metadata.yaml
+++ b/airbyte-integrations/connectors/source-mailerlite/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: mailerlite.svg
   license: MIT
   name: MailerLite
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-mailerlite
   registries:
     cloud:
       enabled: false
diff --git a/airbyte-integrations/connectors/source-mailersend/metadata.yaml b/airbyte-integrations/connectors/source-mailersend/metadata.yaml
index 436e6a8514ed4..97799066552c6 100644
--- a/airbyte-integrations/connectors/source-mailersend/metadata.yaml
+++ b/airbyte-integrations/connectors/source-mailersend/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: mailersend.svg
   license: MIT
   name: MailerSend
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-mailersend
   registries:
     cloud:
       enabled: false
diff --git a/airbyte-integrations/connectors/source-mailgun/metadata.yaml b/airbyte-integrations/connectors/source-mailgun/metadata.yaml
index 7d3e7d30ee15a..669d11d1ef419 100644
--- a/airbyte-integrations/connectors/source-mailgun/metadata.yaml
+++ b/airbyte-integrations/connectors/source-mailgun/metadata.yaml
@@ -2,6 +2,10 @@ data:
   allowedHosts:
     hosts:
       - https://api.mailgun.net/
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-mailgun
   registries:
     oss:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-mailjet-mail/metadata.yaml b/airbyte-integrations/connectors/source-mailjet-mail/metadata.yaml
index 3a0ae99fd35aa..ce0bd1f6e3b22 100644
--- a/airbyte-integrations/connectors/source-mailjet-mail/metadata.yaml
+++ b/airbyte-integrations/connectors/source-mailjet-mail/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: mailjetmail.svg
   license: MIT
   name: Mailjet Mail
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-mailjet-mail
   registries:
     cloud:
       enabled: false
diff --git a/airbyte-integrations/connectors/source-mailjet-sms/metadata.yaml b/airbyte-integrations/connectors/source-mailjet-sms/metadata.yaml
index a68dbed823e29..307381bb7f6c8 100644
--- a/airbyte-integrations/connectors/source-mailjet-sms/metadata.yaml
+++ b/airbyte-integrations/connectors/source-mailjet-sms/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: mailjetsms.svg
   license: MIT
   name: Mailjet SMS
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-mailjet-sms
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-merge/metadata.yaml b/airbyte-integrations/connectors/source-merge/metadata.yaml
index 13c6df4feb033..8a311f0a516d5 100644
--- a/airbyte-integrations/connectors/source-merge/metadata.yaml
+++ b/airbyte-integrations/connectors/source-merge/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: merge.svg
   license: MIT
   name: Merge
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-merge
   registries:
     cloud:
       enabled: false

From 410fc8a840047a9b3fc2835037cfcf16da1bb2ff Mon Sep 17 00:00:00 2001
From: Joe Reuter <joe@airbyte.io>
Date: Wed, 31 Jan 2024 14:14:15 +0100
Subject: [PATCH 40/96] Publish to pypi batch7 (#34673)

---
 .../connectors/source-metabase/metadata.yaml                 | 4 ++++
 .../connectors/source-microsoft-dataverse/metadata.yaml      | 4 ++++
 .../connectors/source-microsoft-onedrive/metadata.yaml       | 5 +++++
 .../connectors/source-microsoft-teams/metadata.yaml          | 4 ++++
 airbyte-integrations/connectors/source-monday/metadata.yaml  | 5 +++++
 .../connectors/source-my-hours/metadata.yaml                 | 4 ++++
 airbyte-integrations/connectors/source-n8n/metadata.yaml     | 4 ++++
 airbyte-integrations/connectors/source-nasa/metadata.yaml    | 4 ++++
 .../connectors/source-netsuite/metadata.yaml                 | 4 ++++
 .../connectors/source-news-api/metadata.yaml                 | 4 ++++
 .../connectors/source-newsdata/metadata.yaml                 | 4 ++++
 airbyte-integrations/connectors/source-notion/metadata.yaml  | 4 ++++
 airbyte-integrations/connectors/source-nytimes/metadata.yaml | 4 ++++
 airbyte-integrations/connectors/source-okta/metadata.yaml    | 4 ++++
 .../connectors/source-omnisend/metadata.yaml                 | 4 ++++
 .../connectors/source-onesignal/metadata.yaml                | 4 ++++
 .../connectors/source-open-exchange-rates/metadata.yaml      | 4 ++++
 .../connectors/source-openweather/metadata.yaml              | 4 ++++
 .../connectors/source-opsgenie/metadata.yaml                 | 4 ++++
 airbyte-integrations/connectors/source-orb/metadata.yaml     | 4 ++++
 20 files changed, 82 insertions(+)

diff --git a/airbyte-integrations/connectors/source-metabase/metadata.yaml b/airbyte-integrations/connectors/source-metabase/metadata.yaml
index c6289bf09e4f0..2ee8fe2744b63 100644
--- a/airbyte-integrations/connectors/source-metabase/metadata.yaml
+++ b/airbyte-integrations/connectors/source-metabase/metadata.yaml
@@ -15,6 +15,10 @@ data:
   icon: metabase.svg
   license: MIT
   name: Metabase
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-metabase
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-microsoft-dataverse/metadata.yaml b/airbyte-integrations/connectors/source-microsoft-dataverse/metadata.yaml
index b91c74f4767e7..30fbf7e9da330 100644
--- a/airbyte-integrations/connectors/source-microsoft-dataverse/metadata.yaml
+++ b/airbyte-integrations/connectors/source-microsoft-dataverse/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: microsoftdataverse.svg
   license: MIT
   name: Microsoft Dataverse
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-microsoft-dataverse
   registries:
     cloud:
       enabled: false
diff --git a/airbyte-integrations/connectors/source-microsoft-onedrive/metadata.yaml b/airbyte-integrations/connectors/source-microsoft-onedrive/metadata.yaml
index b6ef12226f711..c9f69260cd8db 100644
--- a/airbyte-integrations/connectors/source-microsoft-onedrive/metadata.yaml
+++ b/airbyte-integrations/connectors/source-microsoft-onedrive/metadata.yaml
@@ -6,6 +6,11 @@ data:
     hosts:
       - graph.microsoft.com
       - login.microsoftonline.com
+  remoteRegistries:
+    pypi:
+      enabled: false
+      # TODO: Set enabled=true after `airbyte-lib-validate-source` is passing.
+      packageName: airbyte-source-microsoft-onedrive
   registries:
     oss:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-microsoft-teams/metadata.yaml b/airbyte-integrations/connectors/source-microsoft-teams/metadata.yaml
index a554cf83e32ee..f9307d6d500c4 100644
--- a/airbyte-integrations/connectors/source-microsoft-teams/metadata.yaml
+++ b/airbyte-integrations/connectors/source-microsoft-teams/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: microsoft-teams.svg
   license: MIT
   name: Microsoft teams
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-microsoft-teams
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-monday/metadata.yaml b/airbyte-integrations/connectors/source-monday/metadata.yaml
index d5a3a9f0f41c4..e30b06c3cd2e9 100644
--- a/airbyte-integrations/connectors/source-monday/metadata.yaml
+++ b/airbyte-integrations/connectors/source-monday/metadata.yaml
@@ -34,6 +34,11 @@ data:
   icon: monday.svg
   license: MIT
   name: Monday
+  remoteRegistries:
+    pypi:
+      enabled: false
+      # TODO: Set enabled=true after `airbyte-lib-validate-source` is passing.
+      packageName: airbyte-source-monday
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-my-hours/metadata.yaml b/airbyte-integrations/connectors/source-my-hours/metadata.yaml
index ab7bf1e3e5be1..27da449d698ac 100644
--- a/airbyte-integrations/connectors/source-my-hours/metadata.yaml
+++ b/airbyte-integrations/connectors/source-my-hours/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: my-hours.svg
   license: MIT
   name: My Hours
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-my-hours
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-n8n/metadata.yaml b/airbyte-integrations/connectors/source-n8n/metadata.yaml
index f34328d9ee75c..afabe0ee24aa3 100644
--- a/airbyte-integrations/connectors/source-n8n/metadata.yaml
+++ b/airbyte-integrations/connectors/source-n8n/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: n8n.svg
   license: MIT
   name: n8n
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-n8n
   registries:
     cloud:
       enabled: false
diff --git a/airbyte-integrations/connectors/source-nasa/metadata.yaml b/airbyte-integrations/connectors/source-nasa/metadata.yaml
index 1cd017174495b..8bc0a54a45a03 100644
--- a/airbyte-integrations/connectors/source-nasa/metadata.yaml
+++ b/airbyte-integrations/connectors/source-nasa/metadata.yaml
@@ -2,6 +2,10 @@ data:
   allowedHosts:
     hosts:
       - api.nasa.gov
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-nasa
   registries:
     oss:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-netsuite/metadata.yaml b/airbyte-integrations/connectors/source-netsuite/metadata.yaml
index c2451ba1bfa38..2ce3fb426c0c7 100644
--- a/airbyte-integrations/connectors/source-netsuite/metadata.yaml
+++ b/airbyte-integrations/connectors/source-netsuite/metadata.yaml
@@ -12,6 +12,10 @@ data:
   icon: netsuite.svg
   license: MIT
   name: Netsuite
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-netsuite
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-news-api/metadata.yaml b/airbyte-integrations/connectors/source-news-api/metadata.yaml
index d33ea74b3d182..e4f2c6d7e45bc 100644
--- a/airbyte-integrations/connectors/source-news-api/metadata.yaml
+++ b/airbyte-integrations/connectors/source-news-api/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: newsapi.svg
   license: MIT
   name: News API
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-news-api
   registries:
     cloud:
       enabled: false
diff --git a/airbyte-integrations/connectors/source-newsdata/metadata.yaml b/airbyte-integrations/connectors/source-newsdata/metadata.yaml
index e27f676705261..1ae1a6bb448c7 100644
--- a/airbyte-integrations/connectors/source-newsdata/metadata.yaml
+++ b/airbyte-integrations/connectors/source-newsdata/metadata.yaml
@@ -7,6 +7,10 @@ data:
   githubIssueLabel: source-newsdata
   license: MIT
   name: Newsdata
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-newsdata
   registries:
     cloud:
       enabled: false
diff --git a/airbyte-integrations/connectors/source-notion/metadata.yaml b/airbyte-integrations/connectors/source-notion/metadata.yaml
index 69f953d8a5e2c..97d50e3ba0a60 100644
--- a/airbyte-integrations/connectors/source-notion/metadata.yaml
+++ b/airbyte-integrations/connectors/source-notion/metadata.yaml
@@ -17,6 +17,10 @@ data:
   icon: notion.svg
   license: MIT
   name: Notion
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-notion
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-nytimes/metadata.yaml b/airbyte-integrations/connectors/source-nytimes/metadata.yaml
index fa67687b72938..abb5e9e358cc6 100644
--- a/airbyte-integrations/connectors/source-nytimes/metadata.yaml
+++ b/airbyte-integrations/connectors/source-nytimes/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: nytimes.svg
   license: MIT
   name: New York Times
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-nytimes
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-okta/metadata.yaml b/airbyte-integrations/connectors/source-okta/metadata.yaml
index 011fb07a3b8b5..2a7b9541606e7 100644
--- a/airbyte-integrations/connectors/source-okta/metadata.yaml
+++ b/airbyte-integrations/connectors/source-okta/metadata.yaml
@@ -12,6 +12,10 @@ data:
   icon: okta.svg
   license: MIT
   name: Okta
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-okta
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-omnisend/metadata.yaml b/airbyte-integrations/connectors/source-omnisend/metadata.yaml
index 1f350fea734da..3b27557209fa3 100644
--- a/airbyte-integrations/connectors/source-omnisend/metadata.yaml
+++ b/airbyte-integrations/connectors/source-omnisend/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: omnisend.svg
   license: MIT
   name: Omnisend
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-omnisend
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-onesignal/metadata.yaml b/airbyte-integrations/connectors/source-onesignal/metadata.yaml
index cedb38e32be9d..1c57a5eebb555 100644
--- a/airbyte-integrations/connectors/source-onesignal/metadata.yaml
+++ b/airbyte-integrations/connectors/source-onesignal/metadata.yaml
@@ -2,6 +2,10 @@ data:
   allowedHosts:
     hosts:
       - "onesignal.com"
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-onesignal
   registries:
     oss:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-open-exchange-rates/metadata.yaml b/airbyte-integrations/connectors/source-open-exchange-rates/metadata.yaml
index 7c5f21637fae8..4cce2373e1b49 100644
--- a/airbyte-integrations/connectors/source-open-exchange-rates/metadata.yaml
+++ b/airbyte-integrations/connectors/source-open-exchange-rates/metadata.yaml
@@ -2,6 +2,10 @@ data:
   allowedHosts:
     hosts:
       - openexchangerates.org
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-open-exchange-rates
   registries:
     oss:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-openweather/metadata.yaml b/airbyte-integrations/connectors/source-openweather/metadata.yaml
index b15d5744b4f97..e92518c4f92b3 100644
--- a/airbyte-integrations/connectors/source-openweather/metadata.yaml
+++ b/airbyte-integrations/connectors/source-openweather/metadata.yaml
@@ -2,6 +2,10 @@ data:
   allowedHosts:
     hosts:
       - api.openweathermap.org
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-openweather
   registries:
     oss:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-opsgenie/metadata.yaml b/airbyte-integrations/connectors/source-opsgenie/metadata.yaml
index 17edbf7b36e53..9954874734943 100644
--- a/airbyte-integrations/connectors/source-opsgenie/metadata.yaml
+++ b/airbyte-integrations/connectors/source-opsgenie/metadata.yaml
@@ -7,6 +7,10 @@ data:
   githubIssueLabel: source-opsgenie
   license: MIT
   name: Opsgenie
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-opsgenie
   registries:
     cloud:
       enabled: false
diff --git a/airbyte-integrations/connectors/source-orb/metadata.yaml b/airbyte-integrations/connectors/source-orb/metadata.yaml
index 16fbdbb5ab0ac..1c5c21ce8624e 100644
--- a/airbyte-integrations/connectors/source-orb/metadata.yaml
+++ b/airbyte-integrations/connectors/source-orb/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: orb.svg
   license: MIT
   name: Orb
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-orb
   registries:
     cloud:
       enabled: true

From 0c2d92e6392335d69497d227e87d1fb7e2d6cc71 Mon Sep 17 00:00:00 2001
From: Marcos Marx <marcosmarxm@users.noreply.github.com>
Date: Wed, 31 Jan 2024 10:27:40 -0300
Subject: [PATCH 41/96] Kubernetes docs: update instructions to use external
 database (#34604)

---
 .../on-kubernetes-via-helm.md                 | 70 ++++++++++++++++---
 1 file changed, 61 insertions(+), 9 deletions(-)

diff --git a/docs/deploying-airbyte/on-kubernetes-via-helm.md b/docs/deploying-airbyte/on-kubernetes-via-helm.md
index 060e5a6e66545..162a2de4b9cfd 100644
--- a/docs/deploying-airbyte/on-kubernetes-via-helm.md
+++ b/docs/deploying-airbyte/on-kubernetes-via-helm.md
@@ -187,20 +187,72 @@ After updating `values.yaml` simply upgrade your chart by running command:
 helm upgrade -f path/to/values.yaml %release_name% airbyte/airbyte
 ```
 
-### Database external secrets
+### External Airbyte Database
 
-If you're using external DB secrets, then provide them in `values.yaml` under global.database section in the following format:
+::info
+This was tested using [Airbyte Helm Chart Version 0.50.13](https://artifacthub.io/packages/helm/airbyte/airbyte/0.50.13).
+Previous or newer version can change how the external database can be configured.
+:::
 
-```text
+The Airbyte Database only works with Postgres 13.
+Make sure the database is accessible inside the cluster using `busy-box` service using `telnet` or `ping` command.
+
+:::warning
+If you're using the external database for the first time you must ensure the database you're going to use exists. The default database Airbyte will try to use is `airbyte` but you can modified it in the `values.yaml`.
+:::
+
+:::warning
+You can use only one database to a one Airbyte Helm deployment. If you try to use the same database for a different deployment it will have conflict with Temporal internal databases.
+:::
+
+Create a Kubernetes secret to store the database password.
+Save the file as `db-secrets.yaml`.
+```yaml
+apiVersion: v1
+kind: Secret
+metadata:
+  name: db-secrets
+type: Opaque
+stringData:
+  DATABASE_PASSWORD: <PASSWORD>
+```
+
+Run `kubectl apply -f db-secrets.yaml -n <NAMESPACE>` to create the secret in the namespace you're using Airbyte.
+
+Afterward, modify the following blocks in the Helm Chart `values.yaml` file:
+```yaml
+postgresql:
+  # Change the value from true to false.
+  enabled: false
+```
+Then:
+```yaml
+externalDatabase:
+  # Add the host, username and database name you're using.
+  host: <HOST>
+  user: <USERNAME>
+  database: <DATABASE_NAME>
+  password: ""
+  existingSecret: "db-secrets"
+  existingSecretPasswordKey: "DATABASE_PASSWORD"
+  port: 5432
+  jdbcUrl: ""
+```
+Keep password empty as the Chart will use the `db-secrets` value.
+Edit only the host, username, and database name. If your database is using a differnet `port` or need an special `jdbcUrl` you can edit here.
+This wasn't fully tested yet.
+
+Next, reference the secret in the global section:
+```yaml
+global:
   database:
-    secretName: "myOctaviaSecret"
-    secretValue: "postgresql-password"
-    host: "example.com"
-    port: "5432"
+    secretName: "db-secrets"
+    secretValue: "DATABASE_PASSWORD"
 ```
 
-And upgrade the chart by running:
+Unfortunately, the `airbyte-bootloader` configuration uses this variable. Future improvements are planned.
 
+Upgrade the chart by running:
 ```shell
-helm upgrade -f path/to/values.yaml %release_name% airbyte/airbyte
+helm upgrade --install %RELEASE_NAME% airbyte/airbyte -n <NAMESPACE> --values /path/to/values.yaml --version 0.50.13
 ```

From 045ce953164f44f39d0cf4656b861305720163dd Mon Sep 17 00:00:00 2001
From: Catherine Noll <clnoll@users.noreply.github.com>
Date: Wed, 31 Jan 2024 08:48:38 -0500
Subject: [PATCH 42/96] Update file-based connectors for compatibility with
 concurrent CDK (#34681)

---
 .../source-azure-blob-storage/metadata.yaml   |  2 +-
 .../source-azure-blob-storage/setup.py        |  2 +-
 .../source_azure_blob_storage/run.py          | 10 +++++-
 .../source_azure_blob_storage/source.py       |  7 ++--
 .../connectors/source-gcs/metadata.yaml       |  2 +-
 .../connectors/source-gcs/setup.py            |  2 +-
 .../connectors/source-gcs/source_gcs/run.py   | 34 +++++++++++++++++--
 .../source-gcs/source_gcs/source.py           |  7 ++--
 .../source-google-drive/metadata.yaml         |  2 +-
 .../connectors/source-google-drive/setup.py   |  2 +-
 .../source_google_drive/run.py                |  8 ++++-
 .../source_google_drive/source.py             | 11 +++---
 .../source-microsoft-onedrive/metadata.yaml   |  2 +-
 .../source-microsoft-onedrive/setup.py        |  2 +-
 .../source_microsoft_onedrive/run.py          |  8 ++++-
 .../source_microsoft_onedrive/source.py       | 11 +++---
 .../sources/azure-blob-storage.md             |  1 +
 docs/integrations/sources/gcs.md              | 21 ++++++------
 docs/integrations/sources/google-drive.md     |  1 +
 .../sources/microsoft-onedrive.md             |  1 +
 20 files changed, 98 insertions(+), 38 deletions(-)

diff --git a/airbyte-integrations/connectors/source-azure-blob-storage/metadata.yaml b/airbyte-integrations/connectors/source-azure-blob-storage/metadata.yaml
index eca1b2e4c108d..9abbaec55465f 100644
--- a/airbyte-integrations/connectors/source-azure-blob-storage/metadata.yaml
+++ b/airbyte-integrations/connectors/source-azure-blob-storage/metadata.yaml
@@ -7,7 +7,7 @@ data:
   connectorSubtype: file
   connectorType: source
   definitionId: fdaaba68-4875-4ed9-8fcd-4ae1e0a25093
-  dockerImageTag: 0.3.2
+  dockerImageTag: 0.3.3
   dockerRepository: airbyte/source-azure-blob-storage
   documentationUrl: https://docs.airbyte.com/integrations/sources/azure-blob-storage
   githubIssueLabel: source-azure-blob-storage
diff --git a/airbyte-integrations/connectors/source-azure-blob-storage/setup.py b/airbyte-integrations/connectors/source-azure-blob-storage/setup.py
index 5260ac12c058b..827a6fb87060a 100644
--- a/airbyte-integrations/connectors/source-azure-blob-storage/setup.py
+++ b/airbyte-integrations/connectors/source-azure-blob-storage/setup.py
@@ -6,7 +6,7 @@
 from setuptools import find_packages, setup
 
 MAIN_REQUIREMENTS = [
-    "airbyte-cdk[file-based]==0.59.2",  # pinned until compatible with https://github.com/airbytehq/airbyte/pull/34411
+    "airbyte-cdk[file-based]>=0.60.1",
     "smart_open[azure]",
     "pytz",
 ]
diff --git a/airbyte-integrations/connectors/source-azure-blob-storage/source_azure_blob_storage/run.py b/airbyte-integrations/connectors/source-azure-blob-storage/source_azure_blob_storage/run.py
index 404d919b60f3e..a671d836526a5 100644
--- a/airbyte-integrations/connectors/source-azure-blob-storage/source_azure_blob_storage/run.py
+++ b/airbyte-integrations/connectors/source-azure-blob-storage/source_azure_blob_storage/run.py
@@ -14,8 +14,16 @@
 def run():
     args = sys.argv[1:]
     catalog_path = AirbyteEntrypoint.extract_catalog(args)
+    config_path = AirbyteEntrypoint.extract_config(args)
+    state_path = AirbyteEntrypoint.extract_state(args)
     try:
-        source = SourceAzureBlobStorage(SourceAzureBlobStorageStreamReader(), Config, catalog_path)
+        source = SourceAzureBlobStorage(
+            SourceAzureBlobStorageStreamReader(),
+            Config,
+            SourceAzureBlobStorage.read_catalog(catalog_path) if catalog_path else None,
+            SourceAzureBlobStorage.read_config(config_path) if catalog_path else None,
+            SourceAzureBlobStorage.read_state(state_path) if catalog_path else None,
+        )
     except Exception:
         print(
             AirbyteMessage(
diff --git a/airbyte-integrations/connectors/source-azure-blob-storage/source_azure_blob_storage/source.py b/airbyte-integrations/connectors/source-azure-blob-storage/source_azure_blob_storage/source.py
index 419119bb3ef8e..792dcdfe2221b 100644
--- a/airbyte-integrations/connectors/source-azure-blob-storage/source_azure_blob_storage/source.py
+++ b/airbyte-integrations/connectors/source-azure-blob-storage/source_azure_blob_storage/source.py
@@ -11,14 +11,15 @@
 
 
 class SourceAzureBlobStorage(FileBasedSource):
-    def read_config(self, config_path: str) -> Mapping[str, Any]:
+    @classmethod
+    def read_config(cls, config_path: str) -> Mapping[str, Any]:
         """
         Used to override the default read_config so that when the new file-based Azure Blob Storage connector processes a config
         in the legacy format, it can be transformed into the new config. This happens in entrypoint before we
         validate the config against the new spec.
         """
-        config = super().read_config(config_path)
-        if not self._is_v1_config(config):
+        config = FileBasedSource.read_config(config_path)
+        if not cls._is_v1_config(config):
             converted_config = LegacyConfigTransformer.convert(config)
             emit_configuration_as_airbyte_control_message(converted_config)
             return converted_config
diff --git a/airbyte-integrations/connectors/source-gcs/metadata.yaml b/airbyte-integrations/connectors/source-gcs/metadata.yaml
index d707202aa035d..6ec717a2dfe66 100644
--- a/airbyte-integrations/connectors/source-gcs/metadata.yaml
+++ b/airbyte-integrations/connectors/source-gcs/metadata.yaml
@@ -7,7 +7,7 @@ data:
   connectorSubtype: file
   connectorType: source
   definitionId: 2a8c41ae-8c23-4be0-a73f-2ab10ca1a820
-  dockerImageTag: 0.3.5
+  dockerImageTag: 0.3.6
   dockerRepository: airbyte/source-gcs
   documentationUrl: https://docs.airbyte.com/integrations/sources/gcs
   githubIssueLabel: source-gcs
diff --git a/airbyte-integrations/connectors/source-gcs/setup.py b/airbyte-integrations/connectors/source-gcs/setup.py
index 830498574d7a5..1e174a438b845 100644
--- a/airbyte-integrations/connectors/source-gcs/setup.py
+++ b/airbyte-integrations/connectors/source-gcs/setup.py
@@ -6,7 +6,7 @@
 from setuptools import find_packages, setup
 
 MAIN_REQUIREMENTS = [
-    "airbyte-cdk[file-based]==0.59.2",  # pinned until compatible with https://github.com/airbytehq/airbyte/pull/34411
+    "airbyte-cdk[file-based]>=0.60.1",
     "google-cloud-storage==2.12.0",
     "smart-open[s3]==5.1.0",
     "pandas==1.5.3",
diff --git a/airbyte-integrations/connectors/source-gcs/source_gcs/run.py b/airbyte-integrations/connectors/source-gcs/source_gcs/run.py
index d91a6b40df2a0..c4536b2d14e83 100644
--- a/airbyte-integrations/connectors/source-gcs/source_gcs/run.py
+++ b/airbyte-integrations/connectors/source-gcs/source_gcs/run.py
@@ -4,13 +4,41 @@
 
 
 import sys
+import traceback
+from datetime import datetime
 
 from airbyte_cdk.entrypoint import AirbyteEntrypoint, launch
+from airbyte_cdk.models import AirbyteErrorTraceMessage, AirbyteMessage, AirbyteTraceMessage, TraceType, Type
 from source_gcs import Config, Cursor, SourceGCS, SourceGCSStreamReader
 
 
 def run():
     _args = sys.argv[1:]
-    catalog_path = AirbyteEntrypoint.extract_catalog(_args)
-    source = SourceGCS(SourceGCSStreamReader(), Config, catalog_path, cursor_cls=Cursor)
-    launch(source, sys.argv[1:])
+    try:
+        catalog_path = AirbyteEntrypoint.extract_catalog(_args)
+        config_path = AirbyteEntrypoint.extract_config(_args)
+        state_path = AirbyteEntrypoint.extract_state(_args)
+        source = SourceGCS(
+            SourceGCSStreamReader(),
+            Config,
+            SourceGCS.read_catalog(catalog_path) if catalog_path else None,
+            SourceGCS.read_config(config_path) if config_path else None,
+            SourceGCS.read_state(state_path) if state_path else None,
+            cursor_cls=Cursor,
+        )
+    except Exception:
+        print(
+            AirbyteMessage(
+                type=Type.TRACE,
+                trace=AirbyteTraceMessage(
+                    type=TraceType.ERROR,
+                    emitted_at=int(datetime.now().timestamp() * 1000),
+                    error=AirbyteErrorTraceMessage(
+                        message="Error starting the sync. This could be due to an invalid configuration or catalog. Please contact Support for assistance.",
+                        stack_trace=traceback.format_exc(),
+                    ),
+                ),
+            ).json()
+        )
+    else:
+        launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-gcs/source_gcs/source.py b/airbyte-integrations/connectors/source-gcs/source_gcs/source.py
index b33ff2b87eb4c..7152d9ec5e117 100644
--- a/airbyte-integrations/connectors/source-gcs/source_gcs/source.py
+++ b/airbyte-integrations/connectors/source-gcs/source_gcs/source.py
@@ -12,13 +12,14 @@
 
 
 class SourceGCS(FileBasedSource):
-    def read_config(self, config_path: str) -> Mapping[str, Any]:
+    @classmethod
+    def read_config(cls, config_path: str) -> Mapping[str, Any]:
         """
         Override the default read_config to transform the legacy config format
         into the new one before validating it against the new spec.
         """
-        config = super().read_config(config_path)
-        if not self._is_file_based_config(config):
+        config = FileBasedSource.read_config(config_path)
+        if not cls._is_file_based_config(config):
             parsed_legacy_config = SourceGCSSpec(**config)
             converted_config = LegacyConfigTransformer.convert(parsed_legacy_config)
             emit_configuration_as_airbyte_control_message(converted_config)
diff --git a/airbyte-integrations/connectors/source-google-drive/metadata.yaml b/airbyte-integrations/connectors/source-google-drive/metadata.yaml
index 6f4839d112c9b..0a37d17fa9897 100644
--- a/airbyte-integrations/connectors/source-google-drive/metadata.yaml
+++ b/airbyte-integrations/connectors/source-google-drive/metadata.yaml
@@ -7,7 +7,7 @@ data:
   connectorSubtype: file
   connectorType: source
   definitionId: 9f8dda77-1048-4368-815b-269bf54ee9b8
-  dockerImageTag: 0.0.7
+  dockerImageTag: 0.0.8
   dockerRepository: airbyte/source-google-drive
   githubIssueLabel: source-google-drive
   icon: google-drive.svg
diff --git a/airbyte-integrations/connectors/source-google-drive/setup.py b/airbyte-integrations/connectors/source-google-drive/setup.py
index 858c7019384a8..0685947ad3357 100644
--- a/airbyte-integrations/connectors/source-google-drive/setup.py
+++ b/airbyte-integrations/connectors/source-google-drive/setup.py
@@ -6,7 +6,7 @@
 from setuptools import find_packages, setup
 
 MAIN_REQUIREMENTS = [
-    "airbyte-cdk[file-based]==0.59.2",  # pinned until compatible with https://github.com/airbytehq/airbyte/pull/34411
+    "airbyte-cdk[file-based]>=0.60.1",
     "google-api-python-client==2.104.0",
     "google-auth-httplib2==0.1.1",
     "google-auth-oauthlib==1.1.0",
diff --git a/airbyte-integrations/connectors/source-google-drive/source_google_drive/run.py b/airbyte-integrations/connectors/source-google-drive/source_google_drive/run.py
index a5605f39c2b17..d9d56d62740b1 100644
--- a/airbyte-integrations/connectors/source-google-drive/source_google_drive/run.py
+++ b/airbyte-integrations/connectors/source-google-drive/source_google_drive/run.py
@@ -13,5 +13,11 @@
 def run():
     args = sys.argv[1:]
     catalog_path = AirbyteEntrypoint.extract_catalog(args)
-    source = SourceGoogleDrive(catalog_path)
+    config_path = AirbyteEntrypoint.extract_config(args)
+    state_path = AirbyteEntrypoint.extract_state(args)
+    source = SourceGoogleDrive(
+        SourceGoogleDrive.read_catalog(catalog_path) if catalog_path else None,
+        SourceGoogleDrive.read_config(config_path) if config_path else None,
+        SourceGoogleDrive.read_state(state_path) if state_path else None,
+    )
     launch(source, args)
diff --git a/airbyte-integrations/connectors/source-google-drive/source_google_drive/source.py b/airbyte-integrations/connectors/source-google-drive/source_google_drive/source.py
index fe49fba7fe8ce..479711be83eef 100644
--- a/airbyte-integrations/connectors/source-google-drive/source_google_drive/source.py
+++ b/airbyte-integrations/connectors/source-google-drive/source_google_drive/source.py
@@ -1,21 +1,24 @@
 #
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
-from typing import Any
+from typing import Any, Mapping, Optional
 
-from airbyte_cdk.models import AdvancedAuth, ConnectorSpecification, OAuthConfigSpecification
+from airbyte_cdk.models import AdvancedAuth, ConfiguredAirbyteCatalog, ConnectorSpecification, OAuthConfigSpecification
 from airbyte_cdk.sources.file_based.file_based_source import FileBasedSource
 from airbyte_cdk.sources.file_based.stream.cursor.default_file_based_cursor import DefaultFileBasedCursor
+from airbyte_cdk.sources.source import TState
 from source_google_drive.spec import SourceGoogleDriveSpec
 from source_google_drive.stream_reader import SourceGoogleDriveStreamReader
 
 
 class SourceGoogleDrive(FileBasedSource):
-    def __init__(self, catalog_path: str):
+    def __init__(self, catalog: Optional[ConfiguredAirbyteCatalog], config: Optional[Mapping[str, Any]], state: Optional[TState]):
         super().__init__(
             stream_reader=SourceGoogleDriveStreamReader(),
             spec_class=SourceGoogleDriveSpec,
-            catalog_path=catalog_path,
+            catalog=catalog,
+            config=config,
+            state=state,
             cursor_cls=DefaultFileBasedCursor,
         )
 
diff --git a/airbyte-integrations/connectors/source-microsoft-onedrive/metadata.yaml b/airbyte-integrations/connectors/source-microsoft-onedrive/metadata.yaml
index c9f69260cd8db..fb4d15c8e0290 100644
--- a/airbyte-integrations/connectors/source-microsoft-onedrive/metadata.yaml
+++ b/airbyte-integrations/connectors/source-microsoft-onedrive/metadata.yaml
@@ -21,7 +21,7 @@ data:
   connectorSubtype: api
   connectorType: source
   definitionId: 01d1c685-fd4a-4837-8f4c-93fe5a0d2188
-  dockerImageTag: 0.1.4
+  dockerImageTag: 0.1.5
   dockerRepository: airbyte/source-microsoft-onedrive
   githubIssueLabel: source-microsoft-onedrive
   icon: microsoft-onedrive.svg
diff --git a/airbyte-integrations/connectors/source-microsoft-onedrive/setup.py b/airbyte-integrations/connectors/source-microsoft-onedrive/setup.py
index bc93b53a40044..342c12983500b 100644
--- a/airbyte-integrations/connectors/source-microsoft-onedrive/setup.py
+++ b/airbyte-integrations/connectors/source-microsoft-onedrive/setup.py
@@ -6,7 +6,7 @@
 from setuptools import find_packages, setup
 
 MAIN_REQUIREMENTS = [
-    "airbyte-cdk[file-based]==0.59.2",  # pinned until compatible with https://github.com/airbytehq/airbyte/pull/34411
+    "airbyte-cdk[file-based]>=0.60.1",
     "msal~=1.25.0",
     "Office365-REST-Python-Client~=2.5.2",
     "smart-open~=6.4.0",
diff --git a/airbyte-integrations/connectors/source-microsoft-onedrive/source_microsoft_onedrive/run.py b/airbyte-integrations/connectors/source-microsoft-onedrive/source_microsoft_onedrive/run.py
index 2141089780b9a..f083b8c70abce 100644
--- a/airbyte-integrations/connectors/source-microsoft-onedrive/source_microsoft_onedrive/run.py
+++ b/airbyte-integrations/connectors/source-microsoft-onedrive/source_microsoft_onedrive/run.py
@@ -13,5 +13,11 @@
 def run():
     args = sys.argv[1:]
     catalog_path = AirbyteEntrypoint.extract_catalog(args)
-    source = SourceMicrosoftOneDrive(catalog_path)
+    config_path = AirbyteEntrypoint.extract_config(args)
+    state_path = AirbyteEntrypoint.extract_state(args)
+    source = SourceMicrosoftOneDrive(
+        SourceMicrosoftOneDrive.read_catalog(catalog_path) if catalog_path else None,
+        SourceMicrosoftOneDrive.read_config(config_path) if config_path else None,
+        SourceMicrosoftOneDrive.read_state(state_path) if state_path else None,
+    )
     launch(source, args)
diff --git a/airbyte-integrations/connectors/source-microsoft-onedrive/source_microsoft_onedrive/source.py b/airbyte-integrations/connectors/source-microsoft-onedrive/source_microsoft_onedrive/source.py
index 87cf25732fd8d..f317a0990e84d 100644
--- a/airbyte-integrations/connectors/source-microsoft-onedrive/source_microsoft_onedrive/source.py
+++ b/airbyte-integrations/connectors/source-microsoft-onedrive/source_microsoft_onedrive/source.py
@@ -1,21 +1,24 @@
 #
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
-from typing import Any
+from typing import Any, Mapping, Optional
 
-from airbyte_cdk.models import AdvancedAuth, ConnectorSpecification, OAuthConfigSpecification
+from airbyte_cdk.models import AdvancedAuth, ConfiguredAirbyteCatalog, ConnectorSpecification, OAuthConfigSpecification
 from airbyte_cdk.sources.file_based.file_based_source import FileBasedSource
 from airbyte_cdk.sources.file_based.stream.cursor.default_file_based_cursor import DefaultFileBasedCursor
+from airbyte_cdk.sources.source import TState
 from source_microsoft_onedrive.spec import SourceMicrosoftOneDriveSpec
 from source_microsoft_onedrive.stream_reader import SourceMicrosoftOneDriveStreamReader
 
 
 class SourceMicrosoftOneDrive(FileBasedSource):
-    def __init__(self, catalog_path: str):
+    def __init__(self, catalog: Optional[ConfiguredAirbyteCatalog], config: Optional[Mapping[str, Any]], state: Optional[TState]):
         super().__init__(
             stream_reader=SourceMicrosoftOneDriveStreamReader(),
             spec_class=SourceMicrosoftOneDriveSpec,
-            catalog_path=catalog_path,
+            catalog=catalog,
+            config=config,
+            state=state,
             cursor_cls=DefaultFileBasedCursor,
         )
 
diff --git a/docs/integrations/sources/azure-blob-storage.md b/docs/integrations/sources/azure-blob-storage.md
index 01d082c71ca0b..b41ccb856f58b 100644
--- a/docs/integrations/sources/azure-blob-storage.md
+++ b/docs/integrations/sources/azure-blob-storage.md
@@ -193,6 +193,7 @@ To perform the text extraction from PDF and Docx files, the connector uses the [
 
 | Version | Date       | Pull Request                                             | Subject                                                                                      |
 |:--------|:-----------|:---------------------------------------------------------|:---------------------------------------------------------------------------------------------|
+| 0.3.3   | 2024-01-30 | [34681](https://github.com/airbytehq/airbyte/pull/34681)  | Unpin CDK version to make compatible with the Concurrent CDK                                 |
 | 0.3.2   | 2024-01-30 | [34661](https://github.com/airbytehq/airbyte/pull/34661)  | Pin CDK version until upgrade for compatibility with the Concurrent CDK                      |
 | 0.3.1   | 2024-01-10 | [34084](https://github.com/airbytehq/airbyte/pull/34084)  | Fix bug for running check with document file format                                          |
 | 0.3.0   | 2023-12-14 | [33411](https://github.com/airbytehq/airbyte/pull/33411)  | Bump CDK version to auto-set primary key for document file streams and support raw txt files |
diff --git a/docs/integrations/sources/gcs.md b/docs/integrations/sources/gcs.md
index 58e24a17dcc4a..85e429d98f360 100644
--- a/docs/integrations/sources/gcs.md
+++ b/docs/integrations/sources/gcs.md
@@ -146,13 +146,14 @@ Leaving this field blank (default option) will disallow escaping.
 
 ## Changelog
 
-| Version | Date       | Pull Request                                             | Subject                                             |
-|:--------|:-----------|:---------------------------------------------------------|:----------------------------------------------------|
-| 0.3.5   | 2024-01-30 | [34661](https://github.com/airbytehq/airbyte/pull/34661)  | Pin CDK version until upgrade for compatibility with the Concurrent CDK                      |
-| 0.3.4   | 2024-01-11 | [34158](https://github.com/airbytehq/airbyte/pull/34158) | Fix issue in stream reader for document file type parser |
-| 0.3.3   | 2023-12-06 | [33187](https://github.com/airbytehq/airbyte/pull/33187) | Bump CDK version to hide source-defined primary key |
-| 0.3.2   | 2023-11-16 | [32608](https://github.com/airbytehq/airbyte/pull/32608) | Improve document file type parser                   |
-| 0.3.1   | 2023-11-13 | [32357](https://github.com/airbytehq/airbyte/pull/32357) | Improve spec schema                                 |
-| 0.3.0   | 2023-10-11 | [31212](https://github.com/airbytehq/airbyte/pull/31212) | Migrated to file based CDK                          |
-| 0.2.0   | 2023-06-26 | [27725](https://github.com/airbytehq/airbyte/pull/27725) | License Update: Elv2                                |
-| 0.1.0   | 2023-02-16 | [23186](https://github.com/airbytehq/airbyte/pull/23186) | New Source: GCS                                     |
+| Version | Date       | Pull Request                                             | Subject                                                                                |
+|:--------|:-----------|:---------------------------------------------------------|:---------------------------------------------------------------------------------------|
+| 0.3.6   | 2024-01-30 | [34681](https://github.com/airbytehq/airbyte/pull/34681)  | Unpin CDK version to make compatible with the Concurrent CDK                           |
+| 0.3.5   | 2024-01-30 | [34661](https://github.com/airbytehq/airbyte/pull/34661)  | Pin CDK version until upgrade for compatibility with the Concurrent CDK                |
+| 0.3.4   | 2024-01-11 | [34158](https://github.com/airbytehq/airbyte/pull/34158) | Fix issue in stream reader for document file type parser                               |
+| 0.3.3   | 2023-12-06 | [33187](https://github.com/airbytehq/airbyte/pull/33187) | Bump CDK version to hide source-defined primary key                                    |
+| 0.3.2   | 2023-11-16 | [32608](https://github.com/airbytehq/airbyte/pull/32608) | Improve document file type parser                                                      |
+| 0.3.1   | 2023-11-13 | [32357](https://github.com/airbytehq/airbyte/pull/32357) | Improve spec schema                                                                    |
+| 0.3.0   | 2023-10-11 | [31212](https://github.com/airbytehq/airbyte/pull/31212) | Migrated to file based CDK                                                             |
+| 0.2.0   | 2023-06-26 | [27725](https://github.com/airbytehq/airbyte/pull/27725) | License Update: Elv2                                                                   |
+| 0.1.0   | 2023-02-16 | [23186](https://github.com/airbytehq/airbyte/pull/23186) | New Source: GCS                                                                        |
diff --git a/docs/integrations/sources/google-drive.md b/docs/integrations/sources/google-drive.md
index ca98dfb3129e2..b7ea26e0e32e3 100644
--- a/docs/integrations/sources/google-drive.md
+++ b/docs/integrations/sources/google-drive.md
@@ -247,6 +247,7 @@ Before parsing each document, the connector exports Google Document files to Doc
 
 | Version | Date       | Pull Request                                              | Subject                                                      |
 |---------|------------|-----------------------------------------------------------|--------------------------------------------------------------|
+| 0.0.8   | 2024-01-30 | [34681](https://github.com/airbytehq/airbyte/pull/34681)  | Unpin CDK version to make compatible with the Concurrent CDK                      |
 | 0.0.7   | 2024-01-30 | [34661](https://github.com/airbytehq/airbyte/pull/34661)  | Pin CDK version until upgrade for compatibility with the Concurrent CDK                      |
 | 0.0.6   | 2023-12-16 | [33414](https://github.com/airbytehq/airbyte/pull/33414) | Prepare for airbyte-lib |
 | 0.0.5   | 2023-12-14 | [33411](https://github.com/airbytehq/airbyte/pull/33411)  | Bump CDK version to auto-set primary key for document file streams and support raw txt files          |
diff --git a/docs/integrations/sources/microsoft-onedrive.md b/docs/integrations/sources/microsoft-onedrive.md
index 4697bce4734cb..a298e5b98db5f 100644
--- a/docs/integrations/sources/microsoft-onedrive.md
+++ b/docs/integrations/sources/microsoft-onedrive.md
@@ -121,6 +121,7 @@ The connector is restricted by normal Microsoft Graph [requests limitation](http
 
 | Version | Date       | Pull Request                                             | Subject                   |
 |:--------|:-----------|:---------------------------------------------------------|:--------------------------|
+| 0.1.5   | 2024-01-30 | [34681](https://github.com/airbytehq/airbyte/pull/34681)  | Unpin CDK version to make compatible with the Concurrent CDK                      |
 | 0.1.4   | 2024-01-30 | [34661](https://github.com/airbytehq/airbyte/pull/34661)  | Pin CDK version until upgrade for compatibility with the Concurrent CDK                      |
 | 0.1.3   | 2024-01-24 | [34478](https://github.com/airbytehq/airbyte/pull/34478) | Fix OAuth                 |
 | 0.1.2   | 2021-12-22 | [33745](https://github.com/airbytehq/airbyte/pull/33745) | Add ql and sl to metadata |

From 65a7f4237fe04f107dedfc319ae87193b52aa19d Mon Sep 17 00:00:00 2001
From: Anton Karpets <anton.karpets@globallogic.com>
Date: Wed, 31 Jan 2024 16:33:04 +0200
Subject: [PATCH 43/96] =?UTF-8?q?=F0=9F=9A=A8=F0=9F=9A=A8=F0=9F=90=9BSourc?=
 =?UTF-8?q?e=20Hubspot:=20update=20marketing=5Femails=20stream=20schema=20?=
 =?UTF-8?q?(#34492)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../integration_tests/expected_records.jsonl  |  62 ++--
 .../connectors/source-hubspot/metadata.yaml   |  10 +-
 .../source_hubspot/schemas/contact_lists.json |   6 +
 .../source_hubspot/schemas/engagements.json   |  18 ++
 .../source_hubspot/schemas/forms.json         |  17 ++
 .../schemas/marketing_emails.json             | 286 +++++++++---------
 .../source_hubspot/schemas/workflows.json     |   6 +
 .../source-hubspot/unit_tests/test_source.py  |   8 +-
 .../sources/hubspot-migrations.md             |  40 +++
 docs/integrations/sources/hubspot.md          |   1 +
 10 files changed, 272 insertions(+), 182 deletions(-)

diff --git a/airbyte-integrations/connectors/source-hubspot/integration_tests/expected_records.jsonl b/airbyte-integrations/connectors/source-hubspot/integration_tests/expected_records.jsonl
index 0109a703be275..a0f564927da35 100644
--- a/airbyte-integrations/connectors/source-hubspot/integration_tests/expected_records.jsonl
+++ b/airbyte-integrations/connectors/source-hubspot/integration_tests/expected_records.jsonl
@@ -1,22 +1,22 @@
 {"stream": "campaigns", "data": {"id": 243851494, "lastUpdatedTime": 1675121674226, "appId": 113, "appName": "Batch", "contentId": 100523515217, "subject": "test", "name": "test", "counters": {"dropped": 1}, "lastProcessingFinishedAt": 1675121674000, "lastProcessingStartedAt": 1675121671000, "lastProcessingStateChangeAt": 1675121674000, "numIncluded": 1, "processingState": "DONE", "type": "BATCH_EMAIL", "counters_dropped": 1}, "emitted_at": 1697714185530}
 {"stream": "campaigns", "data": {"id": 115429485, "lastUpdatedTime": 1615506409286, "appId": 113, "appName": "Batch", "contentId": 42931043849, "subject": "Test subj", "name": "Test subj", "counters": {"processed": 1, "deferred": 1, "mta_dropped": 1, "dropped": 3, "sent": 0}, "lastProcessingFinishedAt": 1615504712000, "lastProcessingStartedAt": 1615504687000, "lastProcessingStateChangeAt": 1615504712000, "numIncluded": 3, "processingState": "DONE", "type": "BATCH_EMAIL", "counters_processed": 1, "counters_deferred": 1, "counters_mta_dropped": 1, "counters_dropped": 3, "counters_sent": 0}, "emitted_at": 1697714185763}
-{"stream": "companies", "data": {"id": "4992593519", "properties": {"about_us": null, "address": null, "address2": null, "annualrevenue": null, "city": "San Francisco", "closedate": null, "closedate_timestamp_earliest_value_a2a17e6e": null, "country": "United States", "createdate": "2020-12-10T07:58:09.554000+00:00", "custom_company_property": null, "days_to_close": null, "description": "Airbyte is an open-source data integration platform to build ELT pipelines. Consolidate your data in your data warehouses, lakes and databases.", "domain": "airbyte.io", "engagements_last_meeting_booked": null, "engagements_last_meeting_booked_campaign": null, "engagements_last_meeting_booked_medium": null, "engagements_last_meeting_booked_source": null, "facebook_company_page": null, "facebookfans": null, "first_contact_createdate": null, "first_contact_createdate_timestamp_earliest_value_78b50eea": null, "first_conversion_date": null, "first_conversion_date_timestamp_earliest_value_61f58f2c": null, "first_conversion_event_name": null, "first_conversion_event_name_timestamp_earliest_value_68ddae0a": null, "first_deal_created_date": "2021-05-21T10:17:06.028000+00:00", "founded_year": "2020", "googleplus_page": null, "hs_additional_domains": null, "hs_all_accessible_team_ids": null, "hs_all_owner_ids": "52550153", "hs_all_team_ids": null, "hs_analytics_first_timestamp": null, "hs_analytics_first_timestamp_timestamp_earliest_value_11e3a63a": null, "hs_analytics_first_touch_converting_campaign": null, "hs_analytics_first_touch_converting_campaign_timestamp_earliest_value_4757fe10": null, "hs_analytics_first_visit_timestamp": null, "hs_analytics_first_visit_timestamp_timestamp_earliest_value_accc17ae": null, "hs_analytics_last_timestamp": null, "hs_analytics_last_timestamp_timestamp_latest_value_4e16365a": null, "hs_analytics_last_touch_converting_campaign": null, "hs_analytics_last_touch_converting_campaign_timestamp_latest_value_81a64e30": null, "hs_analytics_last_visit_timestamp": null, "hs_analytics_last_visit_timestamp_timestamp_latest_value_999a0fce": null, "hs_analytics_latest_source": null, "hs_analytics_latest_source_data_1": null, "hs_analytics_latest_source_data_2": null, "hs_analytics_latest_source_timestamp": null, "hs_analytics_num_page_views": null, "hs_analytics_num_page_views_cardinality_sum_e46e85b0": null, "hs_analytics_num_visits": null, "hs_analytics_num_visits_cardinality_sum_53d952a6": null, "hs_analytics_source": null, "hs_analytics_source_data_1": null, "hs_analytics_source_data_1_timestamp_earliest_value_9b2f1fa1": null, "hs_analytics_source_data_2": null, "hs_analytics_source_data_2_timestamp_earliest_value_9b2f9400": null, "hs_analytics_source_timestamp_earliest_value_25a3a52c": null, "hs_annual_revenue_currency_code": "USD", "hs_avatar_filemanager_key": null, "hs_created_by_user_id": 12282590, "hs_createdate": null, "hs_date_entered_customer": null, "hs_date_entered_evangelist": null, "hs_date_entered_lead": null, "hs_date_entered_marketingqualifiedlead": null, "hs_date_entered_opportunity": "2021-05-21T10:17:28.964000+00:00", "hs_date_entered_other": null, "hs_date_entered_salesqualifiedlead": null, "hs_date_entered_subscriber": null, "hs_date_exited_customer": null, "hs_date_exited_evangelist": null, "hs_date_exited_lead": null, "hs_date_exited_marketingqualifiedlead": null, "hs_date_exited_opportunity": null, "hs_date_exited_other": null, "hs_date_exited_salesqualifiedlead": null, "hs_date_exited_subscriber": null, "hs_ideal_customer_profile": null, "hs_is_target_account": null, "hs_last_booked_meeting_date": null, "hs_last_logged_call_date": null, "hs_last_open_task_date": null, "hs_last_sales_activity_date": null, "hs_last_sales_activity_timestamp": null, "hs_last_sales_activity_type": null, "hs_lastmodifieddate": "2023-01-26T11:45:49.817000+00:00", "hs_latest_createdate_of_active_subscriptions": null, "hs_latest_meeting_activity": null, "hs_lead_status": null, "hs_merged_object_ids": null, "hs_num_blockers": null, "hs_num_child_companies": 0, "hs_num_contacts_with_buying_roles": null, "hs_num_decision_makers": null, "hs_num_open_deals": 1, "hs_object_id": 4992593519, "hs_object_source": null, "hs_object_source_id": null, "hs_object_source_label": null, "hs_object_source_user_id": null, "hs_parent_company_id": null, "hs_pinned_engagement_id": null, "hs_pipeline": null, "hs_predictivecontactscore_v2": null, "hs_predictivecontactscore_v2_next_max_max_d4e58c1e": null, "hs_read_only": null, "hs_sales_email_last_replied": null, "hs_target_account": null, "hs_target_account_probability": 0.5476861596107483, "hs_target_account_recommendation_snooze_time": null, "hs_target_account_recommendation_state": null, "hs_time_in_customer": null, "hs_time_in_evangelist": null, "hs_time_in_lead": null, "hs_time_in_marketingqualifiedlead": null, "hs_time_in_opportunity": 76121938222, "hs_time_in_other": null, "hs_time_in_salesqualifiedlead": null, "hs_time_in_subscriber": null, "hs_total_deal_value": null, "hs_unique_creation_key": null, "hs_updated_by_user_id": 12282590, "hs_user_ids_of_all_notification_followers": null, "hs_user_ids_of_all_notification_unfollowers": null, "hs_user_ids_of_all_owners": "12282590", "hs_was_imported": null, "hubspot_owner_assigneddate": "2020-12-10T07:58:09.554000+00:00", "hubspot_owner_id": "52550153", "hubspot_team_id": null, "hubspotscore": null, "industry": null, "is_public": false, "lifecyclestage": "opportunity", "linkedin_company_page": "https://www.linkedin.com/company/airbytehq", "linkedinbio": "Airbyte is an open-source data integration platform to build ELT pipelines. Consolidate your data in your data warehouses, lakes and databases.", "name": "Airbyte test1", "notes_last_contacted": null, "notes_last_updated": null, "notes_next_activity_date": null, "num_associated_contacts": 0, "num_associated_deals": 1, "num_contacted_notes": null, "num_conversion_events": null, "num_conversion_events_cardinality_sum_d095f14b": null, "num_notes": null, "numberofemployees": 200, "phone": "+1 415-307-4864", "recent_conversion_date": null, "recent_conversion_date_timestamp_latest_value_72856da1": null, "recent_conversion_event_name": null, "recent_conversion_event_name_timestamp_latest_value_66c820bf": null, "recent_deal_amount": null, "recent_deal_close_date": null, "state": "CA", "timezone": "America/Los_Angeles", "total_money_raised": null, "total_revenue": null, "twitterbio": null, "twitterfollowers": null, "twitterhandle": "AirbyteHQ", "type": null, "web_technologies": "slack;segment;google_tag_manager;greenhouse;google_analytics;intercom;piwik;google_apps;hubspot;facebook_advertiser", "website": "airbyte.io", "zip": "94114"}, "createdAt": "2020-12-10T07:58:09.554Z", "updatedAt": "2023-01-26T11:45:49.817Z", "archived": false, "properties_about_us": null, "properties_address": null, "properties_address2": null, "properties_annualrevenue": null, "properties_city": "San Francisco", "properties_closedate": null, "properties_closedate_timestamp_earliest_value_a2a17e6e": null, "properties_country": "United States", "properties_createdate": "2020-12-10T07:58:09.554000+00:00", "properties_custom_company_property": null, "properties_days_to_close": null, "properties_description": "Airbyte is an open-source data integration platform to build ELT pipelines. Consolidate your data in your data warehouses, lakes and databases.", "properties_domain": "airbyte.io", "properties_engagements_last_meeting_booked": null, "properties_engagements_last_meeting_booked_campaign": null, "properties_engagements_last_meeting_booked_medium": null, "properties_engagements_last_meeting_booked_source": null, "properties_facebook_company_page": null, "properties_facebookfans": null, "properties_first_contact_createdate": null, "properties_first_contact_createdate_timestamp_earliest_value_78b50eea": null, "properties_first_conversion_date": null, "properties_first_conversion_date_timestamp_earliest_value_61f58f2c": null, "properties_first_conversion_event_name": null, "properties_first_conversion_event_name_timestamp_earliest_value_68ddae0a": null, "properties_first_deal_created_date": "2021-05-21T10:17:06.028000+00:00", "properties_founded_year": "2020", "properties_googleplus_page": null, "properties_hs_additional_domains": null, "properties_hs_all_accessible_team_ids": null, "properties_hs_all_owner_ids": "52550153", "properties_hs_all_team_ids": null, "properties_hs_analytics_first_timestamp": null, "properties_hs_analytics_first_timestamp_timestamp_earliest_value_11e3a63a": null, "properties_hs_analytics_first_touch_converting_campaign": null, "properties_hs_analytics_first_touch_converting_campaign_timestamp_earliest_value_4757fe10": null, "properties_hs_analytics_first_visit_timestamp": null, "properties_hs_analytics_first_visit_timestamp_timestamp_earliest_value_accc17ae": null, "properties_hs_analytics_last_timestamp": null, "properties_hs_analytics_last_timestamp_timestamp_latest_value_4e16365a": null, "properties_hs_analytics_last_touch_converting_campaign": null, "properties_hs_analytics_last_touch_converting_campaign_timestamp_latest_value_81a64e30": null, "properties_hs_analytics_last_visit_timestamp": null, "properties_hs_analytics_last_visit_timestamp_timestamp_latest_value_999a0fce": null, "properties_hs_analytics_latest_source": null, "properties_hs_analytics_latest_source_data_1": null, "properties_hs_analytics_latest_source_data_2": null, "properties_hs_analytics_latest_source_timestamp": null, "properties_hs_analytics_num_page_views": null, "properties_hs_analytics_num_page_views_cardinality_sum_e46e85b0": null, "properties_hs_analytics_num_visits": null, "properties_hs_analytics_num_visits_cardinality_sum_53d952a6": null, "properties_hs_analytics_source": null, "properties_hs_analytics_source_data_1": null, "properties_hs_analytics_source_data_1_timestamp_earliest_value_9b2f1fa1": null, "properties_hs_analytics_source_data_2": null, "properties_hs_analytics_source_data_2_timestamp_earliest_value_9b2f9400": null, "properties_hs_analytics_source_timestamp_earliest_value_25a3a52c": null, "properties_hs_annual_revenue_currency_code": "USD", "properties_hs_avatar_filemanager_key": null, "properties_hs_created_by_user_id": 12282590, "properties_hs_createdate": null, "properties_hs_date_entered_customer": null, "properties_hs_date_entered_evangelist": null, "properties_hs_date_entered_lead": null, "properties_hs_date_entered_marketingqualifiedlead": null, "properties_hs_date_entered_opportunity": "2021-05-21T10:17:28.964000+00:00", "properties_hs_date_entered_other": null, "properties_hs_date_entered_salesqualifiedlead": null, "properties_hs_date_entered_subscriber": null, "properties_hs_date_exited_customer": null, "properties_hs_date_exited_evangelist": null, "properties_hs_date_exited_lead": null, "properties_hs_date_exited_marketingqualifiedlead": null, "properties_hs_date_exited_opportunity": null, "properties_hs_date_exited_other": null, "properties_hs_date_exited_salesqualifiedlead": null, "properties_hs_date_exited_subscriber": null, "properties_hs_ideal_customer_profile": null, "properties_hs_is_target_account": null, "properties_hs_last_booked_meeting_date": null, "properties_hs_last_logged_call_date": null, "properties_hs_last_open_task_date": null, "properties_hs_last_sales_activity_date": null, "properties_hs_last_sales_activity_timestamp": null, "properties_hs_last_sales_activity_type": null, "properties_hs_lastmodifieddate": "2023-01-26T11:45:49.817000+00:00", "properties_hs_latest_createdate_of_active_subscriptions": null, "properties_hs_latest_meeting_activity": null, "properties_hs_lead_status": null, "properties_hs_merged_object_ids": null, "properties_hs_num_blockers": null, "properties_hs_num_child_companies": 0, "properties_hs_num_contacts_with_buying_roles": null, "properties_hs_num_decision_makers": null, "properties_hs_num_open_deals": 1, "properties_hs_object_id": 4992593519, "properties_hs_object_source": null, "properties_hs_object_source_id": null, "properties_hs_object_source_label": null, "properties_hs_object_source_user_id": null, "properties_hs_parent_company_id": null, "properties_hs_pinned_engagement_id": null, "properties_hs_pipeline": null, "properties_hs_predictivecontactscore_v2": null, "properties_hs_predictivecontactscore_v2_next_max_max_d4e58c1e": null, "properties_hs_read_only": null, "properties_hs_sales_email_last_replied": null, "properties_hs_target_account": null, "properties_hs_target_account_probability": 0.5476861596107483, "properties_hs_target_account_recommendation_snooze_time": null, "properties_hs_target_account_recommendation_state": null, "properties_hs_time_in_customer": null, "properties_hs_time_in_evangelist": null, "properties_hs_time_in_lead": null, "properties_hs_time_in_marketingqualifiedlead": null, "properties_hs_time_in_opportunity": 76121938222, "properties_hs_time_in_other": null, "properties_hs_time_in_salesqualifiedlead": null, "properties_hs_time_in_subscriber": null, "properties_hs_total_deal_value": null, "properties_hs_unique_creation_key": null, "properties_hs_updated_by_user_id": 12282590, "properties_hs_user_ids_of_all_notification_followers": null, "properties_hs_user_ids_of_all_notification_unfollowers": null, "properties_hs_user_ids_of_all_owners": "12282590", "properties_hs_was_imported": null, "properties_hubspot_owner_assigneddate": "2020-12-10T07:58:09.554000+00:00", "properties_hubspot_owner_id": "52550153", "properties_hubspot_team_id": null, "properties_hubspotscore": null, "properties_industry": null, "properties_is_public": false, "properties_lifecyclestage": "opportunity", "properties_linkedin_company_page": "https://www.linkedin.com/company/airbytehq", "properties_linkedinbio": "Airbyte is an open-source data integration platform to build ELT pipelines. Consolidate your data in your data warehouses, lakes and databases.", "properties_name": "Airbyte test1", "properties_notes_last_contacted": null, "properties_notes_last_updated": null, "properties_notes_next_activity_date": null, "properties_num_associated_contacts": 0, "properties_num_associated_deals": 1, "properties_num_contacted_notes": null, "properties_num_conversion_events": null, "properties_num_conversion_events_cardinality_sum_d095f14b": null, "properties_num_notes": null, "properties_numberofemployees": 200, "properties_phone": "+1 415-307-4864", "properties_recent_conversion_date": null, "properties_recent_conversion_date_timestamp_latest_value_72856da1": null, "properties_recent_conversion_event_name": null, "properties_recent_conversion_event_name_timestamp_latest_value_66c820bf": null, "properties_recent_deal_amount": null, "properties_recent_deal_close_date": null, "properties_state": "CA", "properties_timezone": "America/Los_Angeles", "properties_total_money_raised": null, "properties_total_revenue": null, "properties_twitterbio": null, "properties_twitterfollowers": null, "properties_twitterhandle": "AirbyteHQ", "properties_type": null, "properties_web_technologies": "slack;segment;google_tag_manager;greenhouse;google_analytics;intercom;piwik;google_apps;hubspot;facebook_advertiser", "properties_website": "airbyte.io", "properties_zip": "94114"}, "emitted_at": 1697714187356}
-{"stream": "companies", "data": {"id": "5000526215", "properties": {"about_us": null, "address": null, "address2": null, "annualrevenue": null, "city": "San Francisco", "closedate": "2023-04-04T15:00:58.081000+00:00", "closedate_timestamp_earliest_value_a2a17e6e": null, "country": "United States", "createdate": "2020-12-11T01:27:40.002000+00:00", "custom_company_property": null, "days_to_close": 844, "description": "Airbyte is an open-source data integration platform to build ELT pipelines. Consolidate your data in your data warehouses, lakes and databases.", "domain": "dataline.io", "engagements_last_meeting_booked": null, "engagements_last_meeting_booked_campaign": null, "engagements_last_meeting_booked_medium": null, "engagements_last_meeting_booked_source": null, "facebook_company_page": null, "facebookfans": null, "first_contact_createdate": "2020-12-11T01:29:50.116000+00:00", "first_contact_createdate_timestamp_earliest_value_78b50eea": null, "first_conversion_date": null, "first_conversion_date_timestamp_earliest_value_61f58f2c": null, "first_conversion_event_name": null, "first_conversion_event_name_timestamp_earliest_value_68ddae0a": null, "first_deal_created_date": "2021-01-13T10:30:42.221000+00:00", "founded_year": "2020", "googleplus_page": null, "hs_additional_domains": null, "hs_all_accessible_team_ids": null, "hs_all_owner_ids": "52550153", "hs_all_team_ids": null, "hs_analytics_first_timestamp": "2020-12-11T01:29:50.116000+00:00", "hs_analytics_first_timestamp_timestamp_earliest_value_11e3a63a": null, "hs_analytics_first_touch_converting_campaign": null, "hs_analytics_first_touch_converting_campaign_timestamp_earliest_value_4757fe10": null, "hs_analytics_first_visit_timestamp": null, "hs_analytics_first_visit_timestamp_timestamp_earliest_value_accc17ae": null, "hs_analytics_last_timestamp": null, "hs_analytics_last_timestamp_timestamp_latest_value_4e16365a": null, "hs_analytics_last_touch_converting_campaign": null, "hs_analytics_last_touch_converting_campaign_timestamp_latest_value_81a64e30": null, "hs_analytics_last_visit_timestamp": null, "hs_analytics_last_visit_timestamp_timestamp_latest_value_999a0fce": null, "hs_analytics_latest_source": "OFFLINE", "hs_analytics_latest_source_data_1": "CONTACTS", "hs_analytics_latest_source_data_2": "CRM_UI", "hs_analytics_latest_source_timestamp": "2020-12-11T01:29:50.153000+00:00", "hs_analytics_num_page_views": 0, "hs_analytics_num_page_views_cardinality_sum_e46e85b0": null, "hs_analytics_num_visits": 0, "hs_analytics_num_visits_cardinality_sum_53d952a6": null, "hs_analytics_source": "OFFLINE", "hs_analytics_source_data_1": "CONTACTS", "hs_analytics_source_data_1_timestamp_earliest_value_9b2f1fa1": null, "hs_analytics_source_data_2": "CRM_UI", "hs_analytics_source_data_2_timestamp_earliest_value_9b2f9400": null, "hs_analytics_source_timestamp_earliest_value_25a3a52c": null, "hs_annual_revenue_currency_code": "USD", "hs_avatar_filemanager_key": null, "hs_created_by_user_id": 12282590, "hs_createdate": null, "hs_date_entered_customer": "2023-04-04T15:00:58.081000+00:00", "hs_date_entered_evangelist": null, "hs_date_entered_lead": null, "hs_date_entered_marketingqualifiedlead": null, "hs_date_entered_opportunity": "2021-02-23T20:21:06.027000+00:00", "hs_date_entered_other": null, "hs_date_entered_salesqualifiedlead": null, "hs_date_entered_subscriber": null, "hs_date_exited_customer": null, "hs_date_exited_evangelist": null, "hs_date_exited_lead": null, "hs_date_exited_marketingqualifiedlead": null, "hs_date_exited_opportunity": "2023-04-04T15:00:58.081000+00:00", "hs_date_exited_other": null, "hs_date_exited_salesqualifiedlead": null, "hs_date_exited_subscriber": null, "hs_ideal_customer_profile": null, "hs_is_target_account": null, "hs_last_booked_meeting_date": null, "hs_last_logged_call_date": null, "hs_last_open_task_date": null, "hs_last_sales_activity_date": null, "hs_last_sales_activity_timestamp": null, "hs_last_sales_activity_type": null, "hs_lastmodifieddate": "2023-09-07T03:58:14.126000+00:00", "hs_latest_createdate_of_active_subscriptions": null, "hs_latest_meeting_activity": null, "hs_lead_status": null, "hs_merged_object_ids": "5183403213", "hs_num_blockers": 0, "hs_num_child_companies": 0, "hs_num_contacts_with_buying_roles": 0, "hs_num_decision_makers": 0, "hs_num_open_deals": 2, "hs_object_id": 5000526215, "hs_object_source": null, "hs_object_source_id": null, "hs_object_source_label": null, "hs_object_source_user_id": null, "hs_parent_company_id": null, "hs_pinned_engagement_id": null, "hs_pipeline": "companies-lifecycle-pipeline", "hs_predictivecontactscore_v2": 0.3, "hs_predictivecontactscore_v2_next_max_max_d4e58c1e": null, "hs_read_only": null, "hs_sales_email_last_replied": null, "hs_target_account": null, "hs_target_account_probability": 0.46257445216178894, "hs_target_account_recommendation_snooze_time": null, "hs_target_account_recommendation_state": null, "hs_time_in_customer": 17093729103, "hs_time_in_evangelist": null, "hs_time_in_lead": null, "hs_time_in_marketingqualifiedlead": null, "hs_time_in_opportunity": 66508792054, "hs_time_in_other": null, "hs_time_in_salesqualifiedlead": null, "hs_time_in_subscriber": null, "hs_total_deal_value": 60010, "hs_unique_creation_key": null, "hs_updated_by_user_id": 12282590, "hs_user_ids_of_all_notification_followers": null, "hs_user_ids_of_all_notification_unfollowers": null, "hs_user_ids_of_all_owners": "12282590", "hs_was_imported": null, "hubspot_owner_assigneddate": "2020-12-11T01:27:40.002000+00:00", "hubspot_owner_id": "52550153", "hubspot_team_id": null, "hubspotscore": null, "industry": null, "is_public": false, "lifecyclestage": "customer", "linkedin_company_page": "https://www.linkedin.com/company/airbytehq", "linkedinbio": "Airbyte is an open-source data integration platform to build ELT pipelines. Consolidate your data in your data warehouses, lakes and databases.", "name": "Dataline", "notes_last_contacted": null, "notes_last_updated": null, "notes_next_activity_date": null, "num_associated_contacts": 1, "num_associated_deals": 3, "num_contacted_notes": null, "num_conversion_events": null, "num_conversion_events_cardinality_sum_d095f14b": null, "num_notes": null, "numberofemployees": 25, "phone": "", "recent_conversion_date": null, "recent_conversion_date_timestamp_latest_value_72856da1": null, "recent_conversion_event_name": null, "recent_conversion_event_name_timestamp_latest_value_66c820bf": null, "recent_deal_amount": 60000, "recent_deal_close_date": "2023-04-04T14:59:45.103000+00:00", "state": "CA", "timezone": "America/Los_Angeles", "total_money_raised": null, "total_revenue": 60000, "twitterbio": null, "twitterfollowers": null, "twitterhandle": "AirbyteHQ", "type": null, "web_technologies": "slack;segment;google_tag_manager;cloud_flare;google_analytics;intercom;lever;google_apps", "website": "dataline.io", "zip": ""}, "createdAt": "2020-12-11T01:27:40.002Z", "updatedAt": "2023-09-07T03:58:14.126Z", "archived": false, "contacts": ["151", "151"], "properties_about_us": null, "properties_address": null, "properties_address2": null, "properties_annualrevenue": null, "properties_city": "San Francisco", "properties_closedate": "2023-04-04T15:00:58.081000+00:00", "properties_closedate_timestamp_earliest_value_a2a17e6e": null, "properties_country": "United States", "properties_createdate": "2020-12-11T01:27:40.002000+00:00", "properties_custom_company_property": null, "properties_days_to_close": 844, "properties_description": "Airbyte is an open-source data integration platform to build ELT pipelines. Consolidate your data in your data warehouses, lakes and databases.", "properties_domain": "dataline.io", "properties_engagements_last_meeting_booked": null, "properties_engagements_last_meeting_booked_campaign": null, "properties_engagements_last_meeting_booked_medium": null, "properties_engagements_last_meeting_booked_source": null, "properties_facebook_company_page": null, "properties_facebookfans": null, "properties_first_contact_createdate": "2020-12-11T01:29:50.116000+00:00", "properties_first_contact_createdate_timestamp_earliest_value_78b50eea": null, "properties_first_conversion_date": null, "properties_first_conversion_date_timestamp_earliest_value_61f58f2c": null, "properties_first_conversion_event_name": null, "properties_first_conversion_event_name_timestamp_earliest_value_68ddae0a": null, "properties_first_deal_created_date": "2021-01-13T10:30:42.221000+00:00", "properties_founded_year": "2020", "properties_googleplus_page": null, "properties_hs_additional_domains": null, "properties_hs_all_accessible_team_ids": null, "properties_hs_all_owner_ids": "52550153", "properties_hs_all_team_ids": null, "properties_hs_analytics_first_timestamp": "2020-12-11T01:29:50.116000+00:00", "properties_hs_analytics_first_timestamp_timestamp_earliest_value_11e3a63a": null, "properties_hs_analytics_first_touch_converting_campaign": null, "properties_hs_analytics_first_touch_converting_campaign_timestamp_earliest_value_4757fe10": null, "properties_hs_analytics_first_visit_timestamp": null, "properties_hs_analytics_first_visit_timestamp_timestamp_earliest_value_accc17ae": null, "properties_hs_analytics_last_timestamp": null, "properties_hs_analytics_last_timestamp_timestamp_latest_value_4e16365a": null, "properties_hs_analytics_last_touch_converting_campaign": null, "properties_hs_analytics_last_touch_converting_campaign_timestamp_latest_value_81a64e30": null, "properties_hs_analytics_last_visit_timestamp": null, "properties_hs_analytics_last_visit_timestamp_timestamp_latest_value_999a0fce": null, "properties_hs_analytics_latest_source": "OFFLINE", "properties_hs_analytics_latest_source_data_1": "CONTACTS", "properties_hs_analytics_latest_source_data_2": "CRM_UI", "properties_hs_analytics_latest_source_timestamp": "2020-12-11T01:29:50.153000+00:00", "properties_hs_analytics_num_page_views": 0, "properties_hs_analytics_num_page_views_cardinality_sum_e46e85b0": null, "properties_hs_analytics_num_visits": 0, "properties_hs_analytics_num_visits_cardinality_sum_53d952a6": null, "properties_hs_analytics_source": "OFFLINE", "properties_hs_analytics_source_data_1": "CONTACTS", "properties_hs_analytics_source_data_1_timestamp_earliest_value_9b2f1fa1": null, "properties_hs_analytics_source_data_2": "CRM_UI", "properties_hs_analytics_source_data_2_timestamp_earliest_value_9b2f9400": null, "properties_hs_analytics_source_timestamp_earliest_value_25a3a52c": null, "properties_hs_annual_revenue_currency_code": "USD", "properties_hs_avatar_filemanager_key": null, "properties_hs_created_by_user_id": 12282590, "properties_hs_createdate": null, "properties_hs_date_entered_customer": "2023-04-04T15:00:58.081000+00:00", "properties_hs_date_entered_evangelist": null, "properties_hs_date_entered_lead": null, "properties_hs_date_entered_marketingqualifiedlead": null, "properties_hs_date_entered_opportunity": "2021-02-23T20:21:06.027000+00:00", "properties_hs_date_entered_other": null, "properties_hs_date_entered_salesqualifiedlead": null, "properties_hs_date_entered_subscriber": null, "properties_hs_date_exited_customer": null, "properties_hs_date_exited_evangelist": null, "properties_hs_date_exited_lead": null, "properties_hs_date_exited_marketingqualifiedlead": null, "properties_hs_date_exited_opportunity": "2023-04-04T15:00:58.081000+00:00", "properties_hs_date_exited_other": null, "properties_hs_date_exited_salesqualifiedlead": null, "properties_hs_date_exited_subscriber": null, "properties_hs_ideal_customer_profile": null, "properties_hs_is_target_account": null, "properties_hs_last_booked_meeting_date": null, "properties_hs_last_logged_call_date": null, "properties_hs_last_open_task_date": null, "properties_hs_last_sales_activity_date": null, "properties_hs_last_sales_activity_timestamp": null, "properties_hs_last_sales_activity_type": null, "properties_hs_lastmodifieddate": "2023-09-07T03:58:14.126000+00:00", "properties_hs_latest_createdate_of_active_subscriptions": null, "properties_hs_latest_meeting_activity": null, "properties_hs_lead_status": null, "properties_hs_merged_object_ids": "5183403213", "properties_hs_num_blockers": 0, "properties_hs_num_child_companies": 0, "properties_hs_num_contacts_with_buying_roles": 0, "properties_hs_num_decision_makers": 0, "properties_hs_num_open_deals": 2, "properties_hs_object_id": 5000526215, "properties_hs_object_source": null, "properties_hs_object_source_id": null, "properties_hs_object_source_label": null, "properties_hs_object_source_user_id": null, "properties_hs_parent_company_id": null, "properties_hs_pinned_engagement_id": null, "properties_hs_pipeline": "companies-lifecycle-pipeline", "properties_hs_predictivecontactscore_v2": 0.3, "properties_hs_predictivecontactscore_v2_next_max_max_d4e58c1e": null, "properties_hs_read_only": null, "properties_hs_sales_email_last_replied": null, "properties_hs_target_account": null, "properties_hs_target_account_probability": 0.46257445216178894, "properties_hs_target_account_recommendation_snooze_time": null, "properties_hs_target_account_recommendation_state": null, "properties_hs_time_in_customer": 17093729103, "properties_hs_time_in_evangelist": null, "properties_hs_time_in_lead": null, "properties_hs_time_in_marketingqualifiedlead": null, "properties_hs_time_in_opportunity": 66508792054, "properties_hs_time_in_other": null, "properties_hs_time_in_salesqualifiedlead": null, "properties_hs_time_in_subscriber": null, "properties_hs_total_deal_value": 60010, "properties_hs_unique_creation_key": null, "properties_hs_updated_by_user_id": 12282590, "properties_hs_user_ids_of_all_notification_followers": null, "properties_hs_user_ids_of_all_notification_unfollowers": null, "properties_hs_user_ids_of_all_owners": "12282590", "properties_hs_was_imported": null, "properties_hubspot_owner_assigneddate": "2020-12-11T01:27:40.002000+00:00", "properties_hubspot_owner_id": "52550153", "properties_hubspot_team_id": null, "properties_hubspotscore": null, "properties_industry": null, "properties_is_public": false, "properties_lifecyclestage": "customer", "properties_linkedin_company_page": "https://www.linkedin.com/company/airbytehq", "properties_linkedinbio": "Airbyte is an open-source data integration platform to build ELT pipelines. Consolidate your data in your data warehouses, lakes and databases.", "properties_name": "Dataline", "properties_notes_last_contacted": null, "properties_notes_last_updated": null, "properties_notes_next_activity_date": null, "properties_num_associated_contacts": 1, "properties_num_associated_deals": 3, "properties_num_contacted_notes": null, "properties_num_conversion_events": null, "properties_num_conversion_events_cardinality_sum_d095f14b": null, "properties_num_notes": null, "properties_numberofemployees": 25, "properties_phone": "", "properties_recent_conversion_date": null, "properties_recent_conversion_date_timestamp_latest_value_72856da1": null, "properties_recent_conversion_event_name": null, "properties_recent_conversion_event_name_timestamp_latest_value_66c820bf": null, "properties_recent_deal_amount": 60000, "properties_recent_deal_close_date": "2023-04-04T14:59:45.103000+00:00", "properties_state": "CA", "properties_timezone": "America/Los_Angeles", "properties_total_money_raised": null, "properties_total_revenue": 60000, "properties_twitterbio": null, "properties_twitterfollowers": null, "properties_twitterhandle": "AirbyteHQ", "properties_type": null, "properties_web_technologies": "slack;segment;google_tag_manager;cloud_flare;google_analytics;intercom;lever;google_apps", "properties_website": "dataline.io", "properties_zip": ""}, "emitted_at": 1697714187359}
-{"stream": "companies", "data": {"id": "5000787595", "properties": {"about_us": null, "address": "2261 Market Street", "address2": null, "annualrevenue": null, "city": "San Francisco", "closedate": null, "closedate_timestamp_earliest_value_a2a17e6e": null, "country": "United States", "createdate": "2020-12-11T01:28:27.673000+00:00", "custom_company_property": null, "days_to_close": null, "description": "Airbyte is an open-source data integration platform to build ELT pipelines. Consolidate your data in your data warehouses, lakes and databases.", "domain": "Daxtarity.com", "engagements_last_meeting_booked": null, "engagements_last_meeting_booked_campaign": null, "engagements_last_meeting_booked_medium": null, "engagements_last_meeting_booked_source": null, "facebook_company_page": null, "facebookfans": null, "first_contact_createdate": null, "first_contact_createdate_timestamp_earliest_value_78b50eea": null, "first_conversion_date": null, "first_conversion_date_timestamp_earliest_value_61f58f2c": null, "first_conversion_event_name": null, "first_conversion_event_name_timestamp_earliest_value_68ddae0a": null, "first_deal_created_date": null, "founded_year": "2020", "googleplus_page": null, "hs_additional_domains": null, "hs_all_accessible_team_ids": null, "hs_all_owner_ids": "52550153", "hs_all_team_ids": null, "hs_analytics_first_timestamp": null, "hs_analytics_first_timestamp_timestamp_earliest_value_11e3a63a": null, "hs_analytics_first_touch_converting_campaign": null, "hs_analytics_first_touch_converting_campaign_timestamp_earliest_value_4757fe10": null, "hs_analytics_first_visit_timestamp": null, "hs_analytics_first_visit_timestamp_timestamp_earliest_value_accc17ae": null, "hs_analytics_last_timestamp": null, "hs_analytics_last_timestamp_timestamp_latest_value_4e16365a": null, "hs_analytics_last_touch_converting_campaign": null, "hs_analytics_last_touch_converting_campaign_timestamp_latest_value_81a64e30": null, "hs_analytics_last_visit_timestamp": null, "hs_analytics_last_visit_timestamp_timestamp_latest_value_999a0fce": null, "hs_analytics_latest_source": "", "hs_analytics_latest_source_data_1": "", "hs_analytics_latest_source_data_2": "", "hs_analytics_latest_source_timestamp": null, "hs_analytics_num_page_views": null, "hs_analytics_num_page_views_cardinality_sum_e46e85b0": null, "hs_analytics_num_visits": null, "hs_analytics_num_visits_cardinality_sum_53d952a6": null, "hs_analytics_source": "", "hs_analytics_source_data_1": "", "hs_analytics_source_data_1_timestamp_earliest_value_9b2f1fa1": null, "hs_analytics_source_data_2": "", "hs_analytics_source_data_2_timestamp_earliest_value_9b2f9400": null, "hs_analytics_source_timestamp_earliest_value_25a3a52c": null, "hs_annual_revenue_currency_code": "USD", "hs_avatar_filemanager_key": null, "hs_created_by_user_id": 12282590, "hs_createdate": null, "hs_date_entered_customer": null, "hs_date_entered_evangelist": null, "hs_date_entered_lead": null, "hs_date_entered_marketingqualifiedlead": null, "hs_date_entered_opportunity": null, "hs_date_entered_other": null, "hs_date_entered_salesqualifiedlead": null, "hs_date_entered_subscriber": null, "hs_date_exited_customer": null, "hs_date_exited_evangelist": null, "hs_date_exited_lead": null, "hs_date_exited_marketingqualifiedlead": null, "hs_date_exited_opportunity": null, "hs_date_exited_other": null, "hs_date_exited_salesqualifiedlead": null, "hs_date_exited_subscriber": null, "hs_ideal_customer_profile": null, "hs_is_target_account": null, "hs_last_booked_meeting_date": null, "hs_last_logged_call_date": null, "hs_last_open_task_date": null, "hs_last_sales_activity_date": null, "hs_last_sales_activity_timestamp": null, "hs_last_sales_activity_type": null, "hs_lastmodifieddate": "2023-01-23T15:41:56.644000+00:00", "hs_latest_createdate_of_active_subscriptions": null, "hs_latest_meeting_activity": null, "hs_lead_status": null, "hs_merged_object_ids": null, "hs_num_blockers": 0, "hs_num_child_companies": 0, "hs_num_contacts_with_buying_roles": 0, "hs_num_decision_makers": 0, "hs_num_open_deals": 0, "hs_object_id": 5000787595, "hs_object_source": null, "hs_object_source_id": null, "hs_object_source_label": null, "hs_object_source_user_id": null, "hs_parent_company_id": null, "hs_pinned_engagement_id": null, "hs_pipeline": null, "hs_predictivecontactscore_v2": null, "hs_predictivecontactscore_v2_next_max_max_d4e58c1e": null, "hs_read_only": null, "hs_sales_email_last_replied": null, "hs_target_account": null, "hs_target_account_probability": 0.4076234698295593, "hs_target_account_recommendation_snooze_time": null, "hs_target_account_recommendation_state": null, "hs_time_in_customer": null, "hs_time_in_evangelist": null, "hs_time_in_lead": null, "hs_time_in_marketingqualifiedlead": null, "hs_time_in_opportunity": null, "hs_time_in_other": null, "hs_time_in_salesqualifiedlead": null, "hs_time_in_subscriber": null, "hs_total_deal_value": null, "hs_unique_creation_key": null, "hs_updated_by_user_id": 12282590, "hs_user_ids_of_all_notification_followers": null, "hs_user_ids_of_all_notification_unfollowers": null, "hs_user_ids_of_all_owners": "12282590", "hs_was_imported": null, "hubspot_owner_assigneddate": "2020-12-11T01:28:27.673000+00:00", "hubspot_owner_id": "52550153", "hubspot_team_id": null, "hubspotscore": null, "industry": null, "is_public": false, "lifecyclestage": null, "linkedin_company_page": "https://www.linkedin.com/company/airbytehq", "linkedinbio": "Airbyte is an open-source data integration platform to build ELT pipelines. Consolidate your data in your data warehouses, lakes and databases.", "name": "Daxtarity", "notes_last_contacted": null, "notes_last_updated": null, "notes_next_activity_date": null, "num_associated_contacts": 0, "num_associated_deals": null, "num_contacted_notes": null, "num_conversion_events": null, "num_conversion_events_cardinality_sum_d095f14b": null, "num_notes": null, "numberofemployees": 50, "phone": "+1 415-307-4864", "recent_conversion_date": null, "recent_conversion_date_timestamp_latest_value_72856da1": null, "recent_conversion_event_name": null, "recent_conversion_event_name_timestamp_latest_value_66c820bf": null, "recent_deal_amount": null, "recent_deal_close_date": null, "state": "CA", "timezone": "America/Los_Angeles", "total_money_raised": null, "total_revenue": null, "twitterbio": null, "twitterfollowers": null, "twitterhandle": "AirbyteHQ", "type": null, "web_technologies": "slack;google_tag_manager;greenhouse;google_analytics;intercom;piwik;google_apps;hubspot;facebook_advertiser", "website": "Daxtarity.com", "zip": "94114"}, "createdAt": "2020-12-11T01:28:27.673Z", "updatedAt": "2023-01-23T15:41:56.644Z", "archived": false, "properties_about_us": null, "properties_address": "2261 Market Street", "properties_address2": null, "properties_annualrevenue": null, "properties_city": "San Francisco", "properties_closedate": null, "properties_closedate_timestamp_earliest_value_a2a17e6e": null, "properties_country": "United States", "properties_createdate": "2020-12-11T01:28:27.673000+00:00", "properties_custom_company_property": null, "properties_days_to_close": null, "properties_description": "Airbyte is an open-source data integration platform to build ELT pipelines. Consolidate your data in your data warehouses, lakes and databases.", "properties_domain": "Daxtarity.com", "properties_engagements_last_meeting_booked": null, "properties_engagements_last_meeting_booked_campaign": null, "properties_engagements_last_meeting_booked_medium": null, "properties_engagements_last_meeting_booked_source": null, "properties_facebook_company_page": null, "properties_facebookfans": null, "properties_first_contact_createdate": null, "properties_first_contact_createdate_timestamp_earliest_value_78b50eea": null, "properties_first_conversion_date": null, "properties_first_conversion_date_timestamp_earliest_value_61f58f2c": null, "properties_first_conversion_event_name": null, "properties_first_conversion_event_name_timestamp_earliest_value_68ddae0a": null, "properties_first_deal_created_date": null, "properties_founded_year": "2020", "properties_googleplus_page": null, "properties_hs_additional_domains": null, "properties_hs_all_accessible_team_ids": null, "properties_hs_all_owner_ids": "52550153", "properties_hs_all_team_ids": null, "properties_hs_analytics_first_timestamp": null, "properties_hs_analytics_first_timestamp_timestamp_earliest_value_11e3a63a": null, "properties_hs_analytics_first_touch_converting_campaign": null, "properties_hs_analytics_first_touch_converting_campaign_timestamp_earliest_value_4757fe10": null, "properties_hs_analytics_first_visit_timestamp": null, "properties_hs_analytics_first_visit_timestamp_timestamp_earliest_value_accc17ae": null, "properties_hs_analytics_last_timestamp": null, "properties_hs_analytics_last_timestamp_timestamp_latest_value_4e16365a": null, "properties_hs_analytics_last_touch_converting_campaign": null, "properties_hs_analytics_last_touch_converting_campaign_timestamp_latest_value_81a64e30": null, "properties_hs_analytics_last_visit_timestamp": null, "properties_hs_analytics_last_visit_timestamp_timestamp_latest_value_999a0fce": null, "properties_hs_analytics_latest_source": "", "properties_hs_analytics_latest_source_data_1": "", "properties_hs_analytics_latest_source_data_2": "", "properties_hs_analytics_latest_source_timestamp": null, "properties_hs_analytics_num_page_views": null, "properties_hs_analytics_num_page_views_cardinality_sum_e46e85b0": null, "properties_hs_analytics_num_visits": null, "properties_hs_analytics_num_visits_cardinality_sum_53d952a6": null, "properties_hs_analytics_source": "", "properties_hs_analytics_source_data_1": "", "properties_hs_analytics_source_data_1_timestamp_earliest_value_9b2f1fa1": null, "properties_hs_analytics_source_data_2": "", "properties_hs_analytics_source_data_2_timestamp_earliest_value_9b2f9400": null, "properties_hs_analytics_source_timestamp_earliest_value_25a3a52c": null, "properties_hs_annual_revenue_currency_code": "USD", "properties_hs_avatar_filemanager_key": null, "properties_hs_created_by_user_id": 12282590, "properties_hs_createdate": null, "properties_hs_date_entered_customer": null, "properties_hs_date_entered_evangelist": null, "properties_hs_date_entered_lead": null, "properties_hs_date_entered_marketingqualifiedlead": null, "properties_hs_date_entered_opportunity": null, "properties_hs_date_entered_other": null, "properties_hs_date_entered_salesqualifiedlead": null, "properties_hs_date_entered_subscriber": null, "properties_hs_date_exited_customer": null, "properties_hs_date_exited_evangelist": null, "properties_hs_date_exited_lead": null, "properties_hs_date_exited_marketingqualifiedlead": null, "properties_hs_date_exited_opportunity": null, "properties_hs_date_exited_other": null, "properties_hs_date_exited_salesqualifiedlead": null, "properties_hs_date_exited_subscriber": null, "properties_hs_ideal_customer_profile": null, "properties_hs_is_target_account": null, "properties_hs_last_booked_meeting_date": null, "properties_hs_last_logged_call_date": null, "properties_hs_last_open_task_date": null, "properties_hs_last_sales_activity_date": null, "properties_hs_last_sales_activity_timestamp": null, "properties_hs_last_sales_activity_type": null, "properties_hs_lastmodifieddate": "2023-01-23T15:41:56.644000+00:00", "properties_hs_latest_createdate_of_active_subscriptions": null, "properties_hs_latest_meeting_activity": null, "properties_hs_lead_status": null, "properties_hs_merged_object_ids": null, "properties_hs_num_blockers": 0, "properties_hs_num_child_companies": 0, "properties_hs_num_contacts_with_buying_roles": 0, "properties_hs_num_decision_makers": 0, "properties_hs_num_open_deals": 0, "properties_hs_object_id": 5000787595, "properties_hs_object_source": null, "properties_hs_object_source_id": null, "properties_hs_object_source_label": null, "properties_hs_object_source_user_id": null, "properties_hs_parent_company_id": null, "properties_hs_pinned_engagement_id": null, "properties_hs_pipeline": null, "properties_hs_predictivecontactscore_v2": null, "properties_hs_predictivecontactscore_v2_next_max_max_d4e58c1e": null, "properties_hs_read_only": null, "properties_hs_sales_email_last_replied": null, "properties_hs_target_account": null, "properties_hs_target_account_probability": 0.4076234698295593, "properties_hs_target_account_recommendation_snooze_time": null, "properties_hs_target_account_recommendation_state": null, "properties_hs_time_in_customer": null, "properties_hs_time_in_evangelist": null, "properties_hs_time_in_lead": null, "properties_hs_time_in_marketingqualifiedlead": null, "properties_hs_time_in_opportunity": null, "properties_hs_time_in_other": null, "properties_hs_time_in_salesqualifiedlead": null, "properties_hs_time_in_subscriber": null, "properties_hs_total_deal_value": null, "properties_hs_unique_creation_key": null, "properties_hs_updated_by_user_id": 12282590, "properties_hs_user_ids_of_all_notification_followers": null, "properties_hs_user_ids_of_all_notification_unfollowers": null, "properties_hs_user_ids_of_all_owners": "12282590", "properties_hs_was_imported": null, "properties_hubspot_owner_assigneddate": "2020-12-11T01:28:27.673000+00:00", "properties_hubspot_owner_id": "52550153", "properties_hubspot_team_id": null, "properties_hubspotscore": null, "properties_industry": null, "properties_is_public": false, "properties_lifecyclestage": null, "properties_linkedin_company_page": "https://www.linkedin.com/company/airbytehq", "properties_linkedinbio": "Airbyte is an open-source data integration platform to build ELT pipelines. Consolidate your data in your data warehouses, lakes and databases.", "properties_name": "Daxtarity", "properties_notes_last_contacted": null, "properties_notes_last_updated": null, "properties_notes_next_activity_date": null, "properties_num_associated_contacts": 0, "properties_num_associated_deals": null, "properties_num_contacted_notes": null, "properties_num_conversion_events": null, "properties_num_conversion_events_cardinality_sum_d095f14b": null, "properties_num_notes": null, "properties_numberofemployees": 50, "properties_phone": "+1 415-307-4864", "properties_recent_conversion_date": null, "properties_recent_conversion_date_timestamp_latest_value_72856da1": null, "properties_recent_conversion_event_name": null, "properties_recent_conversion_event_name_timestamp_latest_value_66c820bf": null, "properties_recent_deal_amount": null, "properties_recent_deal_close_date": null, "properties_state": "CA", "properties_timezone": "America/Los_Angeles", "properties_total_money_raised": null, "properties_total_revenue": null, "properties_twitterbio": null, "properties_twitterfollowers": null, "properties_twitterhandle": "AirbyteHQ", "properties_type": null, "properties_web_technologies": "slack;google_tag_manager;greenhouse;google_analytics;intercom;piwik;google_apps;hubspot;facebook_advertiser", "properties_website": "Daxtarity.com", "properties_zip": "94114"}, "emitted_at": 1697714187363}
+{"stream": "companies", "data": {"id": "4992593519", "properties": {"about_us": null, "address": null, "address2": null, "annualrevenue": null, "city": "San Francisco", "closedate": null, "closedate_timestamp_earliest_value_a2a17e6e": null, "country": "United States", "createdate": "2020-12-10T07:58:09.554000+00:00", "custom_company_property": null, "days_to_close": null, "description": "Airbyte is an open-source data integration platform to build ELT pipelines. Consolidate your data in your data warehouses, lakes and databases.", "domain": "airbyte.io", "engagements_last_meeting_booked": null, "engagements_last_meeting_booked_campaign": null, "engagements_last_meeting_booked_medium": null, "engagements_last_meeting_booked_source": null, "facebook_company_page": null, "facebookfans": null, "first_contact_createdate": null, "first_contact_createdate_timestamp_earliest_value_78b50eea": null, "first_conversion_date": null, "first_conversion_date_timestamp_earliest_value_61f58f2c": null, "first_conversion_event_name": null, "first_conversion_event_name_timestamp_earliest_value_68ddae0a": null, "first_deal_created_date": "2021-05-21T10:17:06.028000+00:00", "founded_year": "2020", "googleplus_page": null, "hs_additional_domains": null, "hs_all_accessible_team_ids": null, "hs_all_owner_ids": "52550153", "hs_all_team_ids": null, "hs_analytics_first_timestamp": null, "hs_analytics_first_timestamp_timestamp_earliest_value_11e3a63a": null, "hs_analytics_first_touch_converting_campaign": null, "hs_analytics_first_touch_converting_campaign_timestamp_earliest_value_4757fe10": null, "hs_analytics_first_visit_timestamp": null, "hs_analytics_first_visit_timestamp_timestamp_earliest_value_accc17ae": null, "hs_analytics_last_timestamp": null, "hs_analytics_last_timestamp_timestamp_latest_value_4e16365a": null, "hs_analytics_last_touch_converting_campaign": null, "hs_analytics_last_touch_converting_campaign_timestamp_latest_value_81a64e30": null, "hs_analytics_last_visit_timestamp": null, "hs_analytics_last_visit_timestamp_timestamp_latest_value_999a0fce": null, "hs_analytics_latest_source": null, "hs_analytics_latest_source_data_1": null, "hs_analytics_latest_source_data_2": null, "hs_analytics_latest_source_timestamp": null, "hs_analytics_num_page_views": null, "hs_analytics_num_page_views_cardinality_sum_e46e85b0": null, "hs_analytics_num_visits": null, "hs_analytics_num_visits_cardinality_sum_53d952a6": null, "hs_analytics_source": null, "hs_analytics_source_data_1": null, "hs_analytics_source_data_1_timestamp_earliest_value_9b2f1fa1": null, "hs_analytics_source_data_2": null, "hs_analytics_source_data_2_timestamp_earliest_value_9b2f9400": null, "hs_analytics_source_timestamp_earliest_value_25a3a52c": null, "hs_annual_revenue_currency_code": "USD", "hs_avatar_filemanager_key": null, "hs_created_by_user_id": 12282590, "hs_createdate": null, "hs_date_entered_customer": null, "hs_date_entered_evangelist": null, "hs_date_entered_lead": null, "hs_date_entered_marketingqualifiedlead": null, "hs_date_entered_opportunity": "2021-05-21T10:17:28.964000+00:00", "hs_date_entered_other": null, "hs_date_entered_salesqualifiedlead": null, "hs_date_entered_subscriber": null, "hs_date_exited_customer": null, "hs_date_exited_evangelist": null, "hs_date_exited_lead": null, "hs_date_exited_marketingqualifiedlead": null, "hs_date_exited_opportunity": null, "hs_date_exited_other": null, "hs_date_exited_salesqualifiedlead": null, "hs_date_exited_subscriber": null, "hs_ideal_customer_profile": null, "hs_is_target_account": null, "hs_last_booked_meeting_date": null, "hs_last_logged_call_date": null, "hs_last_open_task_date": null, "hs_last_sales_activity_date": null, "hs_last_sales_activity_timestamp": null, "hs_last_sales_activity_type": null, "hs_lastmodifieddate": "2023-01-26T11:45:49.817000+00:00", "hs_latest_createdate_of_active_subscriptions": null, "hs_latest_meeting_activity": null, "hs_lead_status": null, "hs_merged_object_ids": null, "hs_num_blockers": null, "hs_num_child_companies": 0, "hs_num_contacts_with_buying_roles": null, "hs_num_decision_makers": null, "hs_num_open_deals": 1, "hs_object_id": 4992593519, "hs_object_source": "CONTACTS", "hs_object_source_id": "CRM_UI", "hs_object_source_label": "CRM_UI", "hs_object_source_user_id": 12282590, "hs_parent_company_id": null, "hs_pinned_engagement_id": null, "hs_pipeline": null, "hs_predictivecontactscore_v2": null, "hs_predictivecontactscore_v2_next_max_max_d4e58c1e": null, "hs_read_only": null, "hs_sales_email_last_replied": null, "hs_target_account": null, "hs_target_account_probability": 0.5476861596107483, "hs_target_account_recommendation_snooze_time": null, "hs_target_account_recommendation_state": null, "hs_time_in_customer": null, "hs_time_in_evangelist": null, "hs_time_in_lead": null, "hs_time_in_marketingqualifiedlead": null, "hs_time_in_opportunity": 84592236724, "hs_time_in_other": null, "hs_time_in_salesqualifiedlead": null, "hs_time_in_subscriber": null, "hs_total_deal_value": null, "hs_unique_creation_key": null, "hs_updated_by_user_id": 12282590, "hs_user_ids_of_all_notification_followers": null, "hs_user_ids_of_all_notification_unfollowers": null, "hs_user_ids_of_all_owners": "12282590", "hs_was_imported": null, "hubspot_owner_assigneddate": "2020-12-10T07:58:09.554000+00:00", "hubspot_owner_id": "52550153", "hubspot_team_id": null, "hubspotscore": null, "industry": null, "is_public": false, "lifecyclestage": "opportunity", "linkedin_company_page": "https://www.linkedin.com/company/airbytehq", "linkedinbio": "Airbyte is an open-source data integration platform to build ELT pipelines. Consolidate your data in your data warehouses, lakes and databases.", "name": "Airbyte test1", "notes_last_contacted": null, "notes_last_updated": null, "notes_next_activity_date": null, "num_associated_contacts": 0, "num_associated_deals": 1, "num_contacted_notes": null, "num_conversion_events": null, "num_conversion_events_cardinality_sum_d095f14b": null, "num_notes": null, "numberofemployees": 200, "phone": "+1 415-307-4864", "recent_conversion_date": null, "recent_conversion_date_timestamp_latest_value_72856da1": null, "recent_conversion_event_name": null, "recent_conversion_event_name_timestamp_latest_value_66c820bf": null, "recent_deal_amount": null, "recent_deal_close_date": null, "state": "CA", "timezone": "America/Los_Angeles", "total_money_raised": null, "total_revenue": null, "twitterbio": null, "twitterfollowers": null, "twitterhandle": "AirbyteHQ", "type": null, "web_technologies": "slack;segment;google_tag_manager;greenhouse;google_analytics;intercom;piwik;google_apps;hubspot;facebook_advertiser", "website": "airbyte.io", "zip": "94114"}, "createdAt": "2020-12-10T07:58:09.554Z", "updatedAt": "2023-01-26T11:45:49.817Z", "archived": false, "properties_about_us": null, "properties_address": null, "properties_address2": null, "properties_annualrevenue": null, "properties_city": "San Francisco", "properties_closedate": null, "properties_closedate_timestamp_earliest_value_a2a17e6e": null, "properties_country": "United States", "properties_createdate": "2020-12-10T07:58:09.554000+00:00", "properties_custom_company_property": null, "properties_days_to_close": null, "properties_description": "Airbyte is an open-source data integration platform to build ELT pipelines. Consolidate your data in your data warehouses, lakes and databases.", "properties_domain": "airbyte.io", "properties_engagements_last_meeting_booked": null, "properties_engagements_last_meeting_booked_campaign": null, "properties_engagements_last_meeting_booked_medium": null, "properties_engagements_last_meeting_booked_source": null, "properties_facebook_company_page": null, "properties_facebookfans": null, "properties_first_contact_createdate": null, "properties_first_contact_createdate_timestamp_earliest_value_78b50eea": null, "properties_first_conversion_date": null, "properties_first_conversion_date_timestamp_earliest_value_61f58f2c": null, "properties_first_conversion_event_name": null, "properties_first_conversion_event_name_timestamp_earliest_value_68ddae0a": null, "properties_first_deal_created_date": "2021-05-21T10:17:06.028000+00:00", "properties_founded_year": "2020", "properties_googleplus_page": null, "properties_hs_additional_domains": null, "properties_hs_all_accessible_team_ids": null, "properties_hs_all_owner_ids": "52550153", "properties_hs_all_team_ids": null, "properties_hs_analytics_first_timestamp": null, "properties_hs_analytics_first_timestamp_timestamp_earliest_value_11e3a63a": null, "properties_hs_analytics_first_touch_converting_campaign": null, "properties_hs_analytics_first_touch_converting_campaign_timestamp_earliest_value_4757fe10": null, "properties_hs_analytics_first_visit_timestamp": null, "properties_hs_analytics_first_visit_timestamp_timestamp_earliest_value_accc17ae": null, "properties_hs_analytics_last_timestamp": null, "properties_hs_analytics_last_timestamp_timestamp_latest_value_4e16365a": null, "properties_hs_analytics_last_touch_converting_campaign": null, "properties_hs_analytics_last_touch_converting_campaign_timestamp_latest_value_81a64e30": null, "properties_hs_analytics_last_visit_timestamp": null, "properties_hs_analytics_last_visit_timestamp_timestamp_latest_value_999a0fce": null, "properties_hs_analytics_latest_source": null, "properties_hs_analytics_latest_source_data_1": null, "properties_hs_analytics_latest_source_data_2": null, "properties_hs_analytics_latest_source_timestamp": null, "properties_hs_analytics_num_page_views": null, "properties_hs_analytics_num_page_views_cardinality_sum_e46e85b0": null, "properties_hs_analytics_num_visits": null, "properties_hs_analytics_num_visits_cardinality_sum_53d952a6": null, "properties_hs_analytics_source": null, "properties_hs_analytics_source_data_1": null, "properties_hs_analytics_source_data_1_timestamp_earliest_value_9b2f1fa1": null, "properties_hs_analytics_source_data_2": null, "properties_hs_analytics_source_data_2_timestamp_earliest_value_9b2f9400": null, "properties_hs_analytics_source_timestamp_earliest_value_25a3a52c": null, "properties_hs_annual_revenue_currency_code": "USD", "properties_hs_avatar_filemanager_key": null, "properties_hs_created_by_user_id": 12282590, "properties_hs_createdate": null, "properties_hs_date_entered_customer": null, "properties_hs_date_entered_evangelist": null, "properties_hs_date_entered_lead": null, "properties_hs_date_entered_marketingqualifiedlead": null, "properties_hs_date_entered_opportunity": "2021-05-21T10:17:28.964000+00:00", "properties_hs_date_entered_other": null, "properties_hs_date_entered_salesqualifiedlead": null, "properties_hs_date_entered_subscriber": null, "properties_hs_date_exited_customer": null, "properties_hs_date_exited_evangelist": null, "properties_hs_date_exited_lead": null, "properties_hs_date_exited_marketingqualifiedlead": null, "properties_hs_date_exited_opportunity": null, "properties_hs_date_exited_other": null, "properties_hs_date_exited_salesqualifiedlead": null, "properties_hs_date_exited_subscriber": null, "properties_hs_ideal_customer_profile": null, "properties_hs_is_target_account": null, "properties_hs_last_booked_meeting_date": null, "properties_hs_last_logged_call_date": null, "properties_hs_last_open_task_date": null, "properties_hs_last_sales_activity_date": null, "properties_hs_last_sales_activity_timestamp": null, "properties_hs_last_sales_activity_type": null, "properties_hs_lastmodifieddate": "2023-01-26T11:45:49.817000+00:00", "properties_hs_latest_createdate_of_active_subscriptions": null, "properties_hs_latest_meeting_activity": null, "properties_hs_lead_status": null, "properties_hs_merged_object_ids": null, "properties_hs_num_blockers": null, "properties_hs_num_child_companies": 0, "properties_hs_num_contacts_with_buying_roles": null, "properties_hs_num_decision_makers": null, "properties_hs_num_open_deals": 1, "properties_hs_object_id": 4992593519, "properties_hs_object_source": "CONTACTS", "properties_hs_object_source_id": "CRM_UI", "properties_hs_object_source_label": "CRM_UI", "properties_hs_object_source_user_id": 12282590, "properties_hs_parent_company_id": null, "properties_hs_pinned_engagement_id": null, "properties_hs_pipeline": null, "properties_hs_predictivecontactscore_v2": null, "properties_hs_predictivecontactscore_v2_next_max_max_d4e58c1e": null, "properties_hs_read_only": null, "properties_hs_sales_email_last_replied": null, "properties_hs_target_account": null, "properties_hs_target_account_probability": 0.5476861596107483, "properties_hs_target_account_recommendation_snooze_time": null, "properties_hs_target_account_recommendation_state": null, "properties_hs_time_in_customer": null, "properties_hs_time_in_evangelist": null, "properties_hs_time_in_lead": null, "properties_hs_time_in_marketingqualifiedlead": null, "properties_hs_time_in_opportunity": 84592236724, "properties_hs_time_in_other": null, "properties_hs_time_in_salesqualifiedlead": null, "properties_hs_time_in_subscriber": null, "properties_hs_total_deal_value": null, "properties_hs_unique_creation_key": null, "properties_hs_updated_by_user_id": 12282590, "properties_hs_user_ids_of_all_notification_followers": null, "properties_hs_user_ids_of_all_notification_unfollowers": null, "properties_hs_user_ids_of_all_owners": "12282590", "properties_hs_was_imported": null, "properties_hubspot_owner_assigneddate": "2020-12-10T07:58:09.554000+00:00", "properties_hubspot_owner_id": "52550153", "properties_hubspot_team_id": null, "properties_hubspotscore": null, "properties_industry": null, "properties_is_public": false, "properties_lifecyclestage": "opportunity", "properties_linkedin_company_page": "https://www.linkedin.com/company/airbytehq", "properties_linkedinbio": "Airbyte is an open-source data integration platform to build ELT pipelines. Consolidate your data in your data warehouses, lakes and databases.", "properties_name": "Airbyte test1", "properties_notes_last_contacted": null, "properties_notes_last_updated": null, "properties_notes_next_activity_date": null, "properties_num_associated_contacts": 0, "properties_num_associated_deals": 1, "properties_num_contacted_notes": null, "properties_num_conversion_events": null, "properties_num_conversion_events_cardinality_sum_d095f14b": null, "properties_num_notes": null, "properties_numberofemployees": 200, "properties_phone": "+1 415-307-4864", "properties_recent_conversion_date": null, "properties_recent_conversion_date_timestamp_latest_value_72856da1": null, "properties_recent_conversion_event_name": null, "properties_recent_conversion_event_name_timestamp_latest_value_66c820bf": null, "properties_recent_deal_amount": null, "properties_recent_deal_close_date": null, "properties_state": "CA", "properties_timezone": "America/Los_Angeles", "properties_total_money_raised": null, "properties_total_revenue": null, "properties_twitterbio": null, "properties_twitterfollowers": null, "properties_twitterhandle": "AirbyteHQ", "properties_type": null, "properties_web_technologies": "slack;segment;google_tag_manager;greenhouse;google_analytics;intercom;piwik;google_apps;hubspot;facebook_advertiser", "properties_website": "airbyte.io", "properties_zip": "94114"}, "emitted_at": 1706184485995}
+{"stream": "companies", "data": {"id": "5000526215", "properties": {"about_us": null, "address": null, "address2": null, "annualrevenue": null, "city": "San Francisco", "closedate": "2023-04-04T15:00:58.081000+00:00", "closedate_timestamp_earliest_value_a2a17e6e": null, "country": "United States", "createdate": "2020-12-11T01:27:40.002000+00:00", "custom_company_property": null, "days_to_close": 844, "description": "Airbyte is an open-source data integration platform to build ELT pipelines. Consolidate your data in your data warehouses, lakes and databases.", "domain": "dataline.io", "engagements_last_meeting_booked": null, "engagements_last_meeting_booked_campaign": null, "engagements_last_meeting_booked_medium": null, "engagements_last_meeting_booked_source": null, "facebook_company_page": null, "facebookfans": null, "first_contact_createdate": "2020-12-11T01:29:50.116000+00:00", "first_contact_createdate_timestamp_earliest_value_78b50eea": null, "first_conversion_date": null, "first_conversion_date_timestamp_earliest_value_61f58f2c": null, "first_conversion_event_name": null, "first_conversion_event_name_timestamp_earliest_value_68ddae0a": null, "first_deal_created_date": "2021-01-13T10:30:42.221000+00:00", "founded_year": "2020", "googleplus_page": null, "hs_additional_domains": null, "hs_all_accessible_team_ids": null, "hs_all_owner_ids": "52550153", "hs_all_team_ids": null, "hs_analytics_first_timestamp": "2020-12-11T01:29:50.116000+00:00", "hs_analytics_first_timestamp_timestamp_earliest_value_11e3a63a": null, "hs_analytics_first_touch_converting_campaign": null, "hs_analytics_first_touch_converting_campaign_timestamp_earliest_value_4757fe10": null, "hs_analytics_first_visit_timestamp": null, "hs_analytics_first_visit_timestamp_timestamp_earliest_value_accc17ae": null, "hs_analytics_last_timestamp": null, "hs_analytics_last_timestamp_timestamp_latest_value_4e16365a": null, "hs_analytics_last_touch_converting_campaign": null, "hs_analytics_last_touch_converting_campaign_timestamp_latest_value_81a64e30": null, "hs_analytics_last_visit_timestamp": null, "hs_analytics_last_visit_timestamp_timestamp_latest_value_999a0fce": null, "hs_analytics_latest_source": "OFFLINE", "hs_analytics_latest_source_data_1": "CONTACTS", "hs_analytics_latest_source_data_2": "CRM_UI", "hs_analytics_latest_source_timestamp": "2020-12-11T01:29:50.153000+00:00", "hs_analytics_num_page_views": 0, "hs_analytics_num_page_views_cardinality_sum_e46e85b0": null, "hs_analytics_num_visits": 0, "hs_analytics_num_visits_cardinality_sum_53d952a6": null, "hs_analytics_source": "OFFLINE", "hs_analytics_source_data_1": "CONTACTS", "hs_analytics_source_data_1_timestamp_earliest_value_9b2f1fa1": null, "hs_analytics_source_data_2": "CRM_UI", "hs_analytics_source_data_2_timestamp_earliest_value_9b2f9400": null, "hs_analytics_source_timestamp_earliest_value_25a3a52c": null, "hs_annual_revenue_currency_code": "USD", "hs_avatar_filemanager_key": null, "hs_created_by_user_id": 12282590, "hs_createdate": null, "hs_date_entered_customer": "2023-04-04T15:00:58.081000+00:00", "hs_date_entered_evangelist": null, "hs_date_entered_lead": null, "hs_date_entered_marketingqualifiedlead": null, "hs_date_entered_opportunity": "2021-02-23T20:21:06.027000+00:00", "hs_date_entered_other": null, "hs_date_entered_salesqualifiedlead": null, "hs_date_entered_subscriber": null, "hs_date_exited_customer": null, "hs_date_exited_evangelist": null, "hs_date_exited_lead": null, "hs_date_exited_marketingqualifiedlead": null, "hs_date_exited_opportunity": "2023-04-04T15:00:58.081000+00:00", "hs_date_exited_other": null, "hs_date_exited_salesqualifiedlead": null, "hs_date_exited_subscriber": null, "hs_ideal_customer_profile": null, "hs_is_target_account": null, "hs_last_booked_meeting_date": null, "hs_last_logged_call_date": null, "hs_last_open_task_date": null, "hs_last_sales_activity_date": null, "hs_last_sales_activity_timestamp": null, "hs_last_sales_activity_type": null, "hs_lastmodifieddate": "2023-09-07T03:58:14.126000+00:00", "hs_latest_createdate_of_active_subscriptions": null, "hs_latest_meeting_activity": null, "hs_lead_status": null, "hs_merged_object_ids": "5183403213", "hs_num_blockers": 0, "hs_num_child_companies": 0, "hs_num_contacts_with_buying_roles": 0, "hs_num_decision_makers": 0, "hs_num_open_deals": 2, "hs_object_id": 5000526215, "hs_object_source": "CONTACTS", "hs_object_source_id": "CRM_UI", "hs_object_source_label": "CRM_UI", "hs_object_source_user_id": 12282590, "hs_parent_company_id": null, "hs_pinned_engagement_id": null, "hs_pipeline": "companies-lifecycle-pipeline", "hs_predictivecontactscore_v2": 0.3, "hs_predictivecontactscore_v2_next_max_max_d4e58c1e": null, "hs_read_only": null, "hs_sales_email_last_replied": null, "hs_target_account": null, "hs_target_account_probability": 0.46257445216178894, "hs_target_account_recommendation_snooze_time": null, "hs_target_account_recommendation_state": null, "hs_time_in_customer": 25564027612, "hs_time_in_evangelist": null, "hs_time_in_lead": null, "hs_time_in_marketingqualifiedlead": null, "hs_time_in_opportunity": 66508792054, "hs_time_in_other": null, "hs_time_in_salesqualifiedlead": null, "hs_time_in_subscriber": null, "hs_total_deal_value": 60010, "hs_unique_creation_key": null, "hs_updated_by_user_id": 12282590, "hs_user_ids_of_all_notification_followers": null, "hs_user_ids_of_all_notification_unfollowers": null, "hs_user_ids_of_all_owners": "12282590", "hs_was_imported": null, "hubspot_owner_assigneddate": "2020-12-11T01:27:40.002000+00:00", "hubspot_owner_id": "52550153", "hubspot_team_id": null, "hubspotscore": null, "industry": null, "is_public": false, "lifecyclestage": "customer", "linkedin_company_page": "https://www.linkedin.com/company/airbytehq", "linkedinbio": "Airbyte is an open-source data integration platform to build ELT pipelines. Consolidate your data in your data warehouses, lakes and databases.", "name": "Dataline", "notes_last_contacted": null, "notes_last_updated": null, "notes_next_activity_date": null, "num_associated_contacts": 1, "num_associated_deals": 3, "num_contacted_notes": null, "num_conversion_events": null, "num_conversion_events_cardinality_sum_d095f14b": null, "num_notes": null, "numberofemployees": 25, "phone": "", "recent_conversion_date": null, "recent_conversion_date_timestamp_latest_value_72856da1": null, "recent_conversion_event_name": null, "recent_conversion_event_name_timestamp_latest_value_66c820bf": null, "recent_deal_amount": 60000, "recent_deal_close_date": "2023-04-04T14:59:45.103000+00:00", "state": "CA", "timezone": "America/Los_Angeles", "total_money_raised": null, "total_revenue": 60000, "twitterbio": null, "twitterfollowers": null, "twitterhandle": "AirbyteHQ", "type": null, "web_technologies": "slack;segment;google_tag_manager;cloud_flare;google_analytics;intercom;lever;google_apps", "website": "dataline.io", "zip": ""}, "createdAt": "2020-12-11T01:27:40.002Z", "updatedAt": "2023-09-07T03:58:14.126Z", "archived": false, "contacts": ["151", "151"], "properties_about_us": null, "properties_address": null, "properties_address2": null, "properties_annualrevenue": null, "properties_city": "San Francisco", "properties_closedate": "2023-04-04T15:00:58.081000+00:00", "properties_closedate_timestamp_earliest_value_a2a17e6e": null, "properties_country": "United States", "properties_createdate": "2020-12-11T01:27:40.002000+00:00", "properties_custom_company_property": null, "properties_days_to_close": 844, "properties_description": "Airbyte is an open-source data integration platform to build ELT pipelines. Consolidate your data in your data warehouses, lakes and databases.", "properties_domain": "dataline.io", "properties_engagements_last_meeting_booked": null, "properties_engagements_last_meeting_booked_campaign": null, "properties_engagements_last_meeting_booked_medium": null, "properties_engagements_last_meeting_booked_source": null, "properties_facebook_company_page": null, "properties_facebookfans": null, "properties_first_contact_createdate": "2020-12-11T01:29:50.116000+00:00", "properties_first_contact_createdate_timestamp_earliest_value_78b50eea": null, "properties_first_conversion_date": null, "properties_first_conversion_date_timestamp_earliest_value_61f58f2c": null, "properties_first_conversion_event_name": null, "properties_first_conversion_event_name_timestamp_earliest_value_68ddae0a": null, "properties_first_deal_created_date": "2021-01-13T10:30:42.221000+00:00", "properties_founded_year": "2020", "properties_googleplus_page": null, "properties_hs_additional_domains": null, "properties_hs_all_accessible_team_ids": null, "properties_hs_all_owner_ids": "52550153", "properties_hs_all_team_ids": null, "properties_hs_analytics_first_timestamp": "2020-12-11T01:29:50.116000+00:00", "properties_hs_analytics_first_timestamp_timestamp_earliest_value_11e3a63a": null, "properties_hs_analytics_first_touch_converting_campaign": null, "properties_hs_analytics_first_touch_converting_campaign_timestamp_earliest_value_4757fe10": null, "properties_hs_analytics_first_visit_timestamp": null, "properties_hs_analytics_first_visit_timestamp_timestamp_earliest_value_accc17ae": null, "properties_hs_analytics_last_timestamp": null, "properties_hs_analytics_last_timestamp_timestamp_latest_value_4e16365a": null, "properties_hs_analytics_last_touch_converting_campaign": null, "properties_hs_analytics_last_touch_converting_campaign_timestamp_latest_value_81a64e30": null, "properties_hs_analytics_last_visit_timestamp": null, "properties_hs_analytics_last_visit_timestamp_timestamp_latest_value_999a0fce": null, "properties_hs_analytics_latest_source": "OFFLINE", "properties_hs_analytics_latest_source_data_1": "CONTACTS", "properties_hs_analytics_latest_source_data_2": "CRM_UI", "properties_hs_analytics_latest_source_timestamp": "2020-12-11T01:29:50.153000+00:00", "properties_hs_analytics_num_page_views": 0, "properties_hs_analytics_num_page_views_cardinality_sum_e46e85b0": null, "properties_hs_analytics_num_visits": 0, "properties_hs_analytics_num_visits_cardinality_sum_53d952a6": null, "properties_hs_analytics_source": "OFFLINE", "properties_hs_analytics_source_data_1": "CONTACTS", "properties_hs_analytics_source_data_1_timestamp_earliest_value_9b2f1fa1": null, "properties_hs_analytics_source_data_2": "CRM_UI", "properties_hs_analytics_source_data_2_timestamp_earliest_value_9b2f9400": null, "properties_hs_analytics_source_timestamp_earliest_value_25a3a52c": null, "properties_hs_annual_revenue_currency_code": "USD", "properties_hs_avatar_filemanager_key": null, "properties_hs_created_by_user_id": 12282590, "properties_hs_createdate": null, "properties_hs_date_entered_customer": "2023-04-04T15:00:58.081000+00:00", "properties_hs_date_entered_evangelist": null, "properties_hs_date_entered_lead": null, "properties_hs_date_entered_marketingqualifiedlead": null, "properties_hs_date_entered_opportunity": "2021-02-23T20:21:06.027000+00:00", "properties_hs_date_entered_other": null, "properties_hs_date_entered_salesqualifiedlead": null, "properties_hs_date_entered_subscriber": null, "properties_hs_date_exited_customer": null, "properties_hs_date_exited_evangelist": null, "properties_hs_date_exited_lead": null, "properties_hs_date_exited_marketingqualifiedlead": null, "properties_hs_date_exited_opportunity": "2023-04-04T15:00:58.081000+00:00", "properties_hs_date_exited_other": null, "properties_hs_date_exited_salesqualifiedlead": null, "properties_hs_date_exited_subscriber": null, "properties_hs_ideal_customer_profile": null, "properties_hs_is_target_account": null, "properties_hs_last_booked_meeting_date": null, "properties_hs_last_logged_call_date": null, "properties_hs_last_open_task_date": null, "properties_hs_last_sales_activity_date": null, "properties_hs_last_sales_activity_timestamp": null, "properties_hs_last_sales_activity_type": null, "properties_hs_lastmodifieddate": "2023-09-07T03:58:14.126000+00:00", "properties_hs_latest_createdate_of_active_subscriptions": null, "properties_hs_latest_meeting_activity": null, "properties_hs_lead_status": null, "properties_hs_merged_object_ids": "5183403213", "properties_hs_num_blockers": 0, "properties_hs_num_child_companies": 0, "properties_hs_num_contacts_with_buying_roles": 0, "properties_hs_num_decision_makers": 0, "properties_hs_num_open_deals": 2, "properties_hs_object_id": 5000526215, "properties_hs_object_source": "CONTACTS", "properties_hs_object_source_id": "CRM_UI", "properties_hs_object_source_label": "CRM_UI", "properties_hs_object_source_user_id": 12282590, "properties_hs_parent_company_id": null, "properties_hs_pinned_engagement_id": null, "properties_hs_pipeline": "companies-lifecycle-pipeline", "properties_hs_predictivecontactscore_v2": 0.3, "properties_hs_predictivecontactscore_v2_next_max_max_d4e58c1e": null, "properties_hs_read_only": null, "properties_hs_sales_email_last_replied": null, "properties_hs_target_account": null, "properties_hs_target_account_probability": 0.46257445216178894, "properties_hs_target_account_recommendation_snooze_time": null, "properties_hs_target_account_recommendation_state": null, "properties_hs_time_in_customer": 25564027612, "properties_hs_time_in_evangelist": null, "properties_hs_time_in_lead": null, "properties_hs_time_in_marketingqualifiedlead": null, "properties_hs_time_in_opportunity": 66508792054, "properties_hs_time_in_other": null, "properties_hs_time_in_salesqualifiedlead": null, "properties_hs_time_in_subscriber": null, "properties_hs_total_deal_value": 60010, "properties_hs_unique_creation_key": null, "properties_hs_updated_by_user_id": 12282590, "properties_hs_user_ids_of_all_notification_followers": null, "properties_hs_user_ids_of_all_notification_unfollowers": null, "properties_hs_user_ids_of_all_owners": "12282590", "properties_hs_was_imported": null, "properties_hubspot_owner_assigneddate": "2020-12-11T01:27:40.002000+00:00", "properties_hubspot_owner_id": "52550153", "properties_hubspot_team_id": null, "properties_hubspotscore": null, "properties_industry": null, "properties_is_public": false, "properties_lifecyclestage": "customer", "properties_linkedin_company_page": "https://www.linkedin.com/company/airbytehq", "properties_linkedinbio": "Airbyte is an open-source data integration platform to build ELT pipelines. Consolidate your data in your data warehouses, lakes and databases.", "properties_name": "Dataline", "properties_notes_last_contacted": null, "properties_notes_last_updated": null, "properties_notes_next_activity_date": null, "properties_num_associated_contacts": 1, "properties_num_associated_deals": 3, "properties_num_contacted_notes": null, "properties_num_conversion_events": null, "properties_num_conversion_events_cardinality_sum_d095f14b": null, "properties_num_notes": null, "properties_numberofemployees": 25, "properties_phone": "", "properties_recent_conversion_date": null, "properties_recent_conversion_date_timestamp_latest_value_72856da1": null, "properties_recent_conversion_event_name": null, "properties_recent_conversion_event_name_timestamp_latest_value_66c820bf": null, "properties_recent_deal_amount": 60000, "properties_recent_deal_close_date": "2023-04-04T14:59:45.103000+00:00", "properties_state": "CA", "properties_timezone": "America/Los_Angeles", "properties_total_money_raised": null, "properties_total_revenue": 60000, "properties_twitterbio": null, "properties_twitterfollowers": null, "properties_twitterhandle": "AirbyteHQ", "properties_type": null, "properties_web_technologies": "slack;segment;google_tag_manager;cloud_flare;google_analytics;intercom;lever;google_apps", "properties_website": "dataline.io", "properties_zip": ""}, "emitted_at": 1706184485997}
+{"stream": "companies", "data": {"id": "5000787595", "properties": {"about_us": null, "address": "2261 Market Street", "address2": null, "annualrevenue": null, "city": "San Francisco", "closedate": null, "closedate_timestamp_earliest_value_a2a17e6e": null, "country": "United States", "createdate": "2020-12-11T01:28:27.673000+00:00", "custom_company_property": null, "days_to_close": null, "description": "Airbyte is an open-source data integration platform to build ELT pipelines. Consolidate your data in your data warehouses, lakes and databases.", "domain": "Daxtarity.com", "engagements_last_meeting_booked": null, "engagements_last_meeting_booked_campaign": null, "engagements_last_meeting_booked_medium": null, "engagements_last_meeting_booked_source": null, "facebook_company_page": null, "facebookfans": null, "first_contact_createdate": null, "first_contact_createdate_timestamp_earliest_value_78b50eea": null, "first_conversion_date": null, "first_conversion_date_timestamp_earliest_value_61f58f2c": null, "first_conversion_event_name": null, "first_conversion_event_name_timestamp_earliest_value_68ddae0a": null, "first_deal_created_date": null, "founded_year": "2020", "googleplus_page": null, "hs_additional_domains": null, "hs_all_accessible_team_ids": null, "hs_all_owner_ids": "52550153", "hs_all_team_ids": null, "hs_analytics_first_timestamp": null, "hs_analytics_first_timestamp_timestamp_earliest_value_11e3a63a": null, "hs_analytics_first_touch_converting_campaign": null, "hs_analytics_first_touch_converting_campaign_timestamp_earliest_value_4757fe10": null, "hs_analytics_first_visit_timestamp": null, "hs_analytics_first_visit_timestamp_timestamp_earliest_value_accc17ae": null, "hs_analytics_last_timestamp": null, "hs_analytics_last_timestamp_timestamp_latest_value_4e16365a": null, "hs_analytics_last_touch_converting_campaign": null, "hs_analytics_last_touch_converting_campaign_timestamp_latest_value_81a64e30": null, "hs_analytics_last_visit_timestamp": null, "hs_analytics_last_visit_timestamp_timestamp_latest_value_999a0fce": null, "hs_analytics_latest_source": "", "hs_analytics_latest_source_data_1": "", "hs_analytics_latest_source_data_2": "", "hs_analytics_latest_source_timestamp": null, "hs_analytics_num_page_views": null, "hs_analytics_num_page_views_cardinality_sum_e46e85b0": null, "hs_analytics_num_visits": null, "hs_analytics_num_visits_cardinality_sum_53d952a6": null, "hs_analytics_source": "", "hs_analytics_source_data_1": "", "hs_analytics_source_data_1_timestamp_earliest_value_9b2f1fa1": null, "hs_analytics_source_data_2": "", "hs_analytics_source_data_2_timestamp_earliest_value_9b2f9400": null, "hs_analytics_source_timestamp_earliest_value_25a3a52c": null, "hs_annual_revenue_currency_code": "USD", "hs_avatar_filemanager_key": null, "hs_created_by_user_id": 12282590, "hs_createdate": null, "hs_date_entered_customer": null, "hs_date_entered_evangelist": null, "hs_date_entered_lead": null, "hs_date_entered_marketingqualifiedlead": null, "hs_date_entered_opportunity": null, "hs_date_entered_other": null, "hs_date_entered_salesqualifiedlead": null, "hs_date_entered_subscriber": null, "hs_date_exited_customer": null, "hs_date_exited_evangelist": null, "hs_date_exited_lead": null, "hs_date_exited_marketingqualifiedlead": null, "hs_date_exited_opportunity": null, "hs_date_exited_other": null, "hs_date_exited_salesqualifiedlead": null, "hs_date_exited_subscriber": null, "hs_ideal_customer_profile": null, "hs_is_target_account": null, "hs_last_booked_meeting_date": null, "hs_last_logged_call_date": null, "hs_last_open_task_date": null, "hs_last_sales_activity_date": null, "hs_last_sales_activity_timestamp": null, "hs_last_sales_activity_type": null, "hs_lastmodifieddate": "2023-01-23T15:41:56.644000+00:00", "hs_latest_createdate_of_active_subscriptions": null, "hs_latest_meeting_activity": null, "hs_lead_status": null, "hs_merged_object_ids": null, "hs_num_blockers": 0, "hs_num_child_companies": 0, "hs_num_contacts_with_buying_roles": 0, "hs_num_decision_makers": 0, "hs_num_open_deals": 0, "hs_object_id": 5000787595, "hs_object_source": "CONTACTS", "hs_object_source_id": "CRM_UI", "hs_object_source_label": "CRM_UI", "hs_object_source_user_id": 12282590, "hs_parent_company_id": null, "hs_pinned_engagement_id": null, "hs_pipeline": null, "hs_predictivecontactscore_v2": null, "hs_predictivecontactscore_v2_next_max_max_d4e58c1e": null, "hs_read_only": null, "hs_sales_email_last_replied": null, "hs_target_account": null, "hs_target_account_probability": 0.4076234698295593, "hs_target_account_recommendation_snooze_time": null, "hs_target_account_recommendation_state": null, "hs_time_in_customer": null, "hs_time_in_evangelist": null, "hs_time_in_lead": null, "hs_time_in_marketingqualifiedlead": null, "hs_time_in_opportunity": null, "hs_time_in_other": null, "hs_time_in_salesqualifiedlead": null, "hs_time_in_subscriber": null, "hs_total_deal_value": null, "hs_unique_creation_key": null, "hs_updated_by_user_id": 12282590, "hs_user_ids_of_all_notification_followers": null, "hs_user_ids_of_all_notification_unfollowers": null, "hs_user_ids_of_all_owners": "12282590", "hs_was_imported": null, "hubspot_owner_assigneddate": "2020-12-11T01:28:27.673000+00:00", "hubspot_owner_id": "52550153", "hubspot_team_id": null, "hubspotscore": null, "industry": null, "is_public": false, "lifecyclestage": null, "linkedin_company_page": "https://www.linkedin.com/company/airbytehq", "linkedinbio": "Airbyte is an open-source data integration platform to build ELT pipelines. Consolidate your data in your data warehouses, lakes and databases.", "name": "Daxtarity", "notes_last_contacted": null, "notes_last_updated": null, "notes_next_activity_date": null, "num_associated_contacts": 0, "num_associated_deals": null, "num_contacted_notes": null, "num_conversion_events": null, "num_conversion_events_cardinality_sum_d095f14b": null, "num_notes": null, "numberofemployees": 50, "phone": "+1 415-307-4864", "recent_conversion_date": null, "recent_conversion_date_timestamp_latest_value_72856da1": null, "recent_conversion_event_name": null, "recent_conversion_event_name_timestamp_latest_value_66c820bf": null, "recent_deal_amount": null, "recent_deal_close_date": null, "state": "CA", "timezone": "America/Los_Angeles", "total_money_raised": null, "total_revenue": null, "twitterbio": null, "twitterfollowers": null, "twitterhandle": "AirbyteHQ", "type": null, "web_technologies": "slack;google_tag_manager;greenhouse;google_analytics;intercom;piwik;google_apps;hubspot;facebook_advertiser", "website": "Daxtarity.com", "zip": "94114"}, "createdAt": "2020-12-11T01:28:27.673Z", "updatedAt": "2023-01-23T15:41:56.644Z", "archived": false, "properties_about_us": null, "properties_address": "2261 Market Street", "properties_address2": null, "properties_annualrevenue": null, "properties_city": "San Francisco", "properties_closedate": null, "properties_closedate_timestamp_earliest_value_a2a17e6e": null, "properties_country": "United States", "properties_createdate": "2020-12-11T01:28:27.673000+00:00", "properties_custom_company_property": null, "properties_days_to_close": null, "properties_description": "Airbyte is an open-source data integration platform to build ELT pipelines. Consolidate your data in your data warehouses, lakes and databases.", "properties_domain": "Daxtarity.com", "properties_engagements_last_meeting_booked": null, "properties_engagements_last_meeting_booked_campaign": null, "properties_engagements_last_meeting_booked_medium": null, "properties_engagements_last_meeting_booked_source": null, "properties_facebook_company_page": null, "properties_facebookfans": null, "properties_first_contact_createdate": null, "properties_first_contact_createdate_timestamp_earliest_value_78b50eea": null, "properties_first_conversion_date": null, "properties_first_conversion_date_timestamp_earliest_value_61f58f2c": null, "properties_first_conversion_event_name": null, "properties_first_conversion_event_name_timestamp_earliest_value_68ddae0a": null, "properties_first_deal_created_date": null, "properties_founded_year": "2020", "properties_googleplus_page": null, "properties_hs_additional_domains": null, "properties_hs_all_accessible_team_ids": null, "properties_hs_all_owner_ids": "52550153", "properties_hs_all_team_ids": null, "properties_hs_analytics_first_timestamp": null, "properties_hs_analytics_first_timestamp_timestamp_earliest_value_11e3a63a": null, "properties_hs_analytics_first_touch_converting_campaign": null, "properties_hs_analytics_first_touch_converting_campaign_timestamp_earliest_value_4757fe10": null, "properties_hs_analytics_first_visit_timestamp": null, "properties_hs_analytics_first_visit_timestamp_timestamp_earliest_value_accc17ae": null, "properties_hs_analytics_last_timestamp": null, "properties_hs_analytics_last_timestamp_timestamp_latest_value_4e16365a": null, "properties_hs_analytics_last_touch_converting_campaign": null, "properties_hs_analytics_last_touch_converting_campaign_timestamp_latest_value_81a64e30": null, "properties_hs_analytics_last_visit_timestamp": null, "properties_hs_analytics_last_visit_timestamp_timestamp_latest_value_999a0fce": null, "properties_hs_analytics_latest_source": "", "properties_hs_analytics_latest_source_data_1": "", "properties_hs_analytics_latest_source_data_2": "", "properties_hs_analytics_latest_source_timestamp": null, "properties_hs_analytics_num_page_views": null, "properties_hs_analytics_num_page_views_cardinality_sum_e46e85b0": null, "properties_hs_analytics_num_visits": null, "properties_hs_analytics_num_visits_cardinality_sum_53d952a6": null, "properties_hs_analytics_source": "", "properties_hs_analytics_source_data_1": "", "properties_hs_analytics_source_data_1_timestamp_earliest_value_9b2f1fa1": null, "properties_hs_analytics_source_data_2": "", "properties_hs_analytics_source_data_2_timestamp_earliest_value_9b2f9400": null, "properties_hs_analytics_source_timestamp_earliest_value_25a3a52c": null, "properties_hs_annual_revenue_currency_code": "USD", "properties_hs_avatar_filemanager_key": null, "properties_hs_created_by_user_id": 12282590, "properties_hs_createdate": null, "properties_hs_date_entered_customer": null, "properties_hs_date_entered_evangelist": null, "properties_hs_date_entered_lead": null, "properties_hs_date_entered_marketingqualifiedlead": null, "properties_hs_date_entered_opportunity": null, "properties_hs_date_entered_other": null, "properties_hs_date_entered_salesqualifiedlead": null, "properties_hs_date_entered_subscriber": null, "properties_hs_date_exited_customer": null, "properties_hs_date_exited_evangelist": null, "properties_hs_date_exited_lead": null, "properties_hs_date_exited_marketingqualifiedlead": null, "properties_hs_date_exited_opportunity": null, "properties_hs_date_exited_other": null, "properties_hs_date_exited_salesqualifiedlead": null, "properties_hs_date_exited_subscriber": null, "properties_hs_ideal_customer_profile": null, "properties_hs_is_target_account": null, "properties_hs_last_booked_meeting_date": null, "properties_hs_last_logged_call_date": null, "properties_hs_last_open_task_date": null, "properties_hs_last_sales_activity_date": null, "properties_hs_last_sales_activity_timestamp": null, "properties_hs_last_sales_activity_type": null, "properties_hs_lastmodifieddate": "2023-01-23T15:41:56.644000+00:00", "properties_hs_latest_createdate_of_active_subscriptions": null, "properties_hs_latest_meeting_activity": null, "properties_hs_lead_status": null, "properties_hs_merged_object_ids": null, "properties_hs_num_blockers": 0, "properties_hs_num_child_companies": 0, "properties_hs_num_contacts_with_buying_roles": 0, "properties_hs_num_decision_makers": 0, "properties_hs_num_open_deals": 0, "properties_hs_object_id": 5000787595, "properties_hs_object_source": "CONTACTS", "properties_hs_object_source_id": "CRM_UI", "properties_hs_object_source_label": "CRM_UI", "properties_hs_object_source_user_id": 12282590, "properties_hs_parent_company_id": null, "properties_hs_pinned_engagement_id": null, "properties_hs_pipeline": null, "properties_hs_predictivecontactscore_v2": null, "properties_hs_predictivecontactscore_v2_next_max_max_d4e58c1e": null, "properties_hs_read_only": null, "properties_hs_sales_email_last_replied": null, "properties_hs_target_account": null, "properties_hs_target_account_probability": 0.4076234698295593, "properties_hs_target_account_recommendation_snooze_time": null, "properties_hs_target_account_recommendation_state": null, "properties_hs_time_in_customer": null, "properties_hs_time_in_evangelist": null, "properties_hs_time_in_lead": null, "properties_hs_time_in_marketingqualifiedlead": null, "properties_hs_time_in_opportunity": null, "properties_hs_time_in_other": null, "properties_hs_time_in_salesqualifiedlead": null, "properties_hs_time_in_subscriber": null, "properties_hs_total_deal_value": null, "properties_hs_unique_creation_key": null, "properties_hs_updated_by_user_id": 12282590, "properties_hs_user_ids_of_all_notification_followers": null, "properties_hs_user_ids_of_all_notification_unfollowers": null, "properties_hs_user_ids_of_all_owners": "12282590", "properties_hs_was_imported": null, "properties_hubspot_owner_assigneddate": "2020-12-11T01:28:27.673000+00:00", "properties_hubspot_owner_id": "52550153", "properties_hubspot_team_id": null, "properties_hubspotscore": null, "properties_industry": null, "properties_is_public": false, "properties_lifecyclestage": null, "properties_linkedin_company_page": "https://www.linkedin.com/company/airbytehq", "properties_linkedinbio": "Airbyte is an open-source data integration platform to build ELT pipelines. Consolidate your data in your data warehouses, lakes and databases.", "properties_name": "Daxtarity", "properties_notes_last_contacted": null, "properties_notes_last_updated": null, "properties_notes_next_activity_date": null, "properties_num_associated_contacts": 0, "properties_num_associated_deals": null, "properties_num_contacted_notes": null, "properties_num_conversion_events": null, "properties_num_conversion_events_cardinality_sum_d095f14b": null, "properties_num_notes": null, "properties_numberofemployees": 50, "properties_phone": "+1 415-307-4864", "properties_recent_conversion_date": null, "properties_recent_conversion_date_timestamp_latest_value_72856da1": null, "properties_recent_conversion_event_name": null, "properties_recent_conversion_event_name_timestamp_latest_value_66c820bf": null, "properties_recent_deal_amount": null, "properties_recent_deal_close_date": null, "properties_state": "CA", "properties_timezone": "America/Los_Angeles", "properties_total_money_raised": null, "properties_total_revenue": null, "properties_twitterbio": null, "properties_twitterfollowers": null, "properties_twitterhandle": "AirbyteHQ", "properties_type": null, "properties_web_technologies": "slack;google_tag_manager;greenhouse;google_analytics;intercom;piwik;google_apps;hubspot;facebook_advertiser", "properties_website": "Daxtarity.com", "properties_zip": "94114"}, "emitted_at": 1706184485998}
 {"stream": "contact_lists", "data": {"portalId": 8727216, "listId": 1, "createdAt": 1610634707370, "updatedAt": 1610634721116, "name": "tweeters", "listType": "DYNAMIC", "authorId": 0, "filters": [], "metaData": {"size": 0, "lastSizeChangeAt": 1625270400000, "processing": "DONE", "lastProcessingStateChangeAt": 1610634721950, "error": "", "listReferencesCount": null, "parentFolderId": null}, "archived": false, "teamIds": [], "ilsFilterBranch": "{\"filterBranchOperator\":\"OR\",\"filters\":[],\"filterBranches\":[{\"filterBranchOperator\":\"AND\",\"filters\":[{\"filterType\":\"PROPERTY\",\"property\":\"twitterhandle\",\"operation\":{\"propertyType\":\"string\",\"operator\":\"IS_EQUAL_TO\",\"value\":\"@hubspot\",\"defaultValue\":null,\"includeObjectsWithNoValueSet\":false,\"operationType\":\"string\",\"operatorName\":\"IS_EQUAL_TO\"},\"frameworkFilterId\":null}],\"filterBranches\":[],\"filterBranchType\":\"AND\"}],\"filterBranchType\":\"OR\"}", "readOnly": false, "dynamic": true, "internal": false, "limitExempt": false, "metaData_size": 0, "metaData_lastSizeChangeAt": 1625270400000, "metaData_processing": "DONE", "metaData_lastProcessingStateChangeAt": 1610634721950, "metaData_error": "", "metaData_listReferencesCount": null, "metaData_parentFolderId": null}, "emitted_at": 1697714189110}
 {"stream": "contact_lists", "data": {"portalId": 8727216, "listId": 2, "createdAt": 1610634770432, "updatedAt": 1610634780637, "name": "tweeters 1", "listType": "DYNAMIC", "authorId": 0, "filters": [], "metaData": {"size": 0, "lastSizeChangeAt": 1625270400000, "processing": "DONE", "lastProcessingStateChangeAt": 1610634781147, "error": "", "listReferencesCount": null, "parentFolderId": null}, "archived": false, "teamIds": [], "ilsFilterBranch": "{\"filterBranchOperator\":\"OR\",\"filters\":[],\"filterBranches\":[{\"filterBranchOperator\":\"AND\",\"filters\":[{\"filterType\":\"PROPERTY\",\"property\":\"twitterhandle\",\"operation\":{\"propertyType\":\"string\",\"operator\":\"IS_EQUAL_TO\",\"value\":\"@hubspot\",\"defaultValue\":null,\"includeObjectsWithNoValueSet\":false,\"operationType\":\"string\",\"operatorName\":\"IS_EQUAL_TO\"},\"frameworkFilterId\":null}],\"filterBranches\":[],\"filterBranchType\":\"AND\"}],\"filterBranchType\":\"OR\"}", "readOnly": false, "dynamic": true, "internal": false, "limitExempt": false, "metaData_size": 0, "metaData_lastSizeChangeAt": 1625270400000, "metaData_processing": "DONE", "metaData_lastProcessingStateChangeAt": 1610634781147, "metaData_error": "", "metaData_listReferencesCount": null, "metaData_parentFolderId": null}, "emitted_at": 1697714189112}
 {"stream": "contact_lists", "data": {"portalId": 8727216, "listId": 3, "createdAt": 1610634774356, "updatedAt": 1610634787734, "name": "tweeters 2", "listType": "DYNAMIC", "authorId": 0, "filters": [], "metaData": {"size": 0, "lastSizeChangeAt": 1625270400000, "processing": "DONE", "lastProcessingStateChangeAt": 1610634788528, "error": "", "listReferencesCount": null, "parentFolderId": null}, "archived": false, "teamIds": [], "ilsFilterBranch": "{\"filterBranchOperator\":\"OR\",\"filters\":[],\"filterBranches\":[{\"filterBranchOperator\":\"AND\",\"filters\":[{\"filterType\":\"PROPERTY\",\"property\":\"twitterhandle\",\"operation\":{\"propertyType\":\"string\",\"operator\":\"IS_EQUAL_TO\",\"value\":\"@hubspot\",\"defaultValue\":null,\"includeObjectsWithNoValueSet\":false,\"operationType\":\"string\",\"operatorName\":\"IS_EQUAL_TO\"},\"frameworkFilterId\":null}],\"filterBranches\":[],\"filterBranchType\":\"AND\"}],\"filterBranchType\":\"OR\"}", "readOnly": false, "dynamic": true, "internal": false, "limitExempt": false, "metaData_size": 0, "metaData_lastSizeChangeAt": 1625270400000, "metaData_processing": "DONE", "metaData_lastProcessingStateChangeAt": 1610634788528, "metaData_error": "", "metaData_listReferencesCount": null, "metaData_parentFolderId": null}, "emitted_at": 1697714189113}
-{"stream": "contacts", "data": {"id": "151", "properties": {"address": null, "annualrevenue": null, "associatedcompanyid": 5000526215, "associatedcompanylastupdated": null, "city": null, "closedate": null, "company": null, "company_size": null, "country": null, "createdate": "2020-12-11T01:29:50.116000+00:00", "currentlyinworkflow": null, "date_of_birth": null, "days_to_close": null, "degree": null, "email": "shef@dne.io", "engagements_last_meeting_booked": null, "engagements_last_meeting_booked_campaign": null, "engagements_last_meeting_booked_medium": null, "engagements_last_meeting_booked_source": null, "fax": null, "field_of_study": null, "first_conversion_date": null, "first_conversion_event_name": null, "first_deal_created_date": null, "firstname": "she", "gender": null, "graduation_date": null, "hs_additional_emails": null, "hs_all_accessible_team_ids": null, "hs_all_contact_vids": "151", "hs_all_owner_ids": "52550153", "hs_all_team_ids": null, "hs_analytics_average_page_views": 0, "hs_analytics_first_referrer": null, "hs_analytics_first_timestamp": "2020-12-11T01:29:50.116000+00:00", "hs_analytics_first_touch_converting_campaign": null, "hs_analytics_first_url": null, "hs_analytics_first_visit_timestamp": null, "hs_analytics_last_referrer": null, "hs_analytics_last_timestamp": null, "hs_analytics_last_touch_converting_campaign": null, "hs_analytics_last_url": null, "hs_analytics_last_visit_timestamp": null, "hs_analytics_num_event_completions": 0, "hs_analytics_num_page_views": 0, "hs_analytics_num_visits": 0, "hs_analytics_revenue": 0.0, "hs_analytics_source": "OFFLINE", "hs_analytics_source_data_1": "CONTACTS", "hs_analytics_source_data_2": "CRM_UI", "hs_avatar_filemanager_key": null, "hs_buying_role": null, "hs_calculated_form_submissions": null, "hs_calculated_merged_vids": null, "hs_calculated_mobile_number": null, "hs_calculated_phone_number": null, "hs_calculated_phone_number_area_code": null, "hs_calculated_phone_number_country_code": null, "hs_calculated_phone_number_region_code": null, "hs_clicked_linkedin_ad": null, "hs_content_membership_email": null, "hs_content_membership_email_confirmed": null, "hs_content_membership_notes": null, "hs_content_membership_registered_at": null, "hs_content_membership_registration_domain_sent_to": null, "hs_content_membership_registration_email_sent_at": null, "hs_content_membership_status": null, "hs_conversations_visitor_email": null, "hs_count_is_unworked": 1, "hs_count_is_worked": 0, "hs_created_by_conversations": null, "hs_created_by_user_id": null, "hs_createdate": null, "hs_date_entered_customer": null, "hs_date_entered_evangelist": null, "hs_date_entered_lead": null, "hs_date_entered_marketingqualifiedlead": null, "hs_date_entered_opportunity": null, "hs_date_entered_other": null, "hs_date_entered_salesqualifiedlead": null, "hs_date_entered_subscriber": "2020-12-11T01:29:50.116000+00:00", "hs_date_exited_customer": null, "hs_date_exited_evangelist": null, "hs_date_exited_lead": null, "hs_date_exited_marketingqualifiedlead": null, "hs_date_exited_opportunity": null, "hs_date_exited_other": null, "hs_date_exited_salesqualifiedlead": null, "hs_date_exited_subscriber": null, "hs_document_last_revisited": null, "hs_email_bad_address": null, "hs_email_bounce": null, "hs_email_click": null, "hs_email_customer_quarantined_reason": null, "hs_email_delivered": null, "hs_email_domain": "dne.io", "hs_email_first_click_date": null, "hs_email_first_open_date": null, "hs_email_first_reply_date": null, "hs_email_first_send_date": null, "hs_email_hard_bounce_reason": null, "hs_email_hard_bounce_reason_enum": null, "hs_email_is_ineligible": null, "hs_email_last_click_date": null, "hs_email_last_email_name": null, "hs_email_last_open_date": null, "hs_email_last_reply_date": null, "hs_email_last_send_date": null, "hs_email_open": null, "hs_email_optout": null, "hs_email_optout_10798197": null, "hs_email_optout_11890603": null, "hs_email_optout_11890831": null, "hs_email_optout_23704464": null, "hs_email_optout_94692364": null, "hs_email_quarantined": null, "hs_email_quarantined_reason": null, "hs_email_recipient_fatigue_recovery_time": null, "hs_email_replied": null, "hs_email_sends_since_last_engagement": null, "hs_emailconfirmationstatus": null, "hs_facebook_ad_clicked": null, "hs_facebook_click_id": null, "hs_feedback_last_nps_follow_up": null, "hs_feedback_last_nps_rating": null, "hs_feedback_last_survey_date": null, "hs_feedback_show_nps_web_survey": null, "hs_first_engagement_object_id": null, "hs_first_outreach_date": null, "hs_first_subscription_create_date": null, "hs_google_click_id": null, "hs_has_active_subscription": null, "hs_ip_timezone": null, "hs_is_contact": true, "hs_is_unworked": true, "hs_language": null, "hs_last_sales_activity_date": null, "hs_last_sales_activity_timestamp": null, "hs_last_sales_activity_type": null, "hs_lastmodifieddate": null, "hs_latest_disqualified_lead_date": null, "hs_latest_meeting_activity": null, "hs_latest_open_lead_date": null, "hs_latest_qualified_lead_date": null, "hs_latest_sequence_ended_date": null, "hs_latest_sequence_enrolled": null, "hs_latest_sequence_enrolled_date": null, "hs_latest_sequence_finished_date": null, "hs_latest_sequence_unenrolled_date": null, "hs_latest_source": "OFFLINE", "hs_latest_source_data_1": "CONTACTS", "hs_latest_source_data_2": "CRM_UI", "hs_latest_source_timestamp": "2020-12-11T01:29:50.153000+00:00", "hs_latest_subscription_create_date": null, "hs_lead_status": null, "hs_legal_basis": null, "hs_lifecyclestage_customer_date": null, "hs_lifecyclestage_evangelist_date": null, "hs_lifecyclestage_lead_date": null, "hs_lifecyclestage_marketingqualifiedlead_date": null, "hs_lifecyclestage_opportunity_date": null, "hs_lifecyclestage_other_date": null, "hs_lifecyclestage_salesqualifiedlead_date": null, "hs_lifecyclestage_subscriber_date": "2020-12-11T01:29:50.116000+00:00", "hs_linkedin_ad_clicked": null, "hs_marketable_reason_id": null, "hs_marketable_reason_type": null, "hs_marketable_status": "false", "hs_marketable_until_renewal": "false", "hs_merged_object_ids": null, "hs_object_id": 151, "hs_object_source": null, "hs_object_source_id": null, "hs_object_source_label": null, "hs_object_source_user_id": null, "hs_persona": null, "hs_pinned_engagement_id": null, "hs_pipeline": "contacts-lifecycle-pipeline", "hs_predictivecontactscore": null, "hs_predictivecontactscore_v2": 0.3, "hs_predictivecontactscorebucket": null, "hs_predictivescoringtier": "tier_3", "hs_read_only": null, "hs_sa_first_engagement_date": null, "hs_sa_first_engagement_descr": null, "hs_sa_first_engagement_object_type": null, "hs_sales_email_last_clicked": null, "hs_sales_email_last_opened": null, "hs_sales_email_last_replied": null, "hs_searchable_calculated_international_mobile_number": null, "hs_searchable_calculated_international_phone_number": null, "hs_searchable_calculated_mobile_number": null, "hs_searchable_calculated_phone_number": null, "hs_sequences_actively_enrolled_count": null, "hs_sequences_enrolled_count": null, "hs_sequences_is_enrolled": null, "hs_testpurge": null, "hs_testrollback": null, "hs_time_between_contact_creation_and_deal_close": null, "hs_time_between_contact_creation_and_deal_creation": null, "hs_time_in_customer": null, "hs_time_in_evangelist": null, "hs_time_in_lead": null, "hs_time_in_marketingqualifiedlead": null, "hs_time_in_opportunity": null, "hs_time_in_other": null, "hs_time_in_salesqualifiedlead": null, "hs_time_in_subscriber": 94172907549, "hs_time_to_first_engagement": null, "hs_time_to_move_from_lead_to_customer": null, "hs_time_to_move_from_marketingqualifiedlead_to_customer": null, "hs_time_to_move_from_opportunity_to_customer": null, "hs_time_to_move_from_salesqualifiedlead_to_customer": null, "hs_time_to_move_from_subscriber_to_customer": null, "hs_timezone": null, "hs_unique_creation_key": null, "hs_updated_by_user_id": 12282590, "hs_user_ids_of_all_notification_followers": null, "hs_user_ids_of_all_notification_unfollowers": null, "hs_user_ids_of_all_owners": "12282590", "hs_v2_cumulative_time_in_customer": null, "hs_v2_cumulative_time_in_evangelist": null, "hs_v2_cumulative_time_in_lead": null, "hs_v2_cumulative_time_in_marketingqualifiedlead": null, "hs_v2_cumulative_time_in_opportunity": null, "hs_v2_cumulative_time_in_other": null, "hs_v2_cumulative_time_in_salesqualifiedlead": null, "hs_v2_cumulative_time_in_subscriber": null, "hs_v2_date_entered_customer": null, "hs_v2_date_entered_evangelist": null, "hs_v2_date_entered_lead": null, "hs_v2_date_entered_marketingqualifiedlead": null, "hs_v2_date_entered_opportunity": null, "hs_v2_date_entered_other": null, "hs_v2_date_entered_salesqualifiedlead": null, "hs_v2_date_entered_subscriber": "2020-12-11T01:29:50.116000+00:00", "hs_v2_date_exited_customer": null, "hs_v2_date_exited_evangelist": null, "hs_v2_date_exited_lead": null, "hs_v2_date_exited_marketingqualifiedlead": null, "hs_v2_date_exited_opportunity": null, "hs_v2_date_exited_other": null, "hs_v2_date_exited_salesqualifiedlead": null, "hs_v2_date_exited_subscriber": null, "hs_v2_latest_time_in_customer": null, "hs_v2_latest_time_in_evangelist": null, "hs_v2_latest_time_in_lead": null, "hs_v2_latest_time_in_marketingqualifiedlead": null, "hs_v2_latest_time_in_opportunity": null, "hs_v2_latest_time_in_other": null, "hs_v2_latest_time_in_salesqualifiedlead": null, "hs_v2_latest_time_in_subscriber": null, "hs_was_imported": null, "hs_whatsapp_phone_number": null, "hubspot_owner_assigneddate": "2020-12-11T01:29:50.093000+00:00", "hubspot_owner_id": "52550153", "hubspot_team_id": null, "hubspotscore": null, "industry": null, "ip_city": null, "ip_country": null, "ip_country_code": null, "ip_latlon": null, "ip_state": null, "ip_state_code": null, "ip_zipcode": null, "job_function": null, "jobtitle": null, "lastmodifieddate": "2023-11-22T21:10:04.346000+00:00", "lastname": "nad", "lifecyclestage": "subscriber", "marital_status": null, "message": null, "military_status": null, "mobilephone": null, "my_custom_test_property": null, "notes_last_contacted": null, "notes_last_updated": null, "notes_next_activity_date": null, "num_associated_deals": null, "num_contacted_notes": null, "num_conversion_events": 0, "num_notes": null, "num_unique_conversion_events": 0, "numemployees": null, "phone": null, "recent_conversion_date": null, "recent_conversion_event_name": null, "recent_deal_amount": null, "recent_deal_close_date": null, "relationship_status": null, "salutation": null, "school": null, "seniority": null, "start_date": null, "state": null, "surveymonkeyeventlastupdated": null, "test": null, "total_revenue": null, "twitterhandle": null, "webinareventlastupdated": null, "website": null, "work_email": null, "zip": null}, "createdAt": "2020-12-11T01:29:50.116Z", "updatedAt": "2023-11-22T21:10:04.346Z", "archived": false, "companies": ["5000526215", "5000526215"], "properties_address": null, "properties_annualrevenue": null, "properties_associatedcompanyid": 5000526215, "properties_associatedcompanylastupdated": null, "properties_city": null, "properties_closedate": null, "properties_company": null, "properties_company_size": null, "properties_country": null, "properties_createdate": "2020-12-11T01:29:50.116000+00:00", "properties_currentlyinworkflow": null, "properties_date_of_birth": null, "properties_days_to_close": null, "properties_degree": null, "properties_email": "shef@dne.io", "properties_engagements_last_meeting_booked": null, "properties_engagements_last_meeting_booked_campaign": null, "properties_engagements_last_meeting_booked_medium": null, "properties_engagements_last_meeting_booked_source": null, "properties_fax": null, "properties_field_of_study": null, "properties_first_conversion_date": null, "properties_first_conversion_event_name": null, "properties_first_deal_created_date": null, "properties_firstname": "she", "properties_gender": null, "properties_graduation_date": null, "properties_hs_additional_emails": null, "properties_hs_all_accessible_team_ids": null, "properties_hs_all_contact_vids": "151", "properties_hs_all_owner_ids": "52550153", "properties_hs_all_team_ids": null, "properties_hs_analytics_average_page_views": 0, "properties_hs_analytics_first_referrer": null, "properties_hs_analytics_first_timestamp": "2020-12-11T01:29:50.116000+00:00", "properties_hs_analytics_first_touch_converting_campaign": null, "properties_hs_analytics_first_url": null, "properties_hs_analytics_first_visit_timestamp": null, "properties_hs_analytics_last_referrer": null, "properties_hs_analytics_last_timestamp": null, "properties_hs_analytics_last_touch_converting_campaign": null, "properties_hs_analytics_last_url": null, "properties_hs_analytics_last_visit_timestamp": null, "properties_hs_analytics_num_event_completions": 0, "properties_hs_analytics_num_page_views": 0, "properties_hs_analytics_num_visits": 0, "properties_hs_analytics_revenue": 0.0, "properties_hs_analytics_source": "OFFLINE", "properties_hs_analytics_source_data_1": "CONTACTS", "properties_hs_analytics_source_data_2": "CRM_UI", "properties_hs_avatar_filemanager_key": null, "properties_hs_buying_role": null, "properties_hs_calculated_form_submissions": null, "properties_hs_calculated_merged_vids": null, "properties_hs_calculated_mobile_number": null, "properties_hs_calculated_phone_number": null, "properties_hs_calculated_phone_number_area_code": null, "properties_hs_calculated_phone_number_country_code": null, "properties_hs_calculated_phone_number_region_code": null, "properties_hs_clicked_linkedin_ad": null, "properties_hs_content_membership_email": null, "properties_hs_content_membership_email_confirmed": null, "properties_hs_content_membership_notes": null, "properties_hs_content_membership_registered_at": null, "properties_hs_content_membership_registration_domain_sent_to": null, "properties_hs_content_membership_registration_email_sent_at": null, "properties_hs_content_membership_status": null, "properties_hs_conversations_visitor_email": null, "properties_hs_count_is_unworked": 1, "properties_hs_count_is_worked": 0, "properties_hs_created_by_conversations": null, "properties_hs_created_by_user_id": null, "properties_hs_createdate": null, "properties_hs_date_entered_customer": null, "properties_hs_date_entered_evangelist": null, "properties_hs_date_entered_lead": null, "properties_hs_date_entered_marketingqualifiedlead": null, "properties_hs_date_entered_opportunity": null, "properties_hs_date_entered_other": null, "properties_hs_date_entered_salesqualifiedlead": null, "properties_hs_date_entered_subscriber": "2020-12-11T01:29:50.116000+00:00", "properties_hs_date_exited_customer": null, "properties_hs_date_exited_evangelist": null, "properties_hs_date_exited_lead": null, "properties_hs_date_exited_marketingqualifiedlead": null, "properties_hs_date_exited_opportunity": null, "properties_hs_date_exited_other": null, "properties_hs_date_exited_salesqualifiedlead": null, "properties_hs_date_exited_subscriber": null, "properties_hs_document_last_revisited": null, "properties_hs_email_bad_address": null, "properties_hs_email_bounce": null, "properties_hs_email_click": null, "properties_hs_email_customer_quarantined_reason": null, "properties_hs_email_delivered": null, "properties_hs_email_domain": "dne.io", "properties_hs_email_first_click_date": null, "properties_hs_email_first_open_date": null, "properties_hs_email_first_reply_date": null, "properties_hs_email_first_send_date": null, "properties_hs_email_hard_bounce_reason": null, "properties_hs_email_hard_bounce_reason_enum": null, "properties_hs_email_is_ineligible": null, "properties_hs_email_last_click_date": null, "properties_hs_email_last_email_name": null, "properties_hs_email_last_open_date": null, "properties_hs_email_last_reply_date": null, "properties_hs_email_last_send_date": null, "properties_hs_email_open": null, "properties_hs_email_optout": null, "properties_hs_email_optout_10798197": null, "properties_hs_email_optout_11890603": null, "properties_hs_email_optout_11890831": null, "properties_hs_email_optout_23704464": null, "properties_hs_email_optout_94692364": null, "properties_hs_email_quarantined": null, "properties_hs_email_quarantined_reason": null, "properties_hs_email_recipient_fatigue_recovery_time": null, "properties_hs_email_replied": null, "properties_hs_email_sends_since_last_engagement": null, "properties_hs_emailconfirmationstatus": null, "properties_hs_facebook_ad_clicked": null, "properties_hs_facebook_click_id": null, "properties_hs_feedback_last_nps_follow_up": null, "properties_hs_feedback_last_nps_rating": null, "properties_hs_feedback_last_survey_date": null, "properties_hs_feedback_show_nps_web_survey": null, "properties_hs_first_engagement_object_id": null, "properties_hs_first_outreach_date": null, "properties_hs_first_subscription_create_date": null, "properties_hs_google_click_id": null, "properties_hs_has_active_subscription": null, "properties_hs_ip_timezone": null, "properties_hs_is_contact": true, "properties_hs_is_unworked": true, "properties_hs_language": null, "properties_hs_last_sales_activity_date": null, "properties_hs_last_sales_activity_timestamp": null, "properties_hs_last_sales_activity_type": null, "properties_hs_lastmodifieddate": null, "properties_hs_latest_disqualified_lead_date": null, "properties_hs_latest_meeting_activity": null, "properties_hs_latest_open_lead_date": null, "properties_hs_latest_qualified_lead_date": null, "properties_hs_latest_sequence_ended_date": null, "properties_hs_latest_sequence_enrolled": null, "properties_hs_latest_sequence_enrolled_date": null, "properties_hs_latest_sequence_finished_date": null, "properties_hs_latest_sequence_unenrolled_date": null, "properties_hs_latest_source": "OFFLINE", "properties_hs_latest_source_data_1": "CONTACTS", "properties_hs_latest_source_data_2": "CRM_UI", "properties_hs_latest_source_timestamp": "2020-12-11T01:29:50.153000+00:00", "properties_hs_latest_subscription_create_date": null, "properties_hs_lead_status": null, "properties_hs_legal_basis": null, "properties_hs_lifecyclestage_customer_date": null, "properties_hs_lifecyclestage_evangelist_date": null, "properties_hs_lifecyclestage_lead_date": null, "properties_hs_lifecyclestage_marketingqualifiedlead_date": null, "properties_hs_lifecyclestage_opportunity_date": null, "properties_hs_lifecyclestage_other_date": null, "properties_hs_lifecyclestage_salesqualifiedlead_date": null, "properties_hs_lifecyclestage_subscriber_date": "2020-12-11T01:29:50.116000+00:00", "properties_hs_linkedin_ad_clicked": null, "properties_hs_marketable_reason_id": null, "properties_hs_marketable_reason_type": null, "properties_hs_marketable_status": "false", "properties_hs_marketable_until_renewal": "false", "properties_hs_merged_object_ids": null, "properties_hs_object_id": 151, "properties_hs_object_source": null, "properties_hs_object_source_id": null, "properties_hs_object_source_label": null, "properties_hs_object_source_user_id": null, "properties_hs_persona": null, "properties_hs_pinned_engagement_id": null, "properties_hs_pipeline": "contacts-lifecycle-pipeline", "properties_hs_predictivecontactscore": null, "properties_hs_predictivecontactscore_v2": 0.3, "properties_hs_predictivecontactscorebucket": null, "properties_hs_predictivescoringtier": "tier_3", "properties_hs_read_only": null, "properties_hs_sa_first_engagement_date": null, "properties_hs_sa_first_engagement_descr": null, "properties_hs_sa_first_engagement_object_type": null, "properties_hs_sales_email_last_clicked": null, "properties_hs_sales_email_last_opened": null, "properties_hs_sales_email_last_replied": null, "properties_hs_searchable_calculated_international_mobile_number": null, "properties_hs_searchable_calculated_international_phone_number": null, "properties_hs_searchable_calculated_mobile_number": null, "properties_hs_searchable_calculated_phone_number": null, "properties_hs_sequences_actively_enrolled_count": null, "properties_hs_sequences_enrolled_count": null, "properties_hs_sequences_is_enrolled": null, "properties_hs_testpurge": null, "properties_hs_testrollback": null, "properties_hs_time_between_contact_creation_and_deal_close": null, "properties_hs_time_between_contact_creation_and_deal_creation": null, "properties_hs_time_in_customer": null, "properties_hs_time_in_evangelist": null, "properties_hs_time_in_lead": null, "properties_hs_time_in_marketingqualifiedlead": null, "properties_hs_time_in_opportunity": null, "properties_hs_time_in_other": null, "properties_hs_time_in_salesqualifiedlead": null, "properties_hs_time_in_subscriber": 94172907549, "properties_hs_time_to_first_engagement": null, "properties_hs_time_to_move_from_lead_to_customer": null, "properties_hs_time_to_move_from_marketingqualifiedlead_to_customer": null, "properties_hs_time_to_move_from_opportunity_to_customer": null, "properties_hs_time_to_move_from_salesqualifiedlead_to_customer": null, "properties_hs_time_to_move_from_subscriber_to_customer": null, "properties_hs_timezone": null, "properties_hs_unique_creation_key": null, "properties_hs_updated_by_user_id": 12282590, "properties_hs_user_ids_of_all_notification_followers": null, "properties_hs_user_ids_of_all_notification_unfollowers": null, "properties_hs_user_ids_of_all_owners": "12282590", "properties_hs_v2_cumulative_time_in_customer": null, "properties_hs_v2_cumulative_time_in_evangelist": null, "properties_hs_v2_cumulative_time_in_lead": null, "properties_hs_v2_cumulative_time_in_marketingqualifiedlead": null, "properties_hs_v2_cumulative_time_in_opportunity": null, "properties_hs_v2_cumulative_time_in_other": null, "properties_hs_v2_cumulative_time_in_salesqualifiedlead": null, "properties_hs_v2_cumulative_time_in_subscriber": null, "properties_hs_v2_date_entered_customer": null, "properties_hs_v2_date_entered_evangelist": null, "properties_hs_v2_date_entered_lead": null, "properties_hs_v2_date_entered_marketingqualifiedlead": null, "properties_hs_v2_date_entered_opportunity": null, "properties_hs_v2_date_entered_other": null, "properties_hs_v2_date_entered_salesqualifiedlead": null, "properties_hs_v2_date_entered_subscriber": "2020-12-11T01:29:50.116000+00:00", "properties_hs_v2_date_exited_customer": null, "properties_hs_v2_date_exited_evangelist": null, "properties_hs_v2_date_exited_lead": null, "properties_hs_v2_date_exited_marketingqualifiedlead": null, "properties_hs_v2_date_exited_opportunity": null, "properties_hs_v2_date_exited_other": null, "properties_hs_v2_date_exited_salesqualifiedlead": null, "properties_hs_v2_date_exited_subscriber": null, "properties_hs_v2_latest_time_in_customer": null, "properties_hs_v2_latest_time_in_evangelist": null, "properties_hs_v2_latest_time_in_lead": null, "properties_hs_v2_latest_time_in_marketingqualifiedlead": null, "properties_hs_v2_latest_time_in_opportunity": null, "properties_hs_v2_latest_time_in_other": null, "properties_hs_v2_latest_time_in_salesqualifiedlead": null, "properties_hs_v2_latest_time_in_subscriber": null, "properties_hs_was_imported": null, "properties_hs_whatsapp_phone_number": null, "properties_hubspot_owner_assigneddate": "2020-12-11T01:29:50.093000+00:00", "properties_hubspot_owner_id": "52550153", "properties_hubspot_team_id": null, "properties_hubspotscore": null, "properties_industry": null, "properties_ip_city": null, "properties_ip_country": null, "properties_ip_country_code": null, "properties_ip_latlon": null, "properties_ip_state": null, "properties_ip_state_code": null, "properties_ip_zipcode": null, "properties_job_function": null, "properties_jobtitle": null, "properties_lastmodifieddate": "2023-11-22T21:10:04.346000+00:00", "properties_lastname": "nad", "properties_lifecyclestage": "subscriber", "properties_marital_status": null, "properties_message": null, "properties_military_status": null, "properties_mobilephone": null, "properties_my_custom_test_property": null, "properties_notes_last_contacted": null, "properties_notes_last_updated": null, "properties_notes_next_activity_date": null, "properties_num_associated_deals": null, "properties_num_contacted_notes": null, "properties_num_conversion_events": 0, "properties_num_notes": null, "properties_num_unique_conversion_events": 0, "properties_numemployees": null, "properties_phone": null, "properties_recent_conversion_date": null, "properties_recent_conversion_event_name": null, "properties_recent_deal_amount": null, "properties_recent_deal_close_date": null, "properties_relationship_status": null, "properties_salutation": null, "properties_school": null, "properties_seniority": null, "properties_start_date": null, "properties_state": null, "properties_surveymonkeyeventlastupdated": null, "properties_test": null, "properties_total_revenue": null, "properties_twitterhandle": null, "properties_webinareventlastupdated": null, "properties_website": null, "properties_work_email": null, "properties_zip": null}, "emitted_at": 1701823098427}
-{"stream": "contacts", "data": {"id": "251", "properties": {"address": "25000000 First Street", "annualrevenue": null, "associatedcompanyid": 5170561229, "associatedcompanylastupdated": null, "city": "Cambridge", "closedate": null, "company": "HubSpot", "company_size": null, "country": "USA", "createdate": "2021-02-22T14:05:09.944000+00:00", "currentlyinworkflow": null, "date_of_birth": null, "days_to_close": null, "degree": null, "email": "testingdsapis@hubspot.com", "engagements_last_meeting_booked": null, "engagements_last_meeting_booked_campaign": null, "engagements_last_meeting_booked_medium": null, "engagements_last_meeting_booked_source": null, "fax": null, "field_of_study": null, "first_conversion_date": null, "first_conversion_event_name": null, "first_deal_created_date": null, "firstname": "Test User 5001", "gender": null, "graduation_date": null, "hs_additional_emails": null, "hs_all_accessible_team_ids": null, "hs_all_contact_vids": "251", "hs_all_owner_ids": null, "hs_all_team_ids": null, "hs_analytics_average_page_views": 0, "hs_analytics_first_referrer": null, "hs_analytics_first_timestamp": "2021-02-22T14:05:09.944000+00:00", "hs_analytics_first_touch_converting_campaign": null, "hs_analytics_first_url": null, "hs_analytics_first_visit_timestamp": null, "hs_analytics_last_referrer": null, "hs_analytics_last_timestamp": null, "hs_analytics_last_touch_converting_campaign": null, "hs_analytics_last_url": null, "hs_analytics_last_visit_timestamp": null, "hs_analytics_num_event_completions": 0, "hs_analytics_num_page_views": 0, "hs_analytics_num_visits": 0, "hs_analytics_revenue": 0.0, "hs_analytics_source": "OFFLINE", "hs_analytics_source_data_1": "API", "hs_analytics_source_data_2": null, "hs_avatar_filemanager_key": null, "hs_buying_role": null, "hs_calculated_form_submissions": null, "hs_calculated_merged_vids": null, "hs_calculated_mobile_number": null, "hs_calculated_phone_number": null, "hs_calculated_phone_number_area_code": null, "hs_calculated_phone_number_country_code": null, "hs_calculated_phone_number_region_code": null, "hs_clicked_linkedin_ad": null, "hs_content_membership_email": null, "hs_content_membership_email_confirmed": null, "hs_content_membership_notes": null, "hs_content_membership_registered_at": null, "hs_content_membership_registration_domain_sent_to": null, "hs_content_membership_registration_email_sent_at": null, "hs_content_membership_status": null, "hs_conversations_visitor_email": null, "hs_count_is_unworked": null, "hs_count_is_worked": null, "hs_created_by_conversations": null, "hs_created_by_user_id": null, "hs_createdate": null, "hs_date_entered_customer": null, "hs_date_entered_evangelist": null, "hs_date_entered_lead": null, "hs_date_entered_marketingqualifiedlead": null, "hs_date_entered_opportunity": null, "hs_date_entered_other": null, "hs_date_entered_salesqualifiedlead": null, "hs_date_entered_subscriber": "2021-02-22T14:05:09.944000+00:00", "hs_date_exited_customer": null, "hs_date_exited_evangelist": null, "hs_date_exited_lead": null, "hs_date_exited_marketingqualifiedlead": null, "hs_date_exited_opportunity": null, "hs_date_exited_other": null, "hs_date_exited_salesqualifiedlead": null, "hs_date_exited_subscriber": null, "hs_document_last_revisited": null, "hs_email_bad_address": null, "hs_email_bounce": null, "hs_email_click": null, "hs_email_customer_quarantined_reason": null, "hs_email_delivered": null, "hs_email_domain": "hubspot.com", "hs_email_first_click_date": null, "hs_email_first_open_date": null, "hs_email_first_reply_date": null, "hs_email_first_send_date": null, "hs_email_hard_bounce_reason": null, "hs_email_hard_bounce_reason_enum": null, "hs_email_is_ineligible": null, "hs_email_last_click_date": null, "hs_email_last_email_name": null, "hs_email_last_open_date": null, "hs_email_last_reply_date": null, "hs_email_last_send_date": null, "hs_email_open": null, "hs_email_optout": null, "hs_email_optout_10798197": null, "hs_email_optout_11890603": null, "hs_email_optout_11890831": null, "hs_email_optout_23704464": null, "hs_email_optout_94692364": null, "hs_email_quarantined": null, "hs_email_quarantined_reason": null, "hs_email_recipient_fatigue_recovery_time": null, "hs_email_replied": null, "hs_email_sends_since_last_engagement": null, "hs_emailconfirmationstatus": null, "hs_facebook_ad_clicked": null, "hs_facebook_click_id": null, "hs_feedback_last_nps_follow_up": null, "hs_feedback_last_nps_rating": null, "hs_feedback_last_survey_date": null, "hs_feedback_show_nps_web_survey": null, "hs_first_engagement_object_id": null, "hs_first_outreach_date": null, "hs_first_subscription_create_date": null, "hs_google_click_id": null, "hs_has_active_subscription": null, "hs_ip_timezone": null, "hs_is_contact": true, "hs_is_unworked": true, "hs_language": null, "hs_last_sales_activity_date": null, "hs_last_sales_activity_timestamp": null, "hs_last_sales_activity_type": null, "hs_lastmodifieddate": null, "hs_latest_disqualified_lead_date": null, "hs_latest_meeting_activity": null, "hs_latest_open_lead_date": null, "hs_latest_qualified_lead_date": null, "hs_latest_sequence_ended_date": null, "hs_latest_sequence_enrolled": null, "hs_latest_sequence_enrolled_date": null, "hs_latest_sequence_finished_date": null, "hs_latest_sequence_unenrolled_date": null, "hs_latest_source": "OFFLINE", "hs_latest_source_data_1": "API", "hs_latest_source_data_2": null, "hs_latest_source_timestamp": "2021-02-22T14:05:10.036000+00:00", "hs_latest_subscription_create_date": null, "hs_lead_status": null, "hs_legal_basis": null, "hs_lifecyclestage_customer_date": null, "hs_lifecyclestage_evangelist_date": null, "hs_lifecyclestage_lead_date": null, "hs_lifecyclestage_marketingqualifiedlead_date": null, "hs_lifecyclestage_opportunity_date": null, "hs_lifecyclestage_other_date": null, "hs_lifecyclestage_salesqualifiedlead_date": null, "hs_lifecyclestage_subscriber_date": "2021-02-22T14:05:09.944000+00:00", "hs_linkedin_ad_clicked": null, "hs_marketable_reason_id": null, "hs_marketable_reason_type": null, "hs_marketable_status": "false", "hs_marketable_until_renewal": "false", "hs_merged_object_ids": null, "hs_object_id": 251, "hs_object_source": null, "hs_object_source_id": null, "hs_object_source_label": null, "hs_object_source_user_id": null, "hs_persona": null, "hs_pinned_engagement_id": null, "hs_pipeline": "contacts-lifecycle-pipeline", "hs_predictivecontactscore": null, "hs_predictivecontactscore_v2": 0.29, "hs_predictivecontactscorebucket": null, "hs_predictivescoringtier": "tier_4", "hs_read_only": null, "hs_sa_first_engagement_date": null, "hs_sa_first_engagement_descr": null, "hs_sa_first_engagement_object_type": null, "hs_sales_email_last_clicked": null, "hs_sales_email_last_opened": null, "hs_sales_email_last_replied": null, "hs_searchable_calculated_international_mobile_number": null, "hs_searchable_calculated_international_phone_number": null, "hs_searchable_calculated_mobile_number": null, "hs_searchable_calculated_phone_number": "5551222323", "hs_sequences_actively_enrolled_count": null, "hs_sequences_enrolled_count": null, "hs_sequences_is_enrolled": null, "hs_testpurge": null, "hs_testrollback": null, "hs_time_between_contact_creation_and_deal_close": null, "hs_time_between_contact_creation_and_deal_creation": null, "hs_time_in_customer": null, "hs_time_in_evangelist": null, "hs_time_in_lead": null, "hs_time_in_marketingqualifiedlead": null, "hs_time_in_opportunity": null, "hs_time_in_other": null, "hs_time_in_salesqualifiedlead": null, "hs_time_in_subscriber": 87820387720, "hs_time_to_first_engagement": null, "hs_time_to_move_from_lead_to_customer": null, "hs_time_to_move_from_marketingqualifiedlead_to_customer": null, "hs_time_to_move_from_opportunity_to_customer": null, "hs_time_to_move_from_salesqualifiedlead_to_customer": null, "hs_time_to_move_from_subscriber_to_customer": null, "hs_timezone": null, "hs_unique_creation_key": null, "hs_updated_by_user_id": null, "hs_user_ids_of_all_notification_followers": null, "hs_user_ids_of_all_notification_unfollowers": null, "hs_user_ids_of_all_owners": null, "hs_v2_cumulative_time_in_customer": null, "hs_v2_cumulative_time_in_evangelist": null, "hs_v2_cumulative_time_in_lead": null, "hs_v2_cumulative_time_in_marketingqualifiedlead": null, "hs_v2_cumulative_time_in_opportunity": null, "hs_v2_cumulative_time_in_other": null, "hs_v2_cumulative_time_in_salesqualifiedlead": null, "hs_v2_cumulative_time_in_subscriber": null, "hs_v2_date_entered_customer": null, "hs_v2_date_entered_evangelist": null, "hs_v2_date_entered_lead": null, "hs_v2_date_entered_marketingqualifiedlead": null, "hs_v2_date_entered_opportunity": null, "hs_v2_date_entered_other": null, "hs_v2_date_entered_salesqualifiedlead": null, "hs_v2_date_entered_subscriber": "2021-02-22T14:05:09.944000+00:00", "hs_v2_date_exited_customer": null, "hs_v2_date_exited_evangelist": null, "hs_v2_date_exited_lead": null, "hs_v2_date_exited_marketingqualifiedlead": null, "hs_v2_date_exited_opportunity": null, "hs_v2_date_exited_other": null, "hs_v2_date_exited_salesqualifiedlead": null, "hs_v2_date_exited_subscriber": null, "hs_v2_latest_time_in_customer": null, "hs_v2_latest_time_in_evangelist": null, "hs_v2_latest_time_in_lead": null, "hs_v2_latest_time_in_marketingqualifiedlead": null, "hs_v2_latest_time_in_opportunity": null, "hs_v2_latest_time_in_other": null, "hs_v2_latest_time_in_salesqualifiedlead": null, "hs_v2_latest_time_in_subscriber": null, "hs_was_imported": null, "hs_whatsapp_phone_number": null, "hubspot_owner_assigneddate": null, "hubspot_owner_id": null, "hubspot_team_id": null, "hubspotscore": null, "industry": null, "ip_city": null, "ip_country": null, "ip_country_code": null, "ip_latlon": null, "ip_state": null, "ip_state_code": null, "ip_zipcode": null, "job_function": null, "jobtitle": null, "lastmodifieddate": "2023-03-21T19:29:13.036000+00:00", "lastname": "Test Lastname 5001", "lifecyclestage": "subscriber", "marital_status": null, "message": null, "military_status": null, "mobilephone": null, "my_custom_test_property": null, "notes_last_contacted": null, "notes_last_updated": null, "notes_next_activity_date": null, "num_associated_deals": null, "num_contacted_notes": null, "num_conversion_events": 0, "num_notes": null, "num_unique_conversion_events": 0, "numemployees": null, "phone": "555-122-2323", "recent_conversion_date": null, "recent_conversion_event_name": null, "recent_deal_amount": null, "recent_deal_close_date": null, "relationship_status": null, "salutation": null, "school": null, "seniority": null, "start_date": null, "state": "MA", "surveymonkeyeventlastupdated": null, "test": null, "total_revenue": null, "twitterhandle": null, "webinareventlastupdated": null, "website": "http://hubspot.com", "work_email": null, "zip": "02139"}, "createdAt": "2021-02-22T14:05:09.944Z", "updatedAt": "2023-03-21T19:29:13.036Z", "archived": false, "companies": ["5170561229", "5170561229"], "properties_address": "25000000 First Street", "properties_annualrevenue": null, "properties_associatedcompanyid": 5170561229, "properties_associatedcompanylastupdated": null, "properties_city": "Cambridge", "properties_closedate": null, "properties_company": "HubSpot", "properties_company_size": null, "properties_country": "USA", "properties_createdate": "2021-02-22T14:05:09.944000+00:00", "properties_currentlyinworkflow": null, "properties_date_of_birth": null, "properties_days_to_close": null, "properties_degree": null, "properties_email": "testingdsapis@hubspot.com", "properties_engagements_last_meeting_booked": null, "properties_engagements_last_meeting_booked_campaign": null, "properties_engagements_last_meeting_booked_medium": null, "properties_engagements_last_meeting_booked_source": null, "properties_fax": null, "properties_field_of_study": null, "properties_first_conversion_date": null, "properties_first_conversion_event_name": null, "properties_first_deal_created_date": null, "properties_firstname": "Test User 5001", "properties_gender": null, "properties_graduation_date": null, "properties_hs_additional_emails": null, "properties_hs_all_accessible_team_ids": null, "properties_hs_all_contact_vids": "251", "properties_hs_all_owner_ids": null, "properties_hs_all_team_ids": null, "properties_hs_analytics_average_page_views": 0, "properties_hs_analytics_first_referrer": null, "properties_hs_analytics_first_timestamp": "2021-02-22T14:05:09.944000+00:00", "properties_hs_analytics_first_touch_converting_campaign": null, "properties_hs_analytics_first_url": null, "properties_hs_analytics_first_visit_timestamp": null, "properties_hs_analytics_last_referrer": null, "properties_hs_analytics_last_timestamp": null, "properties_hs_analytics_last_touch_converting_campaign": null, "properties_hs_analytics_last_url": null, "properties_hs_analytics_last_visit_timestamp": null, "properties_hs_analytics_num_event_completions": 0, "properties_hs_analytics_num_page_views": 0, "properties_hs_analytics_num_visits": 0, "properties_hs_analytics_revenue": 0.0, "properties_hs_analytics_source": "OFFLINE", "properties_hs_analytics_source_data_1": "API", "properties_hs_analytics_source_data_2": null, "properties_hs_avatar_filemanager_key": null, "properties_hs_buying_role": null, "properties_hs_calculated_form_submissions": null, "properties_hs_calculated_merged_vids": null, "properties_hs_calculated_mobile_number": null, "properties_hs_calculated_phone_number": null, "properties_hs_calculated_phone_number_area_code": null, "properties_hs_calculated_phone_number_country_code": null, "properties_hs_calculated_phone_number_region_code": null, "properties_hs_clicked_linkedin_ad": null, "properties_hs_content_membership_email": null, "properties_hs_content_membership_email_confirmed": null, "properties_hs_content_membership_notes": null, "properties_hs_content_membership_registered_at": null, "properties_hs_content_membership_registration_domain_sent_to": null, "properties_hs_content_membership_registration_email_sent_at": null, "properties_hs_content_membership_status": null, "properties_hs_conversations_visitor_email": null, "properties_hs_count_is_unworked": null, "properties_hs_count_is_worked": null, "properties_hs_created_by_conversations": null, "properties_hs_created_by_user_id": null, "properties_hs_createdate": null, "properties_hs_date_entered_customer": null, "properties_hs_date_entered_evangelist": null, "properties_hs_date_entered_lead": null, "properties_hs_date_entered_marketingqualifiedlead": null, "properties_hs_date_entered_opportunity": null, "properties_hs_date_entered_other": null, "properties_hs_date_entered_salesqualifiedlead": null, "properties_hs_date_entered_subscriber": "2021-02-22T14:05:09.944000+00:00", "properties_hs_date_exited_customer": null, "properties_hs_date_exited_evangelist": null, "properties_hs_date_exited_lead": null, "properties_hs_date_exited_marketingqualifiedlead": null, "properties_hs_date_exited_opportunity": null, "properties_hs_date_exited_other": null, "properties_hs_date_exited_salesqualifiedlead": null, "properties_hs_date_exited_subscriber": null, "properties_hs_document_last_revisited": null, "properties_hs_email_bad_address": null, "properties_hs_email_bounce": null, "properties_hs_email_click": null, "properties_hs_email_customer_quarantined_reason": null, "properties_hs_email_delivered": null, "properties_hs_email_domain": "hubspot.com", "properties_hs_email_first_click_date": null, "properties_hs_email_first_open_date": null, "properties_hs_email_first_reply_date": null, "properties_hs_email_first_send_date": null, "properties_hs_email_hard_bounce_reason": null, "properties_hs_email_hard_bounce_reason_enum": null, "properties_hs_email_is_ineligible": null, "properties_hs_email_last_click_date": null, "properties_hs_email_last_email_name": null, "properties_hs_email_last_open_date": null, "properties_hs_email_last_reply_date": null, "properties_hs_email_last_send_date": null, "properties_hs_email_open": null, "properties_hs_email_optout": null, "properties_hs_email_optout_10798197": null, "properties_hs_email_optout_11890603": null, "properties_hs_email_optout_11890831": null, "properties_hs_email_optout_23704464": null, "properties_hs_email_optout_94692364": null, "properties_hs_email_quarantined": null, "properties_hs_email_quarantined_reason": null, "properties_hs_email_recipient_fatigue_recovery_time": null, "properties_hs_email_replied": null, "properties_hs_email_sends_since_last_engagement": null, "properties_hs_emailconfirmationstatus": null, "properties_hs_facebook_ad_clicked": null, "properties_hs_facebook_click_id": null, "properties_hs_feedback_last_nps_follow_up": null, "properties_hs_feedback_last_nps_rating": null, "properties_hs_feedback_last_survey_date": null, "properties_hs_feedback_show_nps_web_survey": null, "properties_hs_first_engagement_object_id": null, "properties_hs_first_outreach_date": null, "properties_hs_first_subscription_create_date": null, "properties_hs_google_click_id": null, "properties_hs_has_active_subscription": null, "properties_hs_ip_timezone": null, "properties_hs_is_contact": true, "properties_hs_is_unworked": true, "properties_hs_language": null, "properties_hs_last_sales_activity_date": null, "properties_hs_last_sales_activity_timestamp": null, "properties_hs_last_sales_activity_type": null, "properties_hs_lastmodifieddate": null, "properties_hs_latest_disqualified_lead_date": null, "properties_hs_latest_meeting_activity": null, "properties_hs_latest_open_lead_date": null, "properties_hs_latest_qualified_lead_date": null, "properties_hs_latest_sequence_ended_date": null, "properties_hs_latest_sequence_enrolled": null, "properties_hs_latest_sequence_enrolled_date": null, "properties_hs_latest_sequence_finished_date": null, "properties_hs_latest_sequence_unenrolled_date": null, "properties_hs_latest_source": "OFFLINE", "properties_hs_latest_source_data_1": "API", "properties_hs_latest_source_data_2": null, "properties_hs_latest_source_timestamp": "2021-02-22T14:05:10.036000+00:00", "properties_hs_latest_subscription_create_date": null, "properties_hs_lead_status": null, "properties_hs_legal_basis": null, "properties_hs_lifecyclestage_customer_date": null, "properties_hs_lifecyclestage_evangelist_date": null, "properties_hs_lifecyclestage_lead_date": null, "properties_hs_lifecyclestage_marketingqualifiedlead_date": null, "properties_hs_lifecyclestage_opportunity_date": null, "properties_hs_lifecyclestage_other_date": null, "properties_hs_lifecyclestage_salesqualifiedlead_date": null, "properties_hs_lifecyclestage_subscriber_date": "2021-02-22T14:05:09.944000+00:00", "properties_hs_linkedin_ad_clicked": null, "properties_hs_marketable_reason_id": null, "properties_hs_marketable_reason_type": null, "properties_hs_marketable_status": "false", "properties_hs_marketable_until_renewal": "false", "properties_hs_merged_object_ids": null, "properties_hs_object_id": 251, "properties_hs_object_source": null, "properties_hs_object_source_id": null, "properties_hs_object_source_label": null, "properties_hs_object_source_user_id": null, "properties_hs_persona": null, "properties_hs_pinned_engagement_id": null, "properties_hs_pipeline": "contacts-lifecycle-pipeline", "properties_hs_predictivecontactscore": null, "properties_hs_predictivecontactscore_v2": 0.29, "properties_hs_predictivecontactscorebucket": null, "properties_hs_predictivescoringtier": "tier_4", "properties_hs_read_only": null, "properties_hs_sa_first_engagement_date": null, "properties_hs_sa_first_engagement_descr": null, "properties_hs_sa_first_engagement_object_type": null, "properties_hs_sales_email_last_clicked": null, "properties_hs_sales_email_last_opened": null, "properties_hs_sales_email_last_replied": null, "properties_hs_searchable_calculated_international_mobile_number": null, "properties_hs_searchable_calculated_international_phone_number": null, "properties_hs_searchable_calculated_mobile_number": null, "properties_hs_searchable_calculated_phone_number": "5551222323", "properties_hs_sequences_actively_enrolled_count": null, "properties_hs_sequences_enrolled_count": null, "properties_hs_sequences_is_enrolled": null, "properties_hs_testpurge": null, "properties_hs_testrollback": null, "properties_hs_time_between_contact_creation_and_deal_close": null, "properties_hs_time_between_contact_creation_and_deal_creation": null, "properties_hs_time_in_customer": null, "properties_hs_time_in_evangelist": null, "properties_hs_time_in_lead": null, "properties_hs_time_in_marketingqualifiedlead": null, "properties_hs_time_in_opportunity": null, "properties_hs_time_in_other": null, "properties_hs_time_in_salesqualifiedlead": null, "properties_hs_time_in_subscriber": 87820387720, "properties_hs_time_to_first_engagement": null, "properties_hs_time_to_move_from_lead_to_customer": null, "properties_hs_time_to_move_from_marketingqualifiedlead_to_customer": null, "properties_hs_time_to_move_from_opportunity_to_customer": null, "properties_hs_time_to_move_from_salesqualifiedlead_to_customer": null, "properties_hs_time_to_move_from_subscriber_to_customer": null, "properties_hs_timezone": null, "properties_hs_unique_creation_key": null, "properties_hs_updated_by_user_id": null, "properties_hs_user_ids_of_all_notification_followers": null, "properties_hs_user_ids_of_all_notification_unfollowers": null, "properties_hs_user_ids_of_all_owners": null, "properties_hs_v2_cumulative_time_in_customer": null, "properties_hs_v2_cumulative_time_in_evangelist": null, "properties_hs_v2_cumulative_time_in_lead": null, "properties_hs_v2_cumulative_time_in_marketingqualifiedlead": null, "properties_hs_v2_cumulative_time_in_opportunity": null, "properties_hs_v2_cumulative_time_in_other": null, "properties_hs_v2_cumulative_time_in_salesqualifiedlead": null, "properties_hs_v2_cumulative_time_in_subscriber": null, "properties_hs_v2_date_entered_customer": null, "properties_hs_v2_date_entered_evangelist": null, "properties_hs_v2_date_entered_lead": null, "properties_hs_v2_date_entered_marketingqualifiedlead": null, "properties_hs_v2_date_entered_opportunity": null, "properties_hs_v2_date_entered_other": null, "properties_hs_v2_date_entered_salesqualifiedlead": null, "properties_hs_v2_date_entered_subscriber": "2021-02-22T14:05:09.944000+00:00", "properties_hs_v2_date_exited_customer": null, "properties_hs_v2_date_exited_evangelist": null, "properties_hs_v2_date_exited_lead": null, "properties_hs_v2_date_exited_marketingqualifiedlead": null, "properties_hs_v2_date_exited_opportunity": null, "properties_hs_v2_date_exited_other": null, "properties_hs_v2_date_exited_salesqualifiedlead": null, "properties_hs_v2_date_exited_subscriber": null, "properties_hs_v2_latest_time_in_customer": null, "properties_hs_v2_latest_time_in_evangelist": null, "properties_hs_v2_latest_time_in_lead": null, "properties_hs_v2_latest_time_in_marketingqualifiedlead": null, "properties_hs_v2_latest_time_in_opportunity": null, "properties_hs_v2_latest_time_in_other": null, "properties_hs_v2_latest_time_in_salesqualifiedlead": null, "properties_hs_v2_latest_time_in_subscriber": null, "properties_hs_was_imported": null, "properties_hs_whatsapp_phone_number": null, "properties_hubspot_owner_assigneddate": null, "properties_hubspot_owner_id": null, "properties_hubspot_team_id": null, "properties_hubspotscore": null, "properties_industry": null, "properties_ip_city": null, "properties_ip_country": null, "properties_ip_country_code": null, "properties_ip_latlon": null, "properties_ip_state": null, "properties_ip_state_code": null, "properties_ip_zipcode": null, "properties_job_function": null, "properties_jobtitle": null, "properties_lastmodifieddate": "2023-03-21T19:29:13.036000+00:00", "properties_lastname": "Test Lastname 5001", "properties_lifecyclestage": "subscriber", "properties_marital_status": null, "properties_message": null, "properties_military_status": null, "properties_mobilephone": null, "properties_my_custom_test_property": null, "properties_notes_last_contacted": null, "properties_notes_last_updated": null, "properties_notes_next_activity_date": null, "properties_num_associated_deals": null, "properties_num_contacted_notes": null, "properties_num_conversion_events": 0, "properties_num_notes": null, "properties_num_unique_conversion_events": 0, "properties_numemployees": null, "properties_phone": "555-122-2323", "properties_recent_conversion_date": null, "properties_recent_conversion_event_name": null, "properties_recent_deal_amount": null, "properties_recent_deal_close_date": null, "properties_relationship_status": null, "properties_salutation": null, "properties_school": null, "properties_seniority": null, "properties_start_date": null, "properties_state": "MA", "properties_surveymonkeyeventlastupdated": null, "properties_test": null, "properties_total_revenue": null, "properties_twitterhandle": null, "properties_webinareventlastupdated": null, "properties_website": "http://hubspot.com", "properties_work_email": null, "properties_zip": "02139"}, "emitted_at": 1701823098430}
-{"stream": "contacts", "data": {"id": "401", "properties": {"address": "25 First Street", "annualrevenue": null, "associatedcompanyid": null, "associatedcompanylastupdated": null, "city": "Cambridge", "closedate": null, "company": null, "company_size": null, "country": null, "createdate": "2021-02-23T20:10:36.191000+00:00", "currentlyinworkflow": null, "date_of_birth": null, "days_to_close": null, "degree": null, "email": "macmitch@hubspot.com", "engagements_last_meeting_booked": null, "engagements_last_meeting_booked_campaign": null, "engagements_last_meeting_booked_medium": null, "engagements_last_meeting_booked_source": null, "fax": null, "field_of_study": null, "first_conversion_date": null, "first_conversion_event_name": null, "first_deal_created_date": null, "firstname": "Mac", "gender": null, "graduation_date": null, "hs_additional_emails": null, "hs_all_accessible_team_ids": null, "hs_all_contact_vids": "401", "hs_all_owner_ids": "52550153", "hs_all_team_ids": null, "hs_analytics_average_page_views": 0, "hs_analytics_first_referrer": null, "hs_analytics_first_timestamp": "2021-02-23T20:10:36.181000+00:00", "hs_analytics_first_touch_converting_campaign": null, "hs_analytics_first_url": null, "hs_analytics_first_visit_timestamp": null, "hs_analytics_last_referrer": null, "hs_analytics_last_timestamp": null, "hs_analytics_last_touch_converting_campaign": null, "hs_analytics_last_url": null, "hs_analytics_last_visit_timestamp": null, "hs_analytics_num_event_completions": 0, "hs_analytics_num_page_views": 0, "hs_analytics_num_visits": 0, "hs_analytics_revenue": 0.0, "hs_analytics_source": "OFFLINE", "hs_analytics_source_data_1": "IMPORT", "hs_analytics_source_data_2": "13256565", "hs_avatar_filemanager_key": null, "hs_buying_role": null, "hs_calculated_form_submissions": null, "hs_calculated_merged_vids": null, "hs_calculated_mobile_number": null, "hs_calculated_phone_number": "+18884827768", "hs_calculated_phone_number_area_code": null, "hs_calculated_phone_number_country_code": "US", "hs_calculated_phone_number_region_code": null, "hs_clicked_linkedin_ad": null, "hs_content_membership_email": null, "hs_content_membership_email_confirmed": null, "hs_content_membership_notes": null, "hs_content_membership_registered_at": null, "hs_content_membership_registration_domain_sent_to": null, "hs_content_membership_registration_email_sent_at": null, "hs_content_membership_status": null, "hs_conversations_visitor_email": null, "hs_count_is_unworked": 1, "hs_count_is_worked": 0, "hs_created_by_conversations": null, "hs_created_by_user_id": null, "hs_createdate": null, "hs_date_entered_customer": null, "hs_date_entered_evangelist": null, "hs_date_entered_lead": "2021-02-23T20:10:36.181000+00:00", "hs_date_entered_marketingqualifiedlead": null, "hs_date_entered_opportunity": null, "hs_date_entered_other": null, "hs_date_entered_salesqualifiedlead": null, "hs_date_entered_subscriber": null, "hs_date_exited_customer": null, "hs_date_exited_evangelist": null, "hs_date_exited_lead": null, "hs_date_exited_marketingqualifiedlead": null, "hs_date_exited_opportunity": null, "hs_date_exited_other": null, "hs_date_exited_salesqualifiedlead": null, "hs_date_exited_subscriber": null, "hs_document_last_revisited": null, "hs_email_bad_address": null, "hs_email_bounce": null, "hs_email_click": null, "hs_email_customer_quarantined_reason": null, "hs_email_delivered": null, "hs_email_domain": "hubspot.com", "hs_email_first_click_date": null, "hs_email_first_open_date": null, "hs_email_first_reply_date": null, "hs_email_first_send_date": null, "hs_email_hard_bounce_reason": null, "hs_email_hard_bounce_reason_enum": "OTHER", "hs_email_is_ineligible": null, "hs_email_last_click_date": null, "hs_email_last_email_name": null, "hs_email_last_open_date": null, "hs_email_last_reply_date": null, "hs_email_last_send_date": null, "hs_email_open": null, "hs_email_optout": null, "hs_email_optout_10798197": null, "hs_email_optout_11890603": null, "hs_email_optout_11890831": null, "hs_email_optout_23704464": null, "hs_email_optout_94692364": null, "hs_email_quarantined": null, "hs_email_quarantined_reason": null, "hs_email_recipient_fatigue_recovery_time": null, "hs_email_replied": null, "hs_email_sends_since_last_engagement": null, "hs_emailconfirmationstatus": null, "hs_facebook_ad_clicked": null, "hs_facebook_click_id": null, "hs_feedback_last_nps_follow_up": null, "hs_feedback_last_nps_rating": null, "hs_feedback_last_survey_date": null, "hs_feedback_show_nps_web_survey": null, "hs_first_engagement_object_id": null, "hs_first_outreach_date": null, "hs_first_subscription_create_date": null, "hs_google_click_id": null, "hs_has_active_subscription": null, "hs_ip_timezone": null, "hs_is_contact": true, "hs_is_unworked": true, "hs_language": null, "hs_last_sales_activity_date": null, "hs_last_sales_activity_timestamp": null, "hs_last_sales_activity_type": null, "hs_lastmodifieddate": null, "hs_latest_disqualified_lead_date": null, "hs_latest_meeting_activity": null, "hs_latest_open_lead_date": null, "hs_latest_qualified_lead_date": null, "hs_latest_sequence_ended_date": null, "hs_latest_sequence_enrolled": null, "hs_latest_sequence_enrolled_date": null, "hs_latest_sequence_finished_date": null, "hs_latest_sequence_unenrolled_date": null, "hs_latest_source": "OFFLINE", "hs_latest_source_data_1": "IMPORT", "hs_latest_source_data_2": "13256565", "hs_latest_source_timestamp": "2021-02-23T20:10:36.210000+00:00", "hs_latest_subscription_create_date": null, "hs_lead_status": null, "hs_legal_basis": null, "hs_lifecyclestage_customer_date": null, "hs_lifecyclestage_evangelist_date": null, "hs_lifecyclestage_lead_date": "2021-02-23T20:10:36.181000+00:00", "hs_lifecyclestage_marketingqualifiedlead_date": null, "hs_lifecyclestage_opportunity_date": null, "hs_lifecyclestage_other_date": null, "hs_lifecyclestage_salesqualifiedlead_date": null, "hs_lifecyclestage_subscriber_date": null, "hs_linkedin_ad_clicked": null, "hs_marketable_reason_id": null, "hs_marketable_reason_type": null, "hs_marketable_status": "false", "hs_marketable_until_renewal": "false", "hs_merged_object_ids": null, "hs_object_id": 401, "hs_object_source": null, "hs_object_source_id": null, "hs_object_source_label": null, "hs_object_source_user_id": null, "hs_persona": null, "hs_pinned_engagement_id": null, "hs_pipeline": "contacts-lifecycle-pipeline", "hs_predictivecontactscore": null, "hs_predictivecontactscore_v2": 0.29, "hs_predictivecontactscorebucket": null, "hs_predictivescoringtier": "tier_4", "hs_read_only": null, "hs_sa_first_engagement_date": null, "hs_sa_first_engagement_descr": null, "hs_sa_first_engagement_object_type": null, "hs_sales_email_last_clicked": null, "hs_sales_email_last_opened": null, "hs_sales_email_last_replied": null, "hs_searchable_calculated_international_mobile_number": null, "hs_searchable_calculated_international_phone_number": null, "hs_searchable_calculated_mobile_number": null, "hs_searchable_calculated_phone_number": "8884827768", "hs_sequences_actively_enrolled_count": null, "hs_sequences_enrolled_count": null, "hs_sequences_is_enrolled": null, "hs_testpurge": null, "hs_testrollback": null, "hs_time_between_contact_creation_and_deal_close": null, "hs_time_between_contact_creation_and_deal_creation": null, "hs_time_in_customer": null, "hs_time_in_evangelist": null, "hs_time_in_lead": 87712061483, "hs_time_in_marketingqualifiedlead": null, "hs_time_in_opportunity": null, "hs_time_in_other": null, "hs_time_in_salesqualifiedlead": null, "hs_time_in_subscriber": null, "hs_time_to_first_engagement": null, "hs_time_to_move_from_lead_to_customer": null, "hs_time_to_move_from_marketingqualifiedlead_to_customer": null, "hs_time_to_move_from_opportunity_to_customer": null, "hs_time_to_move_from_salesqualifiedlead_to_customer": null, "hs_time_to_move_from_subscriber_to_customer": null, "hs_timezone": null, "hs_unique_creation_key": null, "hs_updated_by_user_id": null, "hs_user_ids_of_all_notification_followers": null, "hs_user_ids_of_all_notification_unfollowers": null, "hs_user_ids_of_all_owners": "12282590", "hs_v2_cumulative_time_in_customer": null, "hs_v2_cumulative_time_in_evangelist": null, "hs_v2_cumulative_time_in_lead": null, "hs_v2_cumulative_time_in_marketingqualifiedlead": null, "hs_v2_cumulative_time_in_opportunity": null, "hs_v2_cumulative_time_in_other": null, "hs_v2_cumulative_time_in_salesqualifiedlead": null, "hs_v2_cumulative_time_in_subscriber": null, "hs_v2_date_entered_customer": null, "hs_v2_date_entered_evangelist": null, "hs_v2_date_entered_lead": "2021-02-23T20:10:36.181000+00:00", "hs_v2_date_entered_marketingqualifiedlead": null, "hs_v2_date_entered_opportunity": null, "hs_v2_date_entered_other": null, "hs_v2_date_entered_salesqualifiedlead": null, "hs_v2_date_entered_subscriber": null, "hs_v2_date_exited_customer": null, "hs_v2_date_exited_evangelist": null, "hs_v2_date_exited_lead": null, "hs_v2_date_exited_marketingqualifiedlead": null, "hs_v2_date_exited_opportunity": null, "hs_v2_date_exited_other": null, "hs_v2_date_exited_salesqualifiedlead": null, "hs_v2_date_exited_subscriber": null, "hs_v2_latest_time_in_customer": null, "hs_v2_latest_time_in_evangelist": null, "hs_v2_latest_time_in_lead": null, "hs_v2_latest_time_in_marketingqualifiedlead": null, "hs_v2_latest_time_in_opportunity": null, "hs_v2_latest_time_in_other": null, "hs_v2_latest_time_in_salesqualifiedlead": null, "hs_v2_latest_time_in_subscriber": null, "hs_was_imported": true, "hs_whatsapp_phone_number": null, "hubspot_owner_assigneddate": "2021-05-21T10:20:30.963000+00:00", "hubspot_owner_id": "52550153", "hubspot_team_id": null, "hubspotscore": null, "industry": null, "ip_city": null, "ip_country": null, "ip_country_code": null, "ip_latlon": null, "ip_state": null, "ip_state_code": null, "ip_zipcode": null, "job_function": null, "jobtitle": null, "lastmodifieddate": "2023-03-21T19:31:00.563000+00:00", "lastname": "Mitchell", "lifecyclestage": "lead", "marital_status": null, "message": null, "military_status": null, "mobilephone": null, "my_custom_test_property": null, "notes_last_contacted": null, "notes_last_updated": null, "notes_next_activity_date": null, "num_associated_deals": null, "num_contacted_notes": null, "num_conversion_events": 0, "num_notes": null, "num_unique_conversion_events": 0, "numemployees": null, "phone": "1(888) 482-7768", "recent_conversion_date": null, "recent_conversion_event_name": null, "recent_deal_amount": null, "recent_deal_close_date": null, "relationship_status": null, "salutation": null, "school": null, "seniority": null, "start_date": null, "state": "MA", "surveymonkeyeventlastupdated": null, "test": null, "total_revenue": null, "twitterhandle": null, "webinareventlastupdated": null, "website": null, "work_email": null, "zip": "21430"}, "createdAt": "2021-02-23T20:10:36.191Z", "updatedAt": "2023-03-21T19:31:00.563Z", "archived": false, "properties_address": "25 First Street", "properties_annualrevenue": null, "properties_associatedcompanyid": null, "properties_associatedcompanylastupdated": null, "properties_city": "Cambridge", "properties_closedate": null, "properties_company": null, "properties_company_size": null, "properties_country": null, "properties_createdate": "2021-02-23T20:10:36.191000+00:00", "properties_currentlyinworkflow": null, "properties_date_of_birth": null, "properties_days_to_close": null, "properties_degree": null, "properties_email": "macmitch@hubspot.com", "properties_engagements_last_meeting_booked": null, "properties_engagements_last_meeting_booked_campaign": null, "properties_engagements_last_meeting_booked_medium": null, "properties_engagements_last_meeting_booked_source": null, "properties_fax": null, "properties_field_of_study": null, "properties_first_conversion_date": null, "properties_first_conversion_event_name": null, "properties_first_deal_created_date": null, "properties_firstname": "Mac", "properties_gender": null, "properties_graduation_date": null, "properties_hs_additional_emails": null, "properties_hs_all_accessible_team_ids": null, "properties_hs_all_contact_vids": "401", "properties_hs_all_owner_ids": "52550153", "properties_hs_all_team_ids": null, "properties_hs_analytics_average_page_views": 0, "properties_hs_analytics_first_referrer": null, "properties_hs_analytics_first_timestamp": "2021-02-23T20:10:36.181000+00:00", "properties_hs_analytics_first_touch_converting_campaign": null, "properties_hs_analytics_first_url": null, "properties_hs_analytics_first_visit_timestamp": null, "properties_hs_analytics_last_referrer": null, "properties_hs_analytics_last_timestamp": null, "properties_hs_analytics_last_touch_converting_campaign": null, "properties_hs_analytics_last_url": null, "properties_hs_analytics_last_visit_timestamp": null, "properties_hs_analytics_num_event_completions": 0, "properties_hs_analytics_num_page_views": 0, "properties_hs_analytics_num_visits": 0, "properties_hs_analytics_revenue": 0.0, "properties_hs_analytics_source": "OFFLINE", "properties_hs_analytics_source_data_1": "IMPORT", "properties_hs_analytics_source_data_2": "13256565", "properties_hs_avatar_filemanager_key": null, "properties_hs_buying_role": null, "properties_hs_calculated_form_submissions": null, "properties_hs_calculated_merged_vids": null, "properties_hs_calculated_mobile_number": null, "properties_hs_calculated_phone_number": "+18884827768", "properties_hs_calculated_phone_number_area_code": null, "properties_hs_calculated_phone_number_country_code": "US", "properties_hs_calculated_phone_number_region_code": null, "properties_hs_clicked_linkedin_ad": null, "properties_hs_content_membership_email": null, "properties_hs_content_membership_email_confirmed": null, "properties_hs_content_membership_notes": null, "properties_hs_content_membership_registered_at": null, "properties_hs_content_membership_registration_domain_sent_to": null, "properties_hs_content_membership_registration_email_sent_at": null, "properties_hs_content_membership_status": null, "properties_hs_conversations_visitor_email": null, "properties_hs_count_is_unworked": 1, "properties_hs_count_is_worked": 0, "properties_hs_created_by_conversations": null, "properties_hs_created_by_user_id": null, "properties_hs_createdate": null, "properties_hs_date_entered_customer": null, "properties_hs_date_entered_evangelist": null, "properties_hs_date_entered_lead": "2021-02-23T20:10:36.181000+00:00", "properties_hs_date_entered_marketingqualifiedlead": null, "properties_hs_date_entered_opportunity": null, "properties_hs_date_entered_other": null, "properties_hs_date_entered_salesqualifiedlead": null, "properties_hs_date_entered_subscriber": null, "properties_hs_date_exited_customer": null, "properties_hs_date_exited_evangelist": null, "properties_hs_date_exited_lead": null, "properties_hs_date_exited_marketingqualifiedlead": null, "properties_hs_date_exited_opportunity": null, "properties_hs_date_exited_other": null, "properties_hs_date_exited_salesqualifiedlead": null, "properties_hs_date_exited_subscriber": null, "properties_hs_document_last_revisited": null, "properties_hs_email_bad_address": null, "properties_hs_email_bounce": null, "properties_hs_email_click": null, "properties_hs_email_customer_quarantined_reason": null, "properties_hs_email_delivered": null, "properties_hs_email_domain": "hubspot.com", "properties_hs_email_first_click_date": null, "properties_hs_email_first_open_date": null, "properties_hs_email_first_reply_date": null, "properties_hs_email_first_send_date": null, "properties_hs_email_hard_bounce_reason": null, "properties_hs_email_hard_bounce_reason_enum": "OTHER", "properties_hs_email_is_ineligible": null, "properties_hs_email_last_click_date": null, "properties_hs_email_last_email_name": null, "properties_hs_email_last_open_date": null, "properties_hs_email_last_reply_date": null, "properties_hs_email_last_send_date": null, "properties_hs_email_open": null, "properties_hs_email_optout": null, "properties_hs_email_optout_10798197": null, "properties_hs_email_optout_11890603": null, "properties_hs_email_optout_11890831": null, "properties_hs_email_optout_23704464": null, "properties_hs_email_optout_94692364": null, "properties_hs_email_quarantined": null, "properties_hs_email_quarantined_reason": null, "properties_hs_email_recipient_fatigue_recovery_time": null, "properties_hs_email_replied": null, "properties_hs_email_sends_since_last_engagement": null, "properties_hs_emailconfirmationstatus": null, "properties_hs_facebook_ad_clicked": null, "properties_hs_facebook_click_id": null, "properties_hs_feedback_last_nps_follow_up": null, "properties_hs_feedback_last_nps_rating": null, "properties_hs_feedback_last_survey_date": null, "properties_hs_feedback_show_nps_web_survey": null, "properties_hs_first_engagement_object_id": null, "properties_hs_first_outreach_date": null, "properties_hs_first_subscription_create_date": null, "properties_hs_google_click_id": null, "properties_hs_has_active_subscription": null, "properties_hs_ip_timezone": null, "properties_hs_is_contact": true, "properties_hs_is_unworked": true, "properties_hs_language": null, "properties_hs_last_sales_activity_date": null, "properties_hs_last_sales_activity_timestamp": null, "properties_hs_last_sales_activity_type": null, "properties_hs_lastmodifieddate": null, "properties_hs_latest_disqualified_lead_date": null, "properties_hs_latest_meeting_activity": null, "properties_hs_latest_open_lead_date": null, "properties_hs_latest_qualified_lead_date": null, "properties_hs_latest_sequence_ended_date": null, "properties_hs_latest_sequence_enrolled": null, "properties_hs_latest_sequence_enrolled_date": null, "properties_hs_latest_sequence_finished_date": null, "properties_hs_latest_sequence_unenrolled_date": null, "properties_hs_latest_source": "OFFLINE", "properties_hs_latest_source_data_1": "IMPORT", "properties_hs_latest_source_data_2": "13256565", "properties_hs_latest_source_timestamp": "2021-02-23T20:10:36.210000+00:00", "properties_hs_latest_subscription_create_date": null, "properties_hs_lead_status": null, "properties_hs_legal_basis": null, "properties_hs_lifecyclestage_customer_date": null, "properties_hs_lifecyclestage_evangelist_date": null, "properties_hs_lifecyclestage_lead_date": "2021-02-23T20:10:36.181000+00:00", "properties_hs_lifecyclestage_marketingqualifiedlead_date": null, "properties_hs_lifecyclestage_opportunity_date": null, "properties_hs_lifecyclestage_other_date": null, "properties_hs_lifecyclestage_salesqualifiedlead_date": null, "properties_hs_lifecyclestage_subscriber_date": null, "properties_hs_linkedin_ad_clicked": null, "properties_hs_marketable_reason_id": null, "properties_hs_marketable_reason_type": null, "properties_hs_marketable_status": "false", "properties_hs_marketable_until_renewal": "false", "properties_hs_merged_object_ids": null, "properties_hs_object_id": 401, "properties_hs_object_source": null, "properties_hs_object_source_id": null, "properties_hs_object_source_label": null, "properties_hs_object_source_user_id": null, "properties_hs_persona": null, "properties_hs_pinned_engagement_id": null, "properties_hs_pipeline": "contacts-lifecycle-pipeline", "properties_hs_predictivecontactscore": null, "properties_hs_predictivecontactscore_v2": 0.29, "properties_hs_predictivecontactscorebucket": null, "properties_hs_predictivescoringtier": "tier_4", "properties_hs_read_only": null, "properties_hs_sa_first_engagement_date": null, "properties_hs_sa_first_engagement_descr": null, "properties_hs_sa_first_engagement_object_type": null, "properties_hs_sales_email_last_clicked": null, "properties_hs_sales_email_last_opened": null, "properties_hs_sales_email_last_replied": null, "properties_hs_searchable_calculated_international_mobile_number": null, "properties_hs_searchable_calculated_international_phone_number": null, "properties_hs_searchable_calculated_mobile_number": null, "properties_hs_searchable_calculated_phone_number": "8884827768", "properties_hs_sequences_actively_enrolled_count": null, "properties_hs_sequences_enrolled_count": null, "properties_hs_sequences_is_enrolled": null, "properties_hs_testpurge": null, "properties_hs_testrollback": null, "properties_hs_time_between_contact_creation_and_deal_close": null, "properties_hs_time_between_contact_creation_and_deal_creation": null, "properties_hs_time_in_customer": null, "properties_hs_time_in_evangelist": null, "properties_hs_time_in_lead": 87712061483, "properties_hs_time_in_marketingqualifiedlead": null, "properties_hs_time_in_opportunity": null, "properties_hs_time_in_other": null, "properties_hs_time_in_salesqualifiedlead": null, "properties_hs_time_in_subscriber": null, "properties_hs_time_to_first_engagement": null, "properties_hs_time_to_move_from_lead_to_customer": null, "properties_hs_time_to_move_from_marketingqualifiedlead_to_customer": null, "properties_hs_time_to_move_from_opportunity_to_customer": null, "properties_hs_time_to_move_from_salesqualifiedlead_to_customer": null, "properties_hs_time_to_move_from_subscriber_to_customer": null, "properties_hs_timezone": null, "properties_hs_unique_creation_key": null, "properties_hs_updated_by_user_id": null, "properties_hs_user_ids_of_all_notification_followers": null, "properties_hs_user_ids_of_all_notification_unfollowers": null, "properties_hs_user_ids_of_all_owners": "12282590", "properties_hs_v2_cumulative_time_in_customer": null, "properties_hs_v2_cumulative_time_in_evangelist": null, "properties_hs_v2_cumulative_time_in_lead": null, "properties_hs_v2_cumulative_time_in_marketingqualifiedlead": null, "properties_hs_v2_cumulative_time_in_opportunity": null, "properties_hs_v2_cumulative_time_in_other": null, "properties_hs_v2_cumulative_time_in_salesqualifiedlead": null, "properties_hs_v2_cumulative_time_in_subscriber": null, "properties_hs_v2_date_entered_customer": null, "properties_hs_v2_date_entered_evangelist": null, "properties_hs_v2_date_entered_lead": "2021-02-23T20:10:36.181000+00:00", "properties_hs_v2_date_entered_marketingqualifiedlead": null, "properties_hs_v2_date_entered_opportunity": null, "properties_hs_v2_date_entered_other": null, "properties_hs_v2_date_entered_salesqualifiedlead": null, "properties_hs_v2_date_entered_subscriber": null, "properties_hs_v2_date_exited_customer": null, "properties_hs_v2_date_exited_evangelist": null, "properties_hs_v2_date_exited_lead": null, "properties_hs_v2_date_exited_marketingqualifiedlead": null, "properties_hs_v2_date_exited_opportunity": null, "properties_hs_v2_date_exited_other": null, "properties_hs_v2_date_exited_salesqualifiedlead": null, "properties_hs_v2_date_exited_subscriber": null, "properties_hs_v2_latest_time_in_customer": null, "properties_hs_v2_latest_time_in_evangelist": null, "properties_hs_v2_latest_time_in_lead": null, "properties_hs_v2_latest_time_in_marketingqualifiedlead": null, "properties_hs_v2_latest_time_in_opportunity": null, "properties_hs_v2_latest_time_in_other": null, "properties_hs_v2_latest_time_in_salesqualifiedlead": null, "properties_hs_v2_latest_time_in_subscriber": null, "properties_hs_was_imported": true, "properties_hs_whatsapp_phone_number": null, "properties_hubspot_owner_assigneddate": "2021-05-21T10:20:30.963000+00:00", "properties_hubspot_owner_id": "52550153", "properties_hubspot_team_id": null, "properties_hubspotscore": null, "properties_industry": null, "properties_ip_city": null, "properties_ip_country": null, "properties_ip_country_code": null, "properties_ip_latlon": null, "properties_ip_state": null, "properties_ip_state_code": null, "properties_ip_zipcode": null, "properties_job_function": null, "properties_jobtitle": null, "properties_lastmodifieddate": "2023-03-21T19:31:00.563000+00:00", "properties_lastname": "Mitchell", "properties_lifecyclestage": "lead", "properties_marital_status": null, "properties_message": null, "properties_military_status": null, "properties_mobilephone": null, "properties_my_custom_test_property": null, "properties_notes_last_contacted": null, "properties_notes_last_updated": null, "properties_notes_next_activity_date": null, "properties_num_associated_deals": null, "properties_num_contacted_notes": null, "properties_num_conversion_events": 0, "properties_num_notes": null, "properties_num_unique_conversion_events": 0, "properties_numemployees": null, "properties_phone": "1(888) 482-7768", "properties_recent_conversion_date": null, "properties_recent_conversion_event_name": null, "properties_recent_deal_amount": null, "properties_recent_deal_close_date": null, "properties_relationship_status": null, "properties_salutation": null, "properties_school": null, "properties_seniority": null, "properties_start_date": null, "properties_state": "MA", "properties_surveymonkeyeventlastupdated": null, "properties_test": null, "properties_total_revenue": null, "properties_twitterhandle": null, "properties_webinareventlastupdated": null, "properties_website": null, "properties_work_email": null, "properties_zip": "21430"}, "emitted_at": 1701823098432}
+{"stream": "contacts", "data": {"id": "151", "properties": {"address": null, "annualrevenue": null, "associatedcompanyid": 5000526215, "associatedcompanylastupdated": null, "city": null, "closedate": null, "company": null, "company_size": null, "country": null, "createdate": "2020-12-11T01:29:50.116000+00:00", "currentlyinworkflow": null, "date_of_birth": null, "days_to_close": null, "degree": null, "email": "shef@dne.io", "engagements_last_meeting_booked": null, "engagements_last_meeting_booked_campaign": null, "engagements_last_meeting_booked_medium": null, "engagements_last_meeting_booked_source": null, "fax": null, "field_of_study": null, "first_conversion_date": null, "first_conversion_event_name": null, "first_deal_created_date": null, "firstname": "she", "gender": null, "graduation_date": null, "hs_additional_emails": null, "hs_all_accessible_team_ids": null, "hs_all_contact_vids": "151", "hs_all_owner_ids": "52550153", "hs_all_team_ids": null, "hs_analytics_average_page_views": 0, "hs_analytics_first_referrer": null, "hs_analytics_first_timestamp": "2020-12-11T01:29:50.116000+00:00", "hs_analytics_first_touch_converting_campaign": null, "hs_analytics_first_url": null, "hs_analytics_first_visit_timestamp": null, "hs_analytics_last_referrer": null, "hs_analytics_last_timestamp": null, "hs_analytics_last_touch_converting_campaign": null, "hs_analytics_last_url": null, "hs_analytics_last_visit_timestamp": null, "hs_analytics_num_event_completions": 0, "hs_analytics_num_page_views": 0, "hs_analytics_num_visits": 0, "hs_analytics_revenue": 0.0, "hs_analytics_source": "OFFLINE", "hs_analytics_source_data_1": "CONTACTS", "hs_analytics_source_data_2": "CRM_UI", "hs_avatar_filemanager_key": null, "hs_buying_role": null, "hs_calculated_form_submissions": null, "hs_calculated_merged_vids": null, "hs_calculated_mobile_number": null, "hs_calculated_phone_number": null, "hs_calculated_phone_number_area_code": null, "hs_calculated_phone_number_country_code": null, "hs_calculated_phone_number_region_code": null, "hs_clicked_linkedin_ad": null, "hs_content_membership_email": null, "hs_content_membership_email_confirmed": null, "hs_content_membership_follow_up_enqueued_at": null, "hs_content_membership_notes": null, "hs_content_membership_registered_at": null, "hs_content_membership_registration_domain_sent_to": null, "hs_content_membership_registration_email_sent_at": null, "hs_content_membership_status": null, "hs_conversations_visitor_email": null, "hs_count_is_unworked": 1, "hs_count_is_worked": 0, "hs_created_by_conversations": null, "hs_created_by_user_id": null, "hs_createdate": null, "hs_date_entered_customer": null, "hs_date_entered_evangelist": null, "hs_date_entered_lead": null, "hs_date_entered_marketingqualifiedlead": null, "hs_date_entered_opportunity": null, "hs_date_entered_other": null, "hs_date_entered_salesqualifiedlead": null, "hs_date_entered_subscriber": "2020-12-11T01:29:50.116000+00:00", "hs_date_exited_customer": null, "hs_date_exited_evangelist": null, "hs_date_exited_lead": null, "hs_date_exited_marketingqualifiedlead": null, "hs_date_exited_opportunity": null, "hs_date_exited_other": null, "hs_date_exited_salesqualifiedlead": null, "hs_date_exited_subscriber": null, "hs_document_last_revisited": null, "hs_email_bad_address": null, "hs_email_bounce": null, "hs_email_click": null, "hs_email_customer_quarantined_reason": null, "hs_email_delivered": null, "hs_email_domain": "dne.io", "hs_email_first_click_date": null, "hs_email_first_open_date": null, "hs_email_first_reply_date": null, "hs_email_first_send_date": null, "hs_email_hard_bounce_reason": null, "hs_email_hard_bounce_reason_enum": null, "hs_email_is_ineligible": null, "hs_email_last_click_date": null, "hs_email_last_email_name": null, "hs_email_last_open_date": null, "hs_email_last_reply_date": null, "hs_email_last_send_date": null, "hs_email_open": null, "hs_email_optout": null, "hs_email_optout_10798197": null, "hs_email_optout_11890603": null, "hs_email_optout_11890831": null, "hs_email_optout_23704464": null, "hs_email_optout_94692364": null, "hs_email_quarantined": null, "hs_email_quarantined_reason": null, "hs_email_recipient_fatigue_recovery_time": null, "hs_email_replied": null, "hs_email_sends_since_last_engagement": null, "hs_emailconfirmationstatus": null, "hs_facebook_ad_clicked": null, "hs_facebook_click_id": null, "hs_feedback_last_nps_follow_up": null, "hs_feedback_last_nps_rating": null, "hs_feedback_last_survey_date": null, "hs_feedback_show_nps_web_survey": null, "hs_first_engagement_object_id": null, "hs_first_outreach_date": null, "hs_first_subscription_create_date": null, "hs_google_click_id": null, "hs_has_active_subscription": null, "hs_ip_timezone": null, "hs_is_contact": true, "hs_is_unworked": true, "hs_language": null, "hs_last_sales_activity_date": null, "hs_last_sales_activity_timestamp": null, "hs_last_sales_activity_type": null, "hs_lastmodifieddate": null, "hs_latest_disqualified_lead_date": null, "hs_latest_meeting_activity": null, "hs_latest_open_lead_date": null, "hs_latest_qualified_lead_date": null, "hs_latest_sequence_ended_date": null, "hs_latest_sequence_enrolled": null, "hs_latest_sequence_enrolled_date": null, "hs_latest_sequence_finished_date": null, "hs_latest_sequence_unenrolled_date": null, "hs_latest_source": "OFFLINE", "hs_latest_source_data_1": "CONTACTS", "hs_latest_source_data_2": "CRM_UI", "hs_latest_source_timestamp": "2020-12-11T01:29:50.153000+00:00", "hs_latest_subscription_create_date": null, "hs_lead_status": null, "hs_legal_basis": null, "hs_lifecyclestage_customer_date": null, "hs_lifecyclestage_evangelist_date": null, "hs_lifecyclestage_lead_date": null, "hs_lifecyclestage_marketingqualifiedlead_date": null, "hs_lifecyclestage_opportunity_date": null, "hs_lifecyclestage_other_date": null, "hs_lifecyclestage_salesqualifiedlead_date": null, "hs_lifecyclestage_subscriber_date": "2020-12-11T01:29:50.116000+00:00", "hs_linkedin_ad_clicked": null, "hs_marketable_reason_id": null, "hs_marketable_reason_type": null, "hs_marketable_status": "false", "hs_marketable_until_renewal": "false", "hs_merged_object_ids": null, "hs_object_id": 151, "hs_object_source": "CONTACTS", "hs_object_source_id": "CRM_UI", "hs_object_source_label": "CRM_UI", "hs_object_source_user_id": 12282590, "hs_persona": null, "hs_pinned_engagement_id": null, "hs_pipeline": "contacts-lifecycle-pipeline", "hs_predictivecontactscore": null, "hs_predictivecontactscore_v2": 0.3, "hs_predictivecontactscorebucket": null, "hs_predictivescoringtier": "tier_3", "hs_read_only": null, "hs_sa_first_engagement_date": null, "hs_sa_first_engagement_descr": null, "hs_sa_first_engagement_object_type": null, "hs_sales_email_last_clicked": null, "hs_sales_email_last_opened": null, "hs_sales_email_last_replied": null, "hs_searchable_calculated_international_mobile_number": null, "hs_searchable_calculated_international_phone_number": null, "hs_searchable_calculated_mobile_number": null, "hs_searchable_calculated_phone_number": null, "hs_sequences_actively_enrolled_count": null, "hs_sequences_enrolled_count": null, "hs_sequences_is_enrolled": null, "hs_testpurge": null, "hs_testrollback": null, "hs_time_between_contact_creation_and_deal_close": null, "hs_time_between_contact_creation_and_deal_creation": null, "hs_time_in_customer": null, "hs_time_in_evangelist": null, "hs_time_in_lead": null, "hs_time_in_marketingqualifiedlead": null, "hs_time_in_opportunity": null, "hs_time_in_other": null, "hs_time_in_salesqualifiedlead": null, "hs_time_in_subscriber": 98536670035, "hs_time_to_first_engagement": null, "hs_time_to_move_from_lead_to_customer": null, "hs_time_to_move_from_marketingqualifiedlead_to_customer": null, "hs_time_to_move_from_opportunity_to_customer": null, "hs_time_to_move_from_salesqualifiedlead_to_customer": null, "hs_time_to_move_from_subscriber_to_customer": null, "hs_timezone": null, "hs_unique_creation_key": null, "hs_updated_by_user_id": 12282590, "hs_user_ids_of_all_notification_followers": null, "hs_user_ids_of_all_notification_unfollowers": null, "hs_user_ids_of_all_owners": "12282590", "hs_v2_cumulative_time_in_customer": null, "hs_v2_cumulative_time_in_evangelist": null, "hs_v2_cumulative_time_in_lead": null, "hs_v2_cumulative_time_in_marketingqualifiedlead": null, "hs_v2_cumulative_time_in_opportunity": null, "hs_v2_cumulative_time_in_other": null, "hs_v2_cumulative_time_in_salesqualifiedlead": null, "hs_v2_cumulative_time_in_subscriber": null, "hs_v2_date_entered_customer": null, "hs_v2_date_entered_evangelist": null, "hs_v2_date_entered_lead": null, "hs_v2_date_entered_marketingqualifiedlead": null, "hs_v2_date_entered_opportunity": null, "hs_v2_date_entered_other": null, "hs_v2_date_entered_salesqualifiedlead": null, "hs_v2_date_entered_subscriber": "2020-12-11T01:29:50.116000+00:00", "hs_v2_date_exited_customer": null, "hs_v2_date_exited_evangelist": null, "hs_v2_date_exited_lead": null, "hs_v2_date_exited_marketingqualifiedlead": null, "hs_v2_date_exited_opportunity": null, "hs_v2_date_exited_other": null, "hs_v2_date_exited_salesqualifiedlead": null, "hs_v2_date_exited_subscriber": null, "hs_v2_latest_time_in_customer": null, "hs_v2_latest_time_in_evangelist": null, "hs_v2_latest_time_in_lead": null, "hs_v2_latest_time_in_marketingqualifiedlead": null, "hs_v2_latest_time_in_opportunity": null, "hs_v2_latest_time_in_other": null, "hs_v2_latest_time_in_salesqualifiedlead": null, "hs_v2_latest_time_in_subscriber": null, "hs_was_imported": null, "hs_whatsapp_phone_number": null, "hubspot_owner_assigneddate": "2020-12-11T01:29:50.093000+00:00", "hubspot_owner_id": "52550153", "hubspot_team_id": null, "hubspotscore": null, "industry": null, "ip_city": null, "ip_country": null, "ip_country_code": null, "ip_latlon": null, "ip_state": null, "ip_state_code": null, "ip_zipcode": null, "job_function": null, "jobtitle": null, "lastmodifieddate": "2023-11-22T21:10:04.346000+00:00", "lastname": "nad", "lifecyclestage": "subscriber", "marital_status": null, "message": null, "military_status": null, "mobilephone": null, "my_custom_test_property": null, "notes_last_contacted": null, "notes_last_updated": null, "notes_next_activity_date": null, "num_associated_deals": null, "num_contacted_notes": null, "num_conversion_events": 0, "num_notes": null, "num_unique_conversion_events": 0, "numemployees": null, "phone": null, "recent_conversion_date": null, "recent_conversion_event_name": null, "recent_deal_amount": null, "recent_deal_close_date": null, "relationship_status": null, "salutation": null, "school": null, "seniority": null, "start_date": null, "state": null, "surveymonkeyeventlastupdated": null, "test": null, "total_revenue": null, "twitterhandle": null, "webinareventlastupdated": null, "website": null, "work_email": null, "zip": null}, "createdAt": "2020-12-11T01:29:50.116Z", "updatedAt": "2023-11-22T21:10:04.346Z", "archived": false, "companies": ["5000526215", "5000526215"], "properties_address": null, "properties_annualrevenue": null, "properties_associatedcompanyid": 5000526215, "properties_associatedcompanylastupdated": null, "properties_city": null, "properties_closedate": null, "properties_company": null, "properties_company_size": null, "properties_country": null, "properties_createdate": "2020-12-11T01:29:50.116000+00:00", "properties_currentlyinworkflow": null, "properties_date_of_birth": null, "properties_days_to_close": null, "properties_degree": null, "properties_email": "shef@dne.io", "properties_engagements_last_meeting_booked": null, "properties_engagements_last_meeting_booked_campaign": null, "properties_engagements_last_meeting_booked_medium": null, "properties_engagements_last_meeting_booked_source": null, "properties_fax": null, "properties_field_of_study": null, "properties_first_conversion_date": null, "properties_first_conversion_event_name": null, "properties_first_deal_created_date": null, "properties_firstname": "she", "properties_gender": null, "properties_graduation_date": null, "properties_hs_additional_emails": null, "properties_hs_all_accessible_team_ids": null, "properties_hs_all_contact_vids": "151", "properties_hs_all_owner_ids": "52550153", "properties_hs_all_team_ids": null, "properties_hs_analytics_average_page_views": 0, "properties_hs_analytics_first_referrer": null, "properties_hs_analytics_first_timestamp": "2020-12-11T01:29:50.116000+00:00", "properties_hs_analytics_first_touch_converting_campaign": null, "properties_hs_analytics_first_url": null, "properties_hs_analytics_first_visit_timestamp": null, "properties_hs_analytics_last_referrer": null, "properties_hs_analytics_last_timestamp": null, "properties_hs_analytics_last_touch_converting_campaign": null, "properties_hs_analytics_last_url": null, "properties_hs_analytics_last_visit_timestamp": null, "properties_hs_analytics_num_event_completions": 0, "properties_hs_analytics_num_page_views": 0, "properties_hs_analytics_num_visits": 0, "properties_hs_analytics_revenue": 0.0, "properties_hs_analytics_source": "OFFLINE", "properties_hs_analytics_source_data_1": "CONTACTS", "properties_hs_analytics_source_data_2": "CRM_UI", "properties_hs_avatar_filemanager_key": null, "properties_hs_buying_role": null, "properties_hs_calculated_form_submissions": null, "properties_hs_calculated_merged_vids": null, "properties_hs_calculated_mobile_number": null, "properties_hs_calculated_phone_number": null, "properties_hs_calculated_phone_number_area_code": null, "properties_hs_calculated_phone_number_country_code": null, "properties_hs_calculated_phone_number_region_code": null, "properties_hs_clicked_linkedin_ad": null, "properties_hs_content_membership_email": null, "properties_hs_content_membership_email_confirmed": null, "properties_hs_content_membership_follow_up_enqueued_at": null, "properties_hs_content_membership_notes": null, "properties_hs_content_membership_registered_at": null, "properties_hs_content_membership_registration_domain_sent_to": null, "properties_hs_content_membership_registration_email_sent_at": null, "properties_hs_content_membership_status": null, "properties_hs_conversations_visitor_email": null, "properties_hs_count_is_unworked": 1, "properties_hs_count_is_worked": 0, "properties_hs_created_by_conversations": null, "properties_hs_created_by_user_id": null, "properties_hs_createdate": null, "properties_hs_date_entered_customer": null, "properties_hs_date_entered_evangelist": null, "properties_hs_date_entered_lead": null, "properties_hs_date_entered_marketingqualifiedlead": null, "properties_hs_date_entered_opportunity": null, "properties_hs_date_entered_other": null, "properties_hs_date_entered_salesqualifiedlead": null, "properties_hs_date_entered_subscriber": "2020-12-11T01:29:50.116000+00:00", "properties_hs_date_exited_customer": null, "properties_hs_date_exited_evangelist": null, "properties_hs_date_exited_lead": null, "properties_hs_date_exited_marketingqualifiedlead": null, "properties_hs_date_exited_opportunity": null, "properties_hs_date_exited_other": null, "properties_hs_date_exited_salesqualifiedlead": null, "properties_hs_date_exited_subscriber": null, "properties_hs_document_last_revisited": null, "properties_hs_email_bad_address": null, "properties_hs_email_bounce": null, "properties_hs_email_click": null, "properties_hs_email_customer_quarantined_reason": null, "properties_hs_email_delivered": null, "properties_hs_email_domain": "dne.io", "properties_hs_email_first_click_date": null, "properties_hs_email_first_open_date": null, "properties_hs_email_first_reply_date": null, "properties_hs_email_first_send_date": null, "properties_hs_email_hard_bounce_reason": null, "properties_hs_email_hard_bounce_reason_enum": null, "properties_hs_email_is_ineligible": null, "properties_hs_email_last_click_date": null, "properties_hs_email_last_email_name": null, "properties_hs_email_last_open_date": null, "properties_hs_email_last_reply_date": null, "properties_hs_email_last_send_date": null, "properties_hs_email_open": null, "properties_hs_email_optout": null, "properties_hs_email_optout_10798197": null, "properties_hs_email_optout_11890603": null, "properties_hs_email_optout_11890831": null, "properties_hs_email_optout_23704464": null, "properties_hs_email_optout_94692364": null, "properties_hs_email_quarantined": null, "properties_hs_email_quarantined_reason": null, "properties_hs_email_recipient_fatigue_recovery_time": null, "properties_hs_email_replied": null, "properties_hs_email_sends_since_last_engagement": null, "properties_hs_emailconfirmationstatus": null, "properties_hs_facebook_ad_clicked": null, "properties_hs_facebook_click_id": null, "properties_hs_feedback_last_nps_follow_up": null, "properties_hs_feedback_last_nps_rating": null, "properties_hs_feedback_last_survey_date": null, "properties_hs_feedback_show_nps_web_survey": null, "properties_hs_first_engagement_object_id": null, "properties_hs_first_outreach_date": null, "properties_hs_first_subscription_create_date": null, "properties_hs_google_click_id": null, "properties_hs_has_active_subscription": null, "properties_hs_ip_timezone": null, "properties_hs_is_contact": true, "properties_hs_is_unworked": true, "properties_hs_language": null, "properties_hs_last_sales_activity_date": null, "properties_hs_last_sales_activity_timestamp": null, "properties_hs_last_sales_activity_type": null, "properties_hs_lastmodifieddate": null, "properties_hs_latest_disqualified_lead_date": null, "properties_hs_latest_meeting_activity": null, "properties_hs_latest_open_lead_date": null, "properties_hs_latest_qualified_lead_date": null, "properties_hs_latest_sequence_ended_date": null, "properties_hs_latest_sequence_enrolled": null, "properties_hs_latest_sequence_enrolled_date": null, "properties_hs_latest_sequence_finished_date": null, "properties_hs_latest_sequence_unenrolled_date": null, "properties_hs_latest_source": "OFFLINE", "properties_hs_latest_source_data_1": "CONTACTS", "properties_hs_latest_source_data_2": "CRM_UI", "properties_hs_latest_source_timestamp": "2020-12-11T01:29:50.153000+00:00", "properties_hs_latest_subscription_create_date": null, "properties_hs_lead_status": null, "properties_hs_legal_basis": null, "properties_hs_lifecyclestage_customer_date": null, "properties_hs_lifecyclestage_evangelist_date": null, "properties_hs_lifecyclestage_lead_date": null, "properties_hs_lifecyclestage_marketingqualifiedlead_date": null, "properties_hs_lifecyclestage_opportunity_date": null, "properties_hs_lifecyclestage_other_date": null, "properties_hs_lifecyclestage_salesqualifiedlead_date": null, "properties_hs_lifecyclestage_subscriber_date": "2020-12-11T01:29:50.116000+00:00", "properties_hs_linkedin_ad_clicked": null, "properties_hs_marketable_reason_id": null, "properties_hs_marketable_reason_type": null, "properties_hs_marketable_status": "false", "properties_hs_marketable_until_renewal": "false", "properties_hs_merged_object_ids": null, "properties_hs_object_id": 151, "properties_hs_object_source": "CONTACTS", "properties_hs_object_source_id": "CRM_UI", "properties_hs_object_source_label": "CRM_UI", "properties_hs_object_source_user_id": 12282590, "properties_hs_persona": null, "properties_hs_pinned_engagement_id": null, "properties_hs_pipeline": "contacts-lifecycle-pipeline", "properties_hs_predictivecontactscore": null, "properties_hs_predictivecontactscore_v2": 0.3, "properties_hs_predictivecontactscorebucket": null, "properties_hs_predictivescoringtier": "tier_3", "properties_hs_read_only": null, "properties_hs_sa_first_engagement_date": null, "properties_hs_sa_first_engagement_descr": null, "properties_hs_sa_first_engagement_object_type": null, "properties_hs_sales_email_last_clicked": null, "properties_hs_sales_email_last_opened": null, "properties_hs_sales_email_last_replied": null, "properties_hs_searchable_calculated_international_mobile_number": null, "properties_hs_searchable_calculated_international_phone_number": null, "properties_hs_searchable_calculated_mobile_number": null, "properties_hs_searchable_calculated_phone_number": null, "properties_hs_sequences_actively_enrolled_count": null, "properties_hs_sequences_enrolled_count": null, "properties_hs_sequences_is_enrolled": null, "properties_hs_testpurge": null, "properties_hs_testrollback": null, "properties_hs_time_between_contact_creation_and_deal_close": null, "properties_hs_time_between_contact_creation_and_deal_creation": null, "properties_hs_time_in_customer": null, "properties_hs_time_in_evangelist": null, "properties_hs_time_in_lead": null, "properties_hs_time_in_marketingqualifiedlead": null, "properties_hs_time_in_opportunity": null, "properties_hs_time_in_other": null, "properties_hs_time_in_salesqualifiedlead": null, "properties_hs_time_in_subscriber": 98536670035, "properties_hs_time_to_first_engagement": null, "properties_hs_time_to_move_from_lead_to_customer": null, "properties_hs_time_to_move_from_marketingqualifiedlead_to_customer": null, "properties_hs_time_to_move_from_opportunity_to_customer": null, "properties_hs_time_to_move_from_salesqualifiedlead_to_customer": null, "properties_hs_time_to_move_from_subscriber_to_customer": null, "properties_hs_timezone": null, "properties_hs_unique_creation_key": null, "properties_hs_updated_by_user_id": 12282590, "properties_hs_user_ids_of_all_notification_followers": null, "properties_hs_user_ids_of_all_notification_unfollowers": null, "properties_hs_user_ids_of_all_owners": "12282590", "properties_hs_v2_cumulative_time_in_customer": null, "properties_hs_v2_cumulative_time_in_evangelist": null, "properties_hs_v2_cumulative_time_in_lead": null, "properties_hs_v2_cumulative_time_in_marketingqualifiedlead": null, "properties_hs_v2_cumulative_time_in_opportunity": null, "properties_hs_v2_cumulative_time_in_other": null, "properties_hs_v2_cumulative_time_in_salesqualifiedlead": null, "properties_hs_v2_cumulative_time_in_subscriber": null, "properties_hs_v2_date_entered_customer": null, "properties_hs_v2_date_entered_evangelist": null, "properties_hs_v2_date_entered_lead": null, "properties_hs_v2_date_entered_marketingqualifiedlead": null, "properties_hs_v2_date_entered_opportunity": null, "properties_hs_v2_date_entered_other": null, "properties_hs_v2_date_entered_salesqualifiedlead": null, "properties_hs_v2_date_entered_subscriber": "2020-12-11T01:29:50.116000+00:00", "properties_hs_v2_date_exited_customer": null, "properties_hs_v2_date_exited_evangelist": null, "properties_hs_v2_date_exited_lead": null, "properties_hs_v2_date_exited_marketingqualifiedlead": null, "properties_hs_v2_date_exited_opportunity": null, "properties_hs_v2_date_exited_other": null, "properties_hs_v2_date_exited_salesqualifiedlead": null, "properties_hs_v2_date_exited_subscriber": null, "properties_hs_v2_latest_time_in_customer": null, "properties_hs_v2_latest_time_in_evangelist": null, "properties_hs_v2_latest_time_in_lead": null, "properties_hs_v2_latest_time_in_marketingqualifiedlead": null, "properties_hs_v2_latest_time_in_opportunity": null, "properties_hs_v2_latest_time_in_other": null, "properties_hs_v2_latest_time_in_salesqualifiedlead": null, "properties_hs_v2_latest_time_in_subscriber": null, "properties_hs_was_imported": null, "properties_hs_whatsapp_phone_number": null, "properties_hubspot_owner_assigneddate": "2020-12-11T01:29:50.093000+00:00", "properties_hubspot_owner_id": "52550153", "properties_hubspot_team_id": null, "properties_hubspotscore": null, "properties_industry": null, "properties_ip_city": null, "properties_ip_country": null, "properties_ip_country_code": null, "properties_ip_latlon": null, "properties_ip_state": null, "properties_ip_state_code": null, "properties_ip_zipcode": null, "properties_job_function": null, "properties_jobtitle": null, "properties_lastmodifieddate": "2023-11-22T21:10:04.346000+00:00", "properties_lastname": "nad", "properties_lifecyclestage": "subscriber", "properties_marital_status": null, "properties_message": null, "properties_military_status": null, "properties_mobilephone": null, "properties_my_custom_test_property": null, "properties_notes_last_contacted": null, "properties_notes_last_updated": null, "properties_notes_next_activity_date": null, "properties_num_associated_deals": null, "properties_num_contacted_notes": null, "properties_num_conversion_events": 0, "properties_num_notes": null, "properties_num_unique_conversion_events": 0, "properties_numemployees": null, "properties_phone": null, "properties_recent_conversion_date": null, "properties_recent_conversion_event_name": null, "properties_recent_deal_amount": null, "properties_recent_deal_close_date": null, "properties_relationship_status": null, "properties_salutation": null, "properties_school": null, "properties_seniority": null, "properties_start_date": null, "properties_state": null, "properties_surveymonkeyeventlastupdated": null, "properties_test": null, "properties_total_revenue": null, "properties_twitterhandle": null, "properties_webinareventlastupdated": null, "properties_website": null, "properties_work_email": null, "properties_zip": null}, "emitted_at": 1706186860294}
+{"stream": "contacts", "data": {"id": "251", "properties": {"address": "25000000 First Street", "annualrevenue": null, "associatedcompanyid": 5170561229, "associatedcompanylastupdated": null, "city": "Cambridge", "closedate": null, "company": "HubSpot", "company_size": null, "country": "USA", "createdate": "2021-02-22T14:05:09.944000+00:00", "currentlyinworkflow": null, "date_of_birth": null, "days_to_close": null, "degree": null, "email": "testingdsapis@hubspot.com", "engagements_last_meeting_booked": null, "engagements_last_meeting_booked_campaign": null, "engagements_last_meeting_booked_medium": null, "engagements_last_meeting_booked_source": null, "fax": null, "field_of_study": null, "first_conversion_date": null, "first_conversion_event_name": null, "first_deal_created_date": null, "firstname": "Test User 5001", "gender": null, "graduation_date": null, "hs_additional_emails": null, "hs_all_accessible_team_ids": null, "hs_all_contact_vids": "251", "hs_all_owner_ids": null, "hs_all_team_ids": null, "hs_analytics_average_page_views": 0, "hs_analytics_first_referrer": null, "hs_analytics_first_timestamp": "2021-02-22T14:05:09.944000+00:00", "hs_analytics_first_touch_converting_campaign": null, "hs_analytics_first_url": null, "hs_analytics_first_visit_timestamp": null, "hs_analytics_last_referrer": null, "hs_analytics_last_timestamp": null, "hs_analytics_last_touch_converting_campaign": null, "hs_analytics_last_url": null, "hs_analytics_last_visit_timestamp": null, "hs_analytics_num_event_completions": 0, "hs_analytics_num_page_views": 0, "hs_analytics_num_visits": 0, "hs_analytics_revenue": 0.0, "hs_analytics_source": "OFFLINE", "hs_analytics_source_data_1": "API", "hs_analytics_source_data_2": null, "hs_avatar_filemanager_key": null, "hs_buying_role": null, "hs_calculated_form_submissions": null, "hs_calculated_merged_vids": null, "hs_calculated_mobile_number": null, "hs_calculated_phone_number": null, "hs_calculated_phone_number_area_code": null, "hs_calculated_phone_number_country_code": null, "hs_calculated_phone_number_region_code": null, "hs_clicked_linkedin_ad": null, "hs_content_membership_email": null, "hs_content_membership_email_confirmed": null, "hs_content_membership_follow_up_enqueued_at": null, "hs_content_membership_notes": null, "hs_content_membership_registered_at": null, "hs_content_membership_registration_domain_sent_to": null, "hs_content_membership_registration_email_sent_at": null, "hs_content_membership_status": null, "hs_conversations_visitor_email": null, "hs_count_is_unworked": null, "hs_count_is_worked": null, "hs_created_by_conversations": null, "hs_created_by_user_id": null, "hs_createdate": null, "hs_date_entered_customer": null, "hs_date_entered_evangelist": null, "hs_date_entered_lead": null, "hs_date_entered_marketingqualifiedlead": null, "hs_date_entered_opportunity": null, "hs_date_entered_other": null, "hs_date_entered_salesqualifiedlead": null, "hs_date_entered_subscriber": "2021-02-22T14:05:09.944000+00:00", "hs_date_exited_customer": null, "hs_date_exited_evangelist": null, "hs_date_exited_lead": null, "hs_date_exited_marketingqualifiedlead": null, "hs_date_exited_opportunity": null, "hs_date_exited_other": null, "hs_date_exited_salesqualifiedlead": null, "hs_date_exited_subscriber": null, "hs_document_last_revisited": null, "hs_email_bad_address": null, "hs_email_bounce": null, "hs_email_click": null, "hs_email_customer_quarantined_reason": null, "hs_email_delivered": null, "hs_email_domain": "hubspot.com", "hs_email_first_click_date": null, "hs_email_first_open_date": null, "hs_email_first_reply_date": null, "hs_email_first_send_date": null, "hs_email_hard_bounce_reason": null, "hs_email_hard_bounce_reason_enum": null, "hs_email_is_ineligible": null, "hs_email_last_click_date": null, "hs_email_last_email_name": null, "hs_email_last_open_date": null, "hs_email_last_reply_date": null, "hs_email_last_send_date": null, "hs_email_open": null, "hs_email_optout": null, "hs_email_optout_10798197": null, "hs_email_optout_11890603": null, "hs_email_optout_11890831": null, "hs_email_optout_23704464": null, "hs_email_optout_94692364": null, "hs_email_quarantined": null, "hs_email_quarantined_reason": null, "hs_email_recipient_fatigue_recovery_time": null, "hs_email_replied": null, "hs_email_sends_since_last_engagement": null, "hs_emailconfirmationstatus": null, "hs_facebook_ad_clicked": null, "hs_facebook_click_id": null, "hs_feedback_last_nps_follow_up": null, "hs_feedback_last_nps_rating": null, "hs_feedback_last_survey_date": null, "hs_feedback_show_nps_web_survey": null, "hs_first_engagement_object_id": null, "hs_first_outreach_date": null, "hs_first_subscription_create_date": null, "hs_google_click_id": null, "hs_has_active_subscription": null, "hs_ip_timezone": null, "hs_is_contact": true, "hs_is_unworked": true, "hs_language": null, "hs_last_sales_activity_date": null, "hs_last_sales_activity_timestamp": null, "hs_last_sales_activity_type": null, "hs_lastmodifieddate": null, "hs_latest_disqualified_lead_date": null, "hs_latest_meeting_activity": null, "hs_latest_open_lead_date": null, "hs_latest_qualified_lead_date": null, "hs_latest_sequence_ended_date": null, "hs_latest_sequence_enrolled": null, "hs_latest_sequence_enrolled_date": null, "hs_latest_sequence_finished_date": null, "hs_latest_sequence_unenrolled_date": null, "hs_latest_source": "OFFLINE", "hs_latest_source_data_1": "API", "hs_latest_source_data_2": null, "hs_latest_source_timestamp": "2021-02-22T14:05:10.036000+00:00", "hs_latest_subscription_create_date": null, "hs_lead_status": null, "hs_legal_basis": null, "hs_lifecyclestage_customer_date": null, "hs_lifecyclestage_evangelist_date": null, "hs_lifecyclestage_lead_date": null, "hs_lifecyclestage_marketingqualifiedlead_date": null, "hs_lifecyclestage_opportunity_date": null, "hs_lifecyclestage_other_date": null, "hs_lifecyclestage_salesqualifiedlead_date": null, "hs_lifecyclestage_subscriber_date": "2021-02-22T14:05:09.944000+00:00", "hs_linkedin_ad_clicked": null, "hs_marketable_reason_id": null, "hs_marketable_reason_type": null, "hs_marketable_status": "false", "hs_marketable_until_renewal": "false", "hs_merged_object_ids": null, "hs_object_id": 251, "hs_object_source": "API", "hs_object_source_id": null, "hs_object_source_label": "INTERNAL_PROCESSING", "hs_object_source_user_id": null, "hs_persona": null, "hs_pinned_engagement_id": null, "hs_pipeline": "contacts-lifecycle-pipeline", "hs_predictivecontactscore": null, "hs_predictivecontactscore_v2": 0.29, "hs_predictivecontactscorebucket": null, "hs_predictivescoringtier": "tier_4", "hs_read_only": null, "hs_sa_first_engagement_date": null, "hs_sa_first_engagement_descr": null, "hs_sa_first_engagement_object_type": null, "hs_sales_email_last_clicked": null, "hs_sales_email_last_opened": null, "hs_sales_email_last_replied": null, "hs_searchable_calculated_international_mobile_number": null, "hs_searchable_calculated_international_phone_number": null, "hs_searchable_calculated_mobile_number": null, "hs_searchable_calculated_phone_number": "5551222323", "hs_sequences_actively_enrolled_count": null, "hs_sequences_enrolled_count": null, "hs_sequences_is_enrolled": null, "hs_testpurge": null, "hs_testrollback": null, "hs_time_between_contact_creation_and_deal_close": null, "hs_time_between_contact_creation_and_deal_creation": null, "hs_time_in_customer": null, "hs_time_in_evangelist": null, "hs_time_in_lead": null, "hs_time_in_marketingqualifiedlead": null, "hs_time_in_opportunity": null, "hs_time_in_other": null, "hs_time_in_salesqualifiedlead": null, "hs_time_in_subscriber": 92184150208, "hs_time_to_first_engagement": null, "hs_time_to_move_from_lead_to_customer": null, "hs_time_to_move_from_marketingqualifiedlead_to_customer": null, "hs_time_to_move_from_opportunity_to_customer": null, "hs_time_to_move_from_salesqualifiedlead_to_customer": null, "hs_time_to_move_from_subscriber_to_customer": null, "hs_timezone": null, "hs_unique_creation_key": null, "hs_updated_by_user_id": null, "hs_user_ids_of_all_notification_followers": null, "hs_user_ids_of_all_notification_unfollowers": null, "hs_user_ids_of_all_owners": null, "hs_v2_cumulative_time_in_customer": null, "hs_v2_cumulative_time_in_evangelist": null, "hs_v2_cumulative_time_in_lead": null, "hs_v2_cumulative_time_in_marketingqualifiedlead": null, "hs_v2_cumulative_time_in_opportunity": null, "hs_v2_cumulative_time_in_other": null, "hs_v2_cumulative_time_in_salesqualifiedlead": null, "hs_v2_cumulative_time_in_subscriber": null, "hs_v2_date_entered_customer": null, "hs_v2_date_entered_evangelist": null, "hs_v2_date_entered_lead": null, "hs_v2_date_entered_marketingqualifiedlead": null, "hs_v2_date_entered_opportunity": null, "hs_v2_date_entered_other": null, "hs_v2_date_entered_salesqualifiedlead": null, "hs_v2_date_entered_subscriber": "2021-02-22T14:05:09.944000+00:00", "hs_v2_date_exited_customer": null, "hs_v2_date_exited_evangelist": null, "hs_v2_date_exited_lead": null, "hs_v2_date_exited_marketingqualifiedlead": null, "hs_v2_date_exited_opportunity": null, "hs_v2_date_exited_other": null, "hs_v2_date_exited_salesqualifiedlead": null, "hs_v2_date_exited_subscriber": null, "hs_v2_latest_time_in_customer": null, "hs_v2_latest_time_in_evangelist": null, "hs_v2_latest_time_in_lead": null, "hs_v2_latest_time_in_marketingqualifiedlead": null, "hs_v2_latest_time_in_opportunity": null, "hs_v2_latest_time_in_other": null, "hs_v2_latest_time_in_salesqualifiedlead": null, "hs_v2_latest_time_in_subscriber": null, "hs_was_imported": null, "hs_whatsapp_phone_number": null, "hubspot_owner_assigneddate": null, "hubspot_owner_id": null, "hubspot_team_id": null, "hubspotscore": null, "industry": null, "ip_city": null, "ip_country": null, "ip_country_code": null, "ip_latlon": null, "ip_state": null, "ip_state_code": null, "ip_zipcode": null, "job_function": null, "jobtitle": null, "lastmodifieddate": "2023-03-21T19:29:13.036000+00:00", "lastname": "Test Lastname 5001", "lifecyclestage": "subscriber", "marital_status": null, "message": null, "military_status": null, "mobilephone": null, "my_custom_test_property": null, "notes_last_contacted": null, "notes_last_updated": null, "notes_next_activity_date": null, "num_associated_deals": null, "num_contacted_notes": null, "num_conversion_events": 0, "num_notes": null, "num_unique_conversion_events": 0, "numemployees": null, "phone": "555-122-2323", "recent_conversion_date": null, "recent_conversion_event_name": null, "recent_deal_amount": null, "recent_deal_close_date": null, "relationship_status": null, "salutation": null, "school": null, "seniority": null, "start_date": null, "state": "MA", "surveymonkeyeventlastupdated": null, "test": null, "total_revenue": null, "twitterhandle": null, "webinareventlastupdated": null, "website": "http://hubspot.com", "work_email": null, "zip": "02139"}, "createdAt": "2021-02-22T14:05:09.944Z", "updatedAt": "2023-03-21T19:29:13.036Z", "archived": false, "companies": ["5170561229", "5170561229"], "properties_address": "25000000 First Street", "properties_annualrevenue": null, "properties_associatedcompanyid": 5170561229, "properties_associatedcompanylastupdated": null, "properties_city": "Cambridge", "properties_closedate": null, "properties_company": "HubSpot", "properties_company_size": null, "properties_country": "USA", "properties_createdate": "2021-02-22T14:05:09.944000+00:00", "properties_currentlyinworkflow": null, "properties_date_of_birth": null, "properties_days_to_close": null, "properties_degree": null, "properties_email": "testingdsapis@hubspot.com", "properties_engagements_last_meeting_booked": null, "properties_engagements_last_meeting_booked_campaign": null, "properties_engagements_last_meeting_booked_medium": null, "properties_engagements_last_meeting_booked_source": null, "properties_fax": null, "properties_field_of_study": null, "properties_first_conversion_date": null, "properties_first_conversion_event_name": null, "properties_first_deal_created_date": null, "properties_firstname": "Test User 5001", "properties_gender": null, "properties_graduation_date": null, "properties_hs_additional_emails": null, "properties_hs_all_accessible_team_ids": null, "properties_hs_all_contact_vids": "251", "properties_hs_all_owner_ids": null, "properties_hs_all_team_ids": null, "properties_hs_analytics_average_page_views": 0, "properties_hs_analytics_first_referrer": null, "properties_hs_analytics_first_timestamp": "2021-02-22T14:05:09.944000+00:00", "properties_hs_analytics_first_touch_converting_campaign": null, "properties_hs_analytics_first_url": null, "properties_hs_analytics_first_visit_timestamp": null, "properties_hs_analytics_last_referrer": null, "properties_hs_analytics_last_timestamp": null, "properties_hs_analytics_last_touch_converting_campaign": null, "properties_hs_analytics_last_url": null, "properties_hs_analytics_last_visit_timestamp": null, "properties_hs_analytics_num_event_completions": 0, "properties_hs_analytics_num_page_views": 0, "properties_hs_analytics_num_visits": 0, "properties_hs_analytics_revenue": 0.0, "properties_hs_analytics_source": "OFFLINE", "properties_hs_analytics_source_data_1": "API", "properties_hs_analytics_source_data_2": null, "properties_hs_avatar_filemanager_key": null, "properties_hs_buying_role": null, "properties_hs_calculated_form_submissions": null, "properties_hs_calculated_merged_vids": null, "properties_hs_calculated_mobile_number": null, "properties_hs_calculated_phone_number": null, "properties_hs_calculated_phone_number_area_code": null, "properties_hs_calculated_phone_number_country_code": null, "properties_hs_calculated_phone_number_region_code": null, "properties_hs_clicked_linkedin_ad": null, "properties_hs_content_membership_email": null, "properties_hs_content_membership_email_confirmed": null, "properties_hs_content_membership_follow_up_enqueued_at": null, "properties_hs_content_membership_notes": null, "properties_hs_content_membership_registered_at": null, "properties_hs_content_membership_registration_domain_sent_to": null, "properties_hs_content_membership_registration_email_sent_at": null, "properties_hs_content_membership_status": null, "properties_hs_conversations_visitor_email": null, "properties_hs_count_is_unworked": null, "properties_hs_count_is_worked": null, "properties_hs_created_by_conversations": null, "properties_hs_created_by_user_id": null, "properties_hs_createdate": null, "properties_hs_date_entered_customer": null, "properties_hs_date_entered_evangelist": null, "properties_hs_date_entered_lead": null, "properties_hs_date_entered_marketingqualifiedlead": null, "properties_hs_date_entered_opportunity": null, "properties_hs_date_entered_other": null, "properties_hs_date_entered_salesqualifiedlead": null, "properties_hs_date_entered_subscriber": "2021-02-22T14:05:09.944000+00:00", "properties_hs_date_exited_customer": null, "properties_hs_date_exited_evangelist": null, "properties_hs_date_exited_lead": null, "properties_hs_date_exited_marketingqualifiedlead": null, "properties_hs_date_exited_opportunity": null, "properties_hs_date_exited_other": null, "properties_hs_date_exited_salesqualifiedlead": null, "properties_hs_date_exited_subscriber": null, "properties_hs_document_last_revisited": null, "properties_hs_email_bad_address": null, "properties_hs_email_bounce": null, "properties_hs_email_click": null, "properties_hs_email_customer_quarantined_reason": null, "properties_hs_email_delivered": null, "properties_hs_email_domain": "hubspot.com", "properties_hs_email_first_click_date": null, "properties_hs_email_first_open_date": null, "properties_hs_email_first_reply_date": null, "properties_hs_email_first_send_date": null, "properties_hs_email_hard_bounce_reason": null, "properties_hs_email_hard_bounce_reason_enum": null, "properties_hs_email_is_ineligible": null, "properties_hs_email_last_click_date": null, "properties_hs_email_last_email_name": null, "properties_hs_email_last_open_date": null, "properties_hs_email_last_reply_date": null, "properties_hs_email_last_send_date": null, "properties_hs_email_open": null, "properties_hs_email_optout": null, "properties_hs_email_optout_10798197": null, "properties_hs_email_optout_11890603": null, "properties_hs_email_optout_11890831": null, "properties_hs_email_optout_23704464": null, "properties_hs_email_optout_94692364": null, "properties_hs_email_quarantined": null, "properties_hs_email_quarantined_reason": null, "properties_hs_email_recipient_fatigue_recovery_time": null, "properties_hs_email_replied": null, "properties_hs_email_sends_since_last_engagement": null, "properties_hs_emailconfirmationstatus": null, "properties_hs_facebook_ad_clicked": null, "properties_hs_facebook_click_id": null, "properties_hs_feedback_last_nps_follow_up": null, "properties_hs_feedback_last_nps_rating": null, "properties_hs_feedback_last_survey_date": null, "properties_hs_feedback_show_nps_web_survey": null, "properties_hs_first_engagement_object_id": null, "properties_hs_first_outreach_date": null, "properties_hs_first_subscription_create_date": null, "properties_hs_google_click_id": null, "properties_hs_has_active_subscription": null, "properties_hs_ip_timezone": null, "properties_hs_is_contact": true, "properties_hs_is_unworked": true, "properties_hs_language": null, "properties_hs_last_sales_activity_date": null, "properties_hs_last_sales_activity_timestamp": null, "properties_hs_last_sales_activity_type": null, "properties_hs_lastmodifieddate": null, "properties_hs_latest_disqualified_lead_date": null, "properties_hs_latest_meeting_activity": null, "properties_hs_latest_open_lead_date": null, "properties_hs_latest_qualified_lead_date": null, "properties_hs_latest_sequence_ended_date": null, "properties_hs_latest_sequence_enrolled": null, "properties_hs_latest_sequence_enrolled_date": null, "properties_hs_latest_sequence_finished_date": null, "properties_hs_latest_sequence_unenrolled_date": null, "properties_hs_latest_source": "OFFLINE", "properties_hs_latest_source_data_1": "API", "properties_hs_latest_source_data_2": null, "properties_hs_latest_source_timestamp": "2021-02-22T14:05:10.036000+00:00", "properties_hs_latest_subscription_create_date": null, "properties_hs_lead_status": null, "properties_hs_legal_basis": null, "properties_hs_lifecyclestage_customer_date": null, "properties_hs_lifecyclestage_evangelist_date": null, "properties_hs_lifecyclestage_lead_date": null, "properties_hs_lifecyclestage_marketingqualifiedlead_date": null, "properties_hs_lifecyclestage_opportunity_date": null, "properties_hs_lifecyclestage_other_date": null, "properties_hs_lifecyclestage_salesqualifiedlead_date": null, "properties_hs_lifecyclestage_subscriber_date": "2021-02-22T14:05:09.944000+00:00", "properties_hs_linkedin_ad_clicked": null, "properties_hs_marketable_reason_id": null, "properties_hs_marketable_reason_type": null, "properties_hs_marketable_status": "false", "properties_hs_marketable_until_renewal": "false", "properties_hs_merged_object_ids": null, "properties_hs_object_id": 251, "properties_hs_object_source": "API", "properties_hs_object_source_id": null, "properties_hs_object_source_label": "INTERNAL_PROCESSING", "properties_hs_object_source_user_id": null, "properties_hs_persona": null, "properties_hs_pinned_engagement_id": null, "properties_hs_pipeline": "contacts-lifecycle-pipeline", "properties_hs_predictivecontactscore": null, "properties_hs_predictivecontactscore_v2": 0.29, "properties_hs_predictivecontactscorebucket": null, "properties_hs_predictivescoringtier": "tier_4", "properties_hs_read_only": null, "properties_hs_sa_first_engagement_date": null, "properties_hs_sa_first_engagement_descr": null, "properties_hs_sa_first_engagement_object_type": null, "properties_hs_sales_email_last_clicked": null, "properties_hs_sales_email_last_opened": null, "properties_hs_sales_email_last_replied": null, "properties_hs_searchable_calculated_international_mobile_number": null, "properties_hs_searchable_calculated_international_phone_number": null, "properties_hs_searchable_calculated_mobile_number": null, "properties_hs_searchable_calculated_phone_number": "5551222323", "properties_hs_sequences_actively_enrolled_count": null, "properties_hs_sequences_enrolled_count": null, "properties_hs_sequences_is_enrolled": null, "properties_hs_testpurge": null, "properties_hs_testrollback": null, "properties_hs_time_between_contact_creation_and_deal_close": null, "properties_hs_time_between_contact_creation_and_deal_creation": null, "properties_hs_time_in_customer": null, "properties_hs_time_in_evangelist": null, "properties_hs_time_in_lead": null, "properties_hs_time_in_marketingqualifiedlead": null, "properties_hs_time_in_opportunity": null, "properties_hs_time_in_other": null, "properties_hs_time_in_salesqualifiedlead": null, "properties_hs_time_in_subscriber": 92184150208, "properties_hs_time_to_first_engagement": null, "properties_hs_time_to_move_from_lead_to_customer": null, "properties_hs_time_to_move_from_marketingqualifiedlead_to_customer": null, "properties_hs_time_to_move_from_opportunity_to_customer": null, "properties_hs_time_to_move_from_salesqualifiedlead_to_customer": null, "properties_hs_time_to_move_from_subscriber_to_customer": null, "properties_hs_timezone": null, "properties_hs_unique_creation_key": null, "properties_hs_updated_by_user_id": null, "properties_hs_user_ids_of_all_notification_followers": null, "properties_hs_user_ids_of_all_notification_unfollowers": null, "properties_hs_user_ids_of_all_owners": null, "properties_hs_v2_cumulative_time_in_customer": null, "properties_hs_v2_cumulative_time_in_evangelist": null, "properties_hs_v2_cumulative_time_in_lead": null, "properties_hs_v2_cumulative_time_in_marketingqualifiedlead": null, "properties_hs_v2_cumulative_time_in_opportunity": null, "properties_hs_v2_cumulative_time_in_other": null, "properties_hs_v2_cumulative_time_in_salesqualifiedlead": null, "properties_hs_v2_cumulative_time_in_subscriber": null, "properties_hs_v2_date_entered_customer": null, "properties_hs_v2_date_entered_evangelist": null, "properties_hs_v2_date_entered_lead": null, "properties_hs_v2_date_entered_marketingqualifiedlead": null, "properties_hs_v2_date_entered_opportunity": null, "properties_hs_v2_date_entered_other": null, "properties_hs_v2_date_entered_salesqualifiedlead": null, "properties_hs_v2_date_entered_subscriber": "2021-02-22T14:05:09.944000+00:00", "properties_hs_v2_date_exited_customer": null, "properties_hs_v2_date_exited_evangelist": null, "properties_hs_v2_date_exited_lead": null, "properties_hs_v2_date_exited_marketingqualifiedlead": null, "properties_hs_v2_date_exited_opportunity": null, "properties_hs_v2_date_exited_other": null, "properties_hs_v2_date_exited_salesqualifiedlead": null, "properties_hs_v2_date_exited_subscriber": null, "properties_hs_v2_latest_time_in_customer": null, "properties_hs_v2_latest_time_in_evangelist": null, "properties_hs_v2_latest_time_in_lead": null, "properties_hs_v2_latest_time_in_marketingqualifiedlead": null, "properties_hs_v2_latest_time_in_opportunity": null, "properties_hs_v2_latest_time_in_other": null, "properties_hs_v2_latest_time_in_salesqualifiedlead": null, "properties_hs_v2_latest_time_in_subscriber": null, "properties_hs_was_imported": null, "properties_hs_whatsapp_phone_number": null, "properties_hubspot_owner_assigneddate": null, "properties_hubspot_owner_id": null, "properties_hubspot_team_id": null, "properties_hubspotscore": null, "properties_industry": null, "properties_ip_city": null, "properties_ip_country": null, "properties_ip_country_code": null, "properties_ip_latlon": null, "properties_ip_state": null, "properties_ip_state_code": null, "properties_ip_zipcode": null, "properties_job_function": null, "properties_jobtitle": null, "properties_lastmodifieddate": "2023-03-21T19:29:13.036000+00:00", "properties_lastname": "Test Lastname 5001", "properties_lifecyclestage": "subscriber", "properties_marital_status": null, "properties_message": null, "properties_military_status": null, "properties_mobilephone": null, "properties_my_custom_test_property": null, "properties_notes_last_contacted": null, "properties_notes_last_updated": null, "properties_notes_next_activity_date": null, "properties_num_associated_deals": null, "properties_num_contacted_notes": null, "properties_num_conversion_events": 0, "properties_num_notes": null, "properties_num_unique_conversion_events": 0, "properties_numemployees": null, "properties_phone": "555-122-2323", "properties_recent_conversion_date": null, "properties_recent_conversion_event_name": null, "properties_recent_deal_amount": null, "properties_recent_deal_close_date": null, "properties_relationship_status": null, "properties_salutation": null, "properties_school": null, "properties_seniority": null, "properties_start_date": null, "properties_state": "MA", "properties_surveymonkeyeventlastupdated": null, "properties_test": null, "properties_total_revenue": null, "properties_twitterhandle": null, "properties_webinareventlastupdated": null, "properties_website": "http://hubspot.com", "properties_work_email": null, "properties_zip": "02139"}, "emitted_at": 1706186860299}
+{"stream": "contacts", "data": {"id": "401", "properties": {"address": "25 First Street", "annualrevenue": null, "associatedcompanyid": null, "associatedcompanylastupdated": null, "city": "Cambridge", "closedate": null, "company": null, "company_size": null, "country": null, "createdate": "2021-02-23T20:10:36.191000+00:00", "currentlyinworkflow": null, "date_of_birth": null, "days_to_close": null, "degree": null, "email": "macmitch@hubspot.com", "engagements_last_meeting_booked": null, "engagements_last_meeting_booked_campaign": null, "engagements_last_meeting_booked_medium": null, "engagements_last_meeting_booked_source": null, "fax": null, "field_of_study": null, "first_conversion_date": null, "first_conversion_event_name": null, "first_deal_created_date": null, "firstname": "Mac", "gender": null, "graduation_date": null, "hs_additional_emails": null, "hs_all_accessible_team_ids": null, "hs_all_contact_vids": "401", "hs_all_owner_ids": "52550153", "hs_all_team_ids": null, "hs_analytics_average_page_views": 0, "hs_analytics_first_referrer": null, "hs_analytics_first_timestamp": "2021-02-23T20:10:36.181000+00:00", "hs_analytics_first_touch_converting_campaign": null, "hs_analytics_first_url": null, "hs_analytics_first_visit_timestamp": null, "hs_analytics_last_referrer": null, "hs_analytics_last_timestamp": null, "hs_analytics_last_touch_converting_campaign": null, "hs_analytics_last_url": null, "hs_analytics_last_visit_timestamp": null, "hs_analytics_num_event_completions": 0, "hs_analytics_num_page_views": 0, "hs_analytics_num_visits": 0, "hs_analytics_revenue": 0.0, "hs_analytics_source": "OFFLINE", "hs_analytics_source_data_1": "IMPORT", "hs_analytics_source_data_2": "13256565", "hs_avatar_filemanager_key": null, "hs_buying_role": null, "hs_calculated_form_submissions": null, "hs_calculated_merged_vids": null, "hs_calculated_mobile_number": null, "hs_calculated_phone_number": "+18884827768", "hs_calculated_phone_number_area_code": null, "hs_calculated_phone_number_country_code": "US", "hs_calculated_phone_number_region_code": null, "hs_clicked_linkedin_ad": null, "hs_content_membership_email": null, "hs_content_membership_email_confirmed": null, "hs_content_membership_follow_up_enqueued_at": null, "hs_content_membership_notes": null, "hs_content_membership_registered_at": null, "hs_content_membership_registration_domain_sent_to": null, "hs_content_membership_registration_email_sent_at": null, "hs_content_membership_status": null, "hs_conversations_visitor_email": null, "hs_count_is_unworked": 1, "hs_count_is_worked": 0, "hs_created_by_conversations": null, "hs_created_by_user_id": null, "hs_createdate": null, "hs_date_entered_customer": null, "hs_date_entered_evangelist": null, "hs_date_entered_lead": "2021-02-23T20:10:36.181000+00:00", "hs_date_entered_marketingqualifiedlead": null, "hs_date_entered_opportunity": null, "hs_date_entered_other": null, "hs_date_entered_salesqualifiedlead": null, "hs_date_entered_subscriber": null, "hs_date_exited_customer": null, "hs_date_exited_evangelist": null, "hs_date_exited_lead": null, "hs_date_exited_marketingqualifiedlead": null, "hs_date_exited_opportunity": null, "hs_date_exited_other": null, "hs_date_exited_salesqualifiedlead": null, "hs_date_exited_subscriber": null, "hs_document_last_revisited": null, "hs_email_bad_address": null, "hs_email_bounce": null, "hs_email_click": null, "hs_email_customer_quarantined_reason": null, "hs_email_delivered": null, "hs_email_domain": "hubspot.com", "hs_email_first_click_date": null, "hs_email_first_open_date": null, "hs_email_first_reply_date": null, "hs_email_first_send_date": null, "hs_email_hard_bounce_reason": null, "hs_email_hard_bounce_reason_enum": "OTHER", "hs_email_is_ineligible": null, "hs_email_last_click_date": null, "hs_email_last_email_name": null, "hs_email_last_open_date": null, "hs_email_last_reply_date": null, "hs_email_last_send_date": null, "hs_email_open": null, "hs_email_optout": null, "hs_email_optout_10798197": null, "hs_email_optout_11890603": null, "hs_email_optout_11890831": null, "hs_email_optout_23704464": null, "hs_email_optout_94692364": null, "hs_email_quarantined": null, "hs_email_quarantined_reason": null, "hs_email_recipient_fatigue_recovery_time": null, "hs_email_replied": null, "hs_email_sends_since_last_engagement": null, "hs_emailconfirmationstatus": null, "hs_facebook_ad_clicked": null, "hs_facebook_click_id": null, "hs_feedback_last_nps_follow_up": null, "hs_feedback_last_nps_rating": null, "hs_feedback_last_survey_date": null, "hs_feedback_show_nps_web_survey": null, "hs_first_engagement_object_id": null, "hs_first_outreach_date": null, "hs_first_subscription_create_date": null, "hs_google_click_id": null, "hs_has_active_subscription": null, "hs_ip_timezone": null, "hs_is_contact": true, "hs_is_unworked": true, "hs_language": null, "hs_last_sales_activity_date": null, "hs_last_sales_activity_timestamp": null, "hs_last_sales_activity_type": null, "hs_lastmodifieddate": null, "hs_latest_disqualified_lead_date": null, "hs_latest_meeting_activity": null, "hs_latest_open_lead_date": null, "hs_latest_qualified_lead_date": null, "hs_latest_sequence_ended_date": null, "hs_latest_sequence_enrolled": null, "hs_latest_sequence_enrolled_date": null, "hs_latest_sequence_finished_date": null, "hs_latest_sequence_unenrolled_date": null, "hs_latest_source": "OFFLINE", "hs_latest_source_data_1": "IMPORT", "hs_latest_source_data_2": "13256565", "hs_latest_source_timestamp": "2021-02-23T20:10:36.210000+00:00", "hs_latest_subscription_create_date": null, "hs_lead_status": null, "hs_legal_basis": null, "hs_lifecyclestage_customer_date": null, "hs_lifecyclestage_evangelist_date": null, "hs_lifecyclestage_lead_date": "2021-02-23T20:10:36.181000+00:00", "hs_lifecyclestage_marketingqualifiedlead_date": null, "hs_lifecyclestage_opportunity_date": null, "hs_lifecyclestage_other_date": null, "hs_lifecyclestage_salesqualifiedlead_date": null, "hs_lifecyclestage_subscriber_date": null, "hs_linkedin_ad_clicked": null, "hs_marketable_reason_id": null, "hs_marketable_reason_type": null, "hs_marketable_status": "false", "hs_marketable_until_renewal": "false", "hs_merged_object_ids": null, "hs_object_id": 401, "hs_object_source": "IMPORT", "hs_object_source_id": "13256565", "hs_object_source_label": "IMPORT", "hs_object_source_user_id": null, "hs_persona": null, "hs_pinned_engagement_id": null, "hs_pipeline": "contacts-lifecycle-pipeline", "hs_predictivecontactscore": null, "hs_predictivecontactscore_v2": 0.29, "hs_predictivecontactscorebucket": null, "hs_predictivescoringtier": "tier_4", "hs_read_only": null, "hs_sa_first_engagement_date": null, "hs_sa_first_engagement_descr": null, "hs_sa_first_engagement_object_type": null, "hs_sales_email_last_clicked": null, "hs_sales_email_last_opened": null, "hs_sales_email_last_replied": null, "hs_searchable_calculated_international_mobile_number": null, "hs_searchable_calculated_international_phone_number": null, "hs_searchable_calculated_mobile_number": null, "hs_searchable_calculated_phone_number": "8884827768", "hs_sequences_actively_enrolled_count": null, "hs_sequences_enrolled_count": null, "hs_sequences_is_enrolled": null, "hs_testpurge": null, "hs_testrollback": null, "hs_time_between_contact_creation_and_deal_close": null, "hs_time_between_contact_creation_and_deal_creation": null, "hs_time_in_customer": null, "hs_time_in_evangelist": null, "hs_time_in_lead": 92075823971, "hs_time_in_marketingqualifiedlead": null, "hs_time_in_opportunity": null, "hs_time_in_other": null, "hs_time_in_salesqualifiedlead": null, "hs_time_in_subscriber": null, "hs_time_to_first_engagement": null, "hs_time_to_move_from_lead_to_customer": null, "hs_time_to_move_from_marketingqualifiedlead_to_customer": null, "hs_time_to_move_from_opportunity_to_customer": null, "hs_time_to_move_from_salesqualifiedlead_to_customer": null, "hs_time_to_move_from_subscriber_to_customer": null, "hs_timezone": null, "hs_unique_creation_key": null, "hs_updated_by_user_id": null, "hs_user_ids_of_all_notification_followers": null, "hs_user_ids_of_all_notification_unfollowers": null, "hs_user_ids_of_all_owners": "12282590", "hs_v2_cumulative_time_in_customer": null, "hs_v2_cumulative_time_in_evangelist": null, "hs_v2_cumulative_time_in_lead": null, "hs_v2_cumulative_time_in_marketingqualifiedlead": null, "hs_v2_cumulative_time_in_opportunity": null, "hs_v2_cumulative_time_in_other": null, "hs_v2_cumulative_time_in_salesqualifiedlead": null, "hs_v2_cumulative_time_in_subscriber": null, "hs_v2_date_entered_customer": null, "hs_v2_date_entered_evangelist": null, "hs_v2_date_entered_lead": "2021-02-23T20:10:36.181000+00:00", "hs_v2_date_entered_marketingqualifiedlead": null, "hs_v2_date_entered_opportunity": null, "hs_v2_date_entered_other": null, "hs_v2_date_entered_salesqualifiedlead": null, "hs_v2_date_entered_subscriber": null, "hs_v2_date_exited_customer": null, "hs_v2_date_exited_evangelist": null, "hs_v2_date_exited_lead": null, "hs_v2_date_exited_marketingqualifiedlead": null, "hs_v2_date_exited_opportunity": null, "hs_v2_date_exited_other": null, "hs_v2_date_exited_salesqualifiedlead": null, "hs_v2_date_exited_subscriber": null, "hs_v2_latest_time_in_customer": null, "hs_v2_latest_time_in_evangelist": null, "hs_v2_latest_time_in_lead": null, "hs_v2_latest_time_in_marketingqualifiedlead": null, "hs_v2_latest_time_in_opportunity": null, "hs_v2_latest_time_in_other": null, "hs_v2_latest_time_in_salesqualifiedlead": null, "hs_v2_latest_time_in_subscriber": null, "hs_was_imported": true, "hs_whatsapp_phone_number": null, "hubspot_owner_assigneddate": "2021-05-21T10:20:30.963000+00:00", "hubspot_owner_id": "52550153", "hubspot_team_id": null, "hubspotscore": null, "industry": null, "ip_city": null, "ip_country": null, "ip_country_code": null, "ip_latlon": null, "ip_state": null, "ip_state_code": null, "ip_zipcode": null, "job_function": null, "jobtitle": null, "lastmodifieddate": "2023-03-21T19:31:00.563000+00:00", "lastname": "Mitchell", "lifecyclestage": "lead", "marital_status": null, "message": null, "military_status": null, "mobilephone": null, "my_custom_test_property": null, "notes_last_contacted": null, "notes_last_updated": null, "notes_next_activity_date": null, "num_associated_deals": null, "num_contacted_notes": null, "num_conversion_events": 0, "num_notes": null, "num_unique_conversion_events": 0, "numemployees": null, "phone": "1(888) 482-7768", "recent_conversion_date": null, "recent_conversion_event_name": null, "recent_deal_amount": null, "recent_deal_close_date": null, "relationship_status": null, "salutation": null, "school": null, "seniority": null, "start_date": null, "state": "MA", "surveymonkeyeventlastupdated": null, "test": null, "total_revenue": null, "twitterhandle": null, "webinareventlastupdated": null, "website": null, "work_email": null, "zip": "21430"}, "createdAt": "2021-02-23T20:10:36.191Z", "updatedAt": "2023-03-21T19:31:00.563Z", "archived": false, "properties_address": "25 First Street", "properties_annualrevenue": null, "properties_associatedcompanyid": null, "properties_associatedcompanylastupdated": null, "properties_city": "Cambridge", "properties_closedate": null, "properties_company": null, "properties_company_size": null, "properties_country": null, "properties_createdate": "2021-02-23T20:10:36.191000+00:00", "properties_currentlyinworkflow": null, "properties_date_of_birth": null, "properties_days_to_close": null, "properties_degree": null, "properties_email": "macmitch@hubspot.com", "properties_engagements_last_meeting_booked": null, "properties_engagements_last_meeting_booked_campaign": null, "properties_engagements_last_meeting_booked_medium": null, "properties_engagements_last_meeting_booked_source": null, "properties_fax": null, "properties_field_of_study": null, "properties_first_conversion_date": null, "properties_first_conversion_event_name": null, "properties_first_deal_created_date": null, "properties_firstname": "Mac", "properties_gender": null, "properties_graduation_date": null, "properties_hs_additional_emails": null, "properties_hs_all_accessible_team_ids": null, "properties_hs_all_contact_vids": "401", "properties_hs_all_owner_ids": "52550153", "properties_hs_all_team_ids": null, "properties_hs_analytics_average_page_views": 0, "properties_hs_analytics_first_referrer": null, "properties_hs_analytics_first_timestamp": "2021-02-23T20:10:36.181000+00:00", "properties_hs_analytics_first_touch_converting_campaign": null, "properties_hs_analytics_first_url": null, "properties_hs_analytics_first_visit_timestamp": null, "properties_hs_analytics_last_referrer": null, "properties_hs_analytics_last_timestamp": null, "properties_hs_analytics_last_touch_converting_campaign": null, "properties_hs_analytics_last_url": null, "properties_hs_analytics_last_visit_timestamp": null, "properties_hs_analytics_num_event_completions": 0, "properties_hs_analytics_num_page_views": 0, "properties_hs_analytics_num_visits": 0, "properties_hs_analytics_revenue": 0.0, "properties_hs_analytics_source": "OFFLINE", "properties_hs_analytics_source_data_1": "IMPORT", "properties_hs_analytics_source_data_2": "13256565", "properties_hs_avatar_filemanager_key": null, "properties_hs_buying_role": null, "properties_hs_calculated_form_submissions": null, "properties_hs_calculated_merged_vids": null, "properties_hs_calculated_mobile_number": null, "properties_hs_calculated_phone_number": "+18884827768", "properties_hs_calculated_phone_number_area_code": null, "properties_hs_calculated_phone_number_country_code": "US", "properties_hs_calculated_phone_number_region_code": null, "properties_hs_clicked_linkedin_ad": null, "properties_hs_content_membership_email": null, "properties_hs_content_membership_email_confirmed": null, "properties_hs_content_membership_follow_up_enqueued_at": null, "properties_hs_content_membership_notes": null, "properties_hs_content_membership_registered_at": null, "properties_hs_content_membership_registration_domain_sent_to": null, "properties_hs_content_membership_registration_email_sent_at": null, "properties_hs_content_membership_status": null, "properties_hs_conversations_visitor_email": null, "properties_hs_count_is_unworked": 1, "properties_hs_count_is_worked": 0, "properties_hs_created_by_conversations": null, "properties_hs_created_by_user_id": null, "properties_hs_createdate": null, "properties_hs_date_entered_customer": null, "properties_hs_date_entered_evangelist": null, "properties_hs_date_entered_lead": "2021-02-23T20:10:36.181000+00:00", "properties_hs_date_entered_marketingqualifiedlead": null, "properties_hs_date_entered_opportunity": null, "properties_hs_date_entered_other": null, "properties_hs_date_entered_salesqualifiedlead": null, "properties_hs_date_entered_subscriber": null, "properties_hs_date_exited_customer": null, "properties_hs_date_exited_evangelist": null, "properties_hs_date_exited_lead": null, "properties_hs_date_exited_marketingqualifiedlead": null, "properties_hs_date_exited_opportunity": null, "properties_hs_date_exited_other": null, "properties_hs_date_exited_salesqualifiedlead": null, "properties_hs_date_exited_subscriber": null, "properties_hs_document_last_revisited": null, "properties_hs_email_bad_address": null, "properties_hs_email_bounce": null, "properties_hs_email_click": null, "properties_hs_email_customer_quarantined_reason": null, "properties_hs_email_delivered": null, "properties_hs_email_domain": "hubspot.com", "properties_hs_email_first_click_date": null, "properties_hs_email_first_open_date": null, "properties_hs_email_first_reply_date": null, "properties_hs_email_first_send_date": null, "properties_hs_email_hard_bounce_reason": null, "properties_hs_email_hard_bounce_reason_enum": "OTHER", "properties_hs_email_is_ineligible": null, "properties_hs_email_last_click_date": null, "properties_hs_email_last_email_name": null, "properties_hs_email_last_open_date": null, "properties_hs_email_last_reply_date": null, "properties_hs_email_last_send_date": null, "properties_hs_email_open": null, "properties_hs_email_optout": null, "properties_hs_email_optout_10798197": null, "properties_hs_email_optout_11890603": null, "properties_hs_email_optout_11890831": null, "properties_hs_email_optout_23704464": null, "properties_hs_email_optout_94692364": null, "properties_hs_email_quarantined": null, "properties_hs_email_quarantined_reason": null, "properties_hs_email_recipient_fatigue_recovery_time": null, "properties_hs_email_replied": null, "properties_hs_email_sends_since_last_engagement": null, "properties_hs_emailconfirmationstatus": null, "properties_hs_facebook_ad_clicked": null, "properties_hs_facebook_click_id": null, "properties_hs_feedback_last_nps_follow_up": null, "properties_hs_feedback_last_nps_rating": null, "properties_hs_feedback_last_survey_date": null, "properties_hs_feedback_show_nps_web_survey": null, "properties_hs_first_engagement_object_id": null, "properties_hs_first_outreach_date": null, "properties_hs_first_subscription_create_date": null, "properties_hs_google_click_id": null, "properties_hs_has_active_subscription": null, "properties_hs_ip_timezone": null, "properties_hs_is_contact": true, "properties_hs_is_unworked": true, "properties_hs_language": null, "properties_hs_last_sales_activity_date": null, "properties_hs_last_sales_activity_timestamp": null, "properties_hs_last_sales_activity_type": null, "properties_hs_lastmodifieddate": null, "properties_hs_latest_disqualified_lead_date": null, "properties_hs_latest_meeting_activity": null, "properties_hs_latest_open_lead_date": null, "properties_hs_latest_qualified_lead_date": null, "properties_hs_latest_sequence_ended_date": null, "properties_hs_latest_sequence_enrolled": null, "properties_hs_latest_sequence_enrolled_date": null, "properties_hs_latest_sequence_finished_date": null, "properties_hs_latest_sequence_unenrolled_date": null, "properties_hs_latest_source": "OFFLINE", "properties_hs_latest_source_data_1": "IMPORT", "properties_hs_latest_source_data_2": "13256565", "properties_hs_latest_source_timestamp": "2021-02-23T20:10:36.210000+00:00", "properties_hs_latest_subscription_create_date": null, "properties_hs_lead_status": null, "properties_hs_legal_basis": null, "properties_hs_lifecyclestage_customer_date": null, "properties_hs_lifecyclestage_evangelist_date": null, "properties_hs_lifecyclestage_lead_date": "2021-02-23T20:10:36.181000+00:00", "properties_hs_lifecyclestage_marketingqualifiedlead_date": null, "properties_hs_lifecyclestage_opportunity_date": null, "properties_hs_lifecyclestage_other_date": null, "properties_hs_lifecyclestage_salesqualifiedlead_date": null, "properties_hs_lifecyclestage_subscriber_date": null, "properties_hs_linkedin_ad_clicked": null, "properties_hs_marketable_reason_id": null, "properties_hs_marketable_reason_type": null, "properties_hs_marketable_status": "false", "properties_hs_marketable_until_renewal": "false", "properties_hs_merged_object_ids": null, "properties_hs_object_id": 401, "properties_hs_object_source": "IMPORT", "properties_hs_object_source_id": "13256565", "properties_hs_object_source_label": "IMPORT", "properties_hs_object_source_user_id": null, "properties_hs_persona": null, "properties_hs_pinned_engagement_id": null, "properties_hs_pipeline": "contacts-lifecycle-pipeline", "properties_hs_predictivecontactscore": null, "properties_hs_predictivecontactscore_v2": 0.29, "properties_hs_predictivecontactscorebucket": null, "properties_hs_predictivescoringtier": "tier_4", "properties_hs_read_only": null, "properties_hs_sa_first_engagement_date": null, "properties_hs_sa_first_engagement_descr": null, "properties_hs_sa_first_engagement_object_type": null, "properties_hs_sales_email_last_clicked": null, "properties_hs_sales_email_last_opened": null, "properties_hs_sales_email_last_replied": null, "properties_hs_searchable_calculated_international_mobile_number": null, "properties_hs_searchable_calculated_international_phone_number": null, "properties_hs_searchable_calculated_mobile_number": null, "properties_hs_searchable_calculated_phone_number": "8884827768", "properties_hs_sequences_actively_enrolled_count": null, "properties_hs_sequences_enrolled_count": null, "properties_hs_sequences_is_enrolled": null, "properties_hs_testpurge": null, "properties_hs_testrollback": null, "properties_hs_time_between_contact_creation_and_deal_close": null, "properties_hs_time_between_contact_creation_and_deal_creation": null, "properties_hs_time_in_customer": null, "properties_hs_time_in_evangelist": null, "properties_hs_time_in_lead": 92075823971, "properties_hs_time_in_marketingqualifiedlead": null, "properties_hs_time_in_opportunity": null, "properties_hs_time_in_other": null, "properties_hs_time_in_salesqualifiedlead": null, "properties_hs_time_in_subscriber": null, "properties_hs_time_to_first_engagement": null, "properties_hs_time_to_move_from_lead_to_customer": null, "properties_hs_time_to_move_from_marketingqualifiedlead_to_customer": null, "properties_hs_time_to_move_from_opportunity_to_customer": null, "properties_hs_time_to_move_from_salesqualifiedlead_to_customer": null, "properties_hs_time_to_move_from_subscriber_to_customer": null, "properties_hs_timezone": null, "properties_hs_unique_creation_key": null, "properties_hs_updated_by_user_id": null, "properties_hs_user_ids_of_all_notification_followers": null, "properties_hs_user_ids_of_all_notification_unfollowers": null, "properties_hs_user_ids_of_all_owners": "12282590", "properties_hs_v2_cumulative_time_in_customer": null, "properties_hs_v2_cumulative_time_in_evangelist": null, "properties_hs_v2_cumulative_time_in_lead": null, "properties_hs_v2_cumulative_time_in_marketingqualifiedlead": null, "properties_hs_v2_cumulative_time_in_opportunity": null, "properties_hs_v2_cumulative_time_in_other": null, "properties_hs_v2_cumulative_time_in_salesqualifiedlead": null, "properties_hs_v2_cumulative_time_in_subscriber": null, "properties_hs_v2_date_entered_customer": null, "properties_hs_v2_date_entered_evangelist": null, "properties_hs_v2_date_entered_lead": "2021-02-23T20:10:36.181000+00:00", "properties_hs_v2_date_entered_marketingqualifiedlead": null, "properties_hs_v2_date_entered_opportunity": null, "properties_hs_v2_date_entered_other": null, "properties_hs_v2_date_entered_salesqualifiedlead": null, "properties_hs_v2_date_entered_subscriber": null, "properties_hs_v2_date_exited_customer": null, "properties_hs_v2_date_exited_evangelist": null, "properties_hs_v2_date_exited_lead": null, "properties_hs_v2_date_exited_marketingqualifiedlead": null, "properties_hs_v2_date_exited_opportunity": null, "properties_hs_v2_date_exited_other": null, "properties_hs_v2_date_exited_salesqualifiedlead": null, "properties_hs_v2_date_exited_subscriber": null, "properties_hs_v2_latest_time_in_customer": null, "properties_hs_v2_latest_time_in_evangelist": null, "properties_hs_v2_latest_time_in_lead": null, "properties_hs_v2_latest_time_in_marketingqualifiedlead": null, "properties_hs_v2_latest_time_in_opportunity": null, "properties_hs_v2_latest_time_in_other": null, "properties_hs_v2_latest_time_in_salesqualifiedlead": null, "properties_hs_v2_latest_time_in_subscriber": null, "properties_hs_was_imported": true, "properties_hs_whatsapp_phone_number": null, "properties_hubspot_owner_assigneddate": "2021-05-21T10:20:30.963000+00:00", "properties_hubspot_owner_id": "52550153", "properties_hubspot_team_id": null, "properties_hubspotscore": null, "properties_industry": null, "properties_ip_city": null, "properties_ip_country": null, "properties_ip_country_code": null, "properties_ip_latlon": null, "properties_ip_state": null, "properties_ip_state_code": null, "properties_ip_zipcode": null, "properties_job_function": null, "properties_jobtitle": null, "properties_lastmodifieddate": "2023-03-21T19:31:00.563000+00:00", "properties_lastname": "Mitchell", "properties_lifecyclestage": "lead", "properties_marital_status": null, "properties_message": null, "properties_military_status": null, "properties_mobilephone": null, "properties_my_custom_test_property": null, "properties_notes_last_contacted": null, "properties_notes_last_updated": null, "properties_notes_next_activity_date": null, "properties_num_associated_deals": null, "properties_num_contacted_notes": null, "properties_num_conversion_events": 0, "properties_num_notes": null, "properties_num_unique_conversion_events": 0, "properties_numemployees": null, "properties_phone": "1(888) 482-7768", "properties_recent_conversion_date": null, "properties_recent_conversion_event_name": null, "properties_recent_deal_amount": null, "properties_recent_deal_close_date": null, "properties_relationship_status": null, "properties_salutation": null, "properties_school": null, "properties_seniority": null, "properties_start_date": null, "properties_state": "MA", "properties_surveymonkeyeventlastupdated": null, "properties_test": null, "properties_total_revenue": null, "properties_twitterhandle": null, "properties_webinareventlastupdated": null, "properties_website": null, "properties_work_email": null, "properties_zip": "21430"}, "emitted_at": 1706186860302}
 {"stream": "contacts_list_memberships", "data": {"canonical-vid": 401, "static-list-id": 60, "internal-list-id": 2147483643, "timestamp": 1614111042672, "vid": 401, "is-member": true}, "emitted_at": 1697714191502}
 {"stream": "contacts_list_memberships", "data": {"canonical-vid": 401, "static-list-id": 61, "internal-list-id": 2147483643, "timestamp": 1615502112726, "vid": 401, "is-member": true}, "emitted_at": 1697714191513}
 {"stream": "contacts_list_memberships", "data": {"canonical-vid": 2501, "static-list-id": 60, "internal-list-id": 2147483643, "timestamp": 1675124235515, "vid": 2501, "is-member": true}, "emitted_at": 1697714191513}
 {"stream": "contacts_merged_audit", "data": {"canonical-vid": 651, "vid-to-merge": 201, "timestamp": 1688758327178, "entity-id": "auth:app-cookie | auth-level:app | login-id:integration-test@airbyte.io-1688758203663 | hub-id:8727216 | user-id:12282590 | origin-ip:2804:1b3:8402:b1f4:7d1b:f62e:b071:593d | correlation-id:3f139cd7-66fc-4300-8cbc-e6c1fe9ea7d1", "user-id": 12282590, "num-properties-moved": 45, "merged_from_email": {"value": "testingapis@hubspot.com", "source-type": "API", "source-id": null, "source-label": null, "updated-by-user-id": null, "timestamp": 1610634377014, "selected": false}, "merged_to_email": {"value": "testingapicontact_1@hubspot.com", "source-type": "API", "source-id": null, "source-label": null, "updated-by-user-id": null, "timestamp": 1634044981830, "selected": false}, "first-name": "test", "last-name": "testerson", "merged_from_email_value": "testingapis@hubspot.com", "merged_from_email_source-type": "API", "merged_from_email_source-id": null, "merged_from_email_source-label": null, "merged_from_email_updated-by-user-id": null, "merged_from_email_timestamp": 1610634377014, "merged_from_email_selected": false, "merged_to_email_value": "testingapicontact_1@hubspot.com", "merged_to_email_source-type": "API", "merged_to_email_source-id": null, "merged_to_email_source-label": null, "merged_to_email_updated-by-user-id": null, "merged_to_email_timestamp": 1634044981830, "merged_to_email_selected": false}, "emitted_at": 1697714194351}
 {"stream": "deal_pipelines", "data": {"label": "New Business Pipeline", "displayOrder": 3, "active": true, "stages": [{"label": "Initial Qualification", "displayOrder": 0, "metadata": {"isClosed": "false", "probability": "0.1"}, "stageId": "9567448", "createdAt": 1610635973956, "updatedAt": 1680620354263, "active": true}, {"label": "Success! Closed Won", "displayOrder": 2, "metadata": {"isClosed": "true", "probability": "1.0"}, "stageId": "customclosedwonstage", "createdAt": 1610635973956, "updatedAt": 1680620354263, "active": true}, {"label": "Negotiation", "displayOrder": 1, "metadata": {"isClosed": "false", "probability": "0.5"}, "stageId": "9567449", "createdAt": 1610635973956, "updatedAt": 1680620354263, "active": true}, {"label": "Closed Lost", "displayOrder": 3, "metadata": {"isClosed": "false", "probability": "0.1"}, "stageId": "66894120", "createdAt": 1680620354263, "updatedAt": 1680620354263, "active": true}], "objectType": "DEAL", "objectTypeId": "0-3", "pipelineId": "b9152945-a594-4835-9676-a6f405fecd71", "createdAt": 1610635973956, "updatedAt": 1680620354263, "default": false}, "emitted_at": 1697714195524}
-{"stream": "deals", "data": {"id": "3980651569", "properties": {"amount": 60000, "amount_in_home_currency": 60000, "closed_lost_reason": null, "closed_won_reason": null, "closedate": "2014-08-31T00:00:00+00:00", "createdate": "2021-01-13T10:30:42.221000+00:00", "days_to_close": 0, "dealname": "Tim's Newer Deal", "dealstage": "appointmentscheduled", "dealtype": "newbusiness", "description": null, "engagements_last_meeting_booked": null, "engagements_last_meeting_booked_campaign": null, "engagements_last_meeting_booked_medium": null, "engagements_last_meeting_booked_source": null, "hs_acv": null, "hs_all_accessible_team_ids": null, "hs_all_collaborator_owner_ids": null, "hs_all_deal_split_owner_ids": null, "hs_all_owner_ids": "52550153", "hs_all_team_ids": null, "hs_analytics_latest_source": "OFFLINE", "hs_analytics_latest_source_company": "OFFLINE", "hs_analytics_latest_source_contact": null, "hs_analytics_latest_source_data_1": "CONTACTS", "hs_analytics_latest_source_data_1_company": "CONTACTS", "hs_analytics_latest_source_data_1_contact": null, "hs_analytics_latest_source_data_2": "CRM_UI", "hs_analytics_latest_source_data_2_company": "CRM_UI", "hs_analytics_latest_source_data_2_contact": null, "hs_analytics_latest_source_timestamp": null, "hs_analytics_latest_source_timestamp_company": null, "hs_analytics_latest_source_timestamp_contact": null, "hs_analytics_source": "OFFLINE", "hs_analytics_source_data_1": "CONTACTS", "hs_analytics_source_data_2": "CRM_UI", "hs_arr": null, "hs_campaign": null, "hs_closed_amount": 0, "hs_closed_amount_in_home_currency": 0, "hs_closed_won_count": null, "hs_closed_won_date": null, "hs_created_by_user_id": null, "hs_createdate": "2021-01-13T10:30:42.221000+00:00", "hs_date_entered_66894120": null, "hs_date_entered_9567448": null, "hs_date_entered_9567449": null, "hs_date_entered_appointmentscheduled": "2021-01-13T10:30:42.221000+00:00", "hs_date_entered_closedlost": null, "hs_date_entered_closedwon": null, "hs_date_entered_contractsent": null, "hs_date_entered_customclosedwonstage": null, "hs_date_entered_decisionmakerboughtin": null, "hs_date_entered_presentationscheduled": null, "hs_date_entered_qualifiedtobuy": null, "hs_date_exited_66894120": null, "hs_date_exited_9567448": null, "hs_date_exited_9567449": null, "hs_date_exited_appointmentscheduled": null, "hs_date_exited_closedlost": null, "hs_date_exited_closedwon": null, "hs_date_exited_contractsent": null, "hs_date_exited_customclosedwonstage": null, "hs_date_exited_decisionmakerboughtin": null, "hs_date_exited_presentationscheduled": null, "hs_date_exited_qualifiedtobuy": null, "hs_days_to_close_raw": 0, "hs_deal_amount_calculation_preference": null, "hs_deal_stage_probability": 0.2, "hs_deal_stage_probability_shadow": null, "hs_exchange_rate": null, "hs_forecast_amount": 60000, "hs_forecast_probability": null, "hs_is_closed": false, "hs_is_closed_won": false, "hs_is_deal_split": false, "hs_is_open_count": 1, "hs_lastmodifieddate": "2021-09-07T02:36:16.363000+00:00", "hs_latest_meeting_activity": null, "hs_likelihood_to_close": null, "hs_line_item_global_term_hs_discount_percentage": null, "hs_line_item_global_term_hs_discount_percentage_enabled": null, "hs_line_item_global_term_hs_recurring_billing_period": null, "hs_line_item_global_term_hs_recurring_billing_period_enabled": null, "hs_line_item_global_term_hs_recurring_billing_start_date": null, "hs_line_item_global_term_hs_recurring_billing_start_date_enabled": null, "hs_line_item_global_term_recurringbillingfrequency": null, "hs_line_item_global_term_recurringbillingfrequency_enabled": null, "hs_manual_forecast_category": null, "hs_merged_object_ids": null, "hs_mrr": null, "hs_next_step": null, "hs_num_associated_deal_splits": null, "hs_num_of_associated_line_items": 0, "hs_num_target_accounts": 0, "hs_object_id": 3980651569, "hs_object_source": null, "hs_object_source_id": null, "hs_object_source_label": null, "hs_object_source_user_id": null, "hs_pinned_engagement_id": null, "hs_predicted_amount": null, "hs_predicted_amount_in_home_currency": null, "hs_priority": null, "hs_projected_amount": 12000.0, "hs_projected_amount_in_home_currency": 12000.0, "hs_read_only": null, "hs_sales_email_last_replied": null, "hs_tag_ids": null, "hs_tcv": null, "hs_time_in_66894120": null, "hs_time_in_9567448": null, "hs_time_in_9567449": null, "hs_time_in_appointmentscheduled": 92113120720, "hs_time_in_closedlost": null, "hs_time_in_closedwon": null, "hs_time_in_contractsent": null, "hs_time_in_customclosedwonstage": null, "hs_time_in_decisionmakerboughtin": null, "hs_time_in_presentationscheduled": null, "hs_time_in_qualifiedtobuy": null, "hs_unique_creation_key": null, "hs_updated_by_user_id": null, "hs_user_ids_of_all_notification_followers": null, "hs_user_ids_of_all_notification_unfollowers": null, "hs_user_ids_of_all_owners": "12282590", "hs_v2_cumulative_time_in_66894120": null, "hs_v2_cumulative_time_in_9567448": null, "hs_v2_cumulative_time_in_9567449": null, "hs_v2_cumulative_time_in_customclosedwonstage": null, "hs_v2_date_entered_66894120": null, "hs_v2_date_entered_9567448": null, "hs_v2_date_entered_9567449": null, "hs_v2_date_entered_customclosedwonstage": null, "hs_v2_date_exited_66894120": null, "hs_v2_date_exited_9567448": null, "hs_v2_date_exited_9567449": null, "hs_v2_date_exited_customclosedwonstage": null, "hs_v2_latest_time_in_66894120": null, "hs_v2_latest_time_in_9567448": null, "hs_v2_latest_time_in_9567449": null, "hs_v2_latest_time_in_customclosedwonstage": null, "hs_was_imported": null, "hubspot_owner_assigneddate": "2021-01-13T10:30:42.221000+00:00", "hubspot_owner_id": "52550153", "hubspot_team_id": null, "notes_last_contacted": null, "notes_last_updated": null, "notes_next_activity_date": null, "num_associated_contacts": 0, "num_contacted_notes": null, "num_notes": null, "pipeline": "default"}, "createdAt": "2021-01-13T10:30:42.221Z", "updatedAt": "2021-09-07T02:36:16.363Z", "archived": false, "companies": ["5000526215", "5000526215"], "properties_amount": 60000, "properties_amount_in_home_currency": 60000, "properties_closed_lost_reason": null, "properties_closed_won_reason": null, "properties_closedate": "2014-08-31T00:00:00+00:00", "properties_createdate": "2021-01-13T10:30:42.221000+00:00", "properties_days_to_close": 0, "properties_dealname": "Tim's Newer Deal", "properties_dealstage": "appointmentscheduled", "properties_dealtype": "newbusiness", "properties_description": null, "properties_engagements_last_meeting_booked": null, "properties_engagements_last_meeting_booked_campaign": null, "properties_engagements_last_meeting_booked_medium": null, "properties_engagements_last_meeting_booked_source": null, "properties_hs_acv": null, "properties_hs_all_accessible_team_ids": null, "properties_hs_all_collaborator_owner_ids": null, "properties_hs_all_deal_split_owner_ids": null, "properties_hs_all_owner_ids": "52550153", "properties_hs_all_team_ids": null, "properties_hs_analytics_latest_source": "OFFLINE", "properties_hs_analytics_latest_source_company": "OFFLINE", "properties_hs_analytics_latest_source_contact": null, "properties_hs_analytics_latest_source_data_1": "CONTACTS", "properties_hs_analytics_latest_source_data_1_company": "CONTACTS", "properties_hs_analytics_latest_source_data_1_contact": null, "properties_hs_analytics_latest_source_data_2": "CRM_UI", "properties_hs_analytics_latest_source_data_2_company": "CRM_UI", "properties_hs_analytics_latest_source_data_2_contact": null, "properties_hs_analytics_latest_source_timestamp": null, "properties_hs_analytics_latest_source_timestamp_company": null, "properties_hs_analytics_latest_source_timestamp_contact": null, "properties_hs_analytics_source": "OFFLINE", "properties_hs_analytics_source_data_1": "CONTACTS", "properties_hs_analytics_source_data_2": "CRM_UI", "properties_hs_arr": null, "properties_hs_campaign": null, "properties_hs_closed_amount": 0, "properties_hs_closed_amount_in_home_currency": 0, "properties_hs_closed_won_count": null, "properties_hs_closed_won_date": null, "properties_hs_created_by_user_id": null, "properties_hs_createdate": "2021-01-13T10:30:42.221000+00:00", "properties_hs_date_entered_66894120": null, "properties_hs_date_entered_9567448": null, "properties_hs_date_entered_9567449": null, "properties_hs_date_entered_appointmentscheduled": "2021-01-13T10:30:42.221000+00:00", "properties_hs_date_entered_closedlost": null, "properties_hs_date_entered_closedwon": null, "properties_hs_date_entered_contractsent": null, "properties_hs_date_entered_customclosedwonstage": null, "properties_hs_date_entered_decisionmakerboughtin": null, "properties_hs_date_entered_presentationscheduled": null, "properties_hs_date_entered_qualifiedtobuy": null, "properties_hs_date_exited_66894120": null, "properties_hs_date_exited_9567448": null, "properties_hs_date_exited_9567449": null, "properties_hs_date_exited_appointmentscheduled": null, "properties_hs_date_exited_closedlost": null, "properties_hs_date_exited_closedwon": null, "properties_hs_date_exited_contractsent": null, "properties_hs_date_exited_customclosedwonstage": null, "properties_hs_date_exited_decisionmakerboughtin": null, "properties_hs_date_exited_presentationscheduled": null, "properties_hs_date_exited_qualifiedtobuy": null, "properties_hs_days_to_close_raw": 0, "properties_hs_deal_amount_calculation_preference": null, "properties_hs_deal_stage_probability": 0.2, "properties_hs_deal_stage_probability_shadow": null, "properties_hs_exchange_rate": null, "properties_hs_forecast_amount": 60000, "properties_hs_forecast_probability": null, "properties_hs_is_closed": false, "properties_hs_is_closed_won": false, "properties_hs_is_deal_split": false, "properties_hs_is_open_count": 1, "properties_hs_lastmodifieddate": "2021-09-07T02:36:16.363000+00:00", "properties_hs_latest_meeting_activity": null, "properties_hs_likelihood_to_close": null, "properties_hs_line_item_global_term_hs_discount_percentage": null, "properties_hs_line_item_global_term_hs_discount_percentage_enabled": null, "properties_hs_line_item_global_term_hs_recurring_billing_period": null, "properties_hs_line_item_global_term_hs_recurring_billing_period_enabled": null, "properties_hs_line_item_global_term_hs_recurring_billing_start_date": null, "properties_hs_line_item_global_term_hs_recurring_billing_start_date_enabled": null, "properties_hs_line_item_global_term_recurringbillingfrequency": null, "properties_hs_line_item_global_term_recurringbillingfrequency_enabled": null, "properties_hs_manual_forecast_category": null, "properties_hs_merged_object_ids": null, "properties_hs_mrr": null, "properties_hs_next_step": null, "properties_hs_num_associated_deal_splits": null, "properties_hs_num_of_associated_line_items": 0, "properties_hs_num_target_accounts": 0, "properties_hs_object_id": 3980651569, "properties_hs_object_source": null, "properties_hs_object_source_id": null, "properties_hs_object_source_label": null, "properties_hs_object_source_user_id": null, "properties_hs_pinned_engagement_id": null, "properties_hs_predicted_amount": null, "properties_hs_predicted_amount_in_home_currency": null, "properties_hs_priority": null, "properties_hs_projected_amount": 12000.0, "properties_hs_projected_amount_in_home_currency": 12000.0, "properties_hs_read_only": null, "properties_hs_sales_email_last_replied": null, "properties_hs_tag_ids": null, "properties_hs_tcv": null, "properties_hs_time_in_66894120": null, "properties_hs_time_in_9567448": null, "properties_hs_time_in_9567449": null, "properties_hs_time_in_appointmentscheduled": 92113120720, "properties_hs_time_in_closedlost": null, "properties_hs_time_in_closedwon": null, "properties_hs_time_in_contractsent": null, "properties_hs_time_in_customclosedwonstage": null, "properties_hs_time_in_decisionmakerboughtin": null, "properties_hs_time_in_presentationscheduled": null, "properties_hs_time_in_qualifiedtobuy": null, "properties_hs_unique_creation_key": null, "properties_hs_updated_by_user_id": null, "properties_hs_user_ids_of_all_notification_followers": null, "properties_hs_user_ids_of_all_notification_unfollowers": null, "properties_hs_user_ids_of_all_owners": "12282590", "properties_hs_v2_cumulative_time_in_66894120": null, "properties_hs_v2_cumulative_time_in_9567448": null, "properties_hs_v2_cumulative_time_in_9567449": null, "properties_hs_v2_cumulative_time_in_customclosedwonstage": null, "properties_hs_v2_date_entered_66894120": null, "properties_hs_v2_date_entered_9567448": null, "properties_hs_v2_date_entered_9567449": null, "properties_hs_v2_date_entered_customclosedwonstage": null, "properties_hs_v2_date_exited_66894120": null, "properties_hs_v2_date_exited_9567448": null, "properties_hs_v2_date_exited_9567449": null, "properties_hs_v2_date_exited_customclosedwonstage": null, "properties_hs_v2_latest_time_in_66894120": null, "properties_hs_v2_latest_time_in_9567448": null, "properties_hs_v2_latest_time_in_9567449": null, "properties_hs_v2_latest_time_in_customclosedwonstage": null, "properties_hs_was_imported": null, "properties_hubspot_owner_assigneddate": "2021-01-13T10:30:42.221000+00:00", "properties_hubspot_owner_id": "52550153", "properties_hubspot_team_id": null, "properties_notes_last_contacted": null, "properties_notes_last_updated": null, "properties_notes_next_activity_date": null, "properties_num_associated_contacts": 0, "properties_num_contacted_notes": null, "properties_num_notes": null, "properties_pipeline": "default"}, "emitted_at": 1702646964420}
-{"stream": "deals", "data": {"id": "3980673856", "properties": {"amount": 60000, "amount_in_home_currency": 60000, "closed_lost_reason": null, "closed_won_reason": null, "closedate": "2014-08-31T00:00:00+00:00", "createdate": "2021-01-13T10:31:51.154000+00:00", "days_to_close": 0, "dealname": "Tim's Newer Deal", "dealstage": "appointmentscheduled", "dealtype": "newbusiness", "description": null, "engagements_last_meeting_booked": null, "engagements_last_meeting_booked_campaign": null, "engagements_last_meeting_booked_medium": null, "engagements_last_meeting_booked_source": null, "hs_acv": null, "hs_all_accessible_team_ids": null, "hs_all_collaborator_owner_ids": null, "hs_all_deal_split_owner_ids": null, "hs_all_owner_ids": "52550153", "hs_all_team_ids": null, "hs_analytics_latest_source": null, "hs_analytics_latest_source_company": null, "hs_analytics_latest_source_contact": null, "hs_analytics_latest_source_data_1": null, "hs_analytics_latest_source_data_1_company": null, "hs_analytics_latest_source_data_1_contact": null, "hs_analytics_latest_source_data_2": null, "hs_analytics_latest_source_data_2_company": null, "hs_analytics_latest_source_data_2_contact": null, "hs_analytics_latest_source_timestamp": null, "hs_analytics_latest_source_timestamp_company": null, "hs_analytics_latest_source_timestamp_contact": null, "hs_analytics_source": null, "hs_analytics_source_data_1": null, "hs_analytics_source_data_2": null, "hs_arr": null, "hs_campaign": null, "hs_closed_amount": 0, "hs_closed_amount_in_home_currency": 0, "hs_closed_won_count": null, "hs_closed_won_date": null, "hs_created_by_user_id": null, "hs_createdate": "2021-01-13T10:31:51.154000+00:00", "hs_date_entered_66894120": null, "hs_date_entered_9567448": null, "hs_date_entered_9567449": null, "hs_date_entered_appointmentscheduled": "2021-01-13T10:31:51.154000+00:00", "hs_date_entered_closedlost": null, "hs_date_entered_closedwon": null, "hs_date_entered_contractsent": null, "hs_date_entered_customclosedwonstage": null, "hs_date_entered_decisionmakerboughtin": null, "hs_date_entered_presentationscheduled": null, "hs_date_entered_qualifiedtobuy": null, "hs_date_exited_66894120": null, "hs_date_exited_9567448": null, "hs_date_exited_9567449": null, "hs_date_exited_appointmentscheduled": null, "hs_date_exited_closedlost": null, "hs_date_exited_closedwon": null, "hs_date_exited_contractsent": null, "hs_date_exited_customclosedwonstage": null, "hs_date_exited_decisionmakerboughtin": null, "hs_date_exited_presentationscheduled": null, "hs_date_exited_qualifiedtobuy": null, "hs_days_to_close_raw": 0, "hs_deal_amount_calculation_preference": null, "hs_deal_stage_probability": 0.2, "hs_deal_stage_probability_shadow": null, "hs_exchange_rate": null, "hs_forecast_amount": 60000, "hs_forecast_probability": null, "hs_is_closed": false, "hs_is_closed_won": false, "hs_is_deal_split": false, "hs_is_open_count": 1, "hs_lastmodifieddate": "2021-09-07T18:11:59.757000+00:00", "hs_latest_meeting_activity": null, "hs_likelihood_to_close": null, "hs_line_item_global_term_hs_discount_percentage": null, "hs_line_item_global_term_hs_discount_percentage_enabled": null, "hs_line_item_global_term_hs_recurring_billing_period": null, "hs_line_item_global_term_hs_recurring_billing_period_enabled": null, "hs_line_item_global_term_hs_recurring_billing_start_date": null, "hs_line_item_global_term_hs_recurring_billing_start_date_enabled": null, "hs_line_item_global_term_recurringbillingfrequency": null, "hs_line_item_global_term_recurringbillingfrequency_enabled": null, "hs_manual_forecast_category": null, "hs_merged_object_ids": null, "hs_mrr": null, "hs_next_step": null, "hs_num_associated_deal_splits": null, "hs_num_of_associated_line_items": 0, "hs_num_target_accounts": null, "hs_object_id": 3980673856, "hs_object_source": null, "hs_object_source_id": null, "hs_object_source_label": null, "hs_object_source_user_id": null, "hs_pinned_engagement_id": null, "hs_predicted_amount": null, "hs_predicted_amount_in_home_currency": null, "hs_priority": null, "hs_projected_amount": 12000.0, "hs_projected_amount_in_home_currency": 12000.0, "hs_read_only": null, "hs_sales_email_last_replied": null, "hs_tag_ids": null, "hs_tcv": null, "hs_time_in_66894120": null, "hs_time_in_9567448": null, "hs_time_in_9567449": null, "hs_time_in_appointmentscheduled": 92113051787, "hs_time_in_closedlost": null, "hs_time_in_closedwon": null, "hs_time_in_contractsent": null, "hs_time_in_customclosedwonstage": null, "hs_time_in_decisionmakerboughtin": null, "hs_time_in_presentationscheduled": null, "hs_time_in_qualifiedtobuy": null, "hs_unique_creation_key": null, "hs_updated_by_user_id": null, "hs_user_ids_of_all_notification_followers": null, "hs_user_ids_of_all_notification_unfollowers": null, "hs_user_ids_of_all_owners": "12282590", "hs_v2_cumulative_time_in_66894120": null, "hs_v2_cumulative_time_in_9567448": null, "hs_v2_cumulative_time_in_9567449": null, "hs_v2_cumulative_time_in_customclosedwonstage": null, "hs_v2_date_entered_66894120": null, "hs_v2_date_entered_9567448": null, "hs_v2_date_entered_9567449": null, "hs_v2_date_entered_customclosedwonstage": null, "hs_v2_date_exited_66894120": null, "hs_v2_date_exited_9567448": null, "hs_v2_date_exited_9567449": null, "hs_v2_date_exited_customclosedwonstage": null, "hs_v2_latest_time_in_66894120": null, "hs_v2_latest_time_in_9567448": null, "hs_v2_latest_time_in_9567449": null, "hs_v2_latest_time_in_customclosedwonstage": null, "hs_was_imported": null, "hubspot_owner_assigneddate": "2021-01-13T10:31:51.154000+00:00", "hubspot_owner_id": "52550153", "hubspot_team_id": null, "notes_last_contacted": null, "notes_last_updated": null, "notes_next_activity_date": null, "num_associated_contacts": 0, "num_contacted_notes": null, "num_notes": null, "pipeline": "default"}, "createdAt": "2021-01-13T10:31:51.154Z", "updatedAt": "2021-09-07T18:11:59.757Z", "archived": false, "properties_amount": 60000, "properties_amount_in_home_currency": 60000, "properties_closed_lost_reason": null, "properties_closed_won_reason": null, "properties_closedate": "2014-08-31T00:00:00+00:00", "properties_createdate": "2021-01-13T10:31:51.154000+00:00", "properties_days_to_close": 0, "properties_dealname": "Tim's Newer Deal", "properties_dealstage": "appointmentscheduled", "properties_dealtype": "newbusiness", "properties_description": null, "properties_engagements_last_meeting_booked": null, "properties_engagements_last_meeting_booked_campaign": null, "properties_engagements_last_meeting_booked_medium": null, "properties_engagements_last_meeting_booked_source": null, "properties_hs_acv": null, "properties_hs_all_accessible_team_ids": null, "properties_hs_all_collaborator_owner_ids": null, "properties_hs_all_deal_split_owner_ids": null, "properties_hs_all_owner_ids": "52550153", "properties_hs_all_team_ids": null, "properties_hs_analytics_latest_source": null, "properties_hs_analytics_latest_source_company": null, "properties_hs_analytics_latest_source_contact": null, "properties_hs_analytics_latest_source_data_1": null, "properties_hs_analytics_latest_source_data_1_company": null, "properties_hs_analytics_latest_source_data_1_contact": null, "properties_hs_analytics_latest_source_data_2": null, "properties_hs_analytics_latest_source_data_2_company": null, "properties_hs_analytics_latest_source_data_2_contact": null, "properties_hs_analytics_latest_source_timestamp": null, "properties_hs_analytics_latest_source_timestamp_company": null, "properties_hs_analytics_latest_source_timestamp_contact": null, "properties_hs_analytics_source": null, "properties_hs_analytics_source_data_1": null, "properties_hs_analytics_source_data_2": null, "properties_hs_arr": null, "properties_hs_campaign": null, "properties_hs_closed_amount": 0, "properties_hs_closed_amount_in_home_currency": 0, "properties_hs_closed_won_count": null, "properties_hs_closed_won_date": null, "properties_hs_created_by_user_id": null, "properties_hs_createdate": "2021-01-13T10:31:51.154000+00:00", "properties_hs_date_entered_66894120": null, "properties_hs_date_entered_9567448": null, "properties_hs_date_entered_9567449": null, "properties_hs_date_entered_appointmentscheduled": "2021-01-13T10:31:51.154000+00:00", "properties_hs_date_entered_closedlost": null, "properties_hs_date_entered_closedwon": null, "properties_hs_date_entered_contractsent": null, "properties_hs_date_entered_customclosedwonstage": null, "properties_hs_date_entered_decisionmakerboughtin": null, "properties_hs_date_entered_presentationscheduled": null, "properties_hs_date_entered_qualifiedtobuy": null, "properties_hs_date_exited_66894120": null, "properties_hs_date_exited_9567448": null, "properties_hs_date_exited_9567449": null, "properties_hs_date_exited_appointmentscheduled": null, "properties_hs_date_exited_closedlost": null, "properties_hs_date_exited_closedwon": null, "properties_hs_date_exited_contractsent": null, "properties_hs_date_exited_customclosedwonstage": null, "properties_hs_date_exited_decisionmakerboughtin": null, "properties_hs_date_exited_presentationscheduled": null, "properties_hs_date_exited_qualifiedtobuy": null, "properties_hs_days_to_close_raw": 0, "properties_hs_deal_amount_calculation_preference": null, "properties_hs_deal_stage_probability": 0.2, "properties_hs_deal_stage_probability_shadow": null, "properties_hs_exchange_rate": null, "properties_hs_forecast_amount": 60000, "properties_hs_forecast_probability": null, "properties_hs_is_closed": false, "properties_hs_is_closed_won": false, "properties_hs_is_deal_split": false, "properties_hs_is_open_count": 1, "properties_hs_lastmodifieddate": "2021-09-07T18:11:59.757000+00:00", "properties_hs_latest_meeting_activity": null, "properties_hs_likelihood_to_close": null, "properties_hs_line_item_global_term_hs_discount_percentage": null, "properties_hs_line_item_global_term_hs_discount_percentage_enabled": null, "properties_hs_line_item_global_term_hs_recurring_billing_period": null, "properties_hs_line_item_global_term_hs_recurring_billing_period_enabled": null, "properties_hs_line_item_global_term_hs_recurring_billing_start_date": null, "properties_hs_line_item_global_term_hs_recurring_billing_start_date_enabled": null, "properties_hs_line_item_global_term_recurringbillingfrequency": null, "properties_hs_line_item_global_term_recurringbillingfrequency_enabled": null, "properties_hs_manual_forecast_category": null, "properties_hs_merged_object_ids": null, "properties_hs_mrr": null, "properties_hs_next_step": null, "properties_hs_num_associated_deal_splits": null, "properties_hs_num_of_associated_line_items": 0, "properties_hs_num_target_accounts": null, "properties_hs_object_id": 3980673856, "properties_hs_object_source": null, "properties_hs_object_source_id": null, "properties_hs_object_source_label": null, "properties_hs_object_source_user_id": null, "properties_hs_pinned_engagement_id": null, "properties_hs_predicted_amount": null, "properties_hs_predicted_amount_in_home_currency": null, "properties_hs_priority": null, "properties_hs_projected_amount": 12000.0, "properties_hs_projected_amount_in_home_currency": 12000.0, "properties_hs_read_only": null, "properties_hs_sales_email_last_replied": null, "properties_hs_tag_ids": null, "properties_hs_tcv": null, "properties_hs_time_in_66894120": null, "properties_hs_time_in_9567448": null, "properties_hs_time_in_9567449": null, "properties_hs_time_in_appointmentscheduled": 92113051787, "properties_hs_time_in_closedlost": null, "properties_hs_time_in_closedwon": null, "properties_hs_time_in_contractsent": null, "properties_hs_time_in_customclosedwonstage": null, "properties_hs_time_in_decisionmakerboughtin": null, "properties_hs_time_in_presentationscheduled": null, "properties_hs_time_in_qualifiedtobuy": null, "properties_hs_unique_creation_key": null, "properties_hs_updated_by_user_id": null, "properties_hs_user_ids_of_all_notification_followers": null, "properties_hs_user_ids_of_all_notification_unfollowers": null, "properties_hs_user_ids_of_all_owners": "12282590", "properties_hs_v2_cumulative_time_in_66894120": null, "properties_hs_v2_cumulative_time_in_9567448": null, "properties_hs_v2_cumulative_time_in_9567449": null, "properties_hs_v2_cumulative_time_in_customclosedwonstage": null, "properties_hs_v2_date_entered_66894120": null, "properties_hs_v2_date_entered_9567448": null, "properties_hs_v2_date_entered_9567449": null, "properties_hs_v2_date_entered_customclosedwonstage": null, "properties_hs_v2_date_exited_66894120": null, "properties_hs_v2_date_exited_9567448": null, "properties_hs_v2_date_exited_9567449": null, "properties_hs_v2_date_exited_customclosedwonstage": null, "properties_hs_v2_latest_time_in_66894120": null, "properties_hs_v2_latest_time_in_9567448": null, "properties_hs_v2_latest_time_in_9567449": null, "properties_hs_v2_latest_time_in_customclosedwonstage": null, "properties_hs_was_imported": null, "properties_hubspot_owner_assigneddate": "2021-01-13T10:31:51.154000+00:00", "properties_hubspot_owner_id": "52550153", "properties_hubspot_team_id": null, "properties_notes_last_contacted": null, "properties_notes_last_updated": null, "properties_notes_next_activity_date": null, "properties_num_associated_contacts": 0, "properties_num_contacted_notes": null, "properties_num_notes": null, "properties_pipeline": "default"}, "emitted_at": 1702646964423}
-{"stream": "deals", "data": {"id": "3986867076", "properties": {"amount": 6, "amount_in_home_currency": 6, "closed_lost_reason": null, "closed_won_reason": null, "closedate": "2014-08-31T00:00:00+00:00", "createdate": "2021-01-14T14:38:00.797000+00:00", "days_to_close": 0, "dealname": "Test Deal 2", "dealstage": "appointmentscheduled", "dealtype": "newbusiness", "description": null, "engagements_last_meeting_booked": null, "engagements_last_meeting_booked_campaign": null, "engagements_last_meeting_booked_medium": null, "engagements_last_meeting_booked_source": null, "hs_acv": null, "hs_all_accessible_team_ids": null, "hs_all_collaborator_owner_ids": null, "hs_all_deal_split_owner_ids": null, "hs_all_owner_ids": "52550153", "hs_all_team_ids": null, "hs_analytics_latest_source": null, "hs_analytics_latest_source_company": null, "hs_analytics_latest_source_contact": null, "hs_analytics_latest_source_data_1": null, "hs_analytics_latest_source_data_1_company": null, "hs_analytics_latest_source_data_1_contact": null, "hs_analytics_latest_source_data_2": null, "hs_analytics_latest_source_data_2_company": null, "hs_analytics_latest_source_data_2_contact": null, "hs_analytics_latest_source_timestamp": null, "hs_analytics_latest_source_timestamp_company": null, "hs_analytics_latest_source_timestamp_contact": null, "hs_analytics_source": null, "hs_analytics_source_data_1": null, "hs_analytics_source_data_2": null, "hs_arr": null, "hs_campaign": null, "hs_closed_amount": 0, "hs_closed_amount_in_home_currency": 0, "hs_closed_won_count": null, "hs_closed_won_date": null, "hs_created_by_user_id": null, "hs_createdate": "2021-01-14T14:38:00.797000+00:00", "hs_date_entered_66894120": null, "hs_date_entered_9567448": null, "hs_date_entered_9567449": null, "hs_date_entered_appointmentscheduled": "2021-01-14T14:38:00.797000+00:00", "hs_date_entered_closedlost": null, "hs_date_entered_closedwon": null, "hs_date_entered_contractsent": null, "hs_date_entered_customclosedwonstage": null, "hs_date_entered_decisionmakerboughtin": null, "hs_date_entered_presentationscheduled": null, "hs_date_entered_qualifiedtobuy": null, "hs_date_exited_66894120": null, "hs_date_exited_9567448": null, "hs_date_exited_9567449": null, "hs_date_exited_appointmentscheduled": null, "hs_date_exited_closedlost": null, "hs_date_exited_closedwon": null, "hs_date_exited_contractsent": null, "hs_date_exited_customclosedwonstage": null, "hs_date_exited_decisionmakerboughtin": null, "hs_date_exited_presentationscheduled": null, "hs_date_exited_qualifiedtobuy": null, "hs_days_to_close_raw": 0, "hs_deal_amount_calculation_preference": null, "hs_deal_stage_probability": 0.2, "hs_deal_stage_probability_shadow": null, "hs_exchange_rate": null, "hs_forecast_amount": 6, "hs_forecast_probability": null, "hs_is_closed": false, "hs_is_closed_won": false, "hs_is_deal_split": false, "hs_is_open_count": 1, "hs_lastmodifieddate": "2021-09-07T00:24:18.932000+00:00", "hs_latest_meeting_activity": null, "hs_likelihood_to_close": null, "hs_line_item_global_term_hs_discount_percentage": null, "hs_line_item_global_term_hs_discount_percentage_enabled": null, "hs_line_item_global_term_hs_recurring_billing_period": null, "hs_line_item_global_term_hs_recurring_billing_period_enabled": null, "hs_line_item_global_term_hs_recurring_billing_start_date": null, "hs_line_item_global_term_hs_recurring_billing_start_date_enabled": null, "hs_line_item_global_term_recurringbillingfrequency": null, "hs_line_item_global_term_recurringbillingfrequency_enabled": null, "hs_manual_forecast_category": null, "hs_merged_object_ids": null, "hs_mrr": null, "hs_next_step": null, "hs_num_associated_deal_splits": null, "hs_num_of_associated_line_items": 0, "hs_num_target_accounts": 0, "hs_object_id": 3986867076, "hs_object_source": null, "hs_object_source_id": null, "hs_object_source_label": null, "hs_object_source_user_id": null, "hs_pinned_engagement_id": null, "hs_predicted_amount": null, "hs_predicted_amount_in_home_currency": null, "hs_priority": null, "hs_projected_amount": 1.2000000000000002, "hs_projected_amount_in_home_currency": 1.2000000000000002, "hs_read_only": null, "hs_sales_email_last_replied": null, "hs_tag_ids": null, "hs_tcv": null, "hs_time_in_66894120": null, "hs_time_in_9567448": null, "hs_time_in_9567449": null, "hs_time_in_appointmentscheduled": 92011882144, "hs_time_in_closedlost": null, "hs_time_in_closedwon": null, "hs_time_in_contractsent": null, "hs_time_in_customclosedwonstage": null, "hs_time_in_decisionmakerboughtin": null, "hs_time_in_presentationscheduled": null, "hs_time_in_qualifiedtobuy": null, "hs_unique_creation_key": null, "hs_updated_by_user_id": null, "hs_user_ids_of_all_notification_followers": null, "hs_user_ids_of_all_notification_unfollowers": null, "hs_user_ids_of_all_owners": "12282590", "hs_v2_cumulative_time_in_66894120": null, "hs_v2_cumulative_time_in_9567448": null, "hs_v2_cumulative_time_in_9567449": null, "hs_v2_cumulative_time_in_customclosedwonstage": null, "hs_v2_date_entered_66894120": null, "hs_v2_date_entered_9567448": null, "hs_v2_date_entered_9567449": null, "hs_v2_date_entered_customclosedwonstage": null, "hs_v2_date_exited_66894120": null, "hs_v2_date_exited_9567448": null, "hs_v2_date_exited_9567449": null, "hs_v2_date_exited_customclosedwonstage": null, "hs_v2_latest_time_in_66894120": null, "hs_v2_latest_time_in_9567448": null, "hs_v2_latest_time_in_9567449": null, "hs_v2_latest_time_in_customclosedwonstage": null, "hs_was_imported": null, "hubspot_owner_assigneddate": "2021-01-14T14:38:00.797000+00:00", "hubspot_owner_id": "52550153", "hubspot_team_id": null, "notes_last_contacted": null, "notes_last_updated": null, "notes_next_activity_date": null, "num_associated_contacts": 0, "num_contacted_notes": null, "num_notes": null, "pipeline": "default"}, "createdAt": "2021-01-14T14:38:00.797Z", "updatedAt": "2021-09-07T00:24:18.932Z", "archived": false, "companies": ["5183409178", "5183409178"], "properties_amount": 6, "properties_amount_in_home_currency": 6, "properties_closed_lost_reason": null, "properties_closed_won_reason": null, "properties_closedate": "2014-08-31T00:00:00+00:00", "properties_createdate": "2021-01-14T14:38:00.797000+00:00", "properties_days_to_close": 0, "properties_dealname": "Test Deal 2", "properties_dealstage": "appointmentscheduled", "properties_dealtype": "newbusiness", "properties_description": null, "properties_engagements_last_meeting_booked": null, "properties_engagements_last_meeting_booked_campaign": null, "properties_engagements_last_meeting_booked_medium": null, "properties_engagements_last_meeting_booked_source": null, "properties_hs_acv": null, "properties_hs_all_accessible_team_ids": null, "properties_hs_all_collaborator_owner_ids": null, "properties_hs_all_deal_split_owner_ids": null, "properties_hs_all_owner_ids": "52550153", "properties_hs_all_team_ids": null, "properties_hs_analytics_latest_source": null, "properties_hs_analytics_latest_source_company": null, "properties_hs_analytics_latest_source_contact": null, "properties_hs_analytics_latest_source_data_1": null, "properties_hs_analytics_latest_source_data_1_company": null, "properties_hs_analytics_latest_source_data_1_contact": null, "properties_hs_analytics_latest_source_data_2": null, "properties_hs_analytics_latest_source_data_2_company": null, "properties_hs_analytics_latest_source_data_2_contact": null, "properties_hs_analytics_latest_source_timestamp": null, "properties_hs_analytics_latest_source_timestamp_company": null, "properties_hs_analytics_latest_source_timestamp_contact": null, "properties_hs_analytics_source": null, "properties_hs_analytics_source_data_1": null, "properties_hs_analytics_source_data_2": null, "properties_hs_arr": null, "properties_hs_campaign": null, "properties_hs_closed_amount": 0, "properties_hs_closed_amount_in_home_currency": 0, "properties_hs_closed_won_count": null, "properties_hs_closed_won_date": null, "properties_hs_created_by_user_id": null, "properties_hs_createdate": "2021-01-14T14:38:00.797000+00:00", "properties_hs_date_entered_66894120": null, "properties_hs_date_entered_9567448": null, "properties_hs_date_entered_9567449": null, "properties_hs_date_entered_appointmentscheduled": "2021-01-14T14:38:00.797000+00:00", "properties_hs_date_entered_closedlost": null, "properties_hs_date_entered_closedwon": null, "properties_hs_date_entered_contractsent": null, "properties_hs_date_entered_customclosedwonstage": null, "properties_hs_date_entered_decisionmakerboughtin": null, "properties_hs_date_entered_presentationscheduled": null, "properties_hs_date_entered_qualifiedtobuy": null, "properties_hs_date_exited_66894120": null, "properties_hs_date_exited_9567448": null, "properties_hs_date_exited_9567449": null, "properties_hs_date_exited_appointmentscheduled": null, "properties_hs_date_exited_closedlost": null, "properties_hs_date_exited_closedwon": null, "properties_hs_date_exited_contractsent": null, "properties_hs_date_exited_customclosedwonstage": null, "properties_hs_date_exited_decisionmakerboughtin": null, "properties_hs_date_exited_presentationscheduled": null, "properties_hs_date_exited_qualifiedtobuy": null, "properties_hs_days_to_close_raw": 0, "properties_hs_deal_amount_calculation_preference": null, "properties_hs_deal_stage_probability": 0.2, "properties_hs_deal_stage_probability_shadow": null, "properties_hs_exchange_rate": null, "properties_hs_forecast_amount": 6, "properties_hs_forecast_probability": null, "properties_hs_is_closed": false, "properties_hs_is_closed_won": false, "properties_hs_is_deal_split": false, "properties_hs_is_open_count": 1, "properties_hs_lastmodifieddate": "2021-09-07T00:24:18.932000+00:00", "properties_hs_latest_meeting_activity": null, "properties_hs_likelihood_to_close": null, "properties_hs_line_item_global_term_hs_discount_percentage": null, "properties_hs_line_item_global_term_hs_discount_percentage_enabled": null, "properties_hs_line_item_global_term_hs_recurring_billing_period": null, "properties_hs_line_item_global_term_hs_recurring_billing_period_enabled": null, "properties_hs_line_item_global_term_hs_recurring_billing_start_date": null, "properties_hs_line_item_global_term_hs_recurring_billing_start_date_enabled": null, "properties_hs_line_item_global_term_recurringbillingfrequency": null, "properties_hs_line_item_global_term_recurringbillingfrequency_enabled": null, "properties_hs_manual_forecast_category": null, "properties_hs_merged_object_ids": null, "properties_hs_mrr": null, "properties_hs_next_step": null, "properties_hs_num_associated_deal_splits": null, "properties_hs_num_of_associated_line_items": 0, "properties_hs_num_target_accounts": 0, "properties_hs_object_id": 3986867076, "properties_hs_object_source": null, "properties_hs_object_source_id": null, "properties_hs_object_source_label": null, "properties_hs_object_source_user_id": null, "properties_hs_pinned_engagement_id": null, "properties_hs_predicted_amount": null, "properties_hs_predicted_amount_in_home_currency": null, "properties_hs_priority": null, "properties_hs_projected_amount": 1.2000000000000002, "properties_hs_projected_amount_in_home_currency": 1.2000000000000002, "properties_hs_read_only": null, "properties_hs_sales_email_last_replied": null, "properties_hs_tag_ids": null, "properties_hs_tcv": null, "properties_hs_time_in_66894120": null, "properties_hs_time_in_9567448": null, "properties_hs_time_in_9567449": null, "properties_hs_time_in_appointmentscheduled": 92011882144, "properties_hs_time_in_closedlost": null, "properties_hs_time_in_closedwon": null, "properties_hs_time_in_contractsent": null, "properties_hs_time_in_customclosedwonstage": null, "properties_hs_time_in_decisionmakerboughtin": null, "properties_hs_time_in_presentationscheduled": null, "properties_hs_time_in_qualifiedtobuy": null, "properties_hs_unique_creation_key": null, "properties_hs_updated_by_user_id": null, "properties_hs_user_ids_of_all_notification_followers": null, "properties_hs_user_ids_of_all_notification_unfollowers": null, "properties_hs_user_ids_of_all_owners": "12282590", "properties_hs_v2_cumulative_time_in_66894120": null, "properties_hs_v2_cumulative_time_in_9567448": null, "properties_hs_v2_cumulative_time_in_9567449": null, "properties_hs_v2_cumulative_time_in_customclosedwonstage": null, "properties_hs_v2_date_entered_66894120": null, "properties_hs_v2_date_entered_9567448": null, "properties_hs_v2_date_entered_9567449": null, "properties_hs_v2_date_entered_customclosedwonstage": null, "properties_hs_v2_date_exited_66894120": null, "properties_hs_v2_date_exited_9567448": null, "properties_hs_v2_date_exited_9567449": null, "properties_hs_v2_date_exited_customclosedwonstage": null, "properties_hs_v2_latest_time_in_66894120": null, "properties_hs_v2_latest_time_in_9567448": null, "properties_hs_v2_latest_time_in_9567449": null, "properties_hs_v2_latest_time_in_customclosedwonstage": null, "properties_hs_was_imported": null, "properties_hubspot_owner_assigneddate": "2021-01-14T14:38:00.797000+00:00", "properties_hubspot_owner_id": "52550153", "properties_hubspot_team_id": null, "properties_notes_last_contacted": null, "properties_notes_last_updated": null, "properties_notes_next_activity_date": null, "properties_num_associated_contacts": 0, "properties_num_contacted_notes": null, "properties_num_notes": null, "properties_pipeline": "default"}, "emitted_at": 1702646964424}
+{"stream": "deals", "data": {"id": "3980651569", "properties": {"amount": 60000, "amount_in_home_currency": 60000, "closed_lost_reason": null, "closed_won_reason": null, "closedate": "2014-08-31T00:00:00+00:00", "createdate": "2021-01-13T10:30:42.221000+00:00", "days_to_close": 0, "dealname": "Tim's Newer Deal", "dealstage": "appointmentscheduled", "dealtype": "newbusiness", "description": null, "engagements_last_meeting_booked": null, "engagements_last_meeting_booked_campaign": null, "engagements_last_meeting_booked_medium": null, "engagements_last_meeting_booked_source": null, "hs_acv": null, "hs_all_accessible_team_ids": null, "hs_all_collaborator_owner_ids": null, "hs_all_deal_split_owner_ids": null, "hs_all_owner_ids": "52550153", "hs_all_team_ids": null, "hs_analytics_latest_source": "OFFLINE", "hs_analytics_latest_source_company": "OFFLINE", "hs_analytics_latest_source_contact": null, "hs_analytics_latest_source_data_1": "CONTACTS", "hs_analytics_latest_source_data_1_company": "CONTACTS", "hs_analytics_latest_source_data_1_contact": null, "hs_analytics_latest_source_data_2": "CRM_UI", "hs_analytics_latest_source_data_2_company": "CRM_UI", "hs_analytics_latest_source_data_2_contact": null, "hs_analytics_latest_source_timestamp": null, "hs_analytics_latest_source_timestamp_company": null, "hs_analytics_latest_source_timestamp_contact": null, "hs_analytics_source": "OFFLINE", "hs_analytics_source_data_1": "CONTACTS", "hs_analytics_source_data_2": "CRM_UI", "hs_arr": null, "hs_campaign": null, "hs_closed_amount": 0, "hs_closed_amount_in_home_currency": 0, "hs_closed_won_count": null, "hs_closed_won_date": null, "hs_created_by_user_id": null, "hs_createdate": "2021-01-13T10:30:42.221000+00:00", "hs_date_entered_66894120": null, "hs_date_entered_9567448": null, "hs_date_entered_9567449": null, "hs_date_entered_appointmentscheduled": "2021-01-13T10:30:42.221000+00:00", "hs_date_entered_closedlost": null, "hs_date_entered_closedwon": null, "hs_date_entered_contractsent": null, "hs_date_entered_customclosedwonstage": null, "hs_date_entered_decisionmakerboughtin": null, "hs_date_entered_presentationscheduled": null, "hs_date_entered_qualifiedtobuy": null, "hs_date_exited_66894120": null, "hs_date_exited_9567448": null, "hs_date_exited_9567449": null, "hs_date_exited_appointmentscheduled": null, "hs_date_exited_closedlost": null, "hs_date_exited_closedwon": null, "hs_date_exited_contractsent": null, "hs_date_exited_customclosedwonstage": null, "hs_date_exited_decisionmakerboughtin": null, "hs_date_exited_presentationscheduled": null, "hs_date_exited_qualifiedtobuy": null, "hs_days_to_close_raw": 0, "hs_deal_amount_calculation_preference": null, "hs_deal_stage_probability": 0.2, "hs_deal_stage_probability_shadow": null, "hs_exchange_rate": null, "hs_forecast_amount": 60000, "hs_forecast_probability": null, "hs_is_closed": false, "hs_is_closed_won": false, "hs_is_deal_split": false, "hs_is_open_count": 1, "hs_lastmodifieddate": "2024-01-21T22:30:34.782000+00:00", "hs_latest_meeting_activity": null, "hs_likelihood_to_close": null, "hs_line_item_global_term_hs_discount_percentage": null, "hs_line_item_global_term_hs_discount_percentage_enabled": null, "hs_line_item_global_term_hs_recurring_billing_period": null, "hs_line_item_global_term_hs_recurring_billing_period_enabled": null, "hs_line_item_global_term_hs_recurring_billing_start_date": null, "hs_line_item_global_term_hs_recurring_billing_start_date_enabled": null, "hs_line_item_global_term_recurringbillingfrequency": null, "hs_line_item_global_term_recurringbillingfrequency_enabled": null, "hs_manual_forecast_category": null, "hs_merged_object_ids": null, "hs_mrr": null, "hs_next_step": null, "hs_num_associated_deal_splits": null, "hs_num_of_associated_line_items": 0, "hs_num_target_accounts": 0, "hs_object_id": 3980651569, "hs_object_source": "API", "hs_object_source_id": null, "hs_object_source_label": "INTERNAL_PROCESSING", "hs_object_source_user_id": null, "hs_pinned_engagement_id": null, "hs_predicted_amount": null, "hs_predicted_amount_in_home_currency": null, "hs_priority": null, "hs_projected_amount": 12000.0, "hs_projected_amount_in_home_currency": 12000.0, "hs_read_only": null, "hs_sales_email_last_replied": null, "hs_tag_ids": null, "hs_tcv": null, "hs_time_in_66894120": null, "hs_time_in_9567448": null, "hs_time_in_9567449": null, "hs_time_in_appointmentscheduled": 95654671212, "hs_time_in_closedlost": null, "hs_time_in_closedwon": null, "hs_time_in_contractsent": null, "hs_time_in_customclosedwonstage": null, "hs_time_in_decisionmakerboughtin": null, "hs_time_in_presentationscheduled": null, "hs_time_in_qualifiedtobuy": null, "hs_unique_creation_key": null, "hs_updated_by_user_id": null, "hs_user_ids_of_all_notification_followers": null, "hs_user_ids_of_all_notification_unfollowers": null, "hs_user_ids_of_all_owners": "12282590", "hs_was_imported": null, "hubspot_owner_assigneddate": "2021-01-13T10:30:42.221000+00:00", "hubspot_owner_id": "52550153", "hubspot_team_id": null, "notes_last_contacted": null, "notes_last_updated": null, "notes_next_activity_date": null, "num_associated_contacts": 0, "num_contacted_notes": null, "num_notes": null, "pipeline": "default"}, "createdAt": "2021-01-13T10:30:42.221Z", "updatedAt": "2024-01-21T22:30:34.782Z", "archived": false, "companies": ["5000526215", "5000526215"], "properties_amount": 60000, "properties_amount_in_home_currency": 60000, "properties_closed_lost_reason": null, "properties_closed_won_reason": null, "properties_closedate": "2014-08-31T00:00:00+00:00", "properties_createdate": "2021-01-13T10:30:42.221000+00:00", "properties_days_to_close": 0, "properties_dealname": "Tim's Newer Deal", "properties_dealstage": "appointmentscheduled", "properties_dealtype": "newbusiness", "properties_description": null, "properties_engagements_last_meeting_booked": null, "properties_engagements_last_meeting_booked_campaign": null, "properties_engagements_last_meeting_booked_medium": null, "properties_engagements_last_meeting_booked_source": null, "properties_hs_acv": null, "properties_hs_all_accessible_team_ids": null, "properties_hs_all_collaborator_owner_ids": null, "properties_hs_all_deal_split_owner_ids": null, "properties_hs_all_owner_ids": "52550153", "properties_hs_all_team_ids": null, "properties_hs_analytics_latest_source": "OFFLINE", "properties_hs_analytics_latest_source_company": "OFFLINE", "properties_hs_analytics_latest_source_contact": null, "properties_hs_analytics_latest_source_data_1": "CONTACTS", "properties_hs_analytics_latest_source_data_1_company": "CONTACTS", "properties_hs_analytics_latest_source_data_1_contact": null, "properties_hs_analytics_latest_source_data_2": "CRM_UI", "properties_hs_analytics_latest_source_data_2_company": "CRM_UI", "properties_hs_analytics_latest_source_data_2_contact": null, "properties_hs_analytics_latest_source_timestamp": null, "properties_hs_analytics_latest_source_timestamp_company": null, "properties_hs_analytics_latest_source_timestamp_contact": null, "properties_hs_analytics_source": "OFFLINE", "properties_hs_analytics_source_data_1": "CONTACTS", "properties_hs_analytics_source_data_2": "CRM_UI", "properties_hs_arr": null, "properties_hs_campaign": null, "properties_hs_closed_amount": 0, "properties_hs_closed_amount_in_home_currency": 0, "properties_hs_closed_won_count": null, "properties_hs_closed_won_date": null, "properties_hs_created_by_user_id": null, "properties_hs_createdate": "2021-01-13T10:30:42.221000+00:00", "properties_hs_date_entered_66894120": null, "properties_hs_date_entered_9567448": null, "properties_hs_date_entered_9567449": null, "properties_hs_date_entered_appointmentscheduled": "2021-01-13T10:30:42.221000+00:00", "properties_hs_date_entered_closedlost": null, "properties_hs_date_entered_closedwon": null, "properties_hs_date_entered_contractsent": null, "properties_hs_date_entered_customclosedwonstage": null, "properties_hs_date_entered_decisionmakerboughtin": null, "properties_hs_date_entered_presentationscheduled": null, "properties_hs_date_entered_qualifiedtobuy": null, "properties_hs_date_exited_66894120": null, "properties_hs_date_exited_9567448": null, "properties_hs_date_exited_9567449": null, "properties_hs_date_exited_appointmentscheduled": null, "properties_hs_date_exited_closedlost": null, "properties_hs_date_exited_closedwon": null, "properties_hs_date_exited_contractsent": null, "properties_hs_date_exited_customclosedwonstage": null, "properties_hs_date_exited_decisionmakerboughtin": null, "properties_hs_date_exited_presentationscheduled": null, "properties_hs_date_exited_qualifiedtobuy": null, "properties_hs_days_to_close_raw": 0, "properties_hs_deal_amount_calculation_preference": null, "properties_hs_deal_stage_probability": 0.2, "properties_hs_deal_stage_probability_shadow": null, "properties_hs_exchange_rate": null, "properties_hs_forecast_amount": 60000, "properties_hs_forecast_probability": null, "properties_hs_is_closed": false, "properties_hs_is_closed_won": false, "properties_hs_is_deal_split": false, "properties_hs_is_open_count": 1, "properties_hs_lastmodifieddate": "2024-01-21T22:30:34.782000+00:00", "properties_hs_latest_meeting_activity": null, "properties_hs_likelihood_to_close": null, "properties_hs_line_item_global_term_hs_discount_percentage": null, "properties_hs_line_item_global_term_hs_discount_percentage_enabled": null, "properties_hs_line_item_global_term_hs_recurring_billing_period": null, "properties_hs_line_item_global_term_hs_recurring_billing_period_enabled": null, "properties_hs_line_item_global_term_hs_recurring_billing_start_date": null, "properties_hs_line_item_global_term_hs_recurring_billing_start_date_enabled": null, "properties_hs_line_item_global_term_recurringbillingfrequency": null, "properties_hs_line_item_global_term_recurringbillingfrequency_enabled": null, "properties_hs_manual_forecast_category": null, "properties_hs_merged_object_ids": null, "properties_hs_mrr": null, "properties_hs_next_step": null, "properties_hs_num_associated_deal_splits": null, "properties_hs_num_of_associated_line_items": 0, "properties_hs_num_target_accounts": 0, "properties_hs_object_id": 3980651569, "properties_hs_object_source": "API", "properties_hs_object_source_id": null, "properties_hs_object_source_label": "INTERNAL_PROCESSING", "properties_hs_object_source_user_id": null, "properties_hs_pinned_engagement_id": null, "properties_hs_predicted_amount": null, "properties_hs_predicted_amount_in_home_currency": null, "properties_hs_priority": null, "properties_hs_projected_amount": 12000.0, "properties_hs_projected_amount_in_home_currency": 12000.0, "properties_hs_read_only": null, "properties_hs_sales_email_last_replied": null, "properties_hs_tag_ids": null, "properties_hs_tcv": null, "properties_hs_time_in_66894120": null, "properties_hs_time_in_9567448": null, "properties_hs_time_in_9567449": null, "properties_hs_time_in_appointmentscheduled": 95654671212, "properties_hs_time_in_closedlost": null, "properties_hs_time_in_closedwon": null, "properties_hs_time_in_contractsent": null, "properties_hs_time_in_customclosedwonstage": null, "properties_hs_time_in_decisionmakerboughtin": null, "properties_hs_time_in_presentationscheduled": null, "properties_hs_time_in_qualifiedtobuy": null, "properties_hs_unique_creation_key": null, "properties_hs_updated_by_user_id": null, "properties_hs_user_ids_of_all_notification_followers": null, "properties_hs_user_ids_of_all_notification_unfollowers": null, "properties_hs_user_ids_of_all_owners": "12282590", "properties_hs_was_imported": null, "properties_hubspot_owner_assigneddate": "2021-01-13T10:30:42.221000+00:00", "properties_hubspot_owner_id": "52550153", "properties_hubspot_team_id": null, "properties_notes_last_contacted": null, "properties_notes_last_updated": null, "properties_notes_next_activity_date": null, "properties_num_associated_contacts": 0, "properties_num_contacted_notes": null, "properties_num_notes": null, "properties_pipeline": "default"}, "emitted_at": 1706188513541}
+{"stream": "deals", "data": {"id": "3980673856", "properties": {"amount": 60000, "amount_in_home_currency": 60000, "closed_lost_reason": null, "closed_won_reason": null, "closedate": "2014-08-31T00:00:00+00:00", "createdate": "2021-01-13T10:31:51.154000+00:00", "days_to_close": 0, "dealname": "Tim's Newer Deal", "dealstage": "appointmentscheduled", "dealtype": "newbusiness", "description": null, "engagements_last_meeting_booked": null, "engagements_last_meeting_booked_campaign": null, "engagements_last_meeting_booked_medium": null, "engagements_last_meeting_booked_source": null, "hs_acv": null, "hs_all_accessible_team_ids": null, "hs_all_collaborator_owner_ids": null, "hs_all_deal_split_owner_ids": null, "hs_all_owner_ids": "52550153", "hs_all_team_ids": null, "hs_analytics_latest_source": null, "hs_analytics_latest_source_company": null, "hs_analytics_latest_source_contact": null, "hs_analytics_latest_source_data_1": null, "hs_analytics_latest_source_data_1_company": null, "hs_analytics_latest_source_data_1_contact": null, "hs_analytics_latest_source_data_2": null, "hs_analytics_latest_source_data_2_company": null, "hs_analytics_latest_source_data_2_contact": null, "hs_analytics_latest_source_timestamp": null, "hs_analytics_latest_source_timestamp_company": null, "hs_analytics_latest_source_timestamp_contact": null, "hs_analytics_source": null, "hs_analytics_source_data_1": null, "hs_analytics_source_data_2": null, "hs_arr": null, "hs_campaign": null, "hs_closed_amount": 0, "hs_closed_amount_in_home_currency": 0, "hs_closed_won_count": null, "hs_closed_won_date": null, "hs_created_by_user_id": null, "hs_createdate": "2021-01-13T10:31:51.154000+00:00", "hs_date_entered_66894120": null, "hs_date_entered_9567448": null, "hs_date_entered_9567449": null, "hs_date_entered_appointmentscheduled": "2021-01-13T10:31:51.154000+00:00", "hs_date_entered_closedlost": null, "hs_date_entered_closedwon": null, "hs_date_entered_contractsent": null, "hs_date_entered_customclosedwonstage": null, "hs_date_entered_decisionmakerboughtin": null, "hs_date_entered_presentationscheduled": null, "hs_date_entered_qualifiedtobuy": null, "hs_date_exited_66894120": null, "hs_date_exited_9567448": null, "hs_date_exited_9567449": null, "hs_date_exited_appointmentscheduled": null, "hs_date_exited_closedlost": null, "hs_date_exited_closedwon": null, "hs_date_exited_contractsent": null, "hs_date_exited_customclosedwonstage": null, "hs_date_exited_decisionmakerboughtin": null, "hs_date_exited_presentationscheduled": null, "hs_date_exited_qualifiedtobuy": null, "hs_days_to_close_raw": 0, "hs_deal_amount_calculation_preference": null, "hs_deal_stage_probability": 0.2, "hs_deal_stage_probability_shadow": null, "hs_exchange_rate": null, "hs_forecast_amount": 60000, "hs_forecast_probability": null, "hs_is_closed": false, "hs_is_closed_won": false, "hs_is_deal_split": false, "hs_is_open_count": 1, "hs_lastmodifieddate": "2024-01-21T02:48:34.022000+00:00", "hs_latest_meeting_activity": null, "hs_likelihood_to_close": null, "hs_line_item_global_term_hs_discount_percentage": null, "hs_line_item_global_term_hs_discount_percentage_enabled": null, "hs_line_item_global_term_hs_recurring_billing_period": null, "hs_line_item_global_term_hs_recurring_billing_period_enabled": null, "hs_line_item_global_term_hs_recurring_billing_start_date": null, "hs_line_item_global_term_hs_recurring_billing_start_date_enabled": null, "hs_line_item_global_term_recurringbillingfrequency": null, "hs_line_item_global_term_recurringbillingfrequency_enabled": null, "hs_manual_forecast_category": null, "hs_merged_object_ids": null, "hs_mrr": null, "hs_next_step": null, "hs_num_associated_deal_splits": null, "hs_num_of_associated_line_items": 0, "hs_num_target_accounts": null, "hs_object_id": 3980673856, "hs_object_source": "API", "hs_object_source_id": null, "hs_object_source_label": "INTERNAL_PROCESSING", "hs_object_source_user_id": null, "hs_pinned_engagement_id": null, "hs_predicted_amount": null, "hs_predicted_amount_in_home_currency": null, "hs_priority": null, "hs_projected_amount": 12000.0, "hs_projected_amount_in_home_currency": 12000.0, "hs_read_only": null, "hs_sales_email_last_replied": null, "hs_tag_ids": null, "hs_tcv": null, "hs_time_in_66894120": null, "hs_time_in_9567448": null, "hs_time_in_9567449": null, "hs_time_in_appointmentscheduled": 95654602279, "hs_time_in_closedlost": null, "hs_time_in_closedwon": null, "hs_time_in_contractsent": null, "hs_time_in_customclosedwonstage": null, "hs_time_in_decisionmakerboughtin": null, "hs_time_in_presentationscheduled": null, "hs_time_in_qualifiedtobuy": null, "hs_unique_creation_key": null, "hs_updated_by_user_id": null, "hs_user_ids_of_all_notification_followers": null, "hs_user_ids_of_all_notification_unfollowers": null, "hs_user_ids_of_all_owners": "12282590", "hs_was_imported": null, "hubspot_owner_assigneddate": "2021-01-13T10:31:51.154000+00:00", "hubspot_owner_id": "52550153", "hubspot_team_id": null, "notes_last_contacted": null, "notes_last_updated": null, "notes_next_activity_date": null, "num_associated_contacts": 0, "num_contacted_notes": null, "num_notes": null, "pipeline": "default"}, "createdAt": "2021-01-13T10:31:51.154Z", "updatedAt": "2024-01-21T02:48:34.022Z", "archived": false, "properties_amount": 60000, "properties_amount_in_home_currency": 60000, "properties_closed_lost_reason": null, "properties_closed_won_reason": null, "properties_closedate": "2014-08-31T00:00:00+00:00", "properties_createdate": "2021-01-13T10:31:51.154000+00:00", "properties_days_to_close": 0, "properties_dealname": "Tim's Newer Deal", "properties_dealstage": "appointmentscheduled", "properties_dealtype": "newbusiness", "properties_description": null, "properties_engagements_last_meeting_booked": null, "properties_engagements_last_meeting_booked_campaign": null, "properties_engagements_last_meeting_booked_medium": null, "properties_engagements_last_meeting_booked_source": null, "properties_hs_acv": null, "properties_hs_all_accessible_team_ids": null, "properties_hs_all_collaborator_owner_ids": null, "properties_hs_all_deal_split_owner_ids": null, "properties_hs_all_owner_ids": "52550153", "properties_hs_all_team_ids": null, "properties_hs_analytics_latest_source": null, "properties_hs_analytics_latest_source_company": null, "properties_hs_analytics_latest_source_contact": null, "properties_hs_analytics_latest_source_data_1": null, "properties_hs_analytics_latest_source_data_1_company": null, "properties_hs_analytics_latest_source_data_1_contact": null, "properties_hs_analytics_latest_source_data_2": null, "properties_hs_analytics_latest_source_data_2_company": null, "properties_hs_analytics_latest_source_data_2_contact": null, "properties_hs_analytics_latest_source_timestamp": null, "properties_hs_analytics_latest_source_timestamp_company": null, "properties_hs_analytics_latest_source_timestamp_contact": null, "properties_hs_analytics_source": null, "properties_hs_analytics_source_data_1": null, "properties_hs_analytics_source_data_2": null, "properties_hs_arr": null, "properties_hs_campaign": null, "properties_hs_closed_amount": 0, "properties_hs_closed_amount_in_home_currency": 0, "properties_hs_closed_won_count": null, "properties_hs_closed_won_date": null, "properties_hs_created_by_user_id": null, "properties_hs_createdate": "2021-01-13T10:31:51.154000+00:00", "properties_hs_date_entered_66894120": null, "properties_hs_date_entered_9567448": null, "properties_hs_date_entered_9567449": null, "properties_hs_date_entered_appointmentscheduled": "2021-01-13T10:31:51.154000+00:00", "properties_hs_date_entered_closedlost": null, "properties_hs_date_entered_closedwon": null, "properties_hs_date_entered_contractsent": null, "properties_hs_date_entered_customclosedwonstage": null, "properties_hs_date_entered_decisionmakerboughtin": null, "properties_hs_date_entered_presentationscheduled": null, "properties_hs_date_entered_qualifiedtobuy": null, "properties_hs_date_exited_66894120": null, "properties_hs_date_exited_9567448": null, "properties_hs_date_exited_9567449": null, "properties_hs_date_exited_appointmentscheduled": null, "properties_hs_date_exited_closedlost": null, "properties_hs_date_exited_closedwon": null, "properties_hs_date_exited_contractsent": null, "properties_hs_date_exited_customclosedwonstage": null, "properties_hs_date_exited_decisionmakerboughtin": null, "properties_hs_date_exited_presentationscheduled": null, "properties_hs_date_exited_qualifiedtobuy": null, "properties_hs_days_to_close_raw": 0, "properties_hs_deal_amount_calculation_preference": null, "properties_hs_deal_stage_probability": 0.2, "properties_hs_deal_stage_probability_shadow": null, "properties_hs_exchange_rate": null, "properties_hs_forecast_amount": 60000, "properties_hs_forecast_probability": null, "properties_hs_is_closed": false, "properties_hs_is_closed_won": false, "properties_hs_is_deal_split": false, "properties_hs_is_open_count": 1, "properties_hs_lastmodifieddate": "2024-01-21T02:48:34.022000+00:00", "properties_hs_latest_meeting_activity": null, "properties_hs_likelihood_to_close": null, "properties_hs_line_item_global_term_hs_discount_percentage": null, "properties_hs_line_item_global_term_hs_discount_percentage_enabled": null, "properties_hs_line_item_global_term_hs_recurring_billing_period": null, "properties_hs_line_item_global_term_hs_recurring_billing_period_enabled": null, "properties_hs_line_item_global_term_hs_recurring_billing_start_date": null, "properties_hs_line_item_global_term_hs_recurring_billing_start_date_enabled": null, "properties_hs_line_item_global_term_recurringbillingfrequency": null, "properties_hs_line_item_global_term_recurringbillingfrequency_enabled": null, "properties_hs_manual_forecast_category": null, "properties_hs_merged_object_ids": null, "properties_hs_mrr": null, "properties_hs_next_step": null, "properties_hs_num_associated_deal_splits": null, "properties_hs_num_of_associated_line_items": 0, "properties_hs_num_target_accounts": null, "properties_hs_object_id": 3980673856, "properties_hs_object_source": "API", "properties_hs_object_source_id": null, "properties_hs_object_source_label": "INTERNAL_PROCESSING", "properties_hs_object_source_user_id": null, "properties_hs_pinned_engagement_id": null, "properties_hs_predicted_amount": null, "properties_hs_predicted_amount_in_home_currency": null, "properties_hs_priority": null, "properties_hs_projected_amount": 12000.0, "properties_hs_projected_amount_in_home_currency": 12000.0, "properties_hs_read_only": null, "properties_hs_sales_email_last_replied": null, "properties_hs_tag_ids": null, "properties_hs_tcv": null, "properties_hs_time_in_66894120": null, "properties_hs_time_in_9567448": null, "properties_hs_time_in_9567449": null, "properties_hs_time_in_appointmentscheduled": 95654602279, "properties_hs_time_in_closedlost": null, "properties_hs_time_in_closedwon": null, "properties_hs_time_in_contractsent": null, "properties_hs_time_in_customclosedwonstage": null, "properties_hs_time_in_decisionmakerboughtin": null, "properties_hs_time_in_presentationscheduled": null, "properties_hs_time_in_qualifiedtobuy": null, "properties_hs_unique_creation_key": null, "properties_hs_updated_by_user_id": null, "properties_hs_user_ids_of_all_notification_followers": null, "properties_hs_user_ids_of_all_notification_unfollowers": null, "properties_hs_user_ids_of_all_owners": "12282590", "properties_hs_was_imported": null, "properties_hubspot_owner_assigneddate": "2021-01-13T10:31:51.154000+00:00", "properties_hubspot_owner_id": "52550153", "properties_hubspot_team_id": null, "properties_notes_last_contacted": null, "properties_notes_last_updated": null, "properties_notes_next_activity_date": null, "properties_num_associated_contacts": 0, "properties_num_contacted_notes": null, "properties_num_notes": null, "properties_pipeline": "default"}, "emitted_at": 1706188513543}
+{"stream": "deals", "data": {"id": "3986867076", "properties": {"amount": 6, "amount_in_home_currency": 6, "closed_lost_reason": null, "closed_won_reason": null, "closedate": "2014-08-31T00:00:00+00:00", "createdate": "2021-01-14T14:38:00.797000+00:00", "days_to_close": 0, "dealname": "Test Deal 2", "dealstage": "appointmentscheduled", "dealtype": "newbusiness", "description": null, "engagements_last_meeting_booked": null, "engagements_last_meeting_booked_campaign": null, "engagements_last_meeting_booked_medium": null, "engagements_last_meeting_booked_source": null, "hs_acv": null, "hs_all_accessible_team_ids": null, "hs_all_collaborator_owner_ids": null, "hs_all_deal_split_owner_ids": null, "hs_all_owner_ids": "52550153", "hs_all_team_ids": null, "hs_analytics_latest_source": null, "hs_analytics_latest_source_company": null, "hs_analytics_latest_source_contact": null, "hs_analytics_latest_source_data_1": null, "hs_analytics_latest_source_data_1_company": null, "hs_analytics_latest_source_data_1_contact": null, "hs_analytics_latest_source_data_2": null, "hs_analytics_latest_source_data_2_company": null, "hs_analytics_latest_source_data_2_contact": null, "hs_analytics_latest_source_timestamp": null, "hs_analytics_latest_source_timestamp_company": null, "hs_analytics_latest_source_timestamp_contact": null, "hs_analytics_source": null, "hs_analytics_source_data_1": null, "hs_analytics_source_data_2": null, "hs_arr": null, "hs_campaign": null, "hs_closed_amount": 0, "hs_closed_amount_in_home_currency": 0, "hs_closed_won_count": null, "hs_closed_won_date": null, "hs_created_by_user_id": null, "hs_createdate": "2021-01-14T14:38:00.797000+00:00", "hs_date_entered_66894120": null, "hs_date_entered_9567448": null, "hs_date_entered_9567449": null, "hs_date_entered_appointmentscheduled": "2021-01-14T14:38:00.797000+00:00", "hs_date_entered_closedlost": null, "hs_date_entered_closedwon": null, "hs_date_entered_contractsent": null, "hs_date_entered_customclosedwonstage": null, "hs_date_entered_decisionmakerboughtin": null, "hs_date_entered_presentationscheduled": null, "hs_date_entered_qualifiedtobuy": null, "hs_date_exited_66894120": null, "hs_date_exited_9567448": null, "hs_date_exited_9567449": null, "hs_date_exited_appointmentscheduled": null, "hs_date_exited_closedlost": null, "hs_date_exited_closedwon": null, "hs_date_exited_contractsent": null, "hs_date_exited_customclosedwonstage": null, "hs_date_exited_decisionmakerboughtin": null, "hs_date_exited_presentationscheduled": null, "hs_date_exited_qualifiedtobuy": null, "hs_days_to_close_raw": 0, "hs_deal_amount_calculation_preference": null, "hs_deal_stage_probability": 0.2, "hs_deal_stage_probability_shadow": null, "hs_exchange_rate": null, "hs_forecast_amount": 6, "hs_forecast_probability": null, "hs_is_closed": false, "hs_is_closed_won": false, "hs_is_deal_split": false, "hs_is_open_count": 1, "hs_lastmodifieddate": "2024-01-20T00:59:40.882000+00:00", "hs_latest_meeting_activity": null, "hs_likelihood_to_close": null, "hs_line_item_global_term_hs_discount_percentage": null, "hs_line_item_global_term_hs_discount_percentage_enabled": null, "hs_line_item_global_term_hs_recurring_billing_period": null, "hs_line_item_global_term_hs_recurring_billing_period_enabled": null, "hs_line_item_global_term_hs_recurring_billing_start_date": null, "hs_line_item_global_term_hs_recurring_billing_start_date_enabled": null, "hs_line_item_global_term_recurringbillingfrequency": null, "hs_line_item_global_term_recurringbillingfrequency_enabled": null, "hs_manual_forecast_category": null, "hs_merged_object_ids": null, "hs_mrr": null, "hs_next_step": null, "hs_num_associated_deal_splits": null, "hs_num_of_associated_line_items": 0, "hs_num_target_accounts": 0, "hs_object_id": 3986867076, "hs_object_source": "API", "hs_object_source_id": null, "hs_object_source_label": "INTERNAL_PROCESSING", "hs_object_source_user_id": null, "hs_pinned_engagement_id": null, "hs_predicted_amount": null, "hs_predicted_amount_in_home_currency": null, "hs_priority": null, "hs_projected_amount": 1.2000000000000002, "hs_projected_amount_in_home_currency": 1.2000000000000002, "hs_read_only": null, "hs_sales_email_last_replied": null, "hs_tag_ids": null, "hs_tcv": null, "hs_time_in_66894120": null, "hs_time_in_9567448": null, "hs_time_in_9567449": null, "hs_time_in_appointmentscheduled": 95553432636, "hs_time_in_closedlost": null, "hs_time_in_closedwon": null, "hs_time_in_contractsent": null, "hs_time_in_customclosedwonstage": null, "hs_time_in_decisionmakerboughtin": null, "hs_time_in_presentationscheduled": null, "hs_time_in_qualifiedtobuy": null, "hs_unique_creation_key": null, "hs_updated_by_user_id": null, "hs_user_ids_of_all_notification_followers": null, "hs_user_ids_of_all_notification_unfollowers": null, "hs_user_ids_of_all_owners": "12282590", "hs_was_imported": null, "hubspot_owner_assigneddate": "2021-01-14T14:38:00.797000+00:00", "hubspot_owner_id": "52550153", "hubspot_team_id": null, "notes_last_contacted": null, "notes_last_updated": null, "notes_next_activity_date": null, "num_associated_contacts": 0, "num_contacted_notes": null, "num_notes": null, "pipeline": "default"}, "createdAt": "2021-01-14T14:38:00.797Z", "updatedAt": "2024-01-20T00:59:40.882Z", "archived": false, "companies": ["5183409178", "5183409178"], "properties_amount": 6, "properties_amount_in_home_currency": 6, "properties_closed_lost_reason": null, "properties_closed_won_reason": null, "properties_closedate": "2014-08-31T00:00:00+00:00", "properties_createdate": "2021-01-14T14:38:00.797000+00:00", "properties_days_to_close": 0, "properties_dealname": "Test Deal 2", "properties_dealstage": "appointmentscheduled", "properties_dealtype": "newbusiness", "properties_description": null, "properties_engagements_last_meeting_booked": null, "properties_engagements_last_meeting_booked_campaign": null, "properties_engagements_last_meeting_booked_medium": null, "properties_engagements_last_meeting_booked_source": null, "properties_hs_acv": null, "properties_hs_all_accessible_team_ids": null, "properties_hs_all_collaborator_owner_ids": null, "properties_hs_all_deal_split_owner_ids": null, "properties_hs_all_owner_ids": "52550153", "properties_hs_all_team_ids": null, "properties_hs_analytics_latest_source": null, "properties_hs_analytics_latest_source_company": null, "properties_hs_analytics_latest_source_contact": null, "properties_hs_analytics_latest_source_data_1": null, "properties_hs_analytics_latest_source_data_1_company": null, "properties_hs_analytics_latest_source_data_1_contact": null, "properties_hs_analytics_latest_source_data_2": null, "properties_hs_analytics_latest_source_data_2_company": null, "properties_hs_analytics_latest_source_data_2_contact": null, "properties_hs_analytics_latest_source_timestamp": null, "properties_hs_analytics_latest_source_timestamp_company": null, "properties_hs_analytics_latest_source_timestamp_contact": null, "properties_hs_analytics_source": null, "properties_hs_analytics_source_data_1": null, "properties_hs_analytics_source_data_2": null, "properties_hs_arr": null, "properties_hs_campaign": null, "properties_hs_closed_amount": 0, "properties_hs_closed_amount_in_home_currency": 0, "properties_hs_closed_won_count": null, "properties_hs_closed_won_date": null, "properties_hs_created_by_user_id": null, "properties_hs_createdate": "2021-01-14T14:38:00.797000+00:00", "properties_hs_date_entered_66894120": null, "properties_hs_date_entered_9567448": null, "properties_hs_date_entered_9567449": null, "properties_hs_date_entered_appointmentscheduled": "2021-01-14T14:38:00.797000+00:00", "properties_hs_date_entered_closedlost": null, "properties_hs_date_entered_closedwon": null, "properties_hs_date_entered_contractsent": null, "properties_hs_date_entered_customclosedwonstage": null, "properties_hs_date_entered_decisionmakerboughtin": null, "properties_hs_date_entered_presentationscheduled": null, "properties_hs_date_entered_qualifiedtobuy": null, "properties_hs_date_exited_66894120": null, "properties_hs_date_exited_9567448": null, "properties_hs_date_exited_9567449": null, "properties_hs_date_exited_appointmentscheduled": null, "properties_hs_date_exited_closedlost": null, "properties_hs_date_exited_closedwon": null, "properties_hs_date_exited_contractsent": null, "properties_hs_date_exited_customclosedwonstage": null, "properties_hs_date_exited_decisionmakerboughtin": null, "properties_hs_date_exited_presentationscheduled": null, "properties_hs_date_exited_qualifiedtobuy": null, "properties_hs_days_to_close_raw": 0, "properties_hs_deal_amount_calculation_preference": null, "properties_hs_deal_stage_probability": 0.2, "properties_hs_deal_stage_probability_shadow": null, "properties_hs_exchange_rate": null, "properties_hs_forecast_amount": 6, "properties_hs_forecast_probability": null, "properties_hs_is_closed": false, "properties_hs_is_closed_won": false, "properties_hs_is_deal_split": false, "properties_hs_is_open_count": 1, "properties_hs_lastmodifieddate": "2024-01-20T00:59:40.882000+00:00", "properties_hs_latest_meeting_activity": null, "properties_hs_likelihood_to_close": null, "properties_hs_line_item_global_term_hs_discount_percentage": null, "properties_hs_line_item_global_term_hs_discount_percentage_enabled": null, "properties_hs_line_item_global_term_hs_recurring_billing_period": null, "properties_hs_line_item_global_term_hs_recurring_billing_period_enabled": null, "properties_hs_line_item_global_term_hs_recurring_billing_start_date": null, "properties_hs_line_item_global_term_hs_recurring_billing_start_date_enabled": null, "properties_hs_line_item_global_term_recurringbillingfrequency": null, "properties_hs_line_item_global_term_recurringbillingfrequency_enabled": null, "properties_hs_manual_forecast_category": null, "properties_hs_merged_object_ids": null, "properties_hs_mrr": null, "properties_hs_next_step": null, "properties_hs_num_associated_deal_splits": null, "properties_hs_num_of_associated_line_items": 0, "properties_hs_num_target_accounts": 0, "properties_hs_object_id": 3986867076, "properties_hs_object_source": "API", "properties_hs_object_source_id": null, "properties_hs_object_source_label": "INTERNAL_PROCESSING", "properties_hs_object_source_user_id": null, "properties_hs_pinned_engagement_id": null, "properties_hs_predicted_amount": null, "properties_hs_predicted_amount_in_home_currency": null, "properties_hs_priority": null, "properties_hs_projected_amount": 1.2000000000000002, "properties_hs_projected_amount_in_home_currency": 1.2000000000000002, "properties_hs_read_only": null, "properties_hs_sales_email_last_replied": null, "properties_hs_tag_ids": null, "properties_hs_tcv": null, "properties_hs_time_in_66894120": null, "properties_hs_time_in_9567448": null, "properties_hs_time_in_9567449": null, "properties_hs_time_in_appointmentscheduled": 95553432636, "properties_hs_time_in_closedlost": null, "properties_hs_time_in_closedwon": null, "properties_hs_time_in_contractsent": null, "properties_hs_time_in_customclosedwonstage": null, "properties_hs_time_in_decisionmakerboughtin": null, "properties_hs_time_in_presentationscheduled": null, "properties_hs_time_in_qualifiedtobuy": null, "properties_hs_unique_creation_key": null, "properties_hs_updated_by_user_id": null, "properties_hs_user_ids_of_all_notification_followers": null, "properties_hs_user_ids_of_all_notification_unfollowers": null, "properties_hs_user_ids_of_all_owners": "12282590", "properties_hs_was_imported": null, "properties_hubspot_owner_assigneddate": "2021-01-14T14:38:00.797000+00:00", "properties_hubspot_owner_id": "52550153", "properties_hubspot_team_id": null, "properties_notes_last_contacted": null, "properties_notes_last_updated": null, "properties_notes_next_activity_date": null, "properties_num_associated_contacts": 0, "properties_num_contacted_notes": null, "properties_num_notes": null, "properties_pipeline": "default"}, "emitted_at": 1706188513544}
 {"stream": "email_events", "data": {"appName": "BatchTest", "location": {"country": "Unknown", "state": "Unknown", "city": "Unknown", "zipcode": "Unknown"}, "id": "17d3fcc4-bc34-38b4-9103-69b5896bbdde", "duration": 0, "browser": {"name": "Google Image Cache", "family": "Google Image Cache", "producer": "", "producerUrl": "", "type": "Proxy", "url": "", "version": []}, "created": 1614191191202, "userAgent": "Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko Firefox/11.0 (via ggpht.com GoogleImageProxy)", "deviceType": "COMPUTER", "type": "OPEN", "recipient": "integration-test@airbyte.io", "portalId": 8727216, "sentBy": {"id": "dd239309-7866-4705-a3e9-c571dd349477", "created": 1614119023182}, "smtpId": null, "filteredEvent": false, "appId": 20053, "emailCampaignId": 2}, "emitted_at": 1697714199237}
 {"stream": "email_events", "data": {"appName": "BatchTest", "location": {"country": "Unknown", "state": "Unknown", "city": "Unknown", "zipcode": "Unknown"}, "id": "e5cbe134-db76-32cb-9e82-9dafcbaf8b64", "duration": 0, "browser": {"name": "Google Image Cache", "family": "Google Image Cache", "producer": "", "producerUrl": "", "type": "Proxy", "url": "", "version": []}, "created": 1614122124339, "userAgent": "Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko Firefox/11.0 (via ggpht.com GoogleImageProxy)", "deviceType": "COMPUTER", "type": "OPEN", "recipient": "integration-test@airbyte.io", "portalId": 8727216, "sentBy": {"id": "dd239309-7866-4705-a3e9-c571dd349477", "created": 1614119023182}, "smtpId": null, "filteredEvent": false, "appId": 20053, "emailCampaignId": 2}, "emitted_at": 1697714199238}
 {"stream": "email_events", "data": {"appName": "BatchTest", "location": {"country": "UNITED STATES", "state": "california", "city": "mountain view", "latitude": 37.40599, "longitude": -122.078514, "zipcode": "94043"}, "id": "35b79cd1-3527-3ae7-b316-be0bbf872839", "duration": 1229, "browser": {"name": "Microsoft Edge 12.246", "family": "Microsoft Edge", "producer": "Microsoft Corporation.", "producerUrl": "https://www.microsoft.com/about/", "type": "Browser", "url": "https://en.wikipedia.org/wiki/Microsoft_Edge", "version": ["12.246"]}, "created": 1614119026757, "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.246 Mozilla/5.0", "deviceType": "COMPUTER", "type": "OPEN", "recipient": "integration-test@airbyte.io", "portalId": 8727216, "sentBy": {"id": "dd239309-7866-4705-a3e9-c571dd349477", "created": 1614119023182}, "smtpId": null, "filteredEvent": true, "appId": 20053, "emailCampaignId": 2}, "emitted_at": 1697714199239}
@@ -26,30 +26,30 @@
 {"stream": "engagements", "data": {"id": 10584327028, "portalId": 8727216, "active": true, "createdAt": 1610636372009, "lastUpdated": 1610636372009, "type": "NOTE", "timestamp": 1409172644778, "allAccessibleTeamIds": [], "bodyPreview": "note body 5", "queueMembershipIds": [], "bodyPreviewIsTruncated": false, "bodyPreviewHtml": "<html>\n <head></head>\n <body>\n note body 5\n </body>\n</html>", "gdprDeleted": false, "associations": {"contactIds": [], "companyIds": [], "dealIds": [], "ownerIds": [], "workflowIds": [], "ticketIds": [], "contentIds": [], "quoteIds": [], "marketingEventIds": []}, "attachments": [{"id": 4241968539}], "metadata": {"body": "note body 5"}, "associations_contactIds": [], "associations_companyIds": [], "associations_dealIds": [], "associations_ownerIds": [], "associations_workflowIds": [], "associations_ticketIds": [], "associations_contentIds": [], "associations_quoteIds": [], "associations_marketingEventIds": [], "metadata_body": "note body 5"}, "emitted_at": 1697714210187}
 {"stream": "engagements", "data": {"id": 10584327043, "portalId": 8727216, "active": true, "createdAt": 1610636372714, "lastUpdated": 1610636372714, "type": "NOTE", "timestamp": 1409172644778, "allAccessibleTeamIds": [], "bodyPreview": "note body 7", "queueMembershipIds": [], "bodyPreviewIsTruncated": false, "bodyPreviewHtml": "<html>\n <head></head>\n <body>\n note body 7\n </body>\n</html>", "gdprDeleted": false, "associations": {"contactIds": [], "companyIds": [], "dealIds": [], "ownerIds": [], "workflowIds": [], "ticketIds": [], "contentIds": [], "quoteIds": [], "marketingEventIds": []}, "attachments": [{"id": 4241968539}], "metadata": {"body": "note body 7"}, "associations_contactIds": [], "associations_companyIds": [], "associations_dealIds": [], "associations_ownerIds": [], "associations_workflowIds": [], "associations_ticketIds": [], "associations_contentIds": [], "associations_quoteIds": [], "associations_marketingEventIds": [], "metadata_body": "note body 7"}, "emitted_at": 1697714210189}
 {"stream": "engagements", "data": {"id": 10584344127, "portalId": 8727216, "active": true, "createdAt": 1610636320990, "lastUpdated": 1610636320990, "type": "NOTE", "timestamp": 1409172644778, "allAccessibleTeamIds": [], "bodyPreview": "note body", "queueMembershipIds": [], "bodyPreviewIsTruncated": false, "bodyPreviewHtml": "<html>\n <head></head>\n <body>\n note body\n </body>\n</html>", "gdprDeleted": false, "associations": {"contactIds": [], "companyIds": [], "dealIds": [], "ownerIds": [], "workflowIds": [], "ticketIds": [], "contentIds": [], "quoteIds": [], "marketingEventIds": []}, "attachments": [{"id": 4241968539}], "metadata": {"body": "note body"}, "associations_contactIds": [], "associations_companyIds": [], "associations_dealIds": [], "associations_ownerIds": [], "associations_workflowIds": [], "associations_ticketIds": [], "associations_contentIds": [], "associations_quoteIds": [], "associations_marketingEventIds": [], "metadata_body": "note body"}, "emitted_at": 1697714210190}
-{"stream": "engagements_notes", "data": {"id": "10584327028", "properties": {"hs_all_accessible_team_ids": null, "hs_all_assigned_business_unit_ids": null, "hs_all_owner_ids": "", "hs_all_team_ids": null, "hs_at_mentioned_owner_ids": null, "hs_attachment_ids": "4241968539", "hs_body_preview": "note body 5", "hs_body_preview_html": "<html>\n <head></head>\n <body>\n note body 5\n </body>\n</html>", "hs_body_preview_is_truncated": false, "hs_created_by": null, "hs_created_by_user_id": null, "hs_createdate": "2021-01-14T14:59:32.009000+00:00", "hs_engagement_source": null, "hs_engagement_source_id": null, "hs_follow_up_action": null, "hs_gdpr_deleted": false, "hs_lastmodifieddate": "2021-01-14T14:59:32.009000+00:00", "hs_merged_object_ids": null, "hs_modified_by": null, "hs_note_body": "note body 5", "hs_object_id": 10584327028, "hs_object_source": null, "hs_object_source_id": null, "hs_object_source_label": null, "hs_object_source_user_id": null, "hs_product_name": null, "hs_queue_membership_ids": null, "hs_read_only": null, "hs_timestamp": "2014-08-27T20:50:44.778000+00:00", "hs_unique_creation_key": null, "hs_unique_id": null, "hs_updated_by_user_id": null, "hs_user_ids_of_all_notification_followers": null, "hs_user_ids_of_all_notification_unfollowers": null, "hs_user_ids_of_all_owners": null, "hs_was_imported": null, "hubspot_owner_assigneddate": null, "hubspot_owner_id": "", "hubspot_team_id": null}, "createdAt": "2021-01-14T14:59:32.009Z", "updatedAt": "2021-01-14T14:59:32.009Z", "archived": false, "properties_hs_all_accessible_team_ids": null, "properties_hs_all_assigned_business_unit_ids": null, "properties_hs_all_owner_ids": "", "properties_hs_all_team_ids": null, "properties_hs_at_mentioned_owner_ids": null, "properties_hs_attachment_ids": "4241968539", "properties_hs_body_preview": "note body 5", "properties_hs_body_preview_html": "<html>\n <head></head>\n <body>\n note body 5\n </body>\n</html>", "properties_hs_body_preview_is_truncated": false, "properties_hs_created_by": null, "properties_hs_created_by_user_id": null, "properties_hs_createdate": "2021-01-14T14:59:32.009000+00:00", "properties_hs_engagement_source": null, "properties_hs_engagement_source_id": null, "properties_hs_follow_up_action": null, "properties_hs_gdpr_deleted": false, "properties_hs_lastmodifieddate": "2021-01-14T14:59:32.009000+00:00", "properties_hs_merged_object_ids": null, "properties_hs_modified_by": null, "properties_hs_note_body": "note body 5", "properties_hs_object_id": 10584327028, "properties_hs_object_source": null, "properties_hs_object_source_id": null, "properties_hs_object_source_label": null, "properties_hs_object_source_user_id": null, "properties_hs_product_name": null, "properties_hs_queue_membership_ids": null, "properties_hs_read_only": null, "properties_hs_timestamp": "2014-08-27T20:50:44.778000+00:00", "properties_hs_unique_creation_key": null, "properties_hs_unique_id": null, "properties_hs_updated_by_user_id": null, "properties_hs_user_ids_of_all_notification_followers": null, "properties_hs_user_ids_of_all_notification_unfollowers": null, "properties_hs_user_ids_of_all_owners": null, "properties_hs_was_imported": null, "properties_hubspot_owner_assigneddate": null, "properties_hubspot_owner_id": "", "properties_hubspot_team_id": null}, "emitted_at": 1697714218669}
-{"stream": "engagements_notes", "data": {"id": "10584327043", "properties": {"hs_all_accessible_team_ids": null, "hs_all_assigned_business_unit_ids": null, "hs_all_owner_ids": "", "hs_all_team_ids": null, "hs_at_mentioned_owner_ids": null, "hs_attachment_ids": "4241968539", "hs_body_preview": "note body 7", "hs_body_preview_html": "<html>\n <head></head>\n <body>\n note body 7\n </body>\n</html>", "hs_body_preview_is_truncated": false, "hs_created_by": null, "hs_created_by_user_id": null, "hs_createdate": "2021-01-14T14:59:32.714000+00:00", "hs_engagement_source": null, "hs_engagement_source_id": null, "hs_follow_up_action": null, "hs_gdpr_deleted": false, "hs_lastmodifieddate": "2021-01-14T14:59:32.714000+00:00", "hs_merged_object_ids": null, "hs_modified_by": null, "hs_note_body": "note body 7", "hs_object_id": 10584327043, "hs_object_source": null, "hs_object_source_id": null, "hs_object_source_label": null, "hs_object_source_user_id": null, "hs_product_name": null, "hs_queue_membership_ids": null, "hs_read_only": null, "hs_timestamp": "2014-08-27T20:50:44.778000+00:00", "hs_unique_creation_key": null, "hs_unique_id": null, "hs_updated_by_user_id": null, "hs_user_ids_of_all_notification_followers": null, "hs_user_ids_of_all_notification_unfollowers": null, "hs_user_ids_of_all_owners": null, "hs_was_imported": null, "hubspot_owner_assigneddate": null, "hubspot_owner_id": "", "hubspot_team_id": null}, "createdAt": "2021-01-14T14:59:32.714Z", "updatedAt": "2021-01-14T14:59:32.714Z", "archived": false, "properties_hs_all_accessible_team_ids": null, "properties_hs_all_assigned_business_unit_ids": null, "properties_hs_all_owner_ids": "", "properties_hs_all_team_ids": null, "properties_hs_at_mentioned_owner_ids": null, "properties_hs_attachment_ids": "4241968539", "properties_hs_body_preview": "note body 7", "properties_hs_body_preview_html": "<html>\n <head></head>\n <body>\n note body 7\n </body>\n</html>", "properties_hs_body_preview_is_truncated": false, "properties_hs_created_by": null, "properties_hs_created_by_user_id": null, "properties_hs_createdate": "2021-01-14T14:59:32.714000+00:00", "properties_hs_engagement_source": null, "properties_hs_engagement_source_id": null, "properties_hs_follow_up_action": null, "properties_hs_gdpr_deleted": false, "properties_hs_lastmodifieddate": "2021-01-14T14:59:32.714000+00:00", "properties_hs_merged_object_ids": null, "properties_hs_modified_by": null, "properties_hs_note_body": "note body 7", "properties_hs_object_id": 10584327043, "properties_hs_object_source": null, "properties_hs_object_source_id": null, "properties_hs_object_source_label": null, "properties_hs_object_source_user_id": null, "properties_hs_product_name": null, "properties_hs_queue_membership_ids": null, "properties_hs_read_only": null, "properties_hs_timestamp": "2014-08-27T20:50:44.778000+00:00", "properties_hs_unique_creation_key": null, "properties_hs_unique_id": null, "properties_hs_updated_by_user_id": null, "properties_hs_user_ids_of_all_notification_followers": null, "properties_hs_user_ids_of_all_notification_unfollowers": null, "properties_hs_user_ids_of_all_owners": null, "properties_hs_was_imported": null, "properties_hubspot_owner_assigneddate": null, "properties_hubspot_owner_id": "", "properties_hubspot_team_id": null}, "emitted_at": 1697714218670}
-{"stream": "engagements_notes", "data": {"id": "10584344127", "properties": {"hs_all_accessible_team_ids": null, "hs_all_assigned_business_unit_ids": null, "hs_all_owner_ids": "", "hs_all_team_ids": null, "hs_at_mentioned_owner_ids": null, "hs_attachment_ids": "4241968539", "hs_body_preview": "note body", "hs_body_preview_html": "<html>\n <head></head>\n <body>\n note body\n </body>\n</html>", "hs_body_preview_is_truncated": false, "hs_created_by": null, "hs_created_by_user_id": null, "hs_createdate": "2021-01-14T14:58:40.990000+00:00", "hs_engagement_source": null, "hs_engagement_source_id": null, "hs_follow_up_action": null, "hs_gdpr_deleted": false, "hs_lastmodifieddate": "2021-01-14T14:58:40.990000+00:00", "hs_merged_object_ids": null, "hs_modified_by": null, "hs_note_body": "note body", "hs_object_id": 10584344127, "hs_object_source": null, "hs_object_source_id": null, "hs_object_source_label": null, "hs_object_source_user_id": null, "hs_product_name": null, "hs_queue_membership_ids": null, "hs_read_only": null, "hs_timestamp": "2014-08-27T20:50:44.778000+00:00", "hs_unique_creation_key": null, "hs_unique_id": null, "hs_updated_by_user_id": null, "hs_user_ids_of_all_notification_followers": null, "hs_user_ids_of_all_notification_unfollowers": null, "hs_user_ids_of_all_owners": null, "hs_was_imported": null, "hubspot_owner_assigneddate": null, "hubspot_owner_id": "", "hubspot_team_id": null}, "createdAt": "2021-01-14T14:58:40.990Z", "updatedAt": "2021-01-14T14:58:40.990Z", "archived": false, "properties_hs_all_accessible_team_ids": null, "properties_hs_all_assigned_business_unit_ids": null, "properties_hs_all_owner_ids": "", "properties_hs_all_team_ids": null, "properties_hs_at_mentioned_owner_ids": null, "properties_hs_attachment_ids": "4241968539", "properties_hs_body_preview": "note body", "properties_hs_body_preview_html": "<html>\n <head></head>\n <body>\n note body\n </body>\n</html>", "properties_hs_body_preview_is_truncated": false, "properties_hs_created_by": null, "properties_hs_created_by_user_id": null, "properties_hs_createdate": "2021-01-14T14:58:40.990000+00:00", "properties_hs_engagement_source": null, "properties_hs_engagement_source_id": null, "properties_hs_follow_up_action": null, "properties_hs_gdpr_deleted": false, "properties_hs_lastmodifieddate": "2021-01-14T14:58:40.990000+00:00", "properties_hs_merged_object_ids": null, "properties_hs_modified_by": null, "properties_hs_note_body": "note body", "properties_hs_object_id": 10584344127, "properties_hs_object_source": null, "properties_hs_object_source_id": null, "properties_hs_object_source_label": null, "properties_hs_object_source_user_id": null, "properties_hs_product_name": null, "properties_hs_queue_membership_ids": null, "properties_hs_read_only": null, "properties_hs_timestamp": "2014-08-27T20:50:44.778000+00:00", "properties_hs_unique_creation_key": null, "properties_hs_unique_id": null, "properties_hs_updated_by_user_id": null, "properties_hs_user_ids_of_all_notification_followers": null, "properties_hs_user_ids_of_all_notification_unfollowers": null, "properties_hs_user_ids_of_all_owners": null, "properties_hs_was_imported": null, "properties_hubspot_owner_assigneddate": null, "properties_hubspot_owner_id": "", "properties_hubspot_team_id": null}, "emitted_at": 1697714218671}
-{"stream": "engagements_tasks", "data": {"id": "11257289597", "properties": {"hs_all_accessible_team_ids": null, "hs_all_assigned_business_unit_ids": null, "hs_all_owner_ids": "52550153", "hs_all_team_ids": null, "hs_at_mentioned_owner_ids": null, "hs_attachment_ids": null, "hs_body_preview": "Regarding note logged on Tuesday, February 23, 2021 10:25 PM", "hs_body_preview_html": "<html>\n <head></head>\n <body>\n Regarding note logged on Tuesday, February 23, 2021 10:25 PM\n </body>\n</html>", "hs_body_preview_is_truncated": false, "hs_calendar_event_id": null, "hs_created_by": 12282590, "hs_created_by_user_id": 12282590, "hs_createdate": "2021-02-23T20:25:07.503000+00:00", "hs_engagement_source": null, "hs_engagement_source_id": null, "hs_follow_up_action": null, "hs_gdpr_deleted": false, "hs_lastmodifieddate": "2023-04-19T14:52:43.485000+00:00", "hs_merged_object_ids": null, "hs_modified_by": 12282590, "hs_msteams_message_id": null, "hs_num_associated_companies": 0, "hs_num_associated_contacts": 0, "hs_num_associated_deals": 1, "hs_num_associated_queue_objects": 1, "hs_num_associated_tickets": 0, "hs_object_id": 11257289597, "hs_object_source": null, "hs_object_source_id": null, "hs_object_source_label": null, "hs_object_source_user_id": null, "hs_product_name": null, "hs_queue_membership_ids": null, "hs_read_only": null, "hs_repeat_status": null, "hs_scheduled_tasks": "{\"scheduledTasks\":[{\"engagementId\":11257289597,\"portalId\":8727216,\"engagementType\":\"TASK\",\"taskType\":\"REMINDER\",\"timestamp\":1614319200000,\"uuid\":\"TASK:e41fd851-f7c7-4381-85fa-796d076163aa\"}]}", "hs_task_body": "Regarding note logged on Tuesday, February 23, 2021 10:25 PM", "hs_task_completion_count": null, "hs_task_completion_date": null, "hs_task_contact_timezone": null, "hs_task_family": "SALES", "hs_task_for_object_type": "OWNER", "hs_task_is_all_day": false, "hs_task_is_completed": 0, "hs_task_is_completed_call": 0, "hs_task_is_completed_email": 0, "hs_task_is_completed_linked_in": 0, "hs_task_is_completed_sequence": 0, "hs_task_is_overdue": true, "hs_task_is_past_due_date": true, "hs_task_last_contact_outreach": null, "hs_task_last_sales_activity_timestamp": null, "hs_task_missed_due_date": true, "hs_task_missed_due_date_count": 1, "hs_task_priority": "NONE", "hs_task_probability_to_complete": null, "hs_task_relative_reminders": null, "hs_task_reminders": "1614319200000", "hs_task_repeat_interval": null, "hs_task_send_default_reminder": null, "hs_task_sequence_enrollment_active": null, "hs_task_sequence_step_enrollment_id": null, "hs_task_sequence_step_order": null, "hs_task_status": "NOT_STARTED", "hs_task_subject": "Follow up on Test deal 2", "hs_task_template_id": null, "hs_task_type": "TODO", "hs_timestamp": "2021-02-26T06:00:00+00:00", "hs_unique_creation_key": null, "hs_unique_id": null, "hs_updated_by_user_id": 12282590, "hs_user_ids_of_all_notification_followers": null, "hs_user_ids_of_all_notification_unfollowers": null, "hs_user_ids_of_all_owners": "12282590", "hs_was_imported": null, "hubspot_owner_assigneddate": "2021-02-23T20:25:07.503000+00:00", "hubspot_owner_id": "52550153", "hubspot_team_id": null}, "createdAt": "2021-02-23T20:25:07.503Z", "updatedAt": "2023-04-19T14:52:43.485Z", "archived": false, "deals": ["4315375411"], "properties_hs_all_accessible_team_ids": null, "properties_hs_all_assigned_business_unit_ids": null, "properties_hs_all_owner_ids": "52550153", "properties_hs_all_team_ids": null, "properties_hs_at_mentioned_owner_ids": null, "properties_hs_attachment_ids": null, "properties_hs_body_preview": "Regarding note logged on Tuesday, February 23, 2021 10:25 PM", "properties_hs_body_preview_html": "<html>\n <head></head>\n <body>\n Regarding note logged on Tuesday, February 23, 2021 10:25 PM\n </body>\n</html>", "properties_hs_body_preview_is_truncated": false, "properties_hs_calendar_event_id": null, "properties_hs_created_by": 12282590, "properties_hs_created_by_user_id": 12282590, "properties_hs_createdate": "2021-02-23T20:25:07.503000+00:00", "properties_hs_engagement_source": null, "properties_hs_engagement_source_id": null, "properties_hs_follow_up_action": null, "properties_hs_gdpr_deleted": false, "properties_hs_lastmodifieddate": "2023-04-19T14:52:43.485000+00:00", "properties_hs_merged_object_ids": null, "properties_hs_modified_by": 12282590, "properties_hs_msteams_message_id": null, "properties_hs_num_associated_companies": 0, "properties_hs_num_associated_contacts": 0, "properties_hs_num_associated_deals": 1, "properties_hs_num_associated_queue_objects": 1, "properties_hs_num_associated_tickets": 0, "properties_hs_object_id": 11257289597, "properties_hs_object_source": null, "properties_hs_object_source_id": null, "properties_hs_object_source_label": null, "properties_hs_object_source_user_id": null, "properties_hs_product_name": null, "properties_hs_queue_membership_ids": null, "properties_hs_read_only": null, "properties_hs_repeat_status": null, "properties_hs_scheduled_tasks": "{\"scheduledTasks\":[{\"engagementId\":11257289597,\"portalId\":8727216,\"engagementType\":\"TASK\",\"taskType\":\"REMINDER\",\"timestamp\":1614319200000,\"uuid\":\"TASK:e41fd851-f7c7-4381-85fa-796d076163aa\"}]}", "properties_hs_task_body": "Regarding note logged on Tuesday, February 23, 2021 10:25 PM", "properties_hs_task_completion_count": null, "properties_hs_task_completion_date": null, "properties_hs_task_contact_timezone": null, "properties_hs_task_family": "SALES", "properties_hs_task_for_object_type": "OWNER", "properties_hs_task_is_all_day": false, "properties_hs_task_is_completed": 0, "properties_hs_task_is_completed_call": 0, "properties_hs_task_is_completed_email": 0, "properties_hs_task_is_completed_linked_in": 0, "properties_hs_task_is_completed_sequence": 0, "properties_hs_task_is_overdue": true, "properties_hs_task_is_past_due_date": true, "properties_hs_task_last_contact_outreach": null, "properties_hs_task_last_sales_activity_timestamp": null, "properties_hs_task_missed_due_date": true, "properties_hs_task_missed_due_date_count": 1, "properties_hs_task_priority": "NONE", "properties_hs_task_probability_to_complete": null, "properties_hs_task_relative_reminders": null, "properties_hs_task_reminders": "1614319200000", "properties_hs_task_repeat_interval": null, "properties_hs_task_send_default_reminder": null, "properties_hs_task_sequence_enrollment_active": null, "properties_hs_task_sequence_step_enrollment_id": null, "properties_hs_task_sequence_step_order": null, "properties_hs_task_status": "NOT_STARTED", "properties_hs_task_subject": "Follow up on Test deal 2", "properties_hs_task_template_id": null, "properties_hs_task_type": "TODO", "properties_hs_timestamp": "2021-02-26T06:00:00+00:00", "properties_hs_unique_creation_key": null, "properties_hs_unique_id": null, "properties_hs_updated_by_user_id": 12282590, "properties_hs_user_ids_of_all_notification_followers": null, "properties_hs_user_ids_of_all_notification_unfollowers": null, "properties_hs_user_ids_of_all_owners": "12282590", "properties_hs_was_imported": null, "properties_hubspot_owner_assigneddate": "2021-02-23T20:25:07.503000+00:00", "properties_hubspot_owner_id": "52550153", "properties_hubspot_team_id": null}, "emitted_at": 1700237230220}
-{"stream": "engagements_tasks", "data": {"id": "30652597343", "properties": {"hs_all_accessible_team_ids": null, "hs_all_assigned_business_unit_ids": null, "hs_all_owner_ids": "52550153", "hs_all_team_ids": null, "hs_at_mentioned_owner_ids": null, "hs_attachment_ids": null, "hs_body_preview": null, "hs_body_preview_html": null, "hs_body_preview_is_truncated": false, "hs_calendar_event_id": null, "hs_created_by": 12282590, "hs_created_by_user_id": 12282590, "hs_createdate": "2023-01-30T23:41:48.834000+00:00", "hs_engagement_source": "CRM_UI", "hs_engagement_source_id": null, "hs_follow_up_action": null, "hs_gdpr_deleted": null, "hs_lastmodifieddate": "2023-04-04T15:11:47.231000+00:00", "hs_merged_object_ids": null, "hs_modified_by": 12282590, "hs_msteams_message_id": null, "hs_num_associated_companies": 0, "hs_num_associated_contacts": 0, "hs_num_associated_deals": 0, "hs_num_associated_queue_objects": 0, "hs_num_associated_tickets": 0, "hs_object_id": 30652597343, "hs_object_source": null, "hs_object_source_id": null, "hs_object_source_label": null, "hs_object_source_user_id": null, "hs_product_name": null, "hs_queue_membership_ids": null, "hs_read_only": null, "hs_repeat_status": null, "hs_scheduled_tasks": "{\"scheduledTasks\":[]}", "hs_task_body": null, "hs_task_completion_count": null, "hs_task_completion_date": null, "hs_task_contact_timezone": null, "hs_task_family": "SALES", "hs_task_for_object_type": "OWNER", "hs_task_is_all_day": false, "hs_task_is_completed": 0, "hs_task_is_completed_call": 0, "hs_task_is_completed_email": 0, "hs_task_is_completed_linked_in": 0, "hs_task_is_completed_sequence": 0, "hs_task_is_overdue": true, "hs_task_is_past_due_date": true, "hs_task_last_contact_outreach": null, "hs_task_last_sales_activity_timestamp": null, "hs_task_missed_due_date": true, "hs_task_missed_due_date_count": 1, "hs_task_priority": "NONE", "hs_task_probability_to_complete": null, "hs_task_relative_reminders": "[]", "hs_task_reminders": null, "hs_task_repeat_interval": null, "hs_task_send_default_reminder": false, "hs_task_sequence_enrollment_active": null, "hs_task_sequence_step_enrollment_id": null, "hs_task_sequence_step_order": null, "hs_task_status": "NOT_STARTED", "hs_task_subject": "test", "hs_task_template_id": null, "hs_task_type": "TODO", "hs_timestamp": "2023-02-03T07:00:00+00:00", "hs_unique_creation_key": null, "hs_unique_id": null, "hs_updated_by_user_id": 12282590, "hs_user_ids_of_all_notification_followers": null, "hs_user_ids_of_all_notification_unfollowers": null, "hs_user_ids_of_all_owners": "12282590", "hs_was_imported": null, "hubspot_owner_assigneddate": "2023-01-30T23:41:48.834000+00:00", "hubspot_owner_id": "52550153", "hubspot_team_id": null}, "createdAt": "2023-01-30T23:41:48.834Z", "updatedAt": "2023-04-04T15:11:47.231Z", "archived": false, "properties_hs_all_accessible_team_ids": null, "properties_hs_all_assigned_business_unit_ids": null, "properties_hs_all_owner_ids": "52550153", "properties_hs_all_team_ids": null, "properties_hs_at_mentioned_owner_ids": null, "properties_hs_attachment_ids": null, "properties_hs_body_preview": null, "properties_hs_body_preview_html": null, "properties_hs_body_preview_is_truncated": false, "properties_hs_calendar_event_id": null, "properties_hs_created_by": 12282590, "properties_hs_created_by_user_id": 12282590, "properties_hs_createdate": "2023-01-30T23:41:48.834000+00:00", "properties_hs_engagement_source": "CRM_UI", "properties_hs_engagement_source_id": null, "properties_hs_follow_up_action": null, "properties_hs_gdpr_deleted": null, "properties_hs_lastmodifieddate": "2023-04-04T15:11:47.231000+00:00", "properties_hs_merged_object_ids": null, "properties_hs_modified_by": 12282590, "properties_hs_msteams_message_id": null, "properties_hs_num_associated_companies": 0, "properties_hs_num_associated_contacts": 0, "properties_hs_num_associated_deals": 0, "properties_hs_num_associated_queue_objects": 0, "properties_hs_num_associated_tickets": 0, "properties_hs_object_id": 30652597343, "properties_hs_object_source": null, "properties_hs_object_source_id": null, "properties_hs_object_source_label": null, "properties_hs_object_source_user_id": null, "properties_hs_product_name": null, "properties_hs_queue_membership_ids": null, "properties_hs_read_only": null, "properties_hs_repeat_status": null, "properties_hs_scheduled_tasks": "{\"scheduledTasks\":[]}", "properties_hs_task_body": null, "properties_hs_task_completion_count": null, "properties_hs_task_completion_date": null, "properties_hs_task_contact_timezone": null, "properties_hs_task_family": "SALES", "properties_hs_task_for_object_type": "OWNER", "properties_hs_task_is_all_day": false, "properties_hs_task_is_completed": 0, "properties_hs_task_is_completed_call": 0, "properties_hs_task_is_completed_email": 0, "properties_hs_task_is_completed_linked_in": 0, "properties_hs_task_is_completed_sequence": 0, "properties_hs_task_is_overdue": true, "properties_hs_task_is_past_due_date": true, "properties_hs_task_last_contact_outreach": null, "properties_hs_task_last_sales_activity_timestamp": null, "properties_hs_task_missed_due_date": true, "properties_hs_task_missed_due_date_count": 1, "properties_hs_task_priority": "NONE", "properties_hs_task_probability_to_complete": null, "properties_hs_task_relative_reminders": "[]", "properties_hs_task_reminders": null, "properties_hs_task_repeat_interval": null, "properties_hs_task_send_default_reminder": false, "properties_hs_task_sequence_enrollment_active": null, "properties_hs_task_sequence_step_enrollment_id": null, "properties_hs_task_sequence_step_order": null, "properties_hs_task_status": "NOT_STARTED", "properties_hs_task_subject": "test", "properties_hs_task_template_id": null, "properties_hs_task_type": "TODO", "properties_hs_timestamp": "2023-02-03T07:00:00+00:00", "properties_hs_unique_creation_key": null, "properties_hs_unique_id": null, "properties_hs_updated_by_user_id": 12282590, "properties_hs_user_ids_of_all_notification_followers": null, "properties_hs_user_ids_of_all_notification_unfollowers": null, "properties_hs_user_ids_of_all_owners": "12282590", "properties_hs_was_imported": null, "properties_hubspot_owner_assigneddate": "2023-01-30T23:41:48.834000+00:00", "properties_hubspot_owner_id": "52550153", "properties_hubspot_team_id": null}, "emitted_at": 1700237230222}
-{"stream": "engagements_tasks", "data": {"id": "30652613208", "properties": {"hs_all_accessible_team_ids": null, "hs_all_assigned_business_unit_ids": null, "hs_all_owner_ids": "52550153", "hs_all_team_ids": null, "hs_at_mentioned_owner_ids": null, "hs_attachment_ids": null, "hs_body_preview": null, "hs_body_preview_html": null, "hs_body_preview_is_truncated": false, "hs_calendar_event_id": null, "hs_created_by": 12282590, "hs_created_by_user_id": 12282590, "hs_createdate": "2023-01-30T23:51:52.099000+00:00", "hs_engagement_source": "CRM_UI", "hs_engagement_source_id": null, "hs_follow_up_action": null, "hs_gdpr_deleted": null, "hs_lastmodifieddate": "2023-01-30T23:51:54.343000+00:00", "hs_merged_object_ids": null, "hs_modified_by": 12282590, "hs_msteams_message_id": null, "hs_num_associated_companies": 1, "hs_num_associated_contacts": 0, "hs_num_associated_deals": 0, "hs_num_associated_queue_objects": 1, "hs_num_associated_tickets": 0, "hs_object_id": 30652613208, "hs_object_source": null, "hs_object_source_id": null, "hs_object_source_label": null, "hs_object_source_user_id": null, "hs_product_name": null, "hs_queue_membership_ids": null, "hs_read_only": null, "hs_repeat_status": null, "hs_scheduled_tasks": "{\"scheduledTasks\":[]}", "hs_task_body": null, "hs_task_completion_count": null, "hs_task_completion_date": null, "hs_task_contact_timezone": null, "hs_task_family": "SALES", "hs_task_for_object_type": "OWNER", "hs_task_is_all_day": false, "hs_task_is_completed": 0, "hs_task_is_completed_call": 0, "hs_task_is_completed_email": 0, "hs_task_is_completed_linked_in": 0, "hs_task_is_completed_sequence": 0, "hs_task_is_overdue": true, "hs_task_is_past_due_date": true, "hs_task_last_contact_outreach": null, "hs_task_last_sales_activity_timestamp": null, "hs_task_missed_due_date": true, "hs_task_missed_due_date_count": 1, "hs_task_priority": "NONE", "hs_task_probability_to_complete": null, "hs_task_relative_reminders": "[]", "hs_task_reminders": null, "hs_task_repeat_interval": null, "hs_task_send_default_reminder": false, "hs_task_sequence_enrollment_active": null, "hs_task_sequence_step_enrollment_id": null, "hs_task_sequence_step_order": null, "hs_task_status": "NOT_STARTED", "hs_task_subject": "test", "hs_task_template_id": null, "hs_task_type": "TODO", "hs_timestamp": "2023-02-03T07:00:00+00:00", "hs_unique_creation_key": null, "hs_unique_id": null, "hs_updated_by_user_id": 12282590, "hs_user_ids_of_all_notification_followers": null, "hs_user_ids_of_all_notification_unfollowers": null, "hs_user_ids_of_all_owners": "12282590", "hs_was_imported": null, "hubspot_owner_assigneddate": "2023-01-30T23:51:52.099000+00:00", "hubspot_owner_id": "52550153", "hubspot_team_id": null}, "createdAt": "2023-01-30T23:51:52.099Z", "updatedAt": "2023-01-30T23:51:54.343Z", "archived": false, "companies": ["11481383026"], "properties_hs_all_accessible_team_ids": null, "properties_hs_all_assigned_business_unit_ids": null, "properties_hs_all_owner_ids": "52550153", "properties_hs_all_team_ids": null, "properties_hs_at_mentioned_owner_ids": null, "properties_hs_attachment_ids": null, "properties_hs_body_preview": null, "properties_hs_body_preview_html": null, "properties_hs_body_preview_is_truncated": false, "properties_hs_calendar_event_id": null, "properties_hs_created_by": 12282590, "properties_hs_created_by_user_id": 12282590, "properties_hs_createdate": "2023-01-30T23:51:52.099000+00:00", "properties_hs_engagement_source": "CRM_UI", "properties_hs_engagement_source_id": null, "properties_hs_follow_up_action": null, "properties_hs_gdpr_deleted": null, "properties_hs_lastmodifieddate": "2023-01-30T23:51:54.343000+00:00", "properties_hs_merged_object_ids": null, "properties_hs_modified_by": 12282590, "properties_hs_msteams_message_id": null, "properties_hs_num_associated_companies": 1, "properties_hs_num_associated_contacts": 0, "properties_hs_num_associated_deals": 0, "properties_hs_num_associated_queue_objects": 1, "properties_hs_num_associated_tickets": 0, "properties_hs_object_id": 30652613208, "properties_hs_object_source": null, "properties_hs_object_source_id": null, "properties_hs_object_source_label": null, "properties_hs_object_source_user_id": null, "properties_hs_product_name": null, "properties_hs_queue_membership_ids": null, "properties_hs_read_only": null, "properties_hs_repeat_status": null, "properties_hs_scheduled_tasks": "{\"scheduledTasks\":[]}", "properties_hs_task_body": null, "properties_hs_task_completion_count": null, "properties_hs_task_completion_date": null, "properties_hs_task_contact_timezone": null, "properties_hs_task_family": "SALES", "properties_hs_task_for_object_type": "OWNER", "properties_hs_task_is_all_day": false, "properties_hs_task_is_completed": 0, "properties_hs_task_is_completed_call": 0, "properties_hs_task_is_completed_email": 0, "properties_hs_task_is_completed_linked_in": 0, "properties_hs_task_is_completed_sequence": 0, "properties_hs_task_is_overdue": true, "properties_hs_task_is_past_due_date": true, "properties_hs_task_last_contact_outreach": null, "properties_hs_task_last_sales_activity_timestamp": null, "properties_hs_task_missed_due_date": true, "properties_hs_task_missed_due_date_count": 1, "properties_hs_task_priority": "NONE", "properties_hs_task_probability_to_complete": null, "properties_hs_task_relative_reminders": "[]", "properties_hs_task_reminders": null, "properties_hs_task_repeat_interval": null, "properties_hs_task_send_default_reminder": false, "properties_hs_task_sequence_enrollment_active": null, "properties_hs_task_sequence_step_enrollment_id": null, "properties_hs_task_sequence_step_order": null, "properties_hs_task_status": "NOT_STARTED", "properties_hs_task_subject": "test", "properties_hs_task_template_id": null, "properties_hs_task_type": "TODO", "properties_hs_timestamp": "2023-02-03T07:00:00+00:00", "properties_hs_unique_creation_key": null, "properties_hs_unique_id": null, "properties_hs_updated_by_user_id": 12282590, "properties_hs_user_ids_of_all_notification_followers": null, "properties_hs_user_ids_of_all_notification_unfollowers": null, "properties_hs_user_ids_of_all_owners": "12282590", "properties_hs_was_imported": null, "properties_hubspot_owner_assigneddate": "2023-01-30T23:51:52.099000+00:00", "properties_hubspot_owner_id": "52550153", "properties_hubspot_team_id": null}, "emitted_at": 1700237230223}
+{"stream": "engagements_notes", "data": {"id": "10584327028", "properties": {"hs_all_accessible_team_ids": null, "hs_all_assigned_business_unit_ids": null, "hs_all_owner_ids": "", "hs_all_team_ids": null, "hs_at_mentioned_owner_ids": null, "hs_attachment_ids": "4241968539", "hs_body_preview": "note body 5", "hs_body_preview_html": "<html>\n <head></head>\n <body>\n note body 5\n </body>\n</html>", "hs_body_preview_is_truncated": false, "hs_created_by": null, "hs_created_by_user_id": null, "hs_createdate": "2021-01-14T14:59:32.009000+00:00", "hs_engagement_source": null, "hs_engagement_source_id": null, "hs_follow_up_action": null, "hs_gdpr_deleted": false, "hs_lastmodifieddate": "2021-01-14T14:59:32.009000+00:00", "hs_merged_object_ids": null, "hs_modified_by": null, "hs_note_body": "note body 5", "hs_object_id": 10584327028, "hs_object_source": "API", "hs_object_source_id": null, "hs_object_source_label": "INTERNAL_PROCESSING", "hs_object_source_user_id": null, "hs_product_name": null, "hs_queue_membership_ids": null, "hs_read_only": null, "hs_timestamp": "2014-08-27T20:50:44.778000+00:00", "hs_unique_creation_key": null, "hs_unique_id": null, "hs_updated_by_user_id": null, "hs_user_ids_of_all_notification_followers": null, "hs_user_ids_of_all_notification_unfollowers": null, "hs_user_ids_of_all_owners": null, "hs_was_imported": null, "hubspot_owner_assigneddate": null, "hubspot_owner_id": "", "hubspot_team_id": null}, "createdAt": "2021-01-14T14:59:32.009Z", "updatedAt": "2021-01-14T14:59:32.009Z", "archived": false, "properties_hs_all_accessible_team_ids": null, "properties_hs_all_assigned_business_unit_ids": null, "properties_hs_all_owner_ids": "", "properties_hs_all_team_ids": null, "properties_hs_at_mentioned_owner_ids": null, "properties_hs_attachment_ids": "4241968539", "properties_hs_body_preview": "note body 5", "properties_hs_body_preview_html": "<html>\n <head></head>\n <body>\n note body 5\n </body>\n</html>", "properties_hs_body_preview_is_truncated": false, "properties_hs_created_by": null, "properties_hs_created_by_user_id": null, "properties_hs_createdate": "2021-01-14T14:59:32.009000+00:00", "properties_hs_engagement_source": null, "properties_hs_engagement_source_id": null, "properties_hs_follow_up_action": null, "properties_hs_gdpr_deleted": false, "properties_hs_lastmodifieddate": "2021-01-14T14:59:32.009000+00:00", "properties_hs_merged_object_ids": null, "properties_hs_modified_by": null, "properties_hs_note_body": "note body 5", "properties_hs_object_id": 10584327028, "properties_hs_object_source": "API", "properties_hs_object_source_id": null, "properties_hs_object_source_label": "INTERNAL_PROCESSING", "properties_hs_object_source_user_id": null, "properties_hs_product_name": null, "properties_hs_queue_membership_ids": null, "properties_hs_read_only": null, "properties_hs_timestamp": "2014-08-27T20:50:44.778000+00:00", "properties_hs_unique_creation_key": null, "properties_hs_unique_id": null, "properties_hs_updated_by_user_id": null, "properties_hs_user_ids_of_all_notification_followers": null, "properties_hs_user_ids_of_all_notification_unfollowers": null, "properties_hs_user_ids_of_all_owners": null, "properties_hs_was_imported": null, "properties_hubspot_owner_assigneddate": null, "properties_hubspot_owner_id": "", "properties_hubspot_team_id": null}, "emitted_at": 1706189898297}
+{"stream": "engagements_notes", "data": {"id": "10584327043", "properties": {"hs_all_accessible_team_ids": null, "hs_all_assigned_business_unit_ids": null, "hs_all_owner_ids": "", "hs_all_team_ids": null, "hs_at_mentioned_owner_ids": null, "hs_attachment_ids": "4241968539", "hs_body_preview": "note body 7", "hs_body_preview_html": "<html>\n <head></head>\n <body>\n note body 7\n </body>\n</html>", "hs_body_preview_is_truncated": false, "hs_created_by": null, "hs_created_by_user_id": null, "hs_createdate": "2021-01-14T14:59:32.714000+00:00", "hs_engagement_source": null, "hs_engagement_source_id": null, "hs_follow_up_action": null, "hs_gdpr_deleted": false, "hs_lastmodifieddate": "2021-01-14T14:59:32.714000+00:00", "hs_merged_object_ids": null, "hs_modified_by": null, "hs_note_body": "note body 7", "hs_object_id": 10584327043, "hs_object_source": "API", "hs_object_source_id": null, "hs_object_source_label": "INTERNAL_PROCESSING", "hs_object_source_user_id": null, "hs_product_name": null, "hs_queue_membership_ids": null, "hs_read_only": null, "hs_timestamp": "2014-08-27T20:50:44.778000+00:00", "hs_unique_creation_key": null, "hs_unique_id": null, "hs_updated_by_user_id": null, "hs_user_ids_of_all_notification_followers": null, "hs_user_ids_of_all_notification_unfollowers": null, "hs_user_ids_of_all_owners": null, "hs_was_imported": null, "hubspot_owner_assigneddate": null, "hubspot_owner_id": "", "hubspot_team_id": null}, "createdAt": "2021-01-14T14:59:32.714Z", "updatedAt": "2021-01-14T14:59:32.714Z", "archived": false, "properties_hs_all_accessible_team_ids": null, "properties_hs_all_assigned_business_unit_ids": null, "properties_hs_all_owner_ids": "", "properties_hs_all_team_ids": null, "properties_hs_at_mentioned_owner_ids": null, "properties_hs_attachment_ids": "4241968539", "properties_hs_body_preview": "note body 7", "properties_hs_body_preview_html": "<html>\n <head></head>\n <body>\n note body 7\n </body>\n</html>", "properties_hs_body_preview_is_truncated": false, "properties_hs_created_by": null, "properties_hs_created_by_user_id": null, "properties_hs_createdate": "2021-01-14T14:59:32.714000+00:00", "properties_hs_engagement_source": null, "properties_hs_engagement_source_id": null, "properties_hs_follow_up_action": null, "properties_hs_gdpr_deleted": false, "properties_hs_lastmodifieddate": "2021-01-14T14:59:32.714000+00:00", "properties_hs_merged_object_ids": null, "properties_hs_modified_by": null, "properties_hs_note_body": "note body 7", "properties_hs_object_id": 10584327043, "properties_hs_object_source": "API", "properties_hs_object_source_id": null, "properties_hs_object_source_label": "INTERNAL_PROCESSING", "properties_hs_object_source_user_id": null, "properties_hs_product_name": null, "properties_hs_queue_membership_ids": null, "properties_hs_read_only": null, "properties_hs_timestamp": "2014-08-27T20:50:44.778000+00:00", "properties_hs_unique_creation_key": null, "properties_hs_unique_id": null, "properties_hs_updated_by_user_id": null, "properties_hs_user_ids_of_all_notification_followers": null, "properties_hs_user_ids_of_all_notification_unfollowers": null, "properties_hs_user_ids_of_all_owners": null, "properties_hs_was_imported": null, "properties_hubspot_owner_assigneddate": null, "properties_hubspot_owner_id": "", "properties_hubspot_team_id": null}, "emitted_at": 1706189898299}
+{"stream": "engagements_notes", "data": {"id": "10584344127", "properties": {"hs_all_accessible_team_ids": null, "hs_all_assigned_business_unit_ids": null, "hs_all_owner_ids": "", "hs_all_team_ids": null, "hs_at_mentioned_owner_ids": null, "hs_attachment_ids": "4241968539", "hs_body_preview": "note body", "hs_body_preview_html": "<html>\n <head></head>\n <body>\n note body\n </body>\n</html>", "hs_body_preview_is_truncated": false, "hs_created_by": null, "hs_created_by_user_id": null, "hs_createdate": "2021-01-14T14:58:40.990000+00:00", "hs_engagement_source": null, "hs_engagement_source_id": null, "hs_follow_up_action": null, "hs_gdpr_deleted": false, "hs_lastmodifieddate": "2021-01-14T14:58:40.990000+00:00", "hs_merged_object_ids": null, "hs_modified_by": null, "hs_note_body": "note body", "hs_object_id": 10584344127, "hs_object_source": "API", "hs_object_source_id": null, "hs_object_source_label": "INTERNAL_PROCESSING", "hs_object_source_user_id": null, "hs_product_name": null, "hs_queue_membership_ids": null, "hs_read_only": null, "hs_timestamp": "2014-08-27T20:50:44.778000+00:00", "hs_unique_creation_key": null, "hs_unique_id": null, "hs_updated_by_user_id": null, "hs_user_ids_of_all_notification_followers": null, "hs_user_ids_of_all_notification_unfollowers": null, "hs_user_ids_of_all_owners": null, "hs_was_imported": null, "hubspot_owner_assigneddate": null, "hubspot_owner_id": "", "hubspot_team_id": null}, "createdAt": "2021-01-14T14:58:40.990Z", "updatedAt": "2021-01-14T14:58:40.990Z", "archived": false, "properties_hs_all_accessible_team_ids": null, "properties_hs_all_assigned_business_unit_ids": null, "properties_hs_all_owner_ids": "", "properties_hs_all_team_ids": null, "properties_hs_at_mentioned_owner_ids": null, "properties_hs_attachment_ids": "4241968539", "properties_hs_body_preview": "note body", "properties_hs_body_preview_html": "<html>\n <head></head>\n <body>\n note body\n </body>\n</html>", "properties_hs_body_preview_is_truncated": false, "properties_hs_created_by": null, "properties_hs_created_by_user_id": null, "properties_hs_createdate": "2021-01-14T14:58:40.990000+00:00", "properties_hs_engagement_source": null, "properties_hs_engagement_source_id": null, "properties_hs_follow_up_action": null, "properties_hs_gdpr_deleted": false, "properties_hs_lastmodifieddate": "2021-01-14T14:58:40.990000+00:00", "properties_hs_merged_object_ids": null, "properties_hs_modified_by": null, "properties_hs_note_body": "note body", "properties_hs_object_id": 10584344127, "properties_hs_object_source": "API", "properties_hs_object_source_id": null, "properties_hs_object_source_label": "INTERNAL_PROCESSING", "properties_hs_object_source_user_id": null, "properties_hs_product_name": null, "properties_hs_queue_membership_ids": null, "properties_hs_read_only": null, "properties_hs_timestamp": "2014-08-27T20:50:44.778000+00:00", "properties_hs_unique_creation_key": null, "properties_hs_unique_id": null, "properties_hs_updated_by_user_id": null, "properties_hs_user_ids_of_all_notification_followers": null, "properties_hs_user_ids_of_all_notification_unfollowers": null, "properties_hs_user_ids_of_all_owners": null, "properties_hs_was_imported": null, "properties_hubspot_owner_assigneddate": null, "properties_hubspot_owner_id": "", "properties_hubspot_team_id": null}, "emitted_at": 1706189898299}
+{"stream": "engagements_tasks", "data": {"id": "11257289597", "properties": {"hs_all_accessible_team_ids": null, "hs_all_assigned_business_unit_ids": null, "hs_all_owner_ids": "52550153", "hs_all_team_ids": null, "hs_at_mentioned_owner_ids": null, "hs_attachment_ids": null, "hs_body_preview": "Regarding note logged on Tuesday, February 23, 2021 10:25 PM", "hs_body_preview_html": "<html>\n <head></head>\n <body>\n Regarding note logged on Tuesday, February 23, 2021 10:25 PM\n </body>\n</html>", "hs_body_preview_is_truncated": false, "hs_calendar_event_id": null, "hs_created_by": 12282590, "hs_created_by_user_id": 12282590, "hs_createdate": "2021-02-23T20:25:07.503000+00:00", "hs_engagement_source": null, "hs_engagement_source_id": null, "hs_follow_up_action": null, "hs_gdpr_deleted": false, "hs_lastmodifieddate": "2023-04-19T14:52:43.485000+00:00", "hs_merged_object_ids": null, "hs_modified_by": 12282590, "hs_msteams_message_id": null, "hs_object_id": 11257289597, "hs_object_source": "CRM_UI", "hs_object_source_id": "userId:12282590", "hs_object_source_label": "CRM_UI", "hs_object_source_user_id": 12282590, "hs_product_name": null, "hs_queue_membership_ids": null, "hs_read_only": null, "hs_repeat_status": null, "hs_scheduled_tasks": "{\"scheduledTasks\":[{\"engagementId\":11257289597,\"portalId\":8727216,\"engagementType\":\"TASK\",\"taskType\":\"REMINDER\",\"timestamp\":1614319200000,\"uuid\":\"TASK:e41fd851-f7c7-4381-85fa-796d076163aa\"}]}", "hs_task_body": "Regarding note logged on Tuesday, February 23, 2021 10:25 PM", "hs_task_completion_count": null, "hs_task_completion_date": null, "hs_task_contact_timezone": null, "hs_task_family": "SALES", "hs_task_for_object_type": "OWNER", "hs_task_is_all_day": false, "hs_task_is_completed": 0, "hs_task_is_completed_call": 0, "hs_task_is_completed_email": 0, "hs_task_is_completed_linked_in": 0, "hs_task_is_completed_sequence": 0, "hs_task_is_overdue": true, "hs_task_is_past_due_date": true, "hs_task_last_contact_outreach": null, "hs_task_last_sales_activity_timestamp": null, "hs_task_missed_due_date": true, "hs_task_missed_due_date_count": 1, "hs_task_priority": "NONE", "hs_task_probability_to_complete": null, "hs_task_relative_reminders": null, "hs_task_reminders": "1614319200000", "hs_task_repeat_interval": null, "hs_task_send_default_reminder": null, "hs_task_sequence_enrollment_active": null, "hs_task_sequence_step_enrollment_id": null, "hs_task_sequence_step_order": null, "hs_task_status": "NOT_STARTED", "hs_task_subject": "Follow up on Test deal 2", "hs_task_template_id": null, "hs_task_type": "TODO", "hs_timestamp": "2021-02-26T06:00:00+00:00", "hs_unique_creation_key": null, "hs_unique_id": null, "hs_updated_by_user_id": 12282590, "hs_user_ids_of_all_notification_followers": null, "hs_user_ids_of_all_notification_unfollowers": null, "hs_user_ids_of_all_owners": "12282590", "hs_was_imported": null, "hubspot_owner_assigneddate": "2021-02-23T20:25:07.503000+00:00", "hubspot_owner_id": "52550153", "hubspot_team_id": null}, "createdAt": "2021-02-23T20:25:07.503Z", "updatedAt": "2023-04-19T14:52:43.485Z", "archived": false, "deals": ["4315375411"], "properties_hs_all_accessible_team_ids": null, "properties_hs_all_assigned_business_unit_ids": null, "properties_hs_all_owner_ids": "52550153", "properties_hs_all_team_ids": null, "properties_hs_at_mentioned_owner_ids": null, "properties_hs_attachment_ids": null, "properties_hs_body_preview": "Regarding note logged on Tuesday, February 23, 2021 10:25 PM", "properties_hs_body_preview_html": "<html>\n <head></head>\n <body>\n Regarding note logged on Tuesday, February 23, 2021 10:25 PM\n </body>\n</html>", "properties_hs_body_preview_is_truncated": false, "properties_hs_calendar_event_id": null, "properties_hs_created_by": 12282590, "properties_hs_created_by_user_id": 12282590, "properties_hs_createdate": "2021-02-23T20:25:07.503000+00:00", "properties_hs_engagement_source": null, "properties_hs_engagement_source_id": null, "properties_hs_follow_up_action": null, "properties_hs_gdpr_deleted": false, "properties_hs_lastmodifieddate": "2023-04-19T14:52:43.485000+00:00", "properties_hs_merged_object_ids": null, "properties_hs_modified_by": 12282590, "properties_hs_msteams_message_id": null, "properties_hs_object_id": 11257289597, "properties_hs_object_source": "CRM_UI", "properties_hs_object_source_id": "userId:12282590", "properties_hs_object_source_label": "CRM_UI", "properties_hs_object_source_user_id": 12282590, "properties_hs_product_name": null, "properties_hs_queue_membership_ids": null, "properties_hs_read_only": null, "properties_hs_repeat_status": null, "properties_hs_scheduled_tasks": "{\"scheduledTasks\":[{\"engagementId\":11257289597,\"portalId\":8727216,\"engagementType\":\"TASK\",\"taskType\":\"REMINDER\",\"timestamp\":1614319200000,\"uuid\":\"TASK:e41fd851-f7c7-4381-85fa-796d076163aa\"}]}", "properties_hs_task_body": "Regarding note logged on Tuesday, February 23, 2021 10:25 PM", "properties_hs_task_completion_count": null, "properties_hs_task_completion_date": null, "properties_hs_task_contact_timezone": null, "properties_hs_task_family": "SALES", "properties_hs_task_for_object_type": "OWNER", "properties_hs_task_is_all_day": false, "properties_hs_task_is_completed": 0, "properties_hs_task_is_completed_call": 0, "properties_hs_task_is_completed_email": 0, "properties_hs_task_is_completed_linked_in": 0, "properties_hs_task_is_completed_sequence": 0, "properties_hs_task_is_overdue": true, "properties_hs_task_is_past_due_date": true, "properties_hs_task_last_contact_outreach": null, "properties_hs_task_last_sales_activity_timestamp": null, "properties_hs_task_missed_due_date": true, "properties_hs_task_missed_due_date_count": 1, "properties_hs_task_priority": "NONE", "properties_hs_task_probability_to_complete": null, "properties_hs_task_relative_reminders": null, "properties_hs_task_reminders": "1614319200000", "properties_hs_task_repeat_interval": null, "properties_hs_task_send_default_reminder": null, "properties_hs_task_sequence_enrollment_active": null, "properties_hs_task_sequence_step_enrollment_id": null, "properties_hs_task_sequence_step_order": null, "properties_hs_task_status": "NOT_STARTED", "properties_hs_task_subject": "Follow up on Test deal 2", "properties_hs_task_template_id": null, "properties_hs_task_type": "TODO", "properties_hs_timestamp": "2021-02-26T06:00:00+00:00", "properties_hs_unique_creation_key": null, "properties_hs_unique_id": null, "properties_hs_updated_by_user_id": 12282590, "properties_hs_user_ids_of_all_notification_followers": null, "properties_hs_user_ids_of_all_notification_unfollowers": null, "properties_hs_user_ids_of_all_owners": "12282590", "properties_hs_was_imported": null, "properties_hubspot_owner_assigneddate": "2021-02-23T20:25:07.503000+00:00", "properties_hubspot_owner_id": "52550153", "properties_hubspot_team_id": null}, "emitted_at": 1706697197260}
+{"stream": "engagements_tasks", "data": {"id": "30652597343", "properties": {"hs_all_accessible_team_ids": null, "hs_all_assigned_business_unit_ids": null, "hs_all_owner_ids": "52550153", "hs_all_team_ids": null, "hs_at_mentioned_owner_ids": null, "hs_attachment_ids": null, "hs_body_preview": null, "hs_body_preview_html": null, "hs_body_preview_is_truncated": false, "hs_calendar_event_id": null, "hs_created_by": 12282590, "hs_created_by_user_id": 12282590, "hs_createdate": "2023-01-30T23:41:48.834000+00:00", "hs_engagement_source": "CRM_UI", "hs_engagement_source_id": null, "hs_follow_up_action": null, "hs_gdpr_deleted": null, "hs_lastmodifieddate": "2023-04-04T15:11:47.231000+00:00", "hs_merged_object_ids": null, "hs_modified_by": 12282590, "hs_msteams_message_id": null, "hs_object_id": 30652597343, "hs_object_source": "CRM_UI", "hs_object_source_id": "userId:12282590", "hs_object_source_label": "CRM_UI", "hs_object_source_user_id": 12282590, "hs_product_name": null, "hs_queue_membership_ids": null, "hs_read_only": null, "hs_repeat_status": null, "hs_scheduled_tasks": "{\"scheduledTasks\":[]}", "hs_task_body": null, "hs_task_completion_count": null, "hs_task_completion_date": null, "hs_task_contact_timezone": null, "hs_task_family": "SALES", "hs_task_for_object_type": "OWNER", "hs_task_is_all_day": false, "hs_task_is_completed": 0, "hs_task_is_completed_call": 0, "hs_task_is_completed_email": 0, "hs_task_is_completed_linked_in": 0, "hs_task_is_completed_sequence": 0, "hs_task_is_overdue": true, "hs_task_is_past_due_date": true, "hs_task_last_contact_outreach": null, "hs_task_last_sales_activity_timestamp": null, "hs_task_missed_due_date": true, "hs_task_missed_due_date_count": 1, "hs_task_priority": "NONE", "hs_task_probability_to_complete": null, "hs_task_relative_reminders": "[]", "hs_task_reminders": null, "hs_task_repeat_interval": null, "hs_task_send_default_reminder": false, "hs_task_sequence_enrollment_active": null, "hs_task_sequence_step_enrollment_id": null, "hs_task_sequence_step_order": null, "hs_task_status": "NOT_STARTED", "hs_task_subject": "test", "hs_task_template_id": null, "hs_task_type": "TODO", "hs_timestamp": "2023-02-03T07:00:00+00:00", "hs_unique_creation_key": null, "hs_unique_id": null, "hs_updated_by_user_id": 12282590, "hs_user_ids_of_all_notification_followers": null, "hs_user_ids_of_all_notification_unfollowers": null, "hs_user_ids_of_all_owners": "12282590", "hs_was_imported": null, "hubspot_owner_assigneddate": "2023-01-30T23:41:48.834000+00:00", "hubspot_owner_id": "52550153", "hubspot_team_id": null}, "createdAt": "2023-01-30T23:41:48.834Z", "updatedAt": "2023-04-04T15:11:47.231Z", "archived": false, "properties_hs_all_accessible_team_ids": null, "properties_hs_all_assigned_business_unit_ids": null, "properties_hs_all_owner_ids": "52550153", "properties_hs_all_team_ids": null, "properties_hs_at_mentioned_owner_ids": null, "properties_hs_attachment_ids": null, "properties_hs_body_preview": null, "properties_hs_body_preview_html": null, "properties_hs_body_preview_is_truncated": false, "properties_hs_calendar_event_id": null, "properties_hs_created_by": 12282590, "properties_hs_created_by_user_id": 12282590, "properties_hs_createdate": "2023-01-30T23:41:48.834000+00:00", "properties_hs_engagement_source": "CRM_UI", "properties_hs_engagement_source_id": null, "properties_hs_follow_up_action": null, "properties_hs_gdpr_deleted": null, "properties_hs_lastmodifieddate": "2023-04-04T15:11:47.231000+00:00", "properties_hs_merged_object_ids": null, "properties_hs_modified_by": 12282590, "properties_hs_msteams_message_id": null, "properties_hs_object_id": 30652597343, "properties_hs_object_source": "CRM_UI", "properties_hs_object_source_id": "userId:12282590", "properties_hs_object_source_label": "CRM_UI", "properties_hs_object_source_user_id": 12282590, "properties_hs_product_name": null, "properties_hs_queue_membership_ids": null, "properties_hs_read_only": null, "properties_hs_repeat_status": null, "properties_hs_scheduled_tasks": "{\"scheduledTasks\":[]}", "properties_hs_task_body": null, "properties_hs_task_completion_count": null, "properties_hs_task_completion_date": null, "properties_hs_task_contact_timezone": null, "properties_hs_task_family": "SALES", "properties_hs_task_for_object_type": "OWNER", "properties_hs_task_is_all_day": false, "properties_hs_task_is_completed": 0, "properties_hs_task_is_completed_call": 0, "properties_hs_task_is_completed_email": 0, "properties_hs_task_is_completed_linked_in": 0, "properties_hs_task_is_completed_sequence": 0, "properties_hs_task_is_overdue": true, "properties_hs_task_is_past_due_date": true, "properties_hs_task_last_contact_outreach": null, "properties_hs_task_last_sales_activity_timestamp": null, "properties_hs_task_missed_due_date": true, "properties_hs_task_missed_due_date_count": 1, "properties_hs_task_priority": "NONE", "properties_hs_task_probability_to_complete": null, "properties_hs_task_relative_reminders": "[]", "properties_hs_task_reminders": null, "properties_hs_task_repeat_interval": null, "properties_hs_task_send_default_reminder": false, "properties_hs_task_sequence_enrollment_active": null, "properties_hs_task_sequence_step_enrollment_id": null, "properties_hs_task_sequence_step_order": null, "properties_hs_task_status": "NOT_STARTED", "properties_hs_task_subject": "test", "properties_hs_task_template_id": null, "properties_hs_task_type": "TODO", "properties_hs_timestamp": "2023-02-03T07:00:00+00:00", "properties_hs_unique_creation_key": null, "properties_hs_unique_id": null, "properties_hs_updated_by_user_id": 12282590, "properties_hs_user_ids_of_all_notification_followers": null, "properties_hs_user_ids_of_all_notification_unfollowers": null, "properties_hs_user_ids_of_all_owners": "12282590", "properties_hs_was_imported": null, "properties_hubspot_owner_assigneddate": "2023-01-30T23:41:48.834000+00:00", "properties_hubspot_owner_id": "52550153", "properties_hubspot_team_id": null}, "emitted_at": 1706697197261}
+{"stream": "engagements_tasks", "data": {"id": "30652613208", "properties": {"hs_all_accessible_team_ids": null, "hs_all_assigned_business_unit_ids": null, "hs_all_owner_ids": "52550153", "hs_all_team_ids": null, "hs_at_mentioned_owner_ids": null, "hs_attachment_ids": null, "hs_body_preview": null, "hs_body_preview_html": null, "hs_body_preview_is_truncated": false, "hs_calendar_event_id": null, "hs_created_by": 12282590, "hs_created_by_user_id": 12282590, "hs_createdate": "2023-01-30T23:51:52.099000+00:00", "hs_engagement_source": "CRM_UI", "hs_engagement_source_id": null, "hs_follow_up_action": null, "hs_gdpr_deleted": null, "hs_lastmodifieddate": "2023-01-30T23:51:54.343000+00:00", "hs_merged_object_ids": null, "hs_modified_by": 12282590, "hs_msteams_message_id": null, "hs_object_id": 30652613208, "hs_object_source": "CRM_UI", "hs_object_source_id": "userId:12282590", "hs_object_source_label": "CRM_UI", "hs_object_source_user_id": 12282590, "hs_product_name": null, "hs_queue_membership_ids": null, "hs_read_only": null, "hs_repeat_status": null, "hs_scheduled_tasks": "{\"scheduledTasks\":[]}", "hs_task_body": null, "hs_task_completion_count": null, "hs_task_completion_date": null, "hs_task_contact_timezone": null, "hs_task_family": "SALES", "hs_task_for_object_type": "OWNER", "hs_task_is_all_day": false, "hs_task_is_completed": 0, "hs_task_is_completed_call": 0, "hs_task_is_completed_email": 0, "hs_task_is_completed_linked_in": 0, "hs_task_is_completed_sequence": 0, "hs_task_is_overdue": true, "hs_task_is_past_due_date": true, "hs_task_last_contact_outreach": null, "hs_task_last_sales_activity_timestamp": null, "hs_task_missed_due_date": true, "hs_task_missed_due_date_count": 1, "hs_task_priority": "NONE", "hs_task_probability_to_complete": null, "hs_task_relative_reminders": "[]", "hs_task_reminders": null, "hs_task_repeat_interval": null, "hs_task_send_default_reminder": false, "hs_task_sequence_enrollment_active": null, "hs_task_sequence_step_enrollment_id": null, "hs_task_sequence_step_order": null, "hs_task_status": "NOT_STARTED", "hs_task_subject": "test", "hs_task_template_id": null, "hs_task_type": "TODO", "hs_timestamp": "2023-02-03T07:00:00+00:00", "hs_unique_creation_key": null, "hs_unique_id": null, "hs_updated_by_user_id": 12282590, "hs_user_ids_of_all_notification_followers": null, "hs_user_ids_of_all_notification_unfollowers": null, "hs_user_ids_of_all_owners": "12282590", "hs_was_imported": null, "hubspot_owner_assigneddate": "2023-01-30T23:51:52.099000+00:00", "hubspot_owner_id": "52550153", "hubspot_team_id": null}, "createdAt": "2023-01-30T23:51:52.099Z", "updatedAt": "2023-01-30T23:51:54.343Z", "archived": false, "companies": ["11481383026"], "properties_hs_all_accessible_team_ids": null, "properties_hs_all_assigned_business_unit_ids": null, "properties_hs_all_owner_ids": "52550153", "properties_hs_all_team_ids": null, "properties_hs_at_mentioned_owner_ids": null, "properties_hs_attachment_ids": null, "properties_hs_body_preview": null, "properties_hs_body_preview_html": null, "properties_hs_body_preview_is_truncated": false, "properties_hs_calendar_event_id": null, "properties_hs_created_by": 12282590, "properties_hs_created_by_user_id": 12282590, "properties_hs_createdate": "2023-01-30T23:51:52.099000+00:00", "properties_hs_engagement_source": "CRM_UI", "properties_hs_engagement_source_id": null, "properties_hs_follow_up_action": null, "properties_hs_gdpr_deleted": null, "properties_hs_lastmodifieddate": "2023-01-30T23:51:54.343000+00:00", "properties_hs_merged_object_ids": null, "properties_hs_modified_by": 12282590, "properties_hs_msteams_message_id": null, "properties_hs_object_id": 30652613208, "properties_hs_object_source": "CRM_UI", "properties_hs_object_source_id": "userId:12282590", "properties_hs_object_source_label": "CRM_UI", "properties_hs_object_source_user_id": 12282590, "properties_hs_product_name": null, "properties_hs_queue_membership_ids": null, "properties_hs_read_only": null, "properties_hs_repeat_status": null, "properties_hs_scheduled_tasks": "{\"scheduledTasks\":[]}", "properties_hs_task_body": null, "properties_hs_task_completion_count": null, "properties_hs_task_completion_date": null, "properties_hs_task_contact_timezone": null, "properties_hs_task_family": "SALES", "properties_hs_task_for_object_type": "OWNER", "properties_hs_task_is_all_day": false, "properties_hs_task_is_completed": 0, "properties_hs_task_is_completed_call": 0, "properties_hs_task_is_completed_email": 0, "properties_hs_task_is_completed_linked_in": 0, "properties_hs_task_is_completed_sequence": 0, "properties_hs_task_is_overdue": true, "properties_hs_task_is_past_due_date": true, "properties_hs_task_last_contact_outreach": null, "properties_hs_task_last_sales_activity_timestamp": null, "properties_hs_task_missed_due_date": true, "properties_hs_task_missed_due_date_count": 1, "properties_hs_task_priority": "NONE", "properties_hs_task_probability_to_complete": null, "properties_hs_task_relative_reminders": "[]", "properties_hs_task_reminders": null, "properties_hs_task_repeat_interval": null, "properties_hs_task_send_default_reminder": false, "properties_hs_task_sequence_enrollment_active": null, "properties_hs_task_sequence_step_enrollment_id": null, "properties_hs_task_sequence_step_order": null, "properties_hs_task_status": "NOT_STARTED", "properties_hs_task_subject": "test", "properties_hs_task_template_id": null, "properties_hs_task_type": "TODO", "properties_hs_timestamp": "2023-02-03T07:00:00+00:00", "properties_hs_unique_creation_key": null, "properties_hs_unique_id": null, "properties_hs_updated_by_user_id": 12282590, "properties_hs_user_ids_of_all_notification_followers": null, "properties_hs_user_ids_of_all_notification_unfollowers": null, "properties_hs_user_ids_of_all_owners": "12282590", "properties_hs_was_imported": null, "properties_hubspot_owner_assigneddate": "2023-01-30T23:51:52.099000+00:00", "properties_hubspot_owner_id": "52550153", "properties_hubspot_team_id": null}, "emitted_at": 1706697197263}
 {"stream": "forms", "data": {"id": "01ba116c-f3a8-4957-8884-ff0c4420af76", "name": "DemoForm", "createdAt": "2021-01-14T14:44:48.278Z", "updatedAt": "2021-01-14T14:44:48.278Z", "archived": false, "fieldGroups": [{"groupType": "default_group", "richTextType": "text", "fields": [{"objectTypeId": "0-1", "name": "firstname", "label": "First Name", "required": false, "hidden": false, "fieldType": "single_line_text"}]}, {"groupType": "default_group", "richTextType": "text", "fields": [{"objectTypeId": "0-1", "name": "lastname", "label": "Last Name", "required": false, "hidden": false, "fieldType": "single_line_text"}]}, {"groupType": "default_group", "richTextType": "text", "fields": [{"objectTypeId": "0-1", "name": "adress_1", "label": "Adress 1", "required": false, "hidden": false, "fieldType": "single_line_text"}]}], "configuration": {"language": "en", "cloneable": true, "postSubmitAction": {"type": "thank_you", "value": ""}, "editable": true, "archivable": true, "recaptchaEnabled": false, "notifyContactOwner": false, "notifyRecipients": [], "createNewContactForNewEmail": false, "prePopulateKnownValues": true, "allowLinkToResetKnownValues": false, "lifecycleStages": []}, "displayOptions": {"renderRawHtml": false, "theme": "default_style", "submitButtonText": "Submit", "style": {"fontFamily": "arial, helvetica, sans-serif", "backgroundWidth": "100%", "labelTextColor": "#33475b", "labelTextSize": "11px", "helpTextColor": "#7C98B6", "helpTextSize": "11px", "legalConsentTextColor": "#33475b", "legalConsentTextSize": "14px", "submitColor": "#ff7a59", "submitAlignment": "left", "submitFontColor": "#ffffff", "submitSize": "12px"}, "cssClass": null}, "legalConsentOptions": {"type": "none"}, "formType": "hubspot"}, "emitted_at": 1697714221520}
 {"stream": "forms", "data": {"id": "03e69987-1dcb-4d55-9cb6-d3812ac00ee6", "name": "New form 93", "createdAt": "2023-02-13T16:56:33.108Z", "updatedAt": "2023-02-13T16:56:33.108Z", "archived": false, "fieldGroups": [{"groupType": "default_group", "richTextType": "text", "fields": [{"objectTypeId": "0-1", "name": "email", "label": "Email", "required": true, "hidden": false, "fieldType": "email", "validation": {"blockedEmailDomains": [], "useDefaultBlockList": false}}]}], "configuration": {"language": "en", "cloneable": true, "postSubmitAction": {"type": "thank_you", "value": "Thanks for submitting the form."}, "editable": true, "archivable": true, "recaptchaEnabled": false, "notifyContactOwner": false, "notifyRecipients": ["12282590"], "createNewContactForNewEmail": false, "prePopulateKnownValues": true, "allowLinkToResetKnownValues": false, "lifecycleStages": []}, "displayOptions": {"renderRawHtml": false, "theme": "default_style", "submitButtonText": "Submit", "style": {"fontFamily": "arial, helvetica, sans-serif", "backgroundWidth": "100%", "labelTextColor": "#33475b", "labelTextSize": "14px", "helpTextColor": "#7C98B6", "helpTextSize": "11px", "legalConsentTextColor": "#33475b", "legalConsentTextSize": "14px", "submitColor": "#ff7a59", "submitAlignment": "left", "submitFontColor": "#ffffff", "submitSize": "12px"}, "cssClass": "hs-form stacked"}, "legalConsentOptions": {"type": "implicit_consent_to_process", "communicationConsentText": "integrationtest is committed to protecting and respecting your privacy, and we\u2019ll only use your personal information to administer your account and to provide the products and services you requested from us. From time to time, we would like to contact you about our products and services, as well as other content that may be of interest to you. If you consent to us contacting you for this purpose, please tick below to say how you would like us to contact you:", "communicationsCheckboxes": [{"required": false, "subscriptionTypeId": 23704464, "label": "I agree to receive other communications from [MAIN] integration test account."}], "privacyText": "You may unsubscribe from these communications at any time. For more information on how to unsubscribe, our privacy practices, and how we are committed to protecting and respecting your privacy, please review our Privacy Policy.", "consentToProcessText": "By clicking submit below, you consent to allow integrationtest to store and process the personal information submitted above to provide you the content requested."}, "formType": "hubspot"}, "emitted_at": 1697714221521}
 {"stream": "forms", "data": {"id": "0a7fd84f-471e-444a-a4e0-ca36d39f8af7", "name": "New form 27", "createdAt": "2023-02-13T16:45:22.640Z", "updatedAt": "2023-02-13T16:45:22.640Z", "archived": false, "fieldGroups": [{"groupType": "default_group", "richTextType": "text", "fields": [{"objectTypeId": "0-1", "name": "email", "label": "Email", "required": true, "hidden": false, "fieldType": "email", "validation": {"blockedEmailDomains": [], "useDefaultBlockList": false}}]}], "configuration": {"language": "en", "cloneable": true, "postSubmitAction": {"type": "thank_you", "value": "Thanks for submitting the form."}, "editable": true, "archivable": true, "recaptchaEnabled": false, "notifyContactOwner": false, "notifyRecipients": ["12282590"], "createNewContactForNewEmail": false, "prePopulateKnownValues": true, "allowLinkToResetKnownValues": false, "lifecycleStages": []}, "displayOptions": {"renderRawHtml": false, "theme": "default_style", "submitButtonText": "Submit", "style": {"fontFamily": "arial, helvetica, sans-serif", "backgroundWidth": "100%", "labelTextColor": "#33475b", "labelTextSize": "14px", "helpTextColor": "#7C98B6", "helpTextSize": "11px", "legalConsentTextColor": "#33475b", "legalConsentTextSize": "14px", "submitColor": "#ff7a59", "submitAlignment": "left", "submitFontColor": "#ffffff", "submitSize": "12px"}, "cssClass": "hs-form stacked"}, "legalConsentOptions": {"type": "implicit_consent_to_process", "communicationConsentText": "integrationtest is committed to protecting and respecting your privacy, and we\u2019ll only use your personal information to administer your account and to provide the products and services you requested from us. From time to time, we would like to contact you about our products and services, as well as other content that may be of interest to you. If you consent to us contacting you for this purpose, please tick below to say how you would like us to contact you:", "communicationsCheckboxes": [{"required": false, "subscriptionTypeId": 23704464, "label": "I agree to receive other communications from [MAIN] integration test account."}], "privacyText": "You may unsubscribe from these communications at any time. For more information on how to unsubscribe, our privacy practices, and how we are committed to protecting and respecting your privacy, please review our Privacy Policy.", "consentToProcessText": "By clicking submit below, you consent to allow integrationtest to store and process the personal information submitted above to provide you the content requested."}, "formType": "hubspot"}, "emitted_at": 1697714221522}
-{"stream": "goals", "data": {"id": "221880757009", "properties": {"hs__migration_soft_delete": null, "hs_ad_account_asset_ids": null, "hs_ad_campaign_asset_ids": null, "hs_all_accessible_team_ids": null, "hs_all_assigned_business_unit_ids": null, "hs_all_owner_ids": null, "hs_all_team_ids": null, "hs_assignee_team_id": null, "hs_assignee_user_id": 26748728, "hs_contact_lifecycle_stage": null, "hs_created_by_user_id": 12282590, "hs_createdate": "2023-04-10T13:57:36.691000+00:00", "hs_currency": null, "hs_deal_pipeline_ids": null, "hs_edit_updates_notification_frequency": "weekly", "hs_end_date": null, "hs_end_datetime": "2023-07-31T23:59:59.999000+00:00", "hs_fiscal_year_offset": 0, "hs_goal_name": "Integration Test Goal Hubspot", "hs_goal_target_group_id": 221880750627, "hs_goal_type": "average_ticket_response_time", "hs_group_correlation_uuid": "5c49f251-be20-43c6-87c7-dd273732b3a4", "hs_is_forecastable": "true", "hs_is_legacy": null, "hs_kpi_display_unit": "hour", "hs_kpi_filter_groups": "[{\"filters\":[{\"property\":\"hs_pipeline\",\"operator\":\"IN\",\"values\":[\"0\"]}]}]", "hs_kpi_is_team_rollup": false, "hs_kpi_metric_type": "AVG", "hs_kpi_object_type": "TICKET", "hs_kpi_object_type_id": "0-5", "hs_kpi_progress_percent": null, "hs_kpi_property_name": "time_to_first_agent_reply", "hs_kpi_single_object_custom_goal_type_name": "avg_time_to_first_agent_reply_0-5", "hs_kpi_time_period_property": "createdate", "hs_kpi_tracking_method": "LOWER_IS_BETTER", "hs_kpi_unit_type": "duration", "hs_kpi_value": 0.0, "hs_kpi_value_calculated_at": null, "hs_kpi_value_last_calculated_at": "2023-08-01T00:45:14.830000+00:00", "hs_lastmodifieddate": "2023-12-11T20:46:14.473000+00:00", "hs_legacy_active": null, "hs_legacy_created_at": null, "hs_legacy_created_by": null, "hs_legacy_quarterly_target_composite_id": null, "hs_legacy_sql_id": null, "hs_legacy_unique_sql_id": null, "hs_legacy_updated_at": null, "hs_legacy_updated_by": null, "hs_merged_object_ids": null, "hs_migration_soft_delete": null, "hs_milestone": "monthly", "hs_object_id": 221880757009, "hs_object_source": null, "hs_object_source_id": null, "hs_object_source_label": null, "hs_object_source_user_id": null, "hs_outcome": "completed", "hs_owner_ids_of_all_owners": "111730024", "hs_participant_type": "users", "hs_pipelines": "0", "hs_progress_updates_notification_frequency": "weekly", "hs_read_only": null, "hs_should_notify_on_achieved": "false", "hs_should_notify_on_edit_updates": "false", "hs_should_notify_on_exceeded": "false", "hs_should_notify_on_kickoff": "false", "hs_should_notify_on_missed": "false", "hs_should_notify_on_progress_updates": "false", "hs_should_recalculate": "false", "hs_start_date": null, "hs_start_datetime": "2023-07-01T00:00:00+00:00", "hs_static_kpi_filter_groups": "[]", "hs_status": "achieved", "hs_status_display_order": 4, "hs_target_amount": 0.0, "hs_target_amount_in_home_currency": 0.0, "hs_team_id": null, "hs_template_id": 4, "hs_ticket_pipeline_ids": "0", "hs_unique_creation_key": null, "hs_updated_by_user_id": 12282590, "hs_user_id": null, "hs_user_ids_of_all_notification_followers": null, "hs_user_ids_of_all_notification_unfollowers": null, "hs_user_ids_of_all_owners": "26748728", "hs_was_imported": null, "hubspot_owner_assigneddate": null, "hubspot_owner_id": null, "hubspot_team_id": null}, "createdAt": "2023-04-10T13:57:36.691Z", "updatedAt": "2023-12-11T20:46:14.473Z", "archived": false, "properties_hs__migration_soft_delete": null, "properties_hs_ad_account_asset_ids": null, "properties_hs_ad_campaign_asset_ids": null, "properties_hs_all_accessible_team_ids": null, "properties_hs_all_assigned_business_unit_ids": null, "properties_hs_all_owner_ids": null, "properties_hs_all_team_ids": null, "properties_hs_assignee_team_id": null, "properties_hs_assignee_user_id": 26748728, "properties_hs_contact_lifecycle_stage": null, "properties_hs_created_by_user_id": 12282590, "properties_hs_createdate": "2023-04-10T13:57:36.691000+00:00", "properties_hs_currency": null, "properties_hs_deal_pipeline_ids": null, "properties_hs_edit_updates_notification_frequency": "weekly", "properties_hs_end_date": null, "properties_hs_end_datetime": "2023-07-31T23:59:59.999000+00:00", "properties_hs_fiscal_year_offset": 0, "properties_hs_goal_name": "Integration Test Goal Hubspot", "properties_hs_goal_target_group_id": 221880750627, "properties_hs_goal_type": "average_ticket_response_time", "properties_hs_group_correlation_uuid": "5c49f251-be20-43c6-87c7-dd273732b3a4", "properties_hs_is_forecastable": "true", "properties_hs_is_legacy": null, "properties_hs_kpi_display_unit": "hour", "properties_hs_kpi_filter_groups": "[{\"filters\":[{\"property\":\"hs_pipeline\",\"operator\":\"IN\",\"values\":[\"0\"]}]}]", "properties_hs_kpi_is_team_rollup": false, "properties_hs_kpi_metric_type": "AVG", "properties_hs_kpi_object_type": "TICKET", "properties_hs_kpi_object_type_id": "0-5", "properties_hs_kpi_progress_percent": null, "properties_hs_kpi_property_name": "time_to_first_agent_reply", "properties_hs_kpi_single_object_custom_goal_type_name": "avg_time_to_first_agent_reply_0-5", "properties_hs_kpi_time_period_property": "createdate", "properties_hs_kpi_tracking_method": "LOWER_IS_BETTER", "properties_hs_kpi_unit_type": "duration", "properties_hs_kpi_value": 0.0, "properties_hs_kpi_value_calculated_at": null, "properties_hs_kpi_value_last_calculated_at": "2023-08-01T00:45:14.830000+00:00", "properties_hs_lastmodifieddate": "2023-12-11T20:46:14.473000+00:00", "properties_hs_legacy_active": null, "properties_hs_legacy_created_at": null, "properties_hs_legacy_created_by": null, "properties_hs_legacy_quarterly_target_composite_id": null, "properties_hs_legacy_sql_id": null, "properties_hs_legacy_unique_sql_id": null, "properties_hs_legacy_updated_at": null, "properties_hs_legacy_updated_by": null, "properties_hs_merged_object_ids": null, "properties_hs_migration_soft_delete": null, "properties_hs_milestone": "monthly", "properties_hs_object_id": 221880757009, "properties_hs_object_source": null, "properties_hs_object_source_id": null, "properties_hs_object_source_label": null, "properties_hs_object_source_user_id": null, "properties_hs_outcome": "completed", "properties_hs_owner_ids_of_all_owners": "111730024", "properties_hs_participant_type": "users", "properties_hs_pipelines": "0", "properties_hs_progress_updates_notification_frequency": "weekly", "properties_hs_read_only": null, "properties_hs_should_notify_on_achieved": "false", "properties_hs_should_notify_on_edit_updates": "false", "properties_hs_should_notify_on_exceeded": "false", "properties_hs_should_notify_on_kickoff": "false", "properties_hs_should_notify_on_missed": "false", "properties_hs_should_notify_on_progress_updates": "false", "properties_hs_should_recalculate": "false", "properties_hs_start_date": null, "properties_hs_start_datetime": "2023-07-01T00:00:00+00:00", "properties_hs_static_kpi_filter_groups": "[]", "properties_hs_status": "achieved", "properties_hs_status_display_order": 4, "properties_hs_target_amount": 0.0, "properties_hs_target_amount_in_home_currency": 0.0, "properties_hs_team_id": null, "properties_hs_template_id": 4, "properties_hs_ticket_pipeline_ids": "0", "properties_hs_unique_creation_key": null, "properties_hs_updated_by_user_id": 12282590, "properties_hs_user_id": null, "properties_hs_user_ids_of_all_notification_followers": null, "properties_hs_user_ids_of_all_notification_unfollowers": null, "properties_hs_user_ids_of_all_owners": "26748728", "properties_hs_was_imported": null, "properties_hubspot_owner_assigneddate": null, "properties_hubspot_owner_id": null, "properties_hubspot_team_id": null}, "emitted_at": 1702410363120}
-{"stream": "goals", "data": {"id": "221880757010", "properties": {"hs__migration_soft_delete": null, "hs_ad_account_asset_ids": null, "hs_ad_campaign_asset_ids": null, "hs_all_accessible_team_ids": null, "hs_all_assigned_business_unit_ids": null, "hs_all_owner_ids": null, "hs_all_team_ids": null, "hs_assignee_team_id": null, "hs_assignee_user_id": 26748728, "hs_contact_lifecycle_stage": null, "hs_created_by_user_id": 12282590, "hs_createdate": "2023-04-10T13:57:36.691000+00:00", "hs_currency": null, "hs_deal_pipeline_ids": null, "hs_edit_updates_notification_frequency": "weekly", "hs_end_date": null, "hs_end_datetime": "2023-09-30T23:59:59.999000+00:00", "hs_fiscal_year_offset": 0, "hs_goal_name": "Integration Test Goal Hubspot", "hs_goal_target_group_id": 221880750627, "hs_goal_type": "average_ticket_response_time", "hs_group_correlation_uuid": "5c49f251-be20-43c6-87c7-dd273732b3a4", "hs_is_forecastable": "true", "hs_is_legacy": null, "hs_kpi_display_unit": "hour", "hs_kpi_filter_groups": "[{\"filters\":[{\"property\":\"hs_pipeline\",\"operator\":\"IN\",\"values\":[\"0\"]}]}]", "hs_kpi_is_team_rollup": false, "hs_kpi_metric_type": "AVG", "hs_kpi_object_type": "TICKET", "hs_kpi_object_type_id": "0-5", "hs_kpi_progress_percent": null, "hs_kpi_property_name": "time_to_first_agent_reply", "hs_kpi_single_object_custom_goal_type_name": "avg_time_to_first_agent_reply_0-5", "hs_kpi_time_period_property": "createdate", "hs_kpi_tracking_method": "LOWER_IS_BETTER", "hs_kpi_unit_type": "duration", "hs_kpi_value": 0.0, "hs_kpi_value_calculated_at": null, "hs_kpi_value_last_calculated_at": "2023-10-01T22:31:08.621000+00:00", "hs_lastmodifieddate": "2023-12-11T20:46:14.473000+00:00", "hs_legacy_active": null, "hs_legacy_created_at": null, "hs_legacy_created_by": null, "hs_legacy_quarterly_target_composite_id": null, "hs_legacy_sql_id": null, "hs_legacy_unique_sql_id": null, "hs_legacy_updated_at": null, "hs_legacy_updated_by": null, "hs_merged_object_ids": null, "hs_migration_soft_delete": null, "hs_milestone": "monthly", "hs_object_id": 221880757010, "hs_object_source": null, "hs_object_source_id": null, "hs_object_source_label": null, "hs_object_source_user_id": null, "hs_outcome": "completed", "hs_owner_ids_of_all_owners": "111730024", "hs_participant_type": "users", "hs_pipelines": "0", "hs_progress_updates_notification_frequency": "weekly", "hs_read_only": null, "hs_should_notify_on_achieved": "false", "hs_should_notify_on_edit_updates": "false", "hs_should_notify_on_exceeded": "false", "hs_should_notify_on_kickoff": "false", "hs_should_notify_on_missed": "false", "hs_should_notify_on_progress_updates": "false", "hs_should_recalculate": "false", "hs_start_date": null, "hs_start_datetime": "2023-09-01T00:00:00+00:00", "hs_static_kpi_filter_groups": "[]", "hs_status": "achieved", "hs_status_display_order": 4, "hs_target_amount": 0.0, "hs_target_amount_in_home_currency": 0.0, "hs_team_id": null, "hs_template_id": 4, "hs_ticket_pipeline_ids": "0", "hs_unique_creation_key": null, "hs_updated_by_user_id": 12282590, "hs_user_id": null, "hs_user_ids_of_all_notification_followers": null, "hs_user_ids_of_all_notification_unfollowers": null, "hs_user_ids_of_all_owners": "26748728", "hs_was_imported": null, "hubspot_owner_assigneddate": null, "hubspot_owner_id": null, "hubspot_team_id": null}, "createdAt": "2023-04-10T13:57:36.691Z", "updatedAt": "2023-12-11T20:46:14.473Z", "archived": false, "properties_hs__migration_soft_delete": null, "properties_hs_ad_account_asset_ids": null, "properties_hs_ad_campaign_asset_ids": null, "properties_hs_all_accessible_team_ids": null, "properties_hs_all_assigned_business_unit_ids": null, "properties_hs_all_owner_ids": null, "properties_hs_all_team_ids": null, "properties_hs_assignee_team_id": null, "properties_hs_assignee_user_id": 26748728, "properties_hs_contact_lifecycle_stage": null, "properties_hs_created_by_user_id": 12282590, "properties_hs_createdate": "2023-04-10T13:57:36.691000+00:00", "properties_hs_currency": null, "properties_hs_deal_pipeline_ids": null, "properties_hs_edit_updates_notification_frequency": "weekly", "properties_hs_end_date": null, "properties_hs_end_datetime": "2023-09-30T23:59:59.999000+00:00", "properties_hs_fiscal_year_offset": 0, "properties_hs_goal_name": "Integration Test Goal Hubspot", "properties_hs_goal_target_group_id": 221880750627, "properties_hs_goal_type": "average_ticket_response_time", "properties_hs_group_correlation_uuid": "5c49f251-be20-43c6-87c7-dd273732b3a4", "properties_hs_is_forecastable": "true", "properties_hs_is_legacy": null, "properties_hs_kpi_display_unit": "hour", "properties_hs_kpi_filter_groups": "[{\"filters\":[{\"property\":\"hs_pipeline\",\"operator\":\"IN\",\"values\":[\"0\"]}]}]", "properties_hs_kpi_is_team_rollup": false, "properties_hs_kpi_metric_type": "AVG", "properties_hs_kpi_object_type": "TICKET", "properties_hs_kpi_object_type_id": "0-5", "properties_hs_kpi_progress_percent": null, "properties_hs_kpi_property_name": "time_to_first_agent_reply", "properties_hs_kpi_single_object_custom_goal_type_name": "avg_time_to_first_agent_reply_0-5", "properties_hs_kpi_time_period_property": "createdate", "properties_hs_kpi_tracking_method": "LOWER_IS_BETTER", "properties_hs_kpi_unit_type": "duration", "properties_hs_kpi_value": 0.0, "properties_hs_kpi_value_calculated_at": null, "properties_hs_kpi_value_last_calculated_at": "2023-10-01T22:31:08.621000+00:00", "properties_hs_lastmodifieddate": "2023-12-11T20:46:14.473000+00:00", "properties_hs_legacy_active": null, "properties_hs_legacy_created_at": null, "properties_hs_legacy_created_by": null, "properties_hs_legacy_quarterly_target_composite_id": null, "properties_hs_legacy_sql_id": null, "properties_hs_legacy_unique_sql_id": null, "properties_hs_legacy_updated_at": null, "properties_hs_legacy_updated_by": null, "properties_hs_merged_object_ids": null, "properties_hs_migration_soft_delete": null, "properties_hs_milestone": "monthly", "properties_hs_object_id": 221880757010, "properties_hs_object_source": null, "properties_hs_object_source_id": null, "properties_hs_object_source_label": null, "properties_hs_object_source_user_id": null, "properties_hs_outcome": "completed", "properties_hs_owner_ids_of_all_owners": "111730024", "properties_hs_participant_type": "users", "properties_hs_pipelines": "0", "properties_hs_progress_updates_notification_frequency": "weekly", "properties_hs_read_only": null, "properties_hs_should_notify_on_achieved": "false", "properties_hs_should_notify_on_edit_updates": "false", "properties_hs_should_notify_on_exceeded": "false", "properties_hs_should_notify_on_kickoff": "false", "properties_hs_should_notify_on_missed": "false", "properties_hs_should_notify_on_progress_updates": "false", "properties_hs_should_recalculate": "false", "properties_hs_start_date": null, "properties_hs_start_datetime": "2023-09-01T00:00:00+00:00", "properties_hs_static_kpi_filter_groups": "[]", "properties_hs_status": "achieved", "properties_hs_status_display_order": 4, "properties_hs_target_amount": 0.0, "properties_hs_target_amount_in_home_currency": 0.0, "properties_hs_team_id": null, "properties_hs_template_id": 4, "properties_hs_ticket_pipeline_ids": "0", "properties_hs_unique_creation_key": null, "properties_hs_updated_by_user_id": 12282590, "properties_hs_user_id": null, "properties_hs_user_ids_of_all_notification_followers": null, "properties_hs_user_ids_of_all_notification_unfollowers": null, "properties_hs_user_ids_of_all_owners": "26748728", "properties_hs_was_imported": null, "properties_hubspot_owner_assigneddate": null, "properties_hubspot_owner_id": null, "properties_hubspot_team_id": null}, "emitted_at": 1702410363124}
-{"stream": "goals", "data": {"id": "221880757011", "properties": {"hs__migration_soft_delete": null, "hs_ad_account_asset_ids": null, "hs_ad_campaign_asset_ids": null, "hs_all_accessible_team_ids": null, "hs_all_assigned_business_unit_ids": null, "hs_all_owner_ids": null, "hs_all_team_ids": null, "hs_assignee_team_id": null, "hs_assignee_user_id": 26748728, "hs_contact_lifecycle_stage": null, "hs_created_by_user_id": 12282590, "hs_createdate": "2023-04-10T13:57:36.691000+00:00", "hs_currency": null, "hs_deal_pipeline_ids": null, "hs_edit_updates_notification_frequency": "weekly", "hs_end_date": null, "hs_end_datetime": "2023-08-31T23:59:59.999000+00:00", "hs_fiscal_year_offset": 0, "hs_goal_name": "Integration Test Goal Hubspot", "hs_goal_target_group_id": 221880750627, "hs_goal_type": "average_ticket_response_time", "hs_group_correlation_uuid": "5c49f251-be20-43c6-87c7-dd273732b3a4", "hs_is_forecastable": "true", "hs_is_legacy": null, "hs_kpi_display_unit": "hour", "hs_kpi_filter_groups": "[{\"filters\":[{\"property\":\"hs_pipeline\",\"operator\":\"IN\",\"values\":[\"0\"]}]}]", "hs_kpi_is_team_rollup": false, "hs_kpi_metric_type": "AVG", "hs_kpi_object_type": "TICKET", "hs_kpi_object_type_id": "0-5", "hs_kpi_progress_percent": null, "hs_kpi_property_name": "time_to_first_agent_reply", "hs_kpi_single_object_custom_goal_type_name": "avg_time_to_first_agent_reply_0-5", "hs_kpi_time_period_property": "createdate", "hs_kpi_tracking_method": "LOWER_IS_BETTER", "hs_kpi_unit_type": "duration", "hs_kpi_value": 0.0, "hs_kpi_value_calculated_at": null, "hs_kpi_value_last_calculated_at": "2023-09-01T15:26:00.500000+00:00", "hs_lastmodifieddate": "2023-12-11T20:46:14.473000+00:00", "hs_legacy_active": null, "hs_legacy_created_at": null, "hs_legacy_created_by": null, "hs_legacy_quarterly_target_composite_id": null, "hs_legacy_sql_id": null, "hs_legacy_unique_sql_id": null, "hs_legacy_updated_at": null, "hs_legacy_updated_by": null, "hs_merged_object_ids": null, "hs_migration_soft_delete": null, "hs_milestone": "monthly", "hs_object_id": 221880757011, "hs_object_source": null, "hs_object_source_id": null, "hs_object_source_label": null, "hs_object_source_user_id": null, "hs_outcome": "completed", "hs_owner_ids_of_all_owners": "111730024", "hs_participant_type": "users", "hs_pipelines": "0", "hs_progress_updates_notification_frequency": "weekly", "hs_read_only": null, "hs_should_notify_on_achieved": "false", "hs_should_notify_on_edit_updates": "false", "hs_should_notify_on_exceeded": "false", "hs_should_notify_on_kickoff": "false", "hs_should_notify_on_missed": "false", "hs_should_notify_on_progress_updates": "false", "hs_should_recalculate": "false", "hs_start_date": null, "hs_start_datetime": "2023-08-01T00:00:00+00:00", "hs_static_kpi_filter_groups": "[]", "hs_status": "achieved", "hs_status_display_order": 4, "hs_target_amount": 0.0, "hs_target_amount_in_home_currency": 0.0, "hs_team_id": null, "hs_template_id": 4, "hs_ticket_pipeline_ids": "0", "hs_unique_creation_key": null, "hs_updated_by_user_id": 12282590, "hs_user_id": null, "hs_user_ids_of_all_notification_followers": null, "hs_user_ids_of_all_notification_unfollowers": null, "hs_user_ids_of_all_owners": "26748728", "hs_was_imported": null, "hubspot_owner_assigneddate": null, "hubspot_owner_id": null, "hubspot_team_id": null}, "createdAt": "2023-04-10T13:57:36.691Z", "updatedAt": "2023-12-11T20:46:14.473Z", "archived": false, "properties_hs__migration_soft_delete": null, "properties_hs_ad_account_asset_ids": null, "properties_hs_ad_campaign_asset_ids": null, "properties_hs_all_accessible_team_ids": null, "properties_hs_all_assigned_business_unit_ids": null, "properties_hs_all_owner_ids": null, "properties_hs_all_team_ids": null, "properties_hs_assignee_team_id": null, "properties_hs_assignee_user_id": 26748728, "properties_hs_contact_lifecycle_stage": null, "properties_hs_created_by_user_id": 12282590, "properties_hs_createdate": "2023-04-10T13:57:36.691000+00:00", "properties_hs_currency": null, "properties_hs_deal_pipeline_ids": null, "properties_hs_edit_updates_notification_frequency": "weekly", "properties_hs_end_date": null, "properties_hs_end_datetime": "2023-08-31T23:59:59.999000+00:00", "properties_hs_fiscal_year_offset": 0, "properties_hs_goal_name": "Integration Test Goal Hubspot", "properties_hs_goal_target_group_id": 221880750627, "properties_hs_goal_type": "average_ticket_response_time", "properties_hs_group_correlation_uuid": "5c49f251-be20-43c6-87c7-dd273732b3a4", "properties_hs_is_forecastable": "true", "properties_hs_is_legacy": null, "properties_hs_kpi_display_unit": "hour", "properties_hs_kpi_filter_groups": "[{\"filters\":[{\"property\":\"hs_pipeline\",\"operator\":\"IN\",\"values\":[\"0\"]}]}]", "properties_hs_kpi_is_team_rollup": false, "properties_hs_kpi_metric_type": "AVG", "properties_hs_kpi_object_type": "TICKET", "properties_hs_kpi_object_type_id": "0-5", "properties_hs_kpi_progress_percent": null, "properties_hs_kpi_property_name": "time_to_first_agent_reply", "properties_hs_kpi_single_object_custom_goal_type_name": "avg_time_to_first_agent_reply_0-5", "properties_hs_kpi_time_period_property": "createdate", "properties_hs_kpi_tracking_method": "LOWER_IS_BETTER", "properties_hs_kpi_unit_type": "duration", "properties_hs_kpi_value": 0.0, "properties_hs_kpi_value_calculated_at": null, "properties_hs_kpi_value_last_calculated_at": "2023-09-01T15:26:00.500000+00:00", "properties_hs_lastmodifieddate": "2023-12-11T20:46:14.473000+00:00", "properties_hs_legacy_active": null, "properties_hs_legacy_created_at": null, "properties_hs_legacy_created_by": null, "properties_hs_legacy_quarterly_target_composite_id": null, "properties_hs_legacy_sql_id": null, "properties_hs_legacy_unique_sql_id": null, "properties_hs_legacy_updated_at": null, "properties_hs_legacy_updated_by": null, "properties_hs_merged_object_ids": null, "properties_hs_migration_soft_delete": null, "properties_hs_milestone": "monthly", "properties_hs_object_id": 221880757011, "properties_hs_object_source": null, "properties_hs_object_source_id": null, "properties_hs_object_source_label": null, "properties_hs_object_source_user_id": null, "properties_hs_outcome": "completed", "properties_hs_owner_ids_of_all_owners": "111730024", "properties_hs_participant_type": "users", "properties_hs_pipelines": "0", "properties_hs_progress_updates_notification_frequency": "weekly", "properties_hs_read_only": null, "properties_hs_should_notify_on_achieved": "false", "properties_hs_should_notify_on_edit_updates": "false", "properties_hs_should_notify_on_exceeded": "false", "properties_hs_should_notify_on_kickoff": "false", "properties_hs_should_notify_on_missed": "false", "properties_hs_should_notify_on_progress_updates": "false", "properties_hs_should_recalculate": "false", "properties_hs_start_date": null, "properties_hs_start_datetime": "2023-08-01T00:00:00+00:00", "properties_hs_static_kpi_filter_groups": "[]", "properties_hs_status": "achieved", "properties_hs_status_display_order": 4, "properties_hs_target_amount": 0.0, "properties_hs_target_amount_in_home_currency": 0.0, "properties_hs_team_id": null, "properties_hs_template_id": 4, "properties_hs_ticket_pipeline_ids": "0", "properties_hs_unique_creation_key": null, "properties_hs_updated_by_user_id": 12282590, "properties_hs_user_id": null, "properties_hs_user_ids_of_all_notification_followers": null, "properties_hs_user_ids_of_all_notification_unfollowers": null, "properties_hs_user_ids_of_all_owners": "26748728", "properties_hs_was_imported": null, "properties_hubspot_owner_assigneddate": null, "properties_hubspot_owner_id": null, "properties_hubspot_team_id": null}, "emitted_at": 1702410363125}
-{"stream": "line_items", "data": {"id": "1188257165", "properties": {"amount": 10.0, "createdate": "2021-02-23T20:11:54.030000+00:00", "description": "Baseball hat, medium", "discount": null, "hs_acv": 10.0, "hs_all_accessible_team_ids": null, "hs_all_assigned_business_unit_ids": null, "hs_all_owner_ids": null, "hs_all_team_ids": null, "hs_allow_buyer_selected_quantity": null, "hs_arr": 0.0, "hs_billing_period_end_date": null, "hs_billing_period_start_date": null, "hs_billing_start_delay_days": null, "hs_billing_start_delay_months": null, "hs_billing_start_delay_type": null, "hs_cost_of_goods_sold": 5, "hs_created_by_user_id": 12282590, "hs_createdate": null, "hs_discount_percentage": null, "hs_external_id": null, "hs_images": null, "hs_lastmodifieddate": "2021-07-17T23:50:32.502000+00:00", "hs_line_item_currency_code": null, "hs_margin": 5.0, "hs_margin_acv": 5.0, "hs_margin_arr": 0.0, "hs_margin_mrr": 0.0, "hs_margin_tcv": 5.0, "hs_merged_object_ids": null, "hs_mrr": 0.0, "hs_object_id": 1188257165, "hs_object_source": null, "hs_object_source_id": null, "hs_object_source_label": null, "hs_object_source_user_id": null, "hs_position_on_quote": 0, "hs_pre_discount_amount": 10, "hs_product_id": 646778218, "hs_product_type": null, "hs_read_only": null, "hs_recurring_billing_end_date": null, "hs_recurring_billing_number_of_payments": 1, "hs_recurring_billing_period": null, "hs_recurring_billing_start_date": null, "hs_recurring_billing_terms": null, "hs_sku": null, "hs_sync_amount": null, "hs_tcv": 10.0, "hs_term_in_months": null, "hs_total_discount": 0, "hs_unique_creation_key": null, "hs_updated_by_user_id": 12282590, "hs_url": null, "hs_user_ids_of_all_notification_followers": null, "hs_user_ids_of_all_notification_unfollowers": null, "hs_user_ids_of_all_owners": null, "hs_variant_id": null, "hs_was_imported": null, "hubspot_owner_assigneddate": null, "hubspot_owner_id": null, "hubspot_team_id": null, "name": "Blue Hat", "price": 10, "quantity": 1, "recurringbillingfrequency": null, "tax": null, "test": null, "test_product_price": null}, "createdAt": "2021-02-23T20:11:54.030Z", "updatedAt": "2021-07-17T23:50:32.502Z", "archived": false, "properties_amount": 10.0, "properties_createdate": "2021-02-23T20:11:54.030000+00:00", "properties_description": "Baseball hat, medium", "properties_discount": null, "properties_hs_acv": 10.0, "properties_hs_all_accessible_team_ids": null, "properties_hs_all_assigned_business_unit_ids": null, "properties_hs_all_owner_ids": null, "properties_hs_all_team_ids": null, "properties_hs_allow_buyer_selected_quantity": null, "properties_hs_arr": 0.0, "properties_hs_billing_period_end_date": null, "properties_hs_billing_period_start_date": null, "properties_hs_billing_start_delay_days": null, "properties_hs_billing_start_delay_months": null, "properties_hs_billing_start_delay_type": null, "properties_hs_cost_of_goods_sold": 5, "properties_hs_created_by_user_id": 12282590, "properties_hs_createdate": null, "properties_hs_discount_percentage": null, "properties_hs_external_id": null, "properties_hs_images": null, "properties_hs_lastmodifieddate": "2021-07-17T23:50:32.502000+00:00", "properties_hs_line_item_currency_code": null, "properties_hs_margin": 5.0, "properties_hs_margin_acv": 5.0, "properties_hs_margin_arr": 0.0, "properties_hs_margin_mrr": 0.0, "properties_hs_margin_tcv": 5.0, "properties_hs_merged_object_ids": null, "properties_hs_mrr": 0.0, "properties_hs_object_id": 1188257165, "properties_hs_object_source": null, "properties_hs_object_source_id": null, "properties_hs_object_source_label": null, "properties_hs_object_source_user_id": null, "properties_hs_position_on_quote": 0, "properties_hs_pre_discount_amount": 10, "properties_hs_product_id": 646778218, "properties_hs_product_type": null, "properties_hs_read_only": null, "properties_hs_recurring_billing_end_date": null, "properties_hs_recurring_billing_number_of_payments": 1, "properties_hs_recurring_billing_period": null, "properties_hs_recurring_billing_start_date": null, "properties_hs_recurring_billing_terms": null, "properties_hs_sku": null, "properties_hs_sync_amount": null, "properties_hs_tcv": 10.0, "properties_hs_term_in_months": null, "properties_hs_total_discount": 0, "properties_hs_unique_creation_key": null, "properties_hs_updated_by_user_id": 12282590, "properties_hs_url": null, "properties_hs_user_ids_of_all_notification_followers": null, "properties_hs_user_ids_of_all_notification_unfollowers": null, "properties_hs_user_ids_of_all_owners": null, "properties_hs_variant_id": null, "properties_hs_was_imported": null, "properties_hubspot_owner_assigneddate": null, "properties_hubspot_owner_id": null, "properties_hubspot_team_id": null, "properties_name": "Blue Hat", "properties_price": 10, "properties_quantity": 1, "properties_recurringbillingfrequency": null, "properties_tax": null, "properties_test": null, "properties_test_product_price": null}, "emitted_at": 1697714248811}
-{"stream": "line_items", "data": {"id": "1188257309", "properties": {"amount": 10.0, "createdate": "2021-02-23T20:11:54.030000+00:00", "description": "Baseball hat, medium", "discount": null, "hs_acv": 10.0, "hs_all_accessible_team_ids": null, "hs_all_assigned_business_unit_ids": null, "hs_all_owner_ids": null, "hs_all_team_ids": null, "hs_allow_buyer_selected_quantity": null, "hs_arr": 0.0, "hs_billing_period_end_date": null, "hs_billing_period_start_date": null, "hs_billing_start_delay_days": null, "hs_billing_start_delay_months": null, "hs_billing_start_delay_type": null, "hs_cost_of_goods_sold": 5, "hs_created_by_user_id": 12282590, "hs_createdate": null, "hs_discount_percentage": null, "hs_external_id": null, "hs_images": null, "hs_lastmodifieddate": "2021-07-19T03:57:09.834000+00:00", "hs_line_item_currency_code": null, "hs_margin": 5.0, "hs_margin_acv": 5.0, "hs_margin_arr": 0.0, "hs_margin_mrr": 0.0, "hs_margin_tcv": 5.0, "hs_merged_object_ids": null, "hs_mrr": 0.0, "hs_object_id": 1188257309, "hs_object_source": null, "hs_object_source_id": null, "hs_object_source_label": null, "hs_object_source_user_id": null, "hs_position_on_quote": 0, "hs_pre_discount_amount": 10, "hs_product_id": 646778218, "hs_product_type": null, "hs_read_only": null, "hs_recurring_billing_end_date": null, "hs_recurring_billing_number_of_payments": 1, "hs_recurring_billing_period": null, "hs_recurring_billing_start_date": null, "hs_recurring_billing_terms": null, "hs_sku": null, "hs_sync_amount": null, "hs_tcv": 10.0, "hs_term_in_months": null, "hs_total_discount": 0, "hs_unique_creation_key": null, "hs_updated_by_user_id": 12282590, "hs_url": null, "hs_user_ids_of_all_notification_followers": null, "hs_user_ids_of_all_notification_unfollowers": null, "hs_user_ids_of_all_owners": null, "hs_variant_id": null, "hs_was_imported": null, "hubspot_owner_assigneddate": null, "hubspot_owner_id": null, "hubspot_team_id": null, "name": "Blue Hat", "price": 10, "quantity": 1, "recurringbillingfrequency": null, "tax": null, "test": null, "test_product_price": null}, "createdAt": "2021-02-23T20:11:54.030Z", "updatedAt": "2021-07-19T03:57:09.834Z", "archived": false, "properties_amount": 10.0, "properties_createdate": "2021-02-23T20:11:54.030000+00:00", "properties_description": "Baseball hat, medium", "properties_discount": null, "properties_hs_acv": 10.0, "properties_hs_all_accessible_team_ids": null, "properties_hs_all_assigned_business_unit_ids": null, "properties_hs_all_owner_ids": null, "properties_hs_all_team_ids": null, "properties_hs_allow_buyer_selected_quantity": null, "properties_hs_arr": 0.0, "properties_hs_billing_period_end_date": null, "properties_hs_billing_period_start_date": null, "properties_hs_billing_start_delay_days": null, "properties_hs_billing_start_delay_months": null, "properties_hs_billing_start_delay_type": null, "properties_hs_cost_of_goods_sold": 5, "properties_hs_created_by_user_id": 12282590, "properties_hs_createdate": null, "properties_hs_discount_percentage": null, "properties_hs_external_id": null, "properties_hs_images": null, "properties_hs_lastmodifieddate": "2021-07-19T03:57:09.834000+00:00", "properties_hs_line_item_currency_code": null, "properties_hs_margin": 5.0, "properties_hs_margin_acv": 5.0, "properties_hs_margin_arr": 0.0, "properties_hs_margin_mrr": 0.0, "properties_hs_margin_tcv": 5.0, "properties_hs_merged_object_ids": null, "properties_hs_mrr": 0.0, "properties_hs_object_id": 1188257309, "properties_hs_object_source": null, "properties_hs_object_source_id": null, "properties_hs_object_source_label": null, "properties_hs_object_source_user_id": null, "properties_hs_position_on_quote": 0, "properties_hs_pre_discount_amount": 10, "properties_hs_product_id": 646778218, "properties_hs_product_type": null, "properties_hs_read_only": null, "properties_hs_recurring_billing_end_date": null, "properties_hs_recurring_billing_number_of_payments": 1, "properties_hs_recurring_billing_period": null, "properties_hs_recurring_billing_start_date": null, "properties_hs_recurring_billing_terms": null, "properties_hs_sku": null, "properties_hs_sync_amount": null, "properties_hs_tcv": 10.0, "properties_hs_term_in_months": null, "properties_hs_total_discount": 0, "properties_hs_unique_creation_key": null, "properties_hs_updated_by_user_id": 12282590, "properties_hs_url": null, "properties_hs_user_ids_of_all_notification_followers": null, "properties_hs_user_ids_of_all_notification_unfollowers": null, "properties_hs_user_ids_of_all_owners": null, "properties_hs_variant_id": null, "properties_hs_was_imported": null, "properties_hubspot_owner_assigneddate": null, "properties_hubspot_owner_id": null, "properties_hubspot_team_id": null, "properties_name": "Blue Hat", "properties_price": 10, "properties_quantity": 1, "properties_recurringbillingfrequency": null, "properties_tax": null, "properties_test": null, "properties_test_product_price": null}, "emitted_at": 1697714248814}
-{"stream": "line_items", "data": {"id": "1510167477", "properties": {"amount": 20.0, "createdate": "2021-05-21T10:22:40.683000+00:00", "description": "Top hat, large", "discount": null, "hs_acv": 60.0, "hs_all_accessible_team_ids": null, "hs_all_assigned_business_unit_ids": null, "hs_all_owner_ids": null, "hs_all_team_ids": null, "hs_allow_buyer_selected_quantity": null, "hs_arr": 60.0, "hs_billing_period_end_date": null, "hs_billing_period_start_date": null, "hs_billing_start_delay_days": null, "hs_billing_start_delay_months": null, "hs_billing_start_delay_type": null, "hs_cost_of_goods_sold": 10, "hs_created_by_user_id": 12282590, "hs_createdate": null, "hs_discount_percentage": null, "hs_external_id": null, "hs_images": null, "hs_lastmodifieddate": "2022-02-23T08:09:16.555000+00:00", "hs_line_item_currency_code": null, "hs_margin": 10.0, "hs_margin_acv": 30.0, "hs_margin_arr": 30.0, "hs_margin_mrr": 10.0, "hs_margin_tcv": 30.0, "hs_merged_object_ids": null, "hs_mrr": 20.0, "hs_object_id": 1510167477, "hs_object_source": null, "hs_object_source_id": null, "hs_object_source_label": null, "hs_object_source_user_id": null, "hs_position_on_quote": null, "hs_pre_discount_amount": 20, "hs_product_id": 646777910, "hs_product_type": null, "hs_read_only": null, "hs_recurring_billing_end_date": "2022-05-28", "hs_recurring_billing_number_of_payments": 3, "hs_recurring_billing_period": "P3M", "hs_recurring_billing_start_date": "2022-02-28", "hs_recurring_billing_terms": null, "hs_sku": null, "hs_sync_amount": null, "hs_tcv": 60.0, "hs_term_in_months": 3, "hs_total_discount": 0, "hs_unique_creation_key": null, "hs_updated_by_user_id": 12282590, "hs_url": null, "hs_user_ids_of_all_notification_followers": null, "hs_user_ids_of_all_notification_unfollowers": null, "hs_user_ids_of_all_owners": null, "hs_variant_id": null, "hs_was_imported": null, "hubspot_owner_assigneddate": null, "hubspot_owner_id": null, "hubspot_team_id": null, "name": "Red Hat", "price": 20, "quantity": 1, "recurringbillingfrequency": "monthly", "tax": null, "test": "2022-02-24", "test_product_price": "2022-02-23"}, "createdAt": "2021-05-21T10:22:40.683Z", "updatedAt": "2022-02-23T08:09:16.555Z", "archived": false, "properties_amount": 20.0, "properties_createdate": "2021-05-21T10:22:40.683000+00:00", "properties_description": "Top hat, large", "properties_discount": null, "properties_hs_acv": 60.0, "properties_hs_all_accessible_team_ids": null, "properties_hs_all_assigned_business_unit_ids": null, "properties_hs_all_owner_ids": null, "properties_hs_all_team_ids": null, "properties_hs_allow_buyer_selected_quantity": null, "properties_hs_arr": 60.0, "properties_hs_billing_period_end_date": null, "properties_hs_billing_period_start_date": null, "properties_hs_billing_start_delay_days": null, "properties_hs_billing_start_delay_months": null, "properties_hs_billing_start_delay_type": null, "properties_hs_cost_of_goods_sold": 10, "properties_hs_created_by_user_id": 12282590, "properties_hs_createdate": null, "properties_hs_discount_percentage": null, "properties_hs_external_id": null, "properties_hs_images": null, "properties_hs_lastmodifieddate": "2022-02-23T08:09:16.555000+00:00", "properties_hs_line_item_currency_code": null, "properties_hs_margin": 10.0, "properties_hs_margin_acv": 30.0, "properties_hs_margin_arr": 30.0, "properties_hs_margin_mrr": 10.0, "properties_hs_margin_tcv": 30.0, "properties_hs_merged_object_ids": null, "properties_hs_mrr": 20.0, "properties_hs_object_id": 1510167477, "properties_hs_object_source": null, "properties_hs_object_source_id": null, "properties_hs_object_source_label": null, "properties_hs_object_source_user_id": null, "properties_hs_position_on_quote": null, "properties_hs_pre_discount_amount": 20, "properties_hs_product_id": 646777910, "properties_hs_product_type": null, "properties_hs_read_only": null, "properties_hs_recurring_billing_end_date": "2022-05-28", "properties_hs_recurring_billing_number_of_payments": 3, "properties_hs_recurring_billing_period": "P3M", "properties_hs_recurring_billing_start_date": "2022-02-28", "properties_hs_recurring_billing_terms": null, "properties_hs_sku": null, "properties_hs_sync_amount": null, "properties_hs_tcv": 60.0, "properties_hs_term_in_months": 3, "properties_hs_total_discount": 0, "properties_hs_unique_creation_key": null, "properties_hs_updated_by_user_id": 12282590, "properties_hs_url": null, "properties_hs_user_ids_of_all_notification_followers": null, "properties_hs_user_ids_of_all_notification_unfollowers": null, "properties_hs_user_ids_of_all_owners": null, "properties_hs_variant_id": null, "properties_hs_was_imported": null, "properties_hubspot_owner_assigneddate": null, "properties_hubspot_owner_id": null, "properties_hubspot_team_id": null, "properties_name": "Red Hat", "properties_price": 20, "properties_quantity": 1, "properties_recurringbillingfrequency": "monthly", "properties_tax": null, "properties_test": "2022-02-24", "properties_test_product_price": "2022-02-23"}, "emitted_at": 1697714248816}
-{"stream": "marketing_emails", "data": {"ab": false, "abHoursToWait": 4, "abSampleSizeDefault": null, "abSamplingDefault": null, "abSuccessMetric": null, "abTestPercentage": 50, "abVariation": false, "absoluteUrl": "http://integrationtest-dev-8727216-8727216.hs-sites.com/-temporary-slug-86812db1-e3c8-43cd-ae80-69a0934cd1de", "aifeatures": null, "allEmailCampaignIds": [243851494], "analyticsPageId": "100523515217", "analyticsPageType": "email", "archivedAt": 0, "archivedInDashboard": false, "audienceAccess": "PUBLIC", "author": "integration-test@airbyte.io", "authorName": "Team-1 Airbyte", "blogRssSettings": null, "canSpamSettingsId": 36765207029, "categoryId": 2, "contentAccessRuleIds": [], "contentAccessRuleTypes": [], "contentTypeCategory": 2, "createPage": false, "created": 1675121582718, "createdById": 12282590, "currentState": "PUBLISHED", "currentlyPublished": true, "customReplyTo": "", "customReplyToEnabled": false, "domain": "", "emailBody": "{% content_attribute \"email_body\" %}{{ default_email_body }}{% end_content_attribute %}", "emailNote": "", "emailTemplateMode": "DRAG_AND_DROP", "emailType": "BATCH_EMAIL", "emailbodyPlaintext": "", "feedbackSurveyId": null, "flexAreas": {"main": {"boxed": false, "isSingleColumnFullWidth": false, "sections": [{"columns": [{"id": "column-0-0", "widgets": ["module-0-0-0"], "width": 12}], "id": "section-0", "style": {"backgroundColor": "#eaf0f6", "backgroundType": "CONTENT", "paddingBottom": "10px", "paddingTop": "10px"}}, {"columns": [{"id": "column-1-0", "widgets": ["module-1-0-0"], "width": 12}], "id": "section-1", "style": {"backgroundType": "CONTENT", "paddingBottom": "30px", "paddingTop": "30px"}}, {"columns": [{"id": "column-2-0", "widgets": ["module-2-0-0"], "width": 12}], "id": "section-2", "style": {"backgroundColor": "", "backgroundType": "CONTENT", "paddingBottom": "20px", "paddingTop": "20px"}}]}}, "freezeDate": 1675121645993, "fromName": "Team Airbyte", "hasContentAccessRules": false, "htmlTitle": "", "id": 100523515217, "isCreatedFomSandboxSync": false, "isGraymailSuppressionEnabled": true, "isInstanceLayoutPage": false, "isPublished": true, "isRecipientFatigueSuppressionEnabled": null, "language": "en", "layoutSections": {}, "liveDomain": "integrationtest-dev-8727216-8727216.hs-sites.com", "mailingListsExcluded": [], "mailingListsIncluded": [], "maxRssEntries": 5, "metaDescription": "", "name": "test", "pageExpiryEnabled": false, "pageRedirected": false, "pastMabExperimentIds": [], "portalId": 8727216, "previewKey": "nlkwziGL", "primaryEmailCampaignId": 243851494, "processingStatus": "PUBLISHED", "publishDate": 1675121645997, "publishImmediately": true, "publishedAt": 1675121646297, "publishedByEmail": "integration-test@airbyte.io", "publishedById": 12282590, "publishedByName": "Team-1 Airbyte", "publishedUrl": "http://integrationtest-dev-8727216-8727216.hs-sites.com/-temporary-slug-86812db1-e3c8-43cd-ae80-69a0934cd1de", "replyTo": "integration-test@airbyte.io", "resolvedDomain": "integrationtest-dev-8727216-8727216.hs-sites.com", "rssEmailByText": "By", "rssEmailClickThroughText": "Read more &raquo;", "rssEmailCommentText": "Comment &raquo;", "rssEmailEntryTemplateEnabled": false, "rssEmailImageMaxWidth": 0, "rssEmailUrl": "", "sections": {}, "securityState": "NONE", "selected": 0, "slug": "-temporary-slug-86812db1-e3c8-43cd-ae80-69a0934cd1de", "smartEmailFields": {}, "state": "PUBLISHED", "stats": {"counters": {"sent": 0, "open": 0, "delivered": 0, "bounce": 0, "unsubscribed": 0, "click": 0, "reply": 0, "dropped": 1, "selected": 1, "spamreport": 0, "suppressed": 0, "hardbounced": 0, "softbounced": 0, "pending": 0, "contactslost": 0, "notsent": 1}, "deviceBreakdown": {"open_device_type": {"computer": 0, "mobile": 0, "unknown": 0}, "click_device_type": {"computer": 0, "mobile": 0, "unknown": 0}}, "failedToLoad": false, "qualifierStats": {}, "ratios": {"clickratio": 0, "clickthroughratio": 0, "deliveredratio": 0, "openratio": 0, "replyratio": 0, "unsubscribedratio": 0, "spamreportratio": 0, "bounceratio": 0, "hardbounceratio": 0, "softbounceratio": 0, "contactslostratio": 0, "pendingratio": 0, "notsentratio": 100.0}}, "styleSettings": {"background_color": "#EAF0F6", "background_image": null, "background_image_type": null, "body_border_color": "#EAF0F6", "body_border_color_choice": "BORDER_MANUAL", "body_border_width": "1", "body_color": "#ffffff", "color_picker_favorite1": null, "color_picker_favorite2": null, "color_picker_favorite3": null, "color_picker_favorite4": null, "color_picker_favorite5": null, "color_picker_favorite6": null, "email_body_padding": null, "email_body_width": null, "heading_one_font": {"bold": null, "color": null, "font": null, "font_style": {}, "italic": null, "size": "28", "underline": null}, "heading_two_font": {"bold": null, "color": null, "font": null, "font_style": {}, "italic": null, "size": "22", "underline": null}, "links_font": {"bold": false, "color": "#00a4bd", "font": null, "font_style": {}, "italic": false, "size": null, "underline": true}, "primary_accent_color": null, "primary_font": "Arial, sans-serif", "primary_font_color": "#23496d", "primary_font_line_height": null, "primary_font_size": "15", "secondary_accent_color": null, "secondary_font": "Arial, sans-serif", "secondary_font_color": "#23496d", "secondary_font_line_height": null, "secondary_font_size": "12", "use_email_client_default_settings": false, "user_module_defaults": {"button_email": {"background_color": "#00a4bd", "corner_radius": 8, "font": "Arial, sans-serif", "font_color": "#ffffff", "font_size": 16, "font_style": {"color": "#ffffff", "font": "Arial, sans-serif", "size": {"units": "px", "value": 16}, "styles": {"bold": false, "italic": false, "underline": false}}}, "email_divider": {"color": {"color": "#23496d", "opacity": 100}, "height": 1, "line_type": "solid"}}}, "subcategory": "batch", "subject": "test", "subscription": 23704464, "subscriptionName": "Test sub", "teamPerms": [], "templatePath": "@hubspot/email/dnd/welcome.html", "transactional": false, "translations": {}, "unpublishedAt": 0, "updated": 1675121702583, "updatedById": 12282590, "url": "http://integrationtest-dev-8727216-8727216.hs-sites.com/-temporary-slug-86812db1-e3c8-43cd-ae80-69a0934cd1de", "useRssHeadlineAsSubject": false, "userPerms": [], "vidsExcluded": [], "vidsIncluded": [2501], "visibleToAll": true}, "emitted_at": 1697714249852}
-{"stream": "marketing_emails", "data": {"ab": false, "abHoursToWait": 4, "abSampleSizeDefault": null, "abSamplingDefault": null, "abSuccessMetric": null, "abTestPercentage": 50, "abVariation": false, "absoluteUrl": "http://integrationtest-dev-8727216-8727216.hs-sites.com/-temporary-slug-f142cfbc-0d58-4eb5-b442-0d221f27b420", "aifeatures": null, "allEmailCampaignIds": [169919555], "analyticsPageId": "57347028995", "analyticsPageType": "email", "archivedAt": 0, "archivedInDashboard": false, "audienceAccess": "PUBLIC", "author": "integration-test@airbyte.io", "authorName": "Team-1 Airbyte", "blogRssSettings": null, "canSpamSettingsId": 36765207029, "categoryId": 2, "contentAccessRuleIds": [], "contentAccessRuleTypes": [], "contentTypeCategory": 2, "createPage": false, "created": 1634050240841, "createdById": 12282590, "currentState": "PUBLISHED", "currentlyPublished": true, "customReplyTo": "", "customReplyToEnabled": false, "domain": "", "emailBody": "{% content_attribute \"email_body\" %}{{ default_email_body }}{% end_content_attribute %}", "emailNote": "", "emailTemplateMode": "DRAG_AND_DROP", "emailType": "BATCH_EMAIL", "emailbodyPlaintext": "", "feedbackSurveyId": null, "flexAreas": {"main": {"boxed": false, "isSingleColumnFullWidth": false, "sections": [{"columns": [{"id": "column-0-0", "widgets": ["module-0-0-0"], "width": 12}], "id": "section-0", "style": {"backgroundType": "CONTENT", "paddingBottom": "40px", "paddingTop": "40px"}}, {"columns": [{"id": "column-1-0", "widgets": ["module-1-0-0"], "width": 12}], "id": "section-1", "style": {"backgroundColor": "", "backgroundType": "CONTENT", "paddingBottom": "0px", "paddingTop": "0px"}}]}}, "freezeDate": 1634050421336, "fromName": "Team Airbyte", "hasContentAccessRules": false, "htmlTitle": "", "id": 57347028995, "isCreatedFomSandboxSync": false, "isGraymailSuppressionEnabled": true, "isInstanceLayoutPage": false, "isPublished": true, "isRecipientFatigueSuppressionEnabled": null, "language": "en", "layoutSections": {}, "liveDomain": "integrationtest-dev-8727216-8727216.hs-sites.com", "mailingListsExcluded": [], "mailingListsIncluded": [130, 129, 131, 128, 126, 127, 125, 124, 123, 122, 121, 120, 119, 118, 117, 116], "maxRssEntries": 5, "metaDescription": "", "name": "First test email - 1", "pageExpiryEnabled": false, "pageRedirected": false, "pastMabExperimentIds": [], "portalId": 8727216, "previewKey": "bgNuSvDn", "primaryEmailCampaignId": 169919555, "processingStatus": "PUBLISHED", "publishDate": 1634050421341, "publishImmediately": true, "publishedAt": 1634050421580, "publishedByEmail": "integration-test@airbyte.io", "publishedById": 12282590, "publishedByName": "Team-1 Airbyte", "publishedUrl": "http://integrationtest-dev-8727216-8727216.hs-sites.com/-temporary-slug-f142cfbc-0d58-4eb5-b442-0d221f27b420", "replyTo": "integration-test@airbyte.io", "resolvedDomain": "integrationtest-dev-8727216-8727216.hs-sites.com", "rssEmailByText": "By", "rssEmailClickThroughText": "Read more &raquo;", "rssEmailCommentText": "Comment &raquo;", "rssEmailEntryTemplateEnabled": false, "rssEmailImageMaxWidth": 0, "rssEmailUrl": "", "sections": {}, "securityState": "NONE", "selected": 0, "slug": "-temporary-slug-f142cfbc-0d58-4eb5-b442-0d221f27b420", "smartEmailFields": {}, "state": "PUBLISHED", "stats": {"counters": {"sent": 0}, "deviceBreakdown": {}, "failedToLoad": false, "qualifierStats": {}, "ratios": {"clickratio": 0, "clickthroughratio": 0, "deliveredratio": 0, "openratio": 0, "replyratio": 0, "unsubscribedratio": 0, "spamreportratio": 0, "bounceratio": 0, "hardbounceratio": 0, "softbounceratio": 0, "contactslostratio": 0, "pendingratio": 0, "notsentratio": 0}}, "styleSettings": {"background_color": "#ffffff", "background_image": null, "background_image_type": null, "body_border_color": null, "body_border_color_choice": null, "body_border_width": "1", "body_color": "#ffffff", "color_picker_favorite1": null, "color_picker_favorite2": null, "color_picker_favorite3": null, "color_picker_favorite4": null, "color_picker_favorite5": null, "color_picker_favorite6": null, "email_body_padding": null, "email_body_width": null, "heading_one_font": {"bold": null, "color": null, "font": null, "font_style": {}, "italic": null, "size": "28", "underline": null}, "heading_two_font": {"bold": null, "color": null, "font": null, "font_style": {}, "italic": null, "size": "22", "underline": null}, "links_font": {"bold": false, "color": "#00a4bd", "font": null, "font_style": {}, "italic": false, "size": null, "underline": true}, "primary_accent_color": null, "primary_font": "Arial, sans-serif", "primary_font_color": "#23496d", "primary_font_line_height": null, "primary_font_size": "15", "secondary_accent_color": null, "secondary_font": "Arial, sans-serif", "secondary_font_color": "#23496d", "secondary_font_line_height": null, "secondary_font_size": "12", "use_email_client_default_settings": false, "user_module_defaults": {"button_email": {"background_color": null, "corner_radius": 8, "font": "Arial, sans-serif", "font_color": "#ffffff", "font_size": 16, "font_style": {"color": "#ffffff", "font": "Arial, sans-serif", "size": {"units": "px", "value": 16}, "styles": {"bold": false, "italic": false, "underline": false}}}, "email_divider": {"color": {"color": "#000000", "opacity": 100}, "height": 1, "line_type": null}}}, "subcategory": "batch", "subject": "Subject l", "subscription": 23704464, "subscriptionName": "Test sub", "teamPerms": [], "templatePath": "@hubspot/email/dnd/plain_text.html", "transactional": false, "translations": {}, "unpublishedAt": 0, "updated": 1634050455543, "updatedById": 12282590, "url": "http://integrationtest-dev-8727216-8727216.hs-sites.com/-temporary-slug-f142cfbc-0d58-4eb5-b442-0d221f27b420", "useRssHeadlineAsSubject": false, "userPerms": [], "vidsExcluded": [], "vidsIncluded": [], "visibleToAll": true}, "emitted_at": 1697714249853}
-{"stream": "marketing_emails", "data": {"ab": false, "abHoursToWait": 4, "abSampleSizeDefault": null, "abSamplingDefault": null, "abSuccessMetric": null, "abTestPercentage": 50, "abVariation": false, "absoluteUrl": "http://integrationtest-dev-8727216-8727216.hs-sites.com/-temporary-slug-fb53d6bf-1eb6-4ee6-90fe-610fc2569ea7", "aifeatures": null, "allEmailCampaignIds": [], "analyticsPageId": "42930862366", "analyticsPageType": "email", "archivedAt": 0, "archivedInDashboard": false, "audienceAccess": "PUBLIC", "author": "integration-test@airbyte.io", "authorName": "Team-1 Airbyte", "blogRssSettings": null, "canSpamSettingsId": 36765207029, "categoryId": 2, "clonedFrom": 41886608509, "contentAccessRuleIds": [], "contentAccessRuleTypes": [], "contentTypeCategory": 2, "createPage": false, "created": 1615502115346, "createdById": 100, "currentState": "AUTOMATED_DRAFT", "currentlyPublished": false, "customReplyTo": "", "customReplyToEnabled": false, "domain": "", "emailBody": "{% content_attribute \"email_body\" %}{{ default_email_body }}{% end_content_attribute %}", "emailNote": "", "emailTemplateMode": "DRAG_AND_DROP", "emailType": "AUTOMATED_EMAIL", "emailbodyPlaintext": "", "feedbackSurveyId": null, "flexAreas": {"main": {"boxed": false, "isSingleColumnFullWidth": false, "sections": [{"columns": [{"id": "column-0-1", "widgets": ["module-0-1-1"], "width": 12}], "id": "section-0", "style": {"backgroundColor": "#eaf0f6", "backgroundType": "CONTENT", "paddingBottom": "10px", "paddingTop": "10px"}}, {"columns": [{"id": "column-1-1", "widgets": ["module-1-1-1"], "width": 12}], "id": "section-1", "style": {"backgroundType": "CONTENT", "paddingBottom": "30px", "paddingTop": "30px"}}, {"columns": [{"id": "column-2-1", "widgets": ["module-2-1-1"], "width": 12}], "id": "section-2", "style": {"backgroundColor": "", "backgroundType": "CONTENT", "paddingBottom": "20px", "paddingTop": "20px"}}]}}, "freezeDate": 1634042970319, "fromName": "Team Airbyte", "hasContentAccessRules": false, "htmlTitle": "", "id": 42930862366, "isCreatedFomSandboxSync": false, "isGraymailSuppressionEnabled": false, "isInstanceLayoutPage": false, "isPublished": false, "isRecipientFatigueSuppressionEnabled": null, "language": "en", "lastEditSessionId": 1634042969643, "lastEditUpdateId": 0, "layoutSections": {}, "liveDomain": "integrationtest-dev-8727216-8727216.hs-sites.com", "mailingListsExcluded": [], "mailingListsIncluded": [], "maxRssEntries": 5, "metaDescription": "", "name": "Test subject (Test campaing - Clone)", "pageExpiryEnabled": false, "pageRedirected": false, "pastMabExperimentIds": [], "portalId": 8727216, "previewKey": "UmZGYZsU", "processingStatus": "UNDEFINED", "publishDate": 1634042970320, "publishImmediately": true, "publishedUrl": "", "replyTo": "integration-test@airbyte.io", "resolvedDomain": "integrationtest-dev-8727216-8727216.hs-sites.com", "rssEmailByText": "By", "rssEmailClickThroughText": "Read more &raquo;", "rssEmailCommentText": "Comment &raquo;", "rssEmailEntryTemplateEnabled": false, "rssEmailImageMaxWidth": 0, "rssEmailUrl": "", "sections": {}, "securityState": "NONE", "slug": "-temporary-slug-fb53d6bf-1eb6-4ee6-90fe-610fc2569ea7", "smartEmailFields": {}, "state": "AUTOMATED_DRAFT", "styleSettings": {"background_color": "#EAF0F6", "background_image": null, "background_image_type": null, "body_border_color": "#EAF0F6", "body_border_color_choice": "BORDER_MANUAL", "body_border_width": "1", "body_color": "#ffffff", "color_picker_favorite1": null, "color_picker_favorite2": null, "color_picker_favorite3": null, "color_picker_favorite4": null, "color_picker_favorite5": null, "color_picker_favorite6": null, "email_body_padding": null, "email_body_width": null, "heading_one_font": {"bold": null, "color": null, "font": null, "font_style": {}, "italic": null, "size": "28", "underline": null}, "heading_two_font": {"bold": null, "color": null, "font": null, "font_style": {}, "italic": null, "size": "22", "underline": null}, "links_font": {"bold": false, "color": "#00a4bd", "font": null, "font_style": {}, "italic": false, "size": null, "underline": true}, "primary_accent_color": null, "primary_font": "Arial, sans-serif", "primary_font_color": "#23496d", "primary_font_line_height": null, "primary_font_size": "15", "secondary_accent_color": null, "secondary_font": "Arial, sans-serif", "secondary_font_color": "#23496d", "secondary_font_line_height": null, "secondary_font_size": "12", "use_email_client_default_settings": false, "user_module_defaults": {"button_email": {"background_color": "#00a4bd", "corner_radius": 8, "font": "Arial, sans-serif", "font_color": "#ffffff", "font_size": 16, "font_style": {"color": "#ffffff", "font": "Arial, sans-serif", "size": {"units": "px", "value": 16}, "styles": {"bold": false, "italic": false, "underline": false}}}, "email_divider": {"color": {"color": "#23496d", "opacity": 100}, "height": 1, "line_type": "solid"}}}, "subcategory": "automated", "subject": "Test subject", "subscription": 11890831, "subscriptionName": "Test subscription", "teamPerms": [], "templatePath": "@hubspot/email/dnd/welcome.html", "transactional": false, "translations": {}, "unpublishedAt": 0, "updated": 1634042970321, "updatedById": 12282590, "url": "http://integrationtest-dev-8727216-8727216.hs-sites.com/-temporary-slug-fb53d6bf-1eb6-4ee6-90fe-610fc2569ea7", "useRssHeadlineAsSubject": false, "userPerms": [], "vidsExcluded": [], "vidsIncluded": [], "visibleToAll": true}, "emitted_at": 1697714249854}
+{"stream": "goals", "data": {"id": "221880757009", "properties": {"hs__migration_soft_delete": null, "hs_ad_account_asset_ids": null, "hs_ad_campaign_asset_ids": null, "hs_all_accessible_team_ids": null, "hs_all_assigned_business_unit_ids": null, "hs_all_owner_ids": null, "hs_all_team_ids": null, "hs_assignee_team_id": null, "hs_assignee_user_id": 26748728, "hs_contact_lifecycle_stage": null, "hs_created_by_user_id": 12282590, "hs_createdate": "2023-04-10T13:57:36.691000+00:00", "hs_currency": null, "hs_deal_pipeline_ids": null, "hs_edit_updates_notification_frequency": "weekly", "hs_end_date": null, "hs_end_datetime": "2023-07-31T23:59:59.999000+00:00", "hs_fiscal_year_offset": 0, "hs_goal_definition_key": null, "hs_goal_definition_key_with_team": null, "hs_goal_definition_key_with_user": null, "hs_goal_name": "Integration Test Goal Hubspot", "hs_goal_target_group_id": 221880750627, "hs_goal_type": "average_ticket_response_time", "hs_group_correlation_uuid": "5c49f251-be20-43c6-87c7-dd273732b3a4", "hs_is_forecastable": "true", "hs_is_legacy": null, "hs_kpi_display_unit": "hour", "hs_kpi_filter_group_without_team_id": null, "hs_kpi_filter_groups": "[{\"filters\":[{\"property\":\"hs_pipeline\",\"operator\":\"IN\",\"values\":[\"0\"]}]}]", "hs_kpi_is_team_rollup": false, "hs_kpi_metric_type": "AVG", "hs_kpi_object_type": "TICKET", "hs_kpi_object_type_id": "0-5", "hs_kpi_progress_percent": null, "hs_kpi_property_name": "time_to_first_agent_reply", "hs_kpi_single_object_custom_goal_type_name": "avg_time_to_first_agent_reply_0-5", "hs_kpi_time_period_property": "createdate", "hs_kpi_tracking_method": "LOWER_IS_BETTER", "hs_kpi_unit_type": "duration", "hs_kpi_value": 0.0, "hs_kpi_value_calculated_at": null, "hs_kpi_value_last_calculated_at": "2023-08-01T00:45:14.830000+00:00", "hs_lastmodifieddate": "2023-12-11T20:46:14.473000+00:00", "hs_legacy_active": null, "hs_legacy_created_at": null, "hs_legacy_created_by": null, "hs_legacy_quarterly_target_composite_id": null, "hs_legacy_sql_id": null, "hs_legacy_unique_sql_id": null, "hs_legacy_updated_at": null, "hs_legacy_updated_by": null, "hs_merged_object_ids": null, "hs_migration_soft_delete": null, "hs_milestone": "monthly", "hs_object_id": 221880757009, "hs_object_source": null, "hs_object_source_id": null, "hs_object_source_label": null, "hs_object_source_user_id": null, "hs_outcome": "completed", "hs_owner_ids_of_all_owners": "111730024", "hs_participant_type": "users", "hs_pipelines": "0", "hs_progress_updates_notification_frequency": "weekly", "hs_read_only": null, "hs_should_notify_on_achieved": "false", "hs_should_notify_on_edit_updates": "false", "hs_should_notify_on_exceeded": "false", "hs_should_notify_on_kickoff": "false", "hs_should_notify_on_missed": "false", "hs_should_notify_on_progress_updates": "false", "hs_should_recalculate": "false", "hs_start_date": null, "hs_start_datetime": "2023-07-01T00:00:00+00:00", "hs_static_kpi_filter_groups": "[]", "hs_status": "achieved", "hs_status_display_order": 4, "hs_target_amount": 0.0, "hs_target_amount_in_home_currency": 0.0, "hs_team_id": null, "hs_template_id": 4, "hs_ticket_pipeline_ids": "0", "hs_unique_creation_key": null, "hs_updated_by_user_id": 12282590, "hs_user_id": null, "hs_user_ids_of_all_notification_followers": null, "hs_user_ids_of_all_notification_unfollowers": null, "hs_user_ids_of_all_owners": "26748728", "hs_was_imported": null, "hubspot_owner_assigneddate": null, "hubspot_owner_id": null, "hubspot_team_id": null}, "createdAt": "2023-04-10T13:57:36.691Z", "updatedAt": "2023-12-11T20:46:14.473Z", "archived": false, "properties_hs__migration_soft_delete": null, "properties_hs_ad_account_asset_ids": null, "properties_hs_ad_campaign_asset_ids": null, "properties_hs_all_accessible_team_ids": null, "properties_hs_all_assigned_business_unit_ids": null, "properties_hs_all_owner_ids": null, "properties_hs_all_team_ids": null, "properties_hs_assignee_team_id": null, "properties_hs_assignee_user_id": 26748728, "properties_hs_contact_lifecycle_stage": null, "properties_hs_created_by_user_id": 12282590, "properties_hs_createdate": "2023-04-10T13:57:36.691000+00:00", "properties_hs_currency": null, "properties_hs_deal_pipeline_ids": null, "properties_hs_edit_updates_notification_frequency": "weekly", "properties_hs_end_date": null, "properties_hs_end_datetime": "2023-07-31T23:59:59.999000+00:00", "properties_hs_fiscal_year_offset": 0, "properties_hs_goal_definition_key": null, "properties_hs_goal_definition_key_with_team": null, "properties_hs_goal_definition_key_with_user": null, "properties_hs_goal_name": "Integration Test Goal Hubspot", "properties_hs_goal_target_group_id": 221880750627, "properties_hs_goal_type": "average_ticket_response_time", "properties_hs_group_correlation_uuid": "5c49f251-be20-43c6-87c7-dd273732b3a4", "properties_hs_is_forecastable": "true", "properties_hs_is_legacy": null, "properties_hs_kpi_display_unit": "hour", "properties_hs_kpi_filter_group_without_team_id": null, "properties_hs_kpi_filter_groups": "[{\"filters\":[{\"property\":\"hs_pipeline\",\"operator\":\"IN\",\"values\":[\"0\"]}]}]", "properties_hs_kpi_is_team_rollup": false, "properties_hs_kpi_metric_type": "AVG", "properties_hs_kpi_object_type": "TICKET", "properties_hs_kpi_object_type_id": "0-5", "properties_hs_kpi_progress_percent": null, "properties_hs_kpi_property_name": "time_to_first_agent_reply", "properties_hs_kpi_single_object_custom_goal_type_name": "avg_time_to_first_agent_reply_0-5", "properties_hs_kpi_time_period_property": "createdate", "properties_hs_kpi_tracking_method": "LOWER_IS_BETTER", "properties_hs_kpi_unit_type": "duration", "properties_hs_kpi_value": 0.0, "properties_hs_kpi_value_calculated_at": null, "properties_hs_kpi_value_last_calculated_at": "2023-08-01T00:45:14.830000+00:00", "properties_hs_lastmodifieddate": "2023-12-11T20:46:14.473000+00:00", "properties_hs_legacy_active": null, "properties_hs_legacy_created_at": null, "properties_hs_legacy_created_by": null, "properties_hs_legacy_quarterly_target_composite_id": null, "properties_hs_legacy_sql_id": null, "properties_hs_legacy_unique_sql_id": null, "properties_hs_legacy_updated_at": null, "properties_hs_legacy_updated_by": null, "properties_hs_merged_object_ids": null, "properties_hs_migration_soft_delete": null, "properties_hs_milestone": "monthly", "properties_hs_object_id": 221880757009, "properties_hs_object_source": null, "properties_hs_object_source_id": null, "properties_hs_object_source_label": null, "properties_hs_object_source_user_id": null, "properties_hs_outcome": "completed", "properties_hs_owner_ids_of_all_owners": "111730024", "properties_hs_participant_type": "users", "properties_hs_pipelines": "0", "properties_hs_progress_updates_notification_frequency": "weekly", "properties_hs_read_only": null, "properties_hs_should_notify_on_achieved": "false", "properties_hs_should_notify_on_edit_updates": "false", "properties_hs_should_notify_on_exceeded": "false", "properties_hs_should_notify_on_kickoff": "false", "properties_hs_should_notify_on_missed": "false", "properties_hs_should_notify_on_progress_updates": "false", "properties_hs_should_recalculate": "false", "properties_hs_start_date": null, "properties_hs_start_datetime": "2023-07-01T00:00:00+00:00", "properties_hs_static_kpi_filter_groups": "[]", "properties_hs_status": "achieved", "properties_hs_status_display_order": 4, "properties_hs_target_amount": 0.0, "properties_hs_target_amount_in_home_currency": 0.0, "properties_hs_team_id": null, "properties_hs_template_id": 4, "properties_hs_ticket_pipeline_ids": "0", "properties_hs_unique_creation_key": null, "properties_hs_updated_by_user_id": 12282590, "properties_hs_user_id": null, "properties_hs_user_ids_of_all_notification_followers": null, "properties_hs_user_ids_of_all_notification_unfollowers": null, "properties_hs_user_ids_of_all_owners": "26748728", "properties_hs_was_imported": null, "properties_hubspot_owner_assigneddate": null, "properties_hubspot_owner_id": null, "properties_hubspot_team_id": null}, "emitted_at": 1706192378510}
+{"stream": "goals", "data": {"id": "221880757010", "properties": {"hs__migration_soft_delete": null, "hs_ad_account_asset_ids": null, "hs_ad_campaign_asset_ids": null, "hs_all_accessible_team_ids": null, "hs_all_assigned_business_unit_ids": null, "hs_all_owner_ids": null, "hs_all_team_ids": null, "hs_assignee_team_id": null, "hs_assignee_user_id": 26748728, "hs_contact_lifecycle_stage": null, "hs_created_by_user_id": 12282590, "hs_createdate": "2023-04-10T13:57:36.691000+00:00", "hs_currency": null, "hs_deal_pipeline_ids": null, "hs_edit_updates_notification_frequency": "weekly", "hs_end_date": null, "hs_end_datetime": "2023-09-30T23:59:59.999000+00:00", "hs_fiscal_year_offset": 0, "hs_goal_definition_key": null, "hs_goal_definition_key_with_team": null, "hs_goal_definition_key_with_user": null, "hs_goal_name": "Integration Test Goal Hubspot", "hs_goal_target_group_id": 221880750627, "hs_goal_type": "average_ticket_response_time", "hs_group_correlation_uuid": "5c49f251-be20-43c6-87c7-dd273732b3a4", "hs_is_forecastable": "true", "hs_is_legacy": null, "hs_kpi_display_unit": "hour", "hs_kpi_filter_group_without_team_id": null, "hs_kpi_filter_groups": "[{\"filters\":[{\"property\":\"hs_pipeline\",\"operator\":\"IN\",\"values\":[\"0\"]}]}]", "hs_kpi_is_team_rollup": false, "hs_kpi_metric_type": "AVG", "hs_kpi_object_type": "TICKET", "hs_kpi_object_type_id": "0-5", "hs_kpi_progress_percent": null, "hs_kpi_property_name": "time_to_first_agent_reply", "hs_kpi_single_object_custom_goal_type_name": "avg_time_to_first_agent_reply_0-5", "hs_kpi_time_period_property": "createdate", "hs_kpi_tracking_method": "LOWER_IS_BETTER", "hs_kpi_unit_type": "duration", "hs_kpi_value": 0.0, "hs_kpi_value_calculated_at": null, "hs_kpi_value_last_calculated_at": "2023-10-01T22:31:08.621000+00:00", "hs_lastmodifieddate": "2023-12-11T20:46:14.473000+00:00", "hs_legacy_active": null, "hs_legacy_created_at": null, "hs_legacy_created_by": null, "hs_legacy_quarterly_target_composite_id": null, "hs_legacy_sql_id": null, "hs_legacy_unique_sql_id": null, "hs_legacy_updated_at": null, "hs_legacy_updated_by": null, "hs_merged_object_ids": null, "hs_migration_soft_delete": null, "hs_milestone": "monthly", "hs_object_id": 221880757010, "hs_object_source": null, "hs_object_source_id": null, "hs_object_source_label": null, "hs_object_source_user_id": null, "hs_outcome": "completed", "hs_owner_ids_of_all_owners": "111730024", "hs_participant_type": "users", "hs_pipelines": "0", "hs_progress_updates_notification_frequency": "weekly", "hs_read_only": null, "hs_should_notify_on_achieved": "false", "hs_should_notify_on_edit_updates": "false", "hs_should_notify_on_exceeded": "false", "hs_should_notify_on_kickoff": "false", "hs_should_notify_on_missed": "false", "hs_should_notify_on_progress_updates": "false", "hs_should_recalculate": "false", "hs_start_date": null, "hs_start_datetime": "2023-09-01T00:00:00+00:00", "hs_static_kpi_filter_groups": "[]", "hs_status": "achieved", "hs_status_display_order": 4, "hs_target_amount": 0.0, "hs_target_amount_in_home_currency": 0.0, "hs_team_id": null, "hs_template_id": 4, "hs_ticket_pipeline_ids": "0", "hs_unique_creation_key": null, "hs_updated_by_user_id": 12282590, "hs_user_id": null, "hs_user_ids_of_all_notification_followers": null, "hs_user_ids_of_all_notification_unfollowers": null, "hs_user_ids_of_all_owners": "26748728", "hs_was_imported": null, "hubspot_owner_assigneddate": null, "hubspot_owner_id": null, "hubspot_team_id": null}, "createdAt": "2023-04-10T13:57:36.691Z", "updatedAt": "2023-12-11T20:46:14.473Z", "archived": false, "properties_hs__migration_soft_delete": null, "properties_hs_ad_account_asset_ids": null, "properties_hs_ad_campaign_asset_ids": null, "properties_hs_all_accessible_team_ids": null, "properties_hs_all_assigned_business_unit_ids": null, "properties_hs_all_owner_ids": null, "properties_hs_all_team_ids": null, "properties_hs_assignee_team_id": null, "properties_hs_assignee_user_id": 26748728, "properties_hs_contact_lifecycle_stage": null, "properties_hs_created_by_user_id": 12282590, "properties_hs_createdate": "2023-04-10T13:57:36.691000+00:00", "properties_hs_currency": null, "properties_hs_deal_pipeline_ids": null, "properties_hs_edit_updates_notification_frequency": "weekly", "properties_hs_end_date": null, "properties_hs_end_datetime": "2023-09-30T23:59:59.999000+00:00", "properties_hs_fiscal_year_offset": 0, "properties_hs_goal_definition_key": null, "properties_hs_goal_definition_key_with_team": null, "properties_hs_goal_definition_key_with_user": null, "properties_hs_goal_name": "Integration Test Goal Hubspot", "properties_hs_goal_target_group_id": 221880750627, "properties_hs_goal_type": "average_ticket_response_time", "properties_hs_group_correlation_uuid": "5c49f251-be20-43c6-87c7-dd273732b3a4", "properties_hs_is_forecastable": "true", "properties_hs_is_legacy": null, "properties_hs_kpi_display_unit": "hour", "properties_hs_kpi_filter_group_without_team_id": null, "properties_hs_kpi_filter_groups": "[{\"filters\":[{\"property\":\"hs_pipeline\",\"operator\":\"IN\",\"values\":[\"0\"]}]}]", "properties_hs_kpi_is_team_rollup": false, "properties_hs_kpi_metric_type": "AVG", "properties_hs_kpi_object_type": "TICKET", "properties_hs_kpi_object_type_id": "0-5", "properties_hs_kpi_progress_percent": null, "properties_hs_kpi_property_name": "time_to_first_agent_reply", "properties_hs_kpi_single_object_custom_goal_type_name": "avg_time_to_first_agent_reply_0-5", "properties_hs_kpi_time_period_property": "createdate", "properties_hs_kpi_tracking_method": "LOWER_IS_BETTER", "properties_hs_kpi_unit_type": "duration", "properties_hs_kpi_value": 0.0, "properties_hs_kpi_value_calculated_at": null, "properties_hs_kpi_value_last_calculated_at": "2023-10-01T22:31:08.621000+00:00", "properties_hs_lastmodifieddate": "2023-12-11T20:46:14.473000+00:00", "properties_hs_legacy_active": null, "properties_hs_legacy_created_at": null, "properties_hs_legacy_created_by": null, "properties_hs_legacy_quarterly_target_composite_id": null, "properties_hs_legacy_sql_id": null, "properties_hs_legacy_unique_sql_id": null, "properties_hs_legacy_updated_at": null, "properties_hs_legacy_updated_by": null, "properties_hs_merged_object_ids": null, "properties_hs_migration_soft_delete": null, "properties_hs_milestone": "monthly", "properties_hs_object_id": 221880757010, "properties_hs_object_source": null, "properties_hs_object_source_id": null, "properties_hs_object_source_label": null, "properties_hs_object_source_user_id": null, "properties_hs_outcome": "completed", "properties_hs_owner_ids_of_all_owners": "111730024", "properties_hs_participant_type": "users", "properties_hs_pipelines": "0", "properties_hs_progress_updates_notification_frequency": "weekly", "properties_hs_read_only": null, "properties_hs_should_notify_on_achieved": "false", "properties_hs_should_notify_on_edit_updates": "false", "properties_hs_should_notify_on_exceeded": "false", "properties_hs_should_notify_on_kickoff": "false", "properties_hs_should_notify_on_missed": "false", "properties_hs_should_notify_on_progress_updates": "false", "properties_hs_should_recalculate": "false", "properties_hs_start_date": null, "properties_hs_start_datetime": "2023-09-01T00:00:00+00:00", "properties_hs_static_kpi_filter_groups": "[]", "properties_hs_status": "achieved", "properties_hs_status_display_order": 4, "properties_hs_target_amount": 0.0, "properties_hs_target_amount_in_home_currency": 0.0, "properties_hs_team_id": null, "properties_hs_template_id": 4, "properties_hs_ticket_pipeline_ids": "0", "properties_hs_unique_creation_key": null, "properties_hs_updated_by_user_id": 12282590, "properties_hs_user_id": null, "properties_hs_user_ids_of_all_notification_followers": null, "properties_hs_user_ids_of_all_notification_unfollowers": null, "properties_hs_user_ids_of_all_owners": "26748728", "properties_hs_was_imported": null, "properties_hubspot_owner_assigneddate": null, "properties_hubspot_owner_id": null, "properties_hubspot_team_id": null}, "emitted_at": 1706192378516}
+{"stream": "goals", "data": {"id": "221880757011", "properties": {"hs__migration_soft_delete": null, "hs_ad_account_asset_ids": null, "hs_ad_campaign_asset_ids": null, "hs_all_accessible_team_ids": null, "hs_all_assigned_business_unit_ids": null, "hs_all_owner_ids": null, "hs_all_team_ids": null, "hs_assignee_team_id": null, "hs_assignee_user_id": 26748728, "hs_contact_lifecycle_stage": null, "hs_created_by_user_id": 12282590, "hs_createdate": "2023-04-10T13:57:36.691000+00:00", "hs_currency": null, "hs_deal_pipeline_ids": null, "hs_edit_updates_notification_frequency": "weekly", "hs_end_date": null, "hs_end_datetime": "2023-08-31T23:59:59.999000+00:00", "hs_fiscal_year_offset": 0, "hs_goal_definition_key": null, "hs_goal_definition_key_with_team": null, "hs_goal_definition_key_with_user": null, "hs_goal_name": "Integration Test Goal Hubspot", "hs_goal_target_group_id": 221880750627, "hs_goal_type": "average_ticket_response_time", "hs_group_correlation_uuid": "5c49f251-be20-43c6-87c7-dd273732b3a4", "hs_is_forecastable": "true", "hs_is_legacy": null, "hs_kpi_display_unit": "hour", "hs_kpi_filter_group_without_team_id": null, "hs_kpi_filter_groups": "[{\"filters\":[{\"property\":\"hs_pipeline\",\"operator\":\"IN\",\"values\":[\"0\"]}]}]", "hs_kpi_is_team_rollup": false, "hs_kpi_metric_type": "AVG", "hs_kpi_object_type": "TICKET", "hs_kpi_object_type_id": "0-5", "hs_kpi_progress_percent": null, "hs_kpi_property_name": "time_to_first_agent_reply", "hs_kpi_single_object_custom_goal_type_name": "avg_time_to_first_agent_reply_0-5", "hs_kpi_time_period_property": "createdate", "hs_kpi_tracking_method": "LOWER_IS_BETTER", "hs_kpi_unit_type": "duration", "hs_kpi_value": 0.0, "hs_kpi_value_calculated_at": null, "hs_kpi_value_last_calculated_at": "2023-09-01T15:26:00.500000+00:00", "hs_lastmodifieddate": "2023-12-11T20:46:14.473000+00:00", "hs_legacy_active": null, "hs_legacy_created_at": null, "hs_legacy_created_by": null, "hs_legacy_quarterly_target_composite_id": null, "hs_legacy_sql_id": null, "hs_legacy_unique_sql_id": null, "hs_legacy_updated_at": null, "hs_legacy_updated_by": null, "hs_merged_object_ids": null, "hs_migration_soft_delete": null, "hs_milestone": "monthly", "hs_object_id": 221880757011, "hs_object_source": null, "hs_object_source_id": null, "hs_object_source_label": null, "hs_object_source_user_id": null, "hs_outcome": "completed", "hs_owner_ids_of_all_owners": "111730024", "hs_participant_type": "users", "hs_pipelines": "0", "hs_progress_updates_notification_frequency": "weekly", "hs_read_only": null, "hs_should_notify_on_achieved": "false", "hs_should_notify_on_edit_updates": "false", "hs_should_notify_on_exceeded": "false", "hs_should_notify_on_kickoff": "false", "hs_should_notify_on_missed": "false", "hs_should_notify_on_progress_updates": "false", "hs_should_recalculate": "false", "hs_start_date": null, "hs_start_datetime": "2023-08-01T00:00:00+00:00", "hs_static_kpi_filter_groups": "[]", "hs_status": "achieved", "hs_status_display_order": 4, "hs_target_amount": 0.0, "hs_target_amount_in_home_currency": 0.0, "hs_team_id": null, "hs_template_id": 4, "hs_ticket_pipeline_ids": "0", "hs_unique_creation_key": null, "hs_updated_by_user_id": 12282590, "hs_user_id": null, "hs_user_ids_of_all_notification_followers": null, "hs_user_ids_of_all_notification_unfollowers": null, "hs_user_ids_of_all_owners": "26748728", "hs_was_imported": null, "hubspot_owner_assigneddate": null, "hubspot_owner_id": null, "hubspot_team_id": null}, "createdAt": "2023-04-10T13:57:36.691Z", "updatedAt": "2023-12-11T20:46:14.473Z", "archived": false, "properties_hs__migration_soft_delete": null, "properties_hs_ad_account_asset_ids": null, "properties_hs_ad_campaign_asset_ids": null, "properties_hs_all_accessible_team_ids": null, "properties_hs_all_assigned_business_unit_ids": null, "properties_hs_all_owner_ids": null, "properties_hs_all_team_ids": null, "properties_hs_assignee_team_id": null, "properties_hs_assignee_user_id": 26748728, "properties_hs_contact_lifecycle_stage": null, "properties_hs_created_by_user_id": 12282590, "properties_hs_createdate": "2023-04-10T13:57:36.691000+00:00", "properties_hs_currency": null, "properties_hs_deal_pipeline_ids": null, "properties_hs_edit_updates_notification_frequency": "weekly", "properties_hs_end_date": null, "properties_hs_end_datetime": "2023-08-31T23:59:59.999000+00:00", "properties_hs_fiscal_year_offset": 0, "properties_hs_goal_definition_key": null, "properties_hs_goal_definition_key_with_team": null, "properties_hs_goal_definition_key_with_user": null, "properties_hs_goal_name": "Integration Test Goal Hubspot", "properties_hs_goal_target_group_id": 221880750627, "properties_hs_goal_type": "average_ticket_response_time", "properties_hs_group_correlation_uuid": "5c49f251-be20-43c6-87c7-dd273732b3a4", "properties_hs_is_forecastable": "true", "properties_hs_is_legacy": null, "properties_hs_kpi_display_unit": "hour", "properties_hs_kpi_filter_group_without_team_id": null, "properties_hs_kpi_filter_groups": "[{\"filters\":[{\"property\":\"hs_pipeline\",\"operator\":\"IN\",\"values\":[\"0\"]}]}]", "properties_hs_kpi_is_team_rollup": false, "properties_hs_kpi_metric_type": "AVG", "properties_hs_kpi_object_type": "TICKET", "properties_hs_kpi_object_type_id": "0-5", "properties_hs_kpi_progress_percent": null, "properties_hs_kpi_property_name": "time_to_first_agent_reply", "properties_hs_kpi_single_object_custom_goal_type_name": "avg_time_to_first_agent_reply_0-5", "properties_hs_kpi_time_period_property": "createdate", "properties_hs_kpi_tracking_method": "LOWER_IS_BETTER", "properties_hs_kpi_unit_type": "duration", "properties_hs_kpi_value": 0.0, "properties_hs_kpi_value_calculated_at": null, "properties_hs_kpi_value_last_calculated_at": "2023-09-01T15:26:00.500000+00:00", "properties_hs_lastmodifieddate": "2023-12-11T20:46:14.473000+00:00", "properties_hs_legacy_active": null, "properties_hs_legacy_created_at": null, "properties_hs_legacy_created_by": null, "properties_hs_legacy_quarterly_target_composite_id": null, "properties_hs_legacy_sql_id": null, "properties_hs_legacy_unique_sql_id": null, "properties_hs_legacy_updated_at": null, "properties_hs_legacy_updated_by": null, "properties_hs_merged_object_ids": null, "properties_hs_migration_soft_delete": null, "properties_hs_milestone": "monthly", "properties_hs_object_id": 221880757011, "properties_hs_object_source": null, "properties_hs_object_source_id": null, "properties_hs_object_source_label": null, "properties_hs_object_source_user_id": null, "properties_hs_outcome": "completed", "properties_hs_owner_ids_of_all_owners": "111730024", "properties_hs_participant_type": "users", "properties_hs_pipelines": "0", "properties_hs_progress_updates_notification_frequency": "weekly", "properties_hs_read_only": null, "properties_hs_should_notify_on_achieved": "false", "properties_hs_should_notify_on_edit_updates": "false", "properties_hs_should_notify_on_exceeded": "false", "properties_hs_should_notify_on_kickoff": "false", "properties_hs_should_notify_on_missed": "false", "properties_hs_should_notify_on_progress_updates": "false", "properties_hs_should_recalculate": "false", "properties_hs_start_date": null, "properties_hs_start_datetime": "2023-08-01T00:00:00+00:00", "properties_hs_static_kpi_filter_groups": "[]", "properties_hs_status": "achieved", "properties_hs_status_display_order": 4, "properties_hs_target_amount": 0.0, "properties_hs_target_amount_in_home_currency": 0.0, "properties_hs_team_id": null, "properties_hs_template_id": 4, "properties_hs_ticket_pipeline_ids": "0", "properties_hs_unique_creation_key": null, "properties_hs_updated_by_user_id": 12282590, "properties_hs_user_id": null, "properties_hs_user_ids_of_all_notification_followers": null, "properties_hs_user_ids_of_all_notification_unfollowers": null, "properties_hs_user_ids_of_all_owners": "26748728", "properties_hs_was_imported": null, "properties_hubspot_owner_assigneddate": null, "properties_hubspot_owner_id": null, "properties_hubspot_team_id": null}, "emitted_at": 1706192378517}
+{"stream": "line_items", "data": {"id": "1188257165", "properties": {"amount": 10.0, "createdate": "2021-02-23T20:11:54.030000+00:00", "description": "Baseball hat, medium", "discount": null, "hs_acv": 10.0, "hs_all_accessible_team_ids": null, "hs_all_assigned_business_unit_ids": null, "hs_all_owner_ids": null, "hs_all_team_ids": null, "hs_allow_buyer_selected_quantity": null, "hs_arr": 0.0, "hs_billing_period_end_date": null, "hs_billing_period_start_date": null, "hs_billing_start_delay_days": null, "hs_billing_start_delay_months": null, "hs_billing_start_delay_type": null, "hs_cost_of_goods_sold": 5, "hs_created_by_user_id": 12282590, "hs_createdate": null, "hs_discount_percentage": null, "hs_external_id": null, "hs_images": null, "hs_lastmodifieddate": "2021-07-17T23:50:32.502000+00:00", "hs_line_item_currency_code": null, "hs_margin": 5.0, "hs_margin_acv": 5.0, "hs_margin_arr": 0.0, "hs_margin_mrr": 0.0, "hs_margin_tcv": 5.0, "hs_merged_object_ids": null, "hs_mrr": 0.0, "hs_object_id": 1188257165, "hs_object_source": "CRM_UI", "hs_object_source_id": "integration-test@airbyte.io", "hs_object_source_label": "CRM_UI", "hs_object_source_user_id": 12282590, "hs_position_on_quote": 0, "hs_pre_discount_amount": 10, "hs_product_id": 646778218, "hs_product_type": null, "hs_read_only": null, "hs_recurring_billing_end_date": null, "hs_recurring_billing_number_of_payments": 1, "hs_recurring_billing_period": null, "hs_recurring_billing_start_date": null, "hs_recurring_billing_terms": null, "hs_sku": null, "hs_sync_amount": null, "hs_tcv": 10.0, "hs_term_in_months": null, "hs_total_discount": 0, "hs_unique_creation_key": null, "hs_updated_by_user_id": 12282590, "hs_url": null, "hs_user_ids_of_all_notification_followers": null, "hs_user_ids_of_all_notification_unfollowers": null, "hs_user_ids_of_all_owners": null, "hs_variant_id": null, "hs_was_imported": null, "hubspot_owner_assigneddate": null, "hubspot_owner_id": null, "hubspot_team_id": null, "name": "Blue Hat", "price": 10, "quantity": 1, "recurringbillingfrequency": null, "tax": null, "test": null, "test_product_price": null}, "createdAt": "2021-02-23T20:11:54.030Z", "updatedAt": "2021-07-17T23:50:32.502Z", "archived": false, "properties_amount": 10.0, "properties_createdate": "2021-02-23T20:11:54.030000+00:00", "properties_description": "Baseball hat, medium", "properties_discount": null, "properties_hs_acv": 10.0, "properties_hs_all_accessible_team_ids": null, "properties_hs_all_assigned_business_unit_ids": null, "properties_hs_all_owner_ids": null, "properties_hs_all_team_ids": null, "properties_hs_allow_buyer_selected_quantity": null, "properties_hs_arr": 0.0, "properties_hs_billing_period_end_date": null, "properties_hs_billing_period_start_date": null, "properties_hs_billing_start_delay_days": null, "properties_hs_billing_start_delay_months": null, "properties_hs_billing_start_delay_type": null, "properties_hs_cost_of_goods_sold": 5, "properties_hs_created_by_user_id": 12282590, "properties_hs_createdate": null, "properties_hs_discount_percentage": null, "properties_hs_external_id": null, "properties_hs_images": null, "properties_hs_lastmodifieddate": "2021-07-17T23:50:32.502000+00:00", "properties_hs_line_item_currency_code": null, "properties_hs_margin": 5.0, "properties_hs_margin_acv": 5.0, "properties_hs_margin_arr": 0.0, "properties_hs_margin_mrr": 0.0, "properties_hs_margin_tcv": 5.0, "properties_hs_merged_object_ids": null, "properties_hs_mrr": 0.0, "properties_hs_object_id": 1188257165, "properties_hs_object_source": "CRM_UI", "properties_hs_object_source_id": "integration-test@airbyte.io", "properties_hs_object_source_label": "CRM_UI", "properties_hs_object_source_user_id": 12282590, "properties_hs_position_on_quote": 0, "properties_hs_pre_discount_amount": 10, "properties_hs_product_id": 646778218, "properties_hs_product_type": null, "properties_hs_read_only": null, "properties_hs_recurring_billing_end_date": null, "properties_hs_recurring_billing_number_of_payments": 1, "properties_hs_recurring_billing_period": null, "properties_hs_recurring_billing_start_date": null, "properties_hs_recurring_billing_terms": null, "properties_hs_sku": null, "properties_hs_sync_amount": null, "properties_hs_tcv": 10.0, "properties_hs_term_in_months": null, "properties_hs_total_discount": 0, "properties_hs_unique_creation_key": null, "properties_hs_updated_by_user_id": 12282590, "properties_hs_url": null, "properties_hs_user_ids_of_all_notification_followers": null, "properties_hs_user_ids_of_all_notification_unfollowers": null, "properties_hs_user_ids_of_all_owners": null, "properties_hs_variant_id": null, "properties_hs_was_imported": null, "properties_hubspot_owner_assigneddate": null, "properties_hubspot_owner_id": null, "properties_hubspot_team_id": null, "properties_name": "Blue Hat", "properties_price": 10, "properties_quantity": 1, "properties_recurringbillingfrequency": null, "properties_tax": null, "properties_test": null, "properties_test_product_price": null}, "emitted_at": 1706192514669}
+{"stream": "line_items", "data": {"id": "1188257309", "properties": {"amount": 10.0, "createdate": "2021-02-23T20:11:54.030000+00:00", "description": "Baseball hat, medium", "discount": null, "hs_acv": 10.0, "hs_all_accessible_team_ids": null, "hs_all_assigned_business_unit_ids": null, "hs_all_owner_ids": null, "hs_all_team_ids": null, "hs_allow_buyer_selected_quantity": null, "hs_arr": 0.0, "hs_billing_period_end_date": null, "hs_billing_period_start_date": null, "hs_billing_start_delay_days": null, "hs_billing_start_delay_months": null, "hs_billing_start_delay_type": null, "hs_cost_of_goods_sold": 5, "hs_created_by_user_id": 12282590, "hs_createdate": null, "hs_discount_percentage": null, "hs_external_id": null, "hs_images": null, "hs_lastmodifieddate": "2021-07-19T03:57:09.834000+00:00", "hs_line_item_currency_code": null, "hs_margin": 5.0, "hs_margin_acv": 5.0, "hs_margin_arr": 0.0, "hs_margin_mrr": 0.0, "hs_margin_tcv": 5.0, "hs_merged_object_ids": null, "hs_mrr": 0.0, "hs_object_id": 1188257309, "hs_object_source": "CRM_UI", "hs_object_source_id": "integration-test@airbyte.io", "hs_object_source_label": "CRM_UI", "hs_object_source_user_id": 12282590, "hs_position_on_quote": 0, "hs_pre_discount_amount": 10, "hs_product_id": 646778218, "hs_product_type": null, "hs_read_only": null, "hs_recurring_billing_end_date": null, "hs_recurring_billing_number_of_payments": 1, "hs_recurring_billing_period": null, "hs_recurring_billing_start_date": null, "hs_recurring_billing_terms": null, "hs_sku": null, "hs_sync_amount": null, "hs_tcv": 10.0, "hs_term_in_months": null, "hs_total_discount": 0, "hs_unique_creation_key": null, "hs_updated_by_user_id": 12282590, "hs_url": null, "hs_user_ids_of_all_notification_followers": null, "hs_user_ids_of_all_notification_unfollowers": null, "hs_user_ids_of_all_owners": null, "hs_variant_id": null, "hs_was_imported": null, "hubspot_owner_assigneddate": null, "hubspot_owner_id": null, "hubspot_team_id": null, "name": "Blue Hat", "price": 10, "quantity": 1, "recurringbillingfrequency": null, "tax": null, "test": null, "test_product_price": null}, "createdAt": "2021-02-23T20:11:54.030Z", "updatedAt": "2021-07-19T03:57:09.834Z", "archived": false, "properties_amount": 10.0, "properties_createdate": "2021-02-23T20:11:54.030000+00:00", "properties_description": "Baseball hat, medium", "properties_discount": null, "properties_hs_acv": 10.0, "properties_hs_all_accessible_team_ids": null, "properties_hs_all_assigned_business_unit_ids": null, "properties_hs_all_owner_ids": null, "properties_hs_all_team_ids": null, "properties_hs_allow_buyer_selected_quantity": null, "properties_hs_arr": 0.0, "properties_hs_billing_period_end_date": null, "properties_hs_billing_period_start_date": null, "properties_hs_billing_start_delay_days": null, "properties_hs_billing_start_delay_months": null, "properties_hs_billing_start_delay_type": null, "properties_hs_cost_of_goods_sold": 5, "properties_hs_created_by_user_id": 12282590, "properties_hs_createdate": null, "properties_hs_discount_percentage": null, "properties_hs_external_id": null, "properties_hs_images": null, "properties_hs_lastmodifieddate": "2021-07-19T03:57:09.834000+00:00", "properties_hs_line_item_currency_code": null, "properties_hs_margin": 5.0, "properties_hs_margin_acv": 5.0, "properties_hs_margin_arr": 0.0, "properties_hs_margin_mrr": 0.0, "properties_hs_margin_tcv": 5.0, "properties_hs_merged_object_ids": null, "properties_hs_mrr": 0.0, "properties_hs_object_id": 1188257309, "properties_hs_object_source": "CRM_UI", "properties_hs_object_source_id": "integration-test@airbyte.io", "properties_hs_object_source_label": "CRM_UI", "properties_hs_object_source_user_id": 12282590, "properties_hs_position_on_quote": 0, "properties_hs_pre_discount_amount": 10, "properties_hs_product_id": 646778218, "properties_hs_product_type": null, "properties_hs_read_only": null, "properties_hs_recurring_billing_end_date": null, "properties_hs_recurring_billing_number_of_payments": 1, "properties_hs_recurring_billing_period": null, "properties_hs_recurring_billing_start_date": null, "properties_hs_recurring_billing_terms": null, "properties_hs_sku": null, "properties_hs_sync_amount": null, "properties_hs_tcv": 10.0, "properties_hs_term_in_months": null, "properties_hs_total_discount": 0, "properties_hs_unique_creation_key": null, "properties_hs_updated_by_user_id": 12282590, "properties_hs_url": null, "properties_hs_user_ids_of_all_notification_followers": null, "properties_hs_user_ids_of_all_notification_unfollowers": null, "properties_hs_user_ids_of_all_owners": null, "properties_hs_variant_id": null, "properties_hs_was_imported": null, "properties_hubspot_owner_assigneddate": null, "properties_hubspot_owner_id": null, "properties_hubspot_team_id": null, "properties_name": "Blue Hat", "properties_price": 10, "properties_quantity": 1, "properties_recurringbillingfrequency": null, "properties_tax": null, "properties_test": null, "properties_test_product_price": null}, "emitted_at": 1706192514672}
+{"stream": "line_items", "data": {"id": "1510167477", "properties": {"amount": 20.0, "createdate": "2021-05-21T10:22:40.683000+00:00", "description": "Top hat, large", "discount": null, "hs_acv": 60.0, "hs_all_accessible_team_ids": null, "hs_all_assigned_business_unit_ids": null, "hs_all_owner_ids": null, "hs_all_team_ids": null, "hs_allow_buyer_selected_quantity": null, "hs_arr": 60.0, "hs_billing_period_end_date": null, "hs_billing_period_start_date": null, "hs_billing_start_delay_days": null, "hs_billing_start_delay_months": null, "hs_billing_start_delay_type": null, "hs_cost_of_goods_sold": 10, "hs_created_by_user_id": 12282590, "hs_createdate": null, "hs_discount_percentage": null, "hs_external_id": null, "hs_images": null, "hs_lastmodifieddate": "2022-02-23T08:09:16.555000+00:00", "hs_line_item_currency_code": null, "hs_margin": 10.0, "hs_margin_acv": 30.0, "hs_margin_arr": 30.0, "hs_margin_mrr": 10.0, "hs_margin_tcv": 30.0, "hs_merged_object_ids": null, "hs_mrr": 20.0, "hs_object_id": 1510167477, "hs_object_source": "CRM_UI", "hs_object_source_id": "userId:12282590", "hs_object_source_label": "CRM_UI", "hs_object_source_user_id": 12282590, "hs_position_on_quote": null, "hs_pre_discount_amount": 20, "hs_product_id": 646777910, "hs_product_type": null, "hs_read_only": null, "hs_recurring_billing_end_date": "2022-05-28", "hs_recurring_billing_number_of_payments": 3, "hs_recurring_billing_period": "P3M", "hs_recurring_billing_start_date": "2022-02-28", "hs_recurring_billing_terms": null, "hs_sku": null, "hs_sync_amount": null, "hs_tcv": 60.0, "hs_term_in_months": 3, "hs_total_discount": 0, "hs_unique_creation_key": null, "hs_updated_by_user_id": 12282590, "hs_url": null, "hs_user_ids_of_all_notification_followers": null, "hs_user_ids_of_all_notification_unfollowers": null, "hs_user_ids_of_all_owners": null, "hs_variant_id": null, "hs_was_imported": null, "hubspot_owner_assigneddate": null, "hubspot_owner_id": null, "hubspot_team_id": null, "name": "Red Hat", "price": 20, "quantity": 1, "recurringbillingfrequency": "monthly", "tax": null, "test": "2022-02-24", "test_product_price": "2022-02-23"}, "createdAt": "2021-05-21T10:22:40.683Z", "updatedAt": "2022-02-23T08:09:16.555Z", "archived": false, "properties_amount": 20.0, "properties_createdate": "2021-05-21T10:22:40.683000+00:00", "properties_description": "Top hat, large", "properties_discount": null, "properties_hs_acv": 60.0, "properties_hs_all_accessible_team_ids": null, "properties_hs_all_assigned_business_unit_ids": null, "properties_hs_all_owner_ids": null, "properties_hs_all_team_ids": null, "properties_hs_allow_buyer_selected_quantity": null, "properties_hs_arr": 60.0, "properties_hs_billing_period_end_date": null, "properties_hs_billing_period_start_date": null, "properties_hs_billing_start_delay_days": null, "properties_hs_billing_start_delay_months": null, "properties_hs_billing_start_delay_type": null, "properties_hs_cost_of_goods_sold": 10, "properties_hs_created_by_user_id": 12282590, "properties_hs_createdate": null, "properties_hs_discount_percentage": null, "properties_hs_external_id": null, "properties_hs_images": null, "properties_hs_lastmodifieddate": "2022-02-23T08:09:16.555000+00:00", "properties_hs_line_item_currency_code": null, "properties_hs_margin": 10.0, "properties_hs_margin_acv": 30.0, "properties_hs_margin_arr": 30.0, "properties_hs_margin_mrr": 10.0, "properties_hs_margin_tcv": 30.0, "properties_hs_merged_object_ids": null, "properties_hs_mrr": 20.0, "properties_hs_object_id": 1510167477, "properties_hs_object_source": "CRM_UI", "properties_hs_object_source_id": "userId:12282590", "properties_hs_object_source_label": "CRM_UI", "properties_hs_object_source_user_id": 12282590, "properties_hs_position_on_quote": null, "properties_hs_pre_discount_amount": 20, "properties_hs_product_id": 646777910, "properties_hs_product_type": null, "properties_hs_read_only": null, "properties_hs_recurring_billing_end_date": "2022-05-28", "properties_hs_recurring_billing_number_of_payments": 3, "properties_hs_recurring_billing_period": "P3M", "properties_hs_recurring_billing_start_date": "2022-02-28", "properties_hs_recurring_billing_terms": null, "properties_hs_sku": null, "properties_hs_sync_amount": null, "properties_hs_tcv": 60.0, "properties_hs_term_in_months": 3, "properties_hs_total_discount": 0, "properties_hs_unique_creation_key": null, "properties_hs_updated_by_user_id": 12282590, "properties_hs_url": null, "properties_hs_user_ids_of_all_notification_followers": null, "properties_hs_user_ids_of_all_notification_unfollowers": null, "properties_hs_user_ids_of_all_owners": null, "properties_hs_variant_id": null, "properties_hs_was_imported": null, "properties_hubspot_owner_assigneddate": null, "properties_hubspot_owner_id": null, "properties_hubspot_team_id": null, "properties_name": "Red Hat", "properties_price": 20, "properties_quantity": 1, "properties_recurringbillingfrequency": "monthly", "properties_tax": null, "properties_test": "2022-02-24", "properties_test_product_price": "2022-02-23"}, "emitted_at": 1706192514674}
+{"stream": "marketing_emails", "data": {"ab": false, "abHoursToWait": 4, "abSampleSizeDefault": null, "abSamplingDefault": null, "abSuccessMetric": null, "abTestPercentage": 50, "abVariation": false, "absoluteUrl": "http://integrationtest-dev-8727216-8727216.hs-sites.com/-temporary-slug-86812db1-e3c8-43cd-ae80-69a0934cd1de", "aifeatures": null, "allEmailCampaignIds": [243851494], "analyticsPageId": "100523515217", "analyticsPageType": "email", "archivedAt": 0, "archivedInDashboard": false, "audienceAccess": "PUBLIC", "author": "integration-test@airbyte.io", "authorName": "Team-1 Airbyte", "blogRssSettings": null, "canSpamSettingsId": 36765207029, "categoryId": 2, "contentAccessRuleIds": [], "contentAccessRuleTypes": [], "contentTypeCategory": 2, "createPage": false, "created": 1675121582718, "createdById": 12282590, "currentState": "PUBLISHED", "currentlyPublished": true, "customReplyTo": "", "customReplyToEnabled": false, "domain": "", "emailBody": "{% content_attribute \"email_body\" %}{{ default_email_body }}{% end_content_attribute %}", "emailNote": "", "emailTemplateMode": "DRAG_AND_DROP", "emailType": "BATCH_EMAIL", "emailbodyPlaintext": "", "feedbackSurveyId": null, "flexAreas": {"main": {"boxed": false, "isSingleColumnFullWidth": false, "sections": [{"columns": [{"id": "column-0-0", "widgets": ["module-0-0-0"], "width": 12}], "id": "section-0", "style": {"backgroundColor": "#eaf0f6", "backgroundType": "CONTENT", "paddingBottom": "10px", "paddingTop": "10px"}}, {"columns": [{"id": "column-1-0", "widgets": ["module-1-0-0"], "width": 12}], "id": "section-1", "style": {"backgroundType": "CONTENT", "paddingBottom": "30px", "paddingTop": "30px"}}, {"columns": [{"id": "column-2-0", "widgets": ["module-2-0-0"], "width": 12}], "id": "section-2", "style": {"backgroundColor": "", "backgroundType": "CONTENT", "paddingBottom": "20px", "paddingTop": "20px"}}]}}, "freezeDate": 1675121645993, "fromName": "Team Airbyte", "hasContentAccessRules": false, "htmlTitle": "", "id": 100523515217, "isCreatedFomSandboxSync": false, "isGraymailSuppressionEnabled": true, "isInstanceLayoutPage": false, "isPublished": true, "isRecipientFatigueSuppressionEnabled": null, "language": "en", "layoutSections": {}, "liveDomain": "integrationtest-dev-8727216-8727216.hs-sites.com", "mailingListsExcluded": [], "mailingListsIncluded": [], "maxRssEntries": 5, "metaDescription": "", "name": "test", "pageExpiryEnabled": false, "pageRedirected": false, "pastMabExperimentIds": [], "portalId": 8727216, "previewKey": "nlkwziGL", "primaryEmailCampaignId": 243851494, "processingStatus": "PUBLISHED", "publishDate": 1675121645000, "publishImmediately": true, "publishedAt": 1675121646297, "publishedByEmail": "integration-test@airbyte.io", "publishedById": 12282590, "publishedByName": "Team-1 Airbyte", "publishedUrl": "http://integrationtest-dev-8727216-8727216.hs-sites.com/-temporary-slug-86812db1-e3c8-43cd-ae80-69a0934cd1de", "replyTo": "integration-test@airbyte.io", "resolvedDomain": "integrationtest-dev-8727216-8727216.hs-sites.com", "rootMicId": null, "rssEmailByText": "By", "rssEmailClickThroughText": "Read more &raquo;", "rssEmailCommentText": "Comment &raquo;", "rssEmailEntryTemplateEnabled": false, "rssEmailImageMaxWidth": 0, "rssEmailUrl": "", "sections": {}, "securityState": "NONE", "selected": 0, "slug": "-temporary-slug-86812db1-e3c8-43cd-ae80-69a0934cd1de", "smartEmailFields": {}, "state": "PUBLISHED", "stats": {"counters": {"sent": 0, "open": 0, "delivered": 0, "bounce": 0, "unsubscribed": 0, "click": 0, "reply": 0, "dropped": 1, "selected": 1, "spamreport": 0, "suppressed": 0, "hardbounced": 0, "softbounced": 0, "pending": 0, "contactslost": 0, "notsent": 1}, "deviceBreakdown": {"open_device_type": {"computer": 0, "mobile": 0, "unknown": 0}, "click_device_type": {"computer": 0, "mobile": 0, "unknown": 0}}, "failedToLoad": false, "qualifierStats": {}, "ratios": {"clickratio": 0, "clickthroughratio": 0, "deliveredratio": 0, "openratio": 0, "replyratio": 0, "unsubscribedratio": 0, "spamreportratio": 0, "bounceratio": 0, "hardbounceratio": 0, "softbounceratio": 0, "contactslostratio": 0, "pendingratio": 0, "notsentratio": 100.0}}, "styleSettings": {"background_color": "#EAF0F6", "background_image": null, "background_image_type": null, "body_border_color": "#EAF0F6", "body_border_color_choice": "BORDER_MANUAL", "body_border_width": "1", "body_color": "#ffffff", "color_picker_favorite1": null, "color_picker_favorite2": null, "color_picker_favorite3": null, "color_picker_favorite4": null, "color_picker_favorite5": null, "color_picker_favorite6": null, "email_body_padding": null, "email_body_width": null, "heading_one_font": {"bold": null, "color": null, "font": null, "font_style": {}, "italic": null, "size": "28", "underline": null}, "heading_two_font": {"bold": null, "color": null, "font": null, "font_style": {}, "italic": null, "size": "22", "underline": null}, "links_font": {"bold": false, "color": "#00a4bd", "font": null, "font_style": {}, "italic": false, "size": null, "underline": true}, "primary_accent_color": null, "primary_font": "Arial, sans-serif", "primary_font_color": "#23496d", "primary_font_line_height": null, "primary_font_size": "15", "secondary_accent_color": null, "secondary_font": "Arial, sans-serif", "secondary_font_color": "#23496d", "secondary_font_line_height": null, "secondary_font_size": "12", "use_email_client_default_settings": false, "user_module_defaults": {"button_email": {"background_color": "#00a4bd", "corner_radius": 8, "font": "Arial, sans-serif", "font_color": "#ffffff", "font_size": 16, "font_style": {"color": "#ffffff", "font": "Arial, sans-serif", "size": {"units": "px", "value": 16}, "styles": {"bold": false, "italic": false, "underline": false}}}, "email_divider": {"color": {"color": "#23496d", "opacity": 100}, "height": 1, "line_type": "solid"}}}, "subcategory": "batch", "subject": "test", "subscription": 23704464, "subscriptionName": "Test sub", "teamPerms": [], "templatePath": "@hubspot/email/dnd/welcome.html", "transactional": false, "translations": {}, "unpublishedAt": 0, "updated": 1675121702583, "updatedById": 12282590, "url": "http://integrationtest-dev-8727216-8727216.hs-sites.com/-temporary-slug-86812db1-e3c8-43cd-ae80-69a0934cd1de", "useRssHeadlineAsSubject": false, "userPerms": [], "vidsExcluded": [], "vidsIncluded": [2501], "visibleToAll": true}, "emitted_at": 1706192639128}
+{"stream": "marketing_emails", "data": {"ab": false, "abHoursToWait": 4, "abSampleSizeDefault": null, "abSamplingDefault": null, "abSuccessMetric": null, "abTestPercentage": 50, "abVariation": false, "absoluteUrl": "http://integrationtest-dev-8727216-8727216.hs-sites.com/-temporary-slug-f142cfbc-0d58-4eb5-b442-0d221f27b420", "aifeatures": null, "allEmailCampaignIds": [169919555], "analyticsPageId": "57347028995", "analyticsPageType": "email", "archivedAt": 0, "archivedInDashboard": false, "audienceAccess": "PUBLIC", "author": "integration-test@airbyte.io", "authorName": "Team-1 Airbyte", "blogRssSettings": null, "canSpamSettingsId": 36765207029, "categoryId": 2, "contentAccessRuleIds": [], "contentAccessRuleTypes": [], "contentTypeCategory": 2, "createPage": false, "created": 1634050240841, "createdById": 12282590, "currentState": "PUBLISHED", "currentlyPublished": true, "customReplyTo": "", "customReplyToEnabled": false, "domain": "", "emailBody": "{% content_attribute \"email_body\" %}{{ default_email_body }}{% end_content_attribute %}", "emailNote": "", "emailTemplateMode": "DRAG_AND_DROP", "emailType": "BATCH_EMAIL", "emailbodyPlaintext": "", "feedbackSurveyId": null, "flexAreas": {"main": {"boxed": false, "isSingleColumnFullWidth": false, "sections": [{"columns": [{"id": "column-0-0", "widgets": ["module-0-0-0"], "width": 12}], "id": "section-0", "style": {"backgroundType": "CONTENT", "paddingBottom": "40px", "paddingTop": "40px"}}, {"columns": [{"id": "column-1-0", "widgets": ["module-1-0-0"], "width": 12}], "id": "section-1", "style": {"backgroundColor": "", "backgroundType": "CONTENT", "paddingBottom": "0px", "paddingTop": "0px"}}]}}, "freezeDate": 1634050421336, "fromName": "Team Airbyte", "hasContentAccessRules": false, "htmlTitle": "", "id": 57347028995, "isCreatedFomSandboxSync": false, "isGraymailSuppressionEnabled": true, "isInstanceLayoutPage": false, "isPublished": true, "isRecipientFatigueSuppressionEnabled": null, "language": "en", "layoutSections": {}, "liveDomain": "integrationtest-dev-8727216-8727216.hs-sites.com", "mailingListsExcluded": [], "mailingListsIncluded": [130, 129, 131, 128, 126, 127, 125, 124, 123, 122, 121, 120, 119, 118, 117, 116], "maxRssEntries": 5, "metaDescription": "", "name": "First test email - 1", "pageExpiryEnabled": false, "pageRedirected": false, "pastMabExperimentIds": [], "portalId": 8727216, "previewKey": "bgNuSvDn", "primaryEmailCampaignId": 169919555, "processingStatus": "PUBLISHED", "publishDate": 1634050421000, "publishImmediately": true, "publishedAt": 1634050421580, "publishedByEmail": "integration-test@airbyte.io", "publishedById": 12282590, "publishedByName": "Team-1 Airbyte", "publishedUrl": "http://integrationtest-dev-8727216-8727216.hs-sites.com/-temporary-slug-f142cfbc-0d58-4eb5-b442-0d221f27b420", "replyTo": "integration-test@airbyte.io", "resolvedDomain": "integrationtest-dev-8727216-8727216.hs-sites.com", "rootMicId": null, "rssEmailByText": "By", "rssEmailClickThroughText": "Read more &raquo;", "rssEmailCommentText": "Comment &raquo;", "rssEmailEntryTemplateEnabled": false, "rssEmailImageMaxWidth": 0, "rssEmailUrl": "", "sections": {}, "securityState": "NONE", "selected": 0, "slug": "-temporary-slug-f142cfbc-0d58-4eb5-b442-0d221f27b420", "smartEmailFields": {}, "state": "PUBLISHED", "stats": {"counters": {"sent": 0}, "deviceBreakdown": {}, "failedToLoad": false, "qualifierStats": {}, "ratios": {"clickratio": 0, "clickthroughratio": 0, "deliveredratio": 0, "openratio": 0, "replyratio": 0, "unsubscribedratio": 0, "spamreportratio": 0, "bounceratio": 0, "hardbounceratio": 0, "softbounceratio": 0, "contactslostratio": 0, "pendingratio": 0, "notsentratio": 0}}, "styleSettings": {"background_color": "#ffffff", "background_image": null, "background_image_type": null, "body_border_color": null, "body_border_color_choice": null, "body_border_width": "1", "body_color": "#ffffff", "color_picker_favorite1": null, "color_picker_favorite2": null, "color_picker_favorite3": null, "color_picker_favorite4": null, "color_picker_favorite5": null, "color_picker_favorite6": null, "email_body_padding": null, "email_body_width": null, "heading_one_font": {"bold": null, "color": null, "font": null, "font_style": {}, "italic": null, "size": "28", "underline": null}, "heading_two_font": {"bold": null, "color": null, "font": null, "font_style": {}, "italic": null, "size": "22", "underline": null}, "links_font": {"bold": false, "color": "#00a4bd", "font": null, "font_style": {}, "italic": false, "size": null, "underline": true}, "primary_accent_color": null, "primary_font": "Arial, sans-serif", "primary_font_color": "#23496d", "primary_font_line_height": null, "primary_font_size": "15", "secondary_accent_color": null, "secondary_font": "Arial, sans-serif", "secondary_font_color": "#23496d", "secondary_font_line_height": null, "secondary_font_size": "12", "use_email_client_default_settings": false, "user_module_defaults": {"button_email": {"background_color": null, "corner_radius": 8, "font": "Arial, sans-serif", "font_color": "#ffffff", "font_size": 16, "font_style": {"color": "#ffffff", "font": "Arial, sans-serif", "size": {"units": "px", "value": 16}, "styles": {"bold": false, "italic": false, "underline": false}}}, "email_divider": {"color": {"color": "#000000", "opacity": 100}, "height": 1, "line_type": null}}}, "subcategory": "batch", "subject": "Subject l", "subscription": 23704464, "subscriptionName": "Test sub", "teamPerms": [], "templatePath": "@hubspot/email/dnd/plain_text.html", "transactional": false, "translations": {}, "unpublishedAt": 0, "updated": 1634050455543, "updatedById": 12282590, "url": "http://integrationtest-dev-8727216-8727216.hs-sites.com/-temporary-slug-f142cfbc-0d58-4eb5-b442-0d221f27b420", "useRssHeadlineAsSubject": false, "userPerms": [], "vidsExcluded": [], "vidsIncluded": [], "visibleToAll": true}, "emitted_at": 1706192639130}
+{"stream": "marketing_emails", "data": {"ab": false, "abHoursToWait": 4, "abSampleSizeDefault": null, "abSamplingDefault": null, "abSuccessMetric": null, "abTestPercentage": 50, "abVariation": false, "absoluteUrl": "http://integrationtest-dev-8727216-8727216.hs-sites.com/-temporary-slug-fb53d6bf-1eb6-4ee6-90fe-610fc2569ea7", "aifeatures": null, "allEmailCampaignIds": [], "analyticsPageId": "42930862366", "analyticsPageType": "email", "archivedAt": 0, "archivedInDashboard": false, "audienceAccess": "PUBLIC", "author": "integration-test@airbyte.io", "authorName": "Team-1 Airbyte", "blogRssSettings": null, "canSpamSettingsId": 36765207029, "categoryId": 2, "clonedFrom": 41886608509, "contentAccessRuleIds": [], "contentAccessRuleTypes": [], "contentTypeCategory": 2, "createPage": false, "created": 1615502115346, "createdById": 100, "currentState": "AUTOMATED_DRAFT", "currentlyPublished": false, "customReplyTo": "", "customReplyToEnabled": false, "domain": "", "emailBody": "{% content_attribute \"email_body\" %}{{ default_email_body }}{% end_content_attribute %}", "emailNote": "", "emailTemplateMode": "DRAG_AND_DROP", "emailType": "AUTOMATED_EMAIL", "emailbodyPlaintext": "", "feedbackSurveyId": null, "flexAreas": {"main": {"boxed": false, "isSingleColumnFullWidth": false, "sections": [{"columns": [{"id": "column-0-1", "widgets": ["module-0-1-1"], "width": 12}], "id": "section-0", "style": {"backgroundColor": "#eaf0f6", "backgroundType": "CONTENT", "paddingBottom": "10px", "paddingTop": "10px"}}, {"columns": [{"id": "column-1-1", "widgets": ["module-1-1-1"], "width": 12}], "id": "section-1", "style": {"backgroundType": "CONTENT", "paddingBottom": "30px", "paddingTop": "30px"}}, {"columns": [{"id": "column-2-1", "widgets": ["module-2-1-1"], "width": 12}], "id": "section-2", "style": {"backgroundColor": "", "backgroundType": "CONTENT", "paddingBottom": "20px", "paddingTop": "20px"}}]}}, "freezeDate": 1634042970319, "fromName": "Team Airbyte", "hasContentAccessRules": false, "htmlTitle": "", "id": 42930862366, "isCreatedFomSandboxSync": false, "isGraymailSuppressionEnabled": false, "isInstanceLayoutPage": false, "isPublished": false, "isRecipientFatigueSuppressionEnabled": null, "language": "en", "lastEditSessionId": 1634042969643, "lastEditUpdateId": 0, "layoutSections": {}, "liveDomain": "integrationtest-dev-8727216-8727216.hs-sites.com", "mailingListsExcluded": [], "mailingListsIncluded": [], "maxRssEntries": 5, "metaDescription": "", "name": "Test subject (Test campaing - Clone)", "pageExpiryEnabled": false, "pageRedirected": false, "pastMabExperimentIds": [], "portalId": 8727216, "previewKey": "UmZGYZsU", "processingStatus": "UNDEFINED", "publishDate": 1634042970000, "publishImmediately": true, "publishedUrl": "", "replyTo": "integration-test@airbyte.io", "resolvedDomain": "integrationtest-dev-8727216-8727216.hs-sites.com", "rootMicId": null, "rssEmailByText": "By", "rssEmailClickThroughText": "Read more &raquo;", "rssEmailCommentText": "Comment &raquo;", "rssEmailEntryTemplateEnabled": false, "rssEmailImageMaxWidth": 0, "rssEmailUrl": "", "sections": {}, "securityState": "NONE", "slug": "-temporary-slug-fb53d6bf-1eb6-4ee6-90fe-610fc2569ea7", "smartEmailFields": {}, "state": "AUTOMATED_DRAFT", "styleSettings": {"background_color": "#EAF0F6", "background_image": null, "background_image_type": null, "body_border_color": "#EAF0F6", "body_border_color_choice": "BORDER_MANUAL", "body_border_width": "1", "body_color": "#ffffff", "color_picker_favorite1": null, "color_picker_favorite2": null, "color_picker_favorite3": null, "color_picker_favorite4": null, "color_picker_favorite5": null, "color_picker_favorite6": null, "email_body_padding": null, "email_body_width": null, "heading_one_font": {"bold": null, "color": null, "font": null, "font_style": {}, "italic": null, "size": "28", "underline": null}, "heading_two_font": {"bold": null, "color": null, "font": null, "font_style": {}, "italic": null, "size": "22", "underline": null}, "links_font": {"bold": false, "color": "#00a4bd", "font": null, "font_style": {}, "italic": false, "size": null, "underline": true}, "primary_accent_color": null, "primary_font": "Arial, sans-serif", "primary_font_color": "#23496d", "primary_font_line_height": null, "primary_font_size": "15", "secondary_accent_color": null, "secondary_font": "Arial, sans-serif", "secondary_font_color": "#23496d", "secondary_font_line_height": null, "secondary_font_size": "12", "use_email_client_default_settings": false, "user_module_defaults": {"button_email": {"background_color": "#00a4bd", "corner_radius": 8, "font": "Arial, sans-serif", "font_color": "#ffffff", "font_size": 16, "font_style": {"color": "#ffffff", "font": "Arial, sans-serif", "size": {"units": "px", "value": 16}, "styles": {"bold": false, "italic": false, "underline": false}}}, "email_divider": {"color": {"color": "#23496d", "opacity": 100}, "height": 1, "line_type": "solid"}}}, "subcategory": "automated", "subject": "Test subject", "subscription": 11890831, "subscriptionName": "Test subscription", "teamPerms": [], "templatePath": "@hubspot/email/dnd/welcome.html", "transactional": false, "translations": {}, "unpublishedAt": 0, "updated": 1634042970321, "updatedById": 12282590, "url": "http://integrationtest-dev-8727216-8727216.hs-sites.com/-temporary-slug-fb53d6bf-1eb6-4ee6-90fe-610fc2569ea7", "useRssHeadlineAsSubject": false, "userPerms": [], "vidsExcluded": [], "vidsIncluded": [], "visibleToAll": true}, "emitted_at": 1706192639131}
 {"stream": "owners", "data": {"id": "52550153", "email": "integration-test@airbyte.io", "firstName": "Team-1", "lastName": "Airbyte", "userId": 12282590, "createdAt": "2020-10-28T21:17:56.082Z", "updatedAt": "2023-01-31T00:25:34.448Z", "archived": false}, "emitted_at": 1697714250730}
 {"stream": "owners", "data": {"id": "65568071", "email": "test-integration-test-user1@airbyte.io", "firstName": "", "lastName": "", "userId": 23660227, "createdAt": "2021-03-15T11:00:50.053Z", "updatedAt": "2021-03-15T11:00:50.053Z", "archived": false}, "emitted_at": 1697714250731}
 {"stream": "owners", "data": {"id": "65568800", "email": "test-integration-test-user2@airbyte.io", "firstName": "", "lastName": "", "userId": 23660229, "createdAt": "2021-03-15T11:01:02.183Z", "updatedAt": "2021-03-15T11:01:02.183Z", "archived": false}, "emitted_at": 1697714250732}
-{"stream": "products", "data": {"id": "646176421", "properties": {"amount": null, "createdate": "2021-02-23T20:03:18.336000+00:00", "description": null, "discount": null, "hs_all_accessible_team_ids": null, "hs_all_assigned_business_unit_ids": null, "hs_all_owner_ids": null, "hs_all_team_ids": null, "hs_avatar_filemanager_key": null, "hs_cost_of_goods_sold": null, "hs_created_by_user_id": 12282590, "hs_createdate": null, "hs_discount_percentage": null, "hs_folder_id": null, "hs_folder_name": null, "hs_images": null, "hs_lastmodifieddate": "2021-02-23T20:03:18.336000+00:00", "hs_merged_object_ids": null, "hs_object_id": 646176421, "hs_object_source": null, "hs_object_source_id": null, "hs_object_source_label": null, "hs_object_source_user_id": null, "hs_product_type": null, "hs_read_only": null, "hs_recurring_billing_period": null, "hs_recurring_billing_start_date": null, "hs_sku": null, "hs_unique_creation_key": null, "hs_updated_by_user_id": 12282590, "hs_url": null, "hs_user_ids_of_all_notification_followers": null, "hs_user_ids_of_all_notification_unfollowers": null, "hs_user_ids_of_all_owners": null, "hs_was_imported": null, "hubspot_owner_assigneddate": null, "hubspot_owner_id": null, "hubspot_team_id": null, "name": "Test product", "price": 100, "quantity": null, "recurringbillingfrequency": null, "tax": null, "test": null, "test_product_price": null}, "createdAt": "2021-02-23T20:03:18.336Z", "updatedAt": "2021-02-23T20:03:18.336Z", "archived": false, "properties_amount": null, "properties_createdate": "2021-02-23T20:03:18.336000+00:00", "properties_description": null, "properties_discount": null, "properties_hs_all_accessible_team_ids": null, "properties_hs_all_assigned_business_unit_ids": null, "properties_hs_all_owner_ids": null, "properties_hs_all_team_ids": null, "properties_hs_avatar_filemanager_key": null, "properties_hs_cost_of_goods_sold": null, "properties_hs_created_by_user_id": 12282590, "properties_hs_createdate": null, "properties_hs_discount_percentage": null, "properties_hs_folder_id": null, "properties_hs_folder_name": null, "properties_hs_images": null, "properties_hs_lastmodifieddate": "2021-02-23T20:03:18.336000+00:00", "properties_hs_merged_object_ids": null, "properties_hs_object_id": 646176421, "properties_hs_object_source": null, "properties_hs_object_source_id": null, "properties_hs_object_source_label": null, "properties_hs_object_source_user_id": null, "properties_hs_product_type": null, "properties_hs_read_only": null, "properties_hs_recurring_billing_period": null, "properties_hs_recurring_billing_start_date": null, "properties_hs_sku": null, "properties_hs_unique_creation_key": null, "properties_hs_updated_by_user_id": 12282590, "properties_hs_url": null, "properties_hs_user_ids_of_all_notification_followers": null, "properties_hs_user_ids_of_all_notification_unfollowers": null, "properties_hs_user_ids_of_all_owners": null, "properties_hs_was_imported": null, "properties_hubspot_owner_assigneddate": null, "properties_hubspot_owner_id": null, "properties_hubspot_team_id": null, "properties_name": "Test product", "properties_price": 100, "properties_quantity": null, "properties_recurringbillingfrequency": null, "properties_tax": null, "properties_test": null, "properties_test_product_price": null}, "emitted_at": 1697714252635}
-{"stream": "products", "data": {"id": "646176423", "properties": {"amount": null, "createdate": "2021-02-23T20:03:48.577000+00:00", "description": null, "discount": null, "hs_all_accessible_team_ids": null, "hs_all_assigned_business_unit_ids": null, "hs_all_owner_ids": null, "hs_all_team_ids": null, "hs_avatar_filemanager_key": null, "hs_cost_of_goods_sold": null, "hs_created_by_user_id": 12282590, "hs_createdate": null, "hs_discount_percentage": null, "hs_folder_id": 2430008, "hs_folder_name": "test folder", "hs_images": null, "hs_lastmodifieddate": "2021-02-23T20:03:48.577000+00:00", "hs_merged_object_ids": null, "hs_object_id": 646176423, "hs_object_source": null, "hs_object_source_id": null, "hs_object_source_label": null, "hs_object_source_user_id": null, "hs_product_type": null, "hs_read_only": null, "hs_recurring_billing_period": null, "hs_recurring_billing_start_date": null, "hs_sku": null, "hs_unique_creation_key": null, "hs_updated_by_user_id": 12282590, "hs_url": null, "hs_user_ids_of_all_notification_followers": null, "hs_user_ids_of_all_notification_unfollowers": null, "hs_user_ids_of_all_owners": null, "hs_was_imported": null, "hubspot_owner_assigneddate": null, "hubspot_owner_id": null, "hubspot_team_id": null, "name": "Test product 1", "price": 123, "quantity": null, "recurringbillingfrequency": null, "tax": null, "test": null, "test_product_price": null}, "createdAt": "2021-02-23T20:03:48.577Z", "updatedAt": "2021-02-23T20:03:48.577Z", "archived": false, "properties_amount": null, "properties_createdate": "2021-02-23T20:03:48.577000+00:00", "properties_description": null, "properties_discount": null, "properties_hs_all_accessible_team_ids": null, "properties_hs_all_assigned_business_unit_ids": null, "properties_hs_all_owner_ids": null, "properties_hs_all_team_ids": null, "properties_hs_avatar_filemanager_key": null, "properties_hs_cost_of_goods_sold": null, "properties_hs_created_by_user_id": 12282590, "properties_hs_createdate": null, "properties_hs_discount_percentage": null, "properties_hs_folder_id": 2430008, "properties_hs_folder_name": "test folder", "properties_hs_images": null, "properties_hs_lastmodifieddate": "2021-02-23T20:03:48.577000+00:00", "properties_hs_merged_object_ids": null, "properties_hs_object_id": 646176423, "properties_hs_object_source": null, "properties_hs_object_source_id": null, "properties_hs_object_source_label": null, "properties_hs_object_source_user_id": null, "properties_hs_product_type": null, "properties_hs_read_only": null, "properties_hs_recurring_billing_period": null, "properties_hs_recurring_billing_start_date": null, "properties_hs_sku": null, "properties_hs_unique_creation_key": null, "properties_hs_updated_by_user_id": 12282590, "properties_hs_url": null, "properties_hs_user_ids_of_all_notification_followers": null, "properties_hs_user_ids_of_all_notification_unfollowers": null, "properties_hs_user_ids_of_all_owners": null, "properties_hs_was_imported": null, "properties_hubspot_owner_assigneddate": null, "properties_hubspot_owner_id": null, "properties_hubspot_team_id": null, "properties_name": "Test product 1", "properties_price": 123, "properties_quantity": null, "properties_recurringbillingfrequency": null, "properties_tax": null, "properties_test": null, "properties_test_product_price": null}, "emitted_at": 1697714252637}
-{"stream": "products", "data": {"id": "646316535", "properties": {"amount": null, "createdate": "2021-02-23T20:11:54.030000+00:00", "description": "baseball hat, large", "discount": null, "hs_all_accessible_team_ids": null, "hs_all_assigned_business_unit_ids": null, "hs_all_owner_ids": null, "hs_all_team_ids": null, "hs_avatar_filemanager_key": null, "hs_cost_of_goods_sold": 5, "hs_created_by_user_id": null, "hs_createdate": null, "hs_discount_percentage": null, "hs_folder_id": null, "hs_folder_name": null, "hs_images": null, "hs_lastmodifieddate": "2021-02-23T20:11:54.030000+00:00", "hs_merged_object_ids": null, "hs_object_id": 646316535, "hs_object_source": null, "hs_object_source_id": null, "hs_object_source_label": null, "hs_object_source_user_id": null, "hs_product_type": null, "hs_read_only": null, "hs_recurring_billing_period": null, "hs_recurring_billing_start_date": null, "hs_sku": null, "hs_unique_creation_key": null, "hs_updated_by_user_id": null, "hs_url": null, "hs_user_ids_of_all_notification_followers": null, "hs_user_ids_of_all_notification_unfollowers": null, "hs_user_ids_of_all_owners": null, "hs_was_imported": true, "hubspot_owner_assigneddate": null, "hubspot_owner_id": null, "hubspot_team_id": null, "name": "Green Hat", "price": 10, "quantity": null, "recurringbillingfrequency": null, "tax": null, "test": null, "test_product_price": null}, "createdAt": "2021-02-23T20:11:54.030Z", "updatedAt": "2021-02-23T20:11:54.030Z", "archived": false, "properties_amount": null, "properties_createdate": "2021-02-23T20:11:54.030000+00:00", "properties_description": "baseball hat, large", "properties_discount": null, "properties_hs_all_accessible_team_ids": null, "properties_hs_all_assigned_business_unit_ids": null, "properties_hs_all_owner_ids": null, "properties_hs_all_team_ids": null, "properties_hs_avatar_filemanager_key": null, "properties_hs_cost_of_goods_sold": 5, "properties_hs_created_by_user_id": null, "properties_hs_createdate": null, "properties_hs_discount_percentage": null, "properties_hs_folder_id": null, "properties_hs_folder_name": null, "properties_hs_images": null, "properties_hs_lastmodifieddate": "2021-02-23T20:11:54.030000+00:00", "properties_hs_merged_object_ids": null, "properties_hs_object_id": 646316535, "properties_hs_object_source": null, "properties_hs_object_source_id": null, "properties_hs_object_source_label": null, "properties_hs_object_source_user_id": null, "properties_hs_product_type": null, "properties_hs_read_only": null, "properties_hs_recurring_billing_period": null, "properties_hs_recurring_billing_start_date": null, "properties_hs_sku": null, "properties_hs_unique_creation_key": null, "properties_hs_updated_by_user_id": null, "properties_hs_url": null, "properties_hs_user_ids_of_all_notification_followers": null, "properties_hs_user_ids_of_all_notification_unfollowers": null, "properties_hs_user_ids_of_all_owners": null, "properties_hs_was_imported": true, "properties_hubspot_owner_assigneddate": null, "properties_hubspot_owner_id": null, "properties_hubspot_team_id": null, "properties_name": "Green Hat", "properties_price": 10, "properties_quantity": null, "properties_recurringbillingfrequency": null, "properties_tax": null, "properties_test": null, "properties_test_product_price": null}, "emitted_at": 1697714252638}
+{"stream": "products", "data": {"id": "646176421", "properties": {"amount": null, "createdate": "2021-02-23T20:03:18.336000+00:00", "description": null, "discount": null, "hs_all_accessible_team_ids": null, "hs_all_assigned_business_unit_ids": null, "hs_all_owner_ids": null, "hs_all_team_ids": null, "hs_avatar_filemanager_key": null, "hs_cost_of_goods_sold": null, "hs_created_by_user_id": 12282590, "hs_createdate": null, "hs_discount_percentage": null, "hs_folder_id": null, "hs_folder_name": null, "hs_images": null, "hs_lastmodifieddate": "2021-02-23T20:03:18.336000+00:00", "hs_merged_object_ids": null, "hs_object_id": 646176421, "hs_object_source": "CRM_UI", "hs_object_source_id": "userId:12282590", "hs_object_source_label": "CRM_UI", "hs_object_source_user_id": 12282590, "hs_product_type": null, "hs_read_only": null, "hs_recurring_billing_period": null, "hs_recurring_billing_start_date": null, "hs_sku": null, "hs_unique_creation_key": null, "hs_updated_by_user_id": 12282590, "hs_url": null, "hs_user_ids_of_all_notification_followers": null, "hs_user_ids_of_all_notification_unfollowers": null, "hs_user_ids_of_all_owners": null, "hs_was_imported": null, "hubspot_owner_assigneddate": null, "hubspot_owner_id": null, "hubspot_team_id": null, "name": "Test product", "price": 100, "quantity": null, "recurringbillingfrequency": null, "tax": null, "test": null, "test_product_price": null}, "createdAt": "2021-02-23T20:03:18.336Z", "updatedAt": "2021-02-23T20:03:18.336Z", "archived": false, "properties_amount": null, "properties_createdate": "2021-02-23T20:03:18.336000+00:00", "properties_description": null, "properties_discount": null, "properties_hs_all_accessible_team_ids": null, "properties_hs_all_assigned_business_unit_ids": null, "properties_hs_all_owner_ids": null, "properties_hs_all_team_ids": null, "properties_hs_avatar_filemanager_key": null, "properties_hs_cost_of_goods_sold": null, "properties_hs_created_by_user_id": 12282590, "properties_hs_createdate": null, "properties_hs_discount_percentage": null, "properties_hs_folder_id": null, "properties_hs_folder_name": null, "properties_hs_images": null, "properties_hs_lastmodifieddate": "2021-02-23T20:03:18.336000+00:00", "properties_hs_merged_object_ids": null, "properties_hs_object_id": 646176421, "properties_hs_object_source": "CRM_UI", "properties_hs_object_source_id": "userId:12282590", "properties_hs_object_source_label": "CRM_UI", "properties_hs_object_source_user_id": 12282590, "properties_hs_product_type": null, "properties_hs_read_only": null, "properties_hs_recurring_billing_period": null, "properties_hs_recurring_billing_start_date": null, "properties_hs_sku": null, "properties_hs_unique_creation_key": null, "properties_hs_updated_by_user_id": 12282590, "properties_hs_url": null, "properties_hs_user_ids_of_all_notification_followers": null, "properties_hs_user_ids_of_all_notification_unfollowers": null, "properties_hs_user_ids_of_all_owners": null, "properties_hs_was_imported": null, "properties_hubspot_owner_assigneddate": null, "properties_hubspot_owner_id": null, "properties_hubspot_team_id": null, "properties_name": "Test product", "properties_price": 100, "properties_quantity": null, "properties_recurringbillingfrequency": null, "properties_tax": null, "properties_test": null, "properties_test_product_price": null}, "emitted_at": 1706192761055}
+{"stream": "products", "data": {"id": "646176423", "properties": {"amount": null, "createdate": "2021-02-23T20:03:48.577000+00:00", "description": null, "discount": null, "hs_all_accessible_team_ids": null, "hs_all_assigned_business_unit_ids": null, "hs_all_owner_ids": null, "hs_all_team_ids": null, "hs_avatar_filemanager_key": null, "hs_cost_of_goods_sold": null, "hs_created_by_user_id": 12282590, "hs_createdate": null, "hs_discount_percentage": null, "hs_folder_id": 2430008, "hs_folder_name": "test folder", "hs_images": null, "hs_lastmodifieddate": "2021-02-23T20:03:48.577000+00:00", "hs_merged_object_ids": null, "hs_object_id": 646176423, "hs_object_source": "CRM_UI", "hs_object_source_id": "userId:12282590", "hs_object_source_label": "CRM_UI", "hs_object_source_user_id": 12282590, "hs_product_type": null, "hs_read_only": null, "hs_recurring_billing_period": null, "hs_recurring_billing_start_date": null, "hs_sku": null, "hs_unique_creation_key": null, "hs_updated_by_user_id": 12282590, "hs_url": null, "hs_user_ids_of_all_notification_followers": null, "hs_user_ids_of_all_notification_unfollowers": null, "hs_user_ids_of_all_owners": null, "hs_was_imported": null, "hubspot_owner_assigneddate": null, "hubspot_owner_id": null, "hubspot_team_id": null, "name": "Test product 1", "price": 123, "quantity": null, "recurringbillingfrequency": null, "tax": null, "test": null, "test_product_price": null}, "createdAt": "2021-02-23T20:03:48.577Z", "updatedAt": "2021-02-23T20:03:48.577Z", "archived": false, "properties_amount": null, "properties_createdate": "2021-02-23T20:03:48.577000+00:00", "properties_description": null, "properties_discount": null, "properties_hs_all_accessible_team_ids": null, "properties_hs_all_assigned_business_unit_ids": null, "properties_hs_all_owner_ids": null, "properties_hs_all_team_ids": null, "properties_hs_avatar_filemanager_key": null, "properties_hs_cost_of_goods_sold": null, "properties_hs_created_by_user_id": 12282590, "properties_hs_createdate": null, "properties_hs_discount_percentage": null, "properties_hs_folder_id": 2430008, "properties_hs_folder_name": "test folder", "properties_hs_images": null, "properties_hs_lastmodifieddate": "2021-02-23T20:03:48.577000+00:00", "properties_hs_merged_object_ids": null, "properties_hs_object_id": 646176423, "properties_hs_object_source": "CRM_UI", "properties_hs_object_source_id": "userId:12282590", "properties_hs_object_source_label": "CRM_UI", "properties_hs_object_source_user_id": 12282590, "properties_hs_product_type": null, "properties_hs_read_only": null, "properties_hs_recurring_billing_period": null, "properties_hs_recurring_billing_start_date": null, "properties_hs_sku": null, "properties_hs_unique_creation_key": null, "properties_hs_updated_by_user_id": 12282590, "properties_hs_url": null, "properties_hs_user_ids_of_all_notification_followers": null, "properties_hs_user_ids_of_all_notification_unfollowers": null, "properties_hs_user_ids_of_all_owners": null, "properties_hs_was_imported": null, "properties_hubspot_owner_assigneddate": null, "properties_hubspot_owner_id": null, "properties_hubspot_team_id": null, "properties_name": "Test product 1", "properties_price": 123, "properties_quantity": null, "properties_recurringbillingfrequency": null, "properties_tax": null, "properties_test": null, "properties_test_product_price": null}, "emitted_at": 1706192761056}
+{"stream": "products", "data": {"id": "646316535", "properties": {"amount": null, "createdate": "2021-02-23T20:11:54.030000+00:00", "description": "baseball hat, large", "discount": null, "hs_all_accessible_team_ids": null, "hs_all_assigned_business_unit_ids": null, "hs_all_owner_ids": null, "hs_all_team_ids": null, "hs_avatar_filemanager_key": null, "hs_cost_of_goods_sold": 5, "hs_created_by_user_id": null, "hs_createdate": null, "hs_discount_percentage": null, "hs_folder_id": null, "hs_folder_name": null, "hs_images": null, "hs_lastmodifieddate": "2021-02-23T20:11:54.030000+00:00", "hs_merged_object_ids": null, "hs_object_id": 646316535, "hs_object_source": "IMPORT", "hs_object_source_id": null, "hs_object_source_label": "IMPORT", "hs_object_source_user_id": null, "hs_product_type": null, "hs_read_only": null, "hs_recurring_billing_period": null, "hs_recurring_billing_start_date": null, "hs_sku": null, "hs_unique_creation_key": null, "hs_updated_by_user_id": null, "hs_url": null, "hs_user_ids_of_all_notification_followers": null, "hs_user_ids_of_all_notification_unfollowers": null, "hs_user_ids_of_all_owners": null, "hs_was_imported": true, "hubspot_owner_assigneddate": null, "hubspot_owner_id": null, "hubspot_team_id": null, "name": "Green Hat", "price": 10, "quantity": null, "recurringbillingfrequency": null, "tax": null, "test": null, "test_product_price": null}, "createdAt": "2021-02-23T20:11:54.030Z", "updatedAt": "2021-02-23T20:11:54.030Z", "archived": false, "properties_amount": null, "properties_createdate": "2021-02-23T20:11:54.030000+00:00", "properties_description": "baseball hat, large", "properties_discount": null, "properties_hs_all_accessible_team_ids": null, "properties_hs_all_assigned_business_unit_ids": null, "properties_hs_all_owner_ids": null, "properties_hs_all_team_ids": null, "properties_hs_avatar_filemanager_key": null, "properties_hs_cost_of_goods_sold": 5, "properties_hs_created_by_user_id": null, "properties_hs_createdate": null, "properties_hs_discount_percentage": null, "properties_hs_folder_id": null, "properties_hs_folder_name": null, "properties_hs_images": null, "properties_hs_lastmodifieddate": "2021-02-23T20:11:54.030000+00:00", "properties_hs_merged_object_ids": null, "properties_hs_object_id": 646316535, "properties_hs_object_source": "IMPORT", "properties_hs_object_source_id": null, "properties_hs_object_source_label": "IMPORT", "properties_hs_object_source_user_id": null, "properties_hs_product_type": null, "properties_hs_read_only": null, "properties_hs_recurring_billing_period": null, "properties_hs_recurring_billing_start_date": null, "properties_hs_sku": null, "properties_hs_unique_creation_key": null, "properties_hs_updated_by_user_id": null, "properties_hs_url": null, "properties_hs_user_ids_of_all_notification_followers": null, "properties_hs_user_ids_of_all_notification_unfollowers": null, "properties_hs_user_ids_of_all_owners": null, "properties_hs_was_imported": true, "properties_hubspot_owner_assigneddate": null, "properties_hubspot_owner_id": null, "properties_hubspot_team_id": null, "properties_name": "Green Hat", "properties_price": 10, "properties_quantity": null, "properties_recurringbillingfrequency": null, "properties_tax": null, "properties_test": null, "properties_test_product_price": null}, "emitted_at": 1706192761057}
 {"stream": "contacts_property_history", "data": {"value": "testo", "source-type": "CRM_UI", "source-id": "userId:12282590", "source-label": null, "updated-by-user-id": 12282590, "timestamp": 1700681340515, "selected": false, "property": "firstname", "vid": 2501, "portal-id": 8727216, "is-contact": true, "canonical-vid": 2501}, "emitted_at": 1701905506064}
 {"stream": "contacts_property_history", "data": {"value": "test", "source-type": "CRM_UI", "source-id": "userId:12282590", "source-label": null, "updated-by-user-id": 12282590, "timestamp": 1675120629904, "selected": false, "property": "firstname", "vid": 2501, "portal-id": 8727216, "is-contact": true, "canonical-vid": 2501}, "emitted_at": 1701905506064}
 {"stream": "companies_property_history", "data": {"name": "hs_analytics_latest_source_data_2", "value": "CRM_UI", "timestamp": 1657222285656, "sourceId": "RollupProperties", "source": "MIGRATION", "sourceVid": [], "property": "hs_analytics_latest_source_data_2", "companyId": 5000526215, "portalId": 8727216, "isDeleted": false}, "emitted_at": 1701905731242}
@@ -58,9 +58,9 @@
 {"stream": "subscription_changes", "data": {"timestamp": 1616173134301, "portalId": 8727216, "recipient": "0c90ecf5-629e-4fe4-8516-05f75636c3e3@gdpr-forgotten.hubspot.com", "normalizedEmailId": "0c90ecf5-629e-4fe4-8516-05f75636c3e3", "changes": [{"source": "SOURCE_HUBSPOT_CUSTOMER", "timestamp": 1616173134301, "portalId": 8727216, "causedByEvent": {"id": "d70b78b9-a411-4d3e-808b-fe931be35b43", "created": 1616173134301}, "changeType": "PORTAL_STATUS", "change": "SUBSCRIBED"}]}, "emitted_at": 1697714255435}
 {"stream": "subscription_changes", "data": {"timestamp": 1616173134301, "portalId": 8727216, "recipient": "0c90ecf5-629e-4fe4-8516-05f75636c3e3@gdpr-forgotten.hubspot.com", "normalizedEmailId": "0c90ecf5-629e-4fe4-8516-05f75636c3e3", "changes": [{"source": "SOURCE_HUBSPOT_CUSTOMER", "timestamp": 1616173134301, "subscriptionId": 10798197, "portalId": 8727216, "causedByEvent": {"id": "ff118718-786d-4a35-94f9-6bbd413654de", "created": 1616173134301}, "changeType": "SUBSCRIPTION_STATUS", "change": "SUBSCRIBED"}]}, "emitted_at": 1697714255436}
 {"stream": "subscription_changes", "data": {"timestamp": 1616173106737, "portalId": 8727216, "recipient": "0c90ecf5-629e-4fe4-8516-05f75636c3e3@gdpr-forgotten.hubspot.com", "normalizedEmailId": "0c90ecf5-629e-4fe4-8516-05f75636c3e3", "changes": [{"source": "SOURCE_HUBSPOT_CUSTOMER", "timestamp": 1616173106737, "portalId": 8727216, "causedByEvent": {"id": "24539f1f-0b20-4296-a5bf-6ba3bb9dc1b8", "created": 1616173106737}, "changeType": "PORTAL_STATUS", "change": "SUBSCRIBED"}]}, "emitted_at": 1697714255437}
-{"stream": "tickets", "data": {"id": "312929579", "properties": {"closed_date": "2021-02-23T20:08:49.603000+00:00", "content": null, "created_by": null, "createdate": "2021-02-23T20:08:49.603000+00:00", "first_agent_reply_date": null, "hs_all_accessible_team_ids": null, "hs_all_associated_contact_companies": null, "hs_all_associated_contact_emails": null, "hs_all_associated_contact_firstnames": null, "hs_all_associated_contact_lastnames": null, "hs_all_associated_contact_mobilephones": null, "hs_all_associated_contact_phones": null, "hs_all_conversation_mentions": null, "hs_all_owner_ids": null, "hs_all_team_ids": null, "hs_assignment_method": null, "hs_auto_generated_from_thread_id": null, "hs_conversations_originating_message_id": null, "hs_conversations_originating_thread_id": null, "hs_created_by_user_id": null, "hs_createdate": null, "hs_custom_inbox": null, "hs_date_entered_1": "2021-02-23T20:08:49.603000+00:00", "hs_date_entered_2": "2021-02-23T20:08:49.603000+00:00", "hs_date_entered_3": "2021-02-23T20:08:49.603000+00:00", "hs_date_entered_4": "2021-02-23T20:08:49.603000+00:00", "hs_date_exited_1": "2021-02-23T20:08:49.603000+00:00", "hs_date_exited_2": "2021-02-23T20:08:49.603000+00:00", "hs_date_exited_3": "2021-02-23T20:08:49.603000+00:00", "hs_date_exited_4": null, "hs_external_object_ids": null, "hs_feedback_last_ces_follow_up": null, "hs_feedback_last_ces_rating": null, "hs_feedback_last_survey_date": null, "hs_file_upload": null, "hs_first_agent_message_sent_at": null, "hs_helpdesk_sort_timestamp": "2021-02-23T20:08:49.603000+00:00", "hs_in_helpdesk": null, "hs_inbox_id": null, "hs_is_visible_in_help_desk": null, "hs_last_email_activity": null, "hs_last_email_date": null, "hs_last_message_from_visitor": false, "hs_last_message_received_at": null, "hs_last_message_sent_at": null, "hs_lastactivitydate": null, "hs_lastcontacted": null, "hs_lastmodifieddate": "2021-02-23T20:08:53.371000+00:00", "hs_latest_message_seen_by_agent_ids": null, "hs_merged_object_ids": null, "hs_most_relevant_sla_status": null, "hs_most_relevant_sla_type": null, "hs_msteams_message_id": null, "hs_nextactivitydate": null, "hs_num_associated_companies": 0, "hs_num_associated_conversations": null, "hs_num_times_contacted": null, "hs_object_id": 312929579, "hs_object_source": null, "hs_object_source_id": null, "hs_object_source_label": null, "hs_object_source_user_id": null, "hs_originating_channel_instance_id": null, "hs_originating_email_engagement_id": null, "hs_originating_generic_channel_id": null, "hs_pinned_engagement_id": null, "hs_pipeline": "0", "hs_pipeline_stage": "4", "hs_primary_company": null, "hs_primary_company_id": null, "hs_primary_company_name": null, "hs_read_only": null, "hs_resolution": null, "hs_sales_email_last_replied": null, "hs_tag_ids": null, "hs_thread_ids_to_restore": null, "hs_ticket_category": null, "hs_ticket_id": 312929579, "hs_ticket_priority": "LOW", "hs_time_in_1": 0, "hs_time_in_2": 0, "hs_time_in_3": 0, "hs_time_in_4": 87748604133, "hs_time_to_close_sla_at": null, "hs_time_to_close_sla_status": null, "hs_time_to_first_response_sla_at": null, "hs_time_to_first_response_sla_status": null, "hs_unique_creation_key": null, "hs_updated_by_user_id": null, "hs_user_ids_of_all_notification_followers": null, "hs_user_ids_of_all_notification_unfollowers": null, "hs_user_ids_of_all_owners": null, "hs_was_imported": true, "hubspot_owner_assigneddate": null, "hubspot_owner_id": null, "hubspot_team_id": null, "last_engagement_date": null, "last_reply_date": null, "notes_last_contacted": null, "notes_last_updated": null, "notes_next_activity_date": null, "nps_follow_up_answer": null, "nps_follow_up_question_version": null, "nps_score": null, "num_contacted_notes": null, "num_notes": null, "source_ref": null, "source_thread_id": null, "source_type": "CHAT", "subject": "Marketing Starter", "tags": null, "time_to_close": 0, "time_to_first_agent_reply": null}, "createdAt": "2021-02-23T20:08:49.603Z", "updatedAt": "2021-02-23T20:08:53.371Z", "archived": false, "properties_closed_date": "2021-02-23T20:08:49.603000+00:00", "properties_content": null, "properties_created_by": null, "properties_createdate": "2021-02-23T20:08:49.603000+00:00", "properties_first_agent_reply_date": null, "properties_hs_all_accessible_team_ids": null, "properties_hs_all_associated_contact_companies": null, "properties_hs_all_associated_contact_emails": null, "properties_hs_all_associated_contact_firstnames": null, "properties_hs_all_associated_contact_lastnames": null, "properties_hs_all_associated_contact_mobilephones": null, "properties_hs_all_associated_contact_phones": null, "properties_hs_all_conversation_mentions": null, "properties_hs_all_owner_ids": null, "properties_hs_all_team_ids": null, "properties_hs_assignment_method": null, "properties_hs_auto_generated_from_thread_id": null, "properties_hs_conversations_originating_message_id": null, "properties_hs_conversations_originating_thread_id": null, "properties_hs_created_by_user_id": null, "properties_hs_createdate": null, "properties_hs_custom_inbox": null, "properties_hs_date_entered_1": "2021-02-23T20:08:49.603000+00:00", "properties_hs_date_entered_2": "2021-02-23T20:08:49.603000+00:00", "properties_hs_date_entered_3": "2021-02-23T20:08:49.603000+00:00", "properties_hs_date_entered_4": "2021-02-23T20:08:49.603000+00:00", "properties_hs_date_exited_1": "2021-02-23T20:08:49.603000+00:00", "properties_hs_date_exited_2": "2021-02-23T20:08:49.603000+00:00", "properties_hs_date_exited_3": "2021-02-23T20:08:49.603000+00:00", "properties_hs_date_exited_4": null, "properties_hs_external_object_ids": null, "properties_hs_feedback_last_ces_follow_up": null, "properties_hs_feedback_last_ces_rating": null, "properties_hs_feedback_last_survey_date": null, "properties_hs_file_upload": null, "properties_hs_first_agent_message_sent_at": null, "properties_hs_helpdesk_sort_timestamp": "2021-02-23T20:08:49.603000+00:00", "properties_hs_in_helpdesk": null, "properties_hs_inbox_id": null, "properties_hs_is_visible_in_help_desk": null, "properties_hs_last_email_activity": null, "properties_hs_last_email_date": null, "properties_hs_last_message_from_visitor": false, "properties_hs_last_message_received_at": null, "properties_hs_last_message_sent_at": null, "properties_hs_lastactivitydate": null, "properties_hs_lastcontacted": null, "properties_hs_lastmodifieddate": "2021-02-23T20:08:53.371000+00:00", "properties_hs_latest_message_seen_by_agent_ids": null, "properties_hs_merged_object_ids": null, "properties_hs_most_relevant_sla_status": null, "properties_hs_most_relevant_sla_type": null, "properties_hs_msteams_message_id": null, "properties_hs_nextactivitydate": null, "properties_hs_num_associated_companies": 0, "properties_hs_num_associated_conversations": null, "properties_hs_num_times_contacted": null, "properties_hs_object_id": 312929579, "properties_hs_object_source": null, "properties_hs_object_source_id": null, "properties_hs_object_source_label": null, "properties_hs_object_source_user_id": null, "properties_hs_originating_channel_instance_id": null, "properties_hs_originating_email_engagement_id": null, "properties_hs_originating_generic_channel_id": null, "properties_hs_pinned_engagement_id": null, "properties_hs_pipeline": "0", "properties_hs_pipeline_stage": "4", "properties_hs_primary_company": null, "properties_hs_primary_company_id": null, "properties_hs_primary_company_name": null, "properties_hs_read_only": null, "properties_hs_resolution": null, "properties_hs_sales_email_last_replied": null, "properties_hs_tag_ids": null, "properties_hs_thread_ids_to_restore": null, "properties_hs_ticket_category": null, "properties_hs_ticket_id": 312929579, "properties_hs_ticket_priority": "LOW", "properties_hs_time_in_1": 0, "properties_hs_time_in_2": 0, "properties_hs_time_in_3": 0, "properties_hs_time_in_4": 87748604133, "properties_hs_time_to_close_sla_at": null, "properties_hs_time_to_close_sla_status": null, "properties_hs_time_to_first_response_sla_at": null, "properties_hs_time_to_first_response_sla_status": null, "properties_hs_unique_creation_key": null, "properties_hs_updated_by_user_id": null, "properties_hs_user_ids_of_all_notification_followers": null, "properties_hs_user_ids_of_all_notification_unfollowers": null, "properties_hs_user_ids_of_all_owners": null, "properties_hs_was_imported": true, "properties_hubspot_owner_assigneddate": null, "properties_hubspot_owner_id": null, "properties_hubspot_team_id": null, "properties_last_engagement_date": null, "properties_last_reply_date": null, "properties_notes_last_contacted": null, "properties_notes_last_updated": null, "properties_notes_next_activity_date": null, "properties_nps_follow_up_answer": null, "properties_nps_follow_up_question_version": null, "properties_nps_score": null, "properties_num_contacted_notes": null, "properties_num_notes": null, "properties_source_ref": null, "properties_source_thread_id": null, "properties_source_type": "CHAT", "properties_subject": "Marketing Starter", "properties_tags": null, "properties_time_to_close": 0, "properties_time_to_first_agent_reply": null}, "emitted_at": 1701859534671}
-{"stream": "tickets", "data": {"id": "312972611", "properties": {"closed_date": null, "content": null, "created_by": null, "createdate": "2021-02-23T20:08:49.603000+00:00", "first_agent_reply_date": null, "hs_all_accessible_team_ids": null, "hs_all_associated_contact_companies": null, "hs_all_associated_contact_emails": null, "hs_all_associated_contact_firstnames": null, "hs_all_associated_contact_lastnames": null, "hs_all_associated_contact_mobilephones": null, "hs_all_associated_contact_phones": null, "hs_all_conversation_mentions": null, "hs_all_owner_ids": null, "hs_all_team_ids": null, "hs_assignment_method": null, "hs_auto_generated_from_thread_id": null, "hs_conversations_originating_message_id": null, "hs_conversations_originating_thread_id": null, "hs_created_by_user_id": null, "hs_createdate": null, "hs_custom_inbox": null, "hs_date_entered_1": "2021-02-23T20:08:49.603000+00:00", "hs_date_entered_2": "2021-02-23T20:08:49.603000+00:00", "hs_date_entered_3": null, "hs_date_entered_4": null, "hs_date_exited_1": "2021-02-23T20:08:49.603000+00:00", "hs_date_exited_2": null, "hs_date_exited_3": null, "hs_date_exited_4": null, "hs_external_object_ids": null, "hs_feedback_last_ces_follow_up": null, "hs_feedback_last_ces_rating": null, "hs_feedback_last_survey_date": null, "hs_file_upload": null, "hs_first_agent_message_sent_at": null, "hs_helpdesk_sort_timestamp": "2021-02-23T20:08:49.603000+00:00", "hs_in_helpdesk": null, "hs_inbox_id": null, "hs_is_visible_in_help_desk": null, "hs_last_email_activity": null, "hs_last_email_date": null, "hs_last_message_from_visitor": false, "hs_last_message_received_at": null, "hs_last_message_sent_at": null, "hs_lastactivitydate": null, "hs_lastcontacted": null, "hs_lastmodifieddate": "2021-02-23T20:08:52.663000+00:00", "hs_latest_message_seen_by_agent_ids": null, "hs_merged_object_ids": null, "hs_most_relevant_sla_status": null, "hs_most_relevant_sla_type": null, "hs_msteams_message_id": null, "hs_nextactivitydate": null, "hs_num_associated_companies": 0, "hs_num_associated_conversations": null, "hs_num_times_contacted": null, "hs_object_id": 312972611, "hs_object_source": null, "hs_object_source_id": null, "hs_object_source_label": null, "hs_object_source_user_id": null, "hs_originating_channel_instance_id": null, "hs_originating_email_engagement_id": null, "hs_originating_generic_channel_id": null, "hs_pinned_engagement_id": null, "hs_pipeline": "0", "hs_pipeline_stage": "2", "hs_primary_company": null, "hs_primary_company_id": null, "hs_primary_company_name": null, "hs_read_only": null, "hs_resolution": null, "hs_sales_email_last_replied": null, "hs_tag_ids": null, "hs_thread_ids_to_restore": null, "hs_ticket_category": null, "hs_ticket_id": 312972611, "hs_ticket_priority": "LOW", "hs_time_in_1": 0, "hs_time_in_2": 87748604132, "hs_time_in_3": null, "hs_time_in_4": null, "hs_time_to_close_sla_at": null, "hs_time_to_close_sla_status": null, "hs_time_to_first_response_sla_at": null, "hs_time_to_first_response_sla_status": null, "hs_unique_creation_key": null, "hs_updated_by_user_id": null, "hs_user_ids_of_all_notification_followers": null, "hs_user_ids_of_all_notification_unfollowers": null, "hs_user_ids_of_all_owners": null, "hs_was_imported": true, "hubspot_owner_assigneddate": null, "hubspot_owner_id": null, "hubspot_team_id": null, "last_engagement_date": null, "last_reply_date": null, "notes_last_contacted": null, "notes_last_updated": null, "notes_next_activity_date": null, "nps_follow_up_answer": null, "nps_follow_up_question_version": null, "nps_score": null, "num_contacted_notes": null, "num_notes": null, "source_ref": null, "source_thread_id": null, "source_type": "FORM", "subject": "Sales Starter", "tags": null, "time_to_close": null, "time_to_first_agent_reply": null}, "createdAt": "2021-02-23T20:08:49.603Z", "updatedAt": "2021-02-23T20:08:52.663Z", "archived": false, "properties_closed_date": null, "properties_content": null, "properties_created_by": null, "properties_createdate": "2021-02-23T20:08:49.603000+00:00", "properties_first_agent_reply_date": null, "properties_hs_all_accessible_team_ids": null, "properties_hs_all_associated_contact_companies": null, "properties_hs_all_associated_contact_emails": null, "properties_hs_all_associated_contact_firstnames": null, "properties_hs_all_associated_contact_lastnames": null, "properties_hs_all_associated_contact_mobilephones": null, "properties_hs_all_associated_contact_phones": null, "properties_hs_all_conversation_mentions": null, "properties_hs_all_owner_ids": null, "properties_hs_all_team_ids": null, "properties_hs_assignment_method": null, "properties_hs_auto_generated_from_thread_id": null, "properties_hs_conversations_originating_message_id": null, "properties_hs_conversations_originating_thread_id": null, "properties_hs_created_by_user_id": null, "properties_hs_createdate": null, "properties_hs_custom_inbox": null, "properties_hs_date_entered_1": "2021-02-23T20:08:49.603000+00:00", "properties_hs_date_entered_2": "2021-02-23T20:08:49.603000+00:00", "properties_hs_date_entered_3": null, "properties_hs_date_entered_4": null, "properties_hs_date_exited_1": "2021-02-23T20:08:49.603000+00:00", "properties_hs_date_exited_2": null, "properties_hs_date_exited_3": null, "properties_hs_date_exited_4": null, "properties_hs_external_object_ids": null, "properties_hs_feedback_last_ces_follow_up": null, "properties_hs_feedback_last_ces_rating": null, "properties_hs_feedback_last_survey_date": null, "properties_hs_file_upload": null, "properties_hs_first_agent_message_sent_at": null, "properties_hs_helpdesk_sort_timestamp": "2021-02-23T20:08:49.603000+00:00", "properties_hs_in_helpdesk": null, "properties_hs_inbox_id": null, "properties_hs_is_visible_in_help_desk": null, "properties_hs_last_email_activity": null, "properties_hs_last_email_date": null, "properties_hs_last_message_from_visitor": false, "properties_hs_last_message_received_at": null, "properties_hs_last_message_sent_at": null, "properties_hs_lastactivitydate": null, "properties_hs_lastcontacted": null, "properties_hs_lastmodifieddate": "2021-02-23T20:08:52.663000+00:00", "properties_hs_latest_message_seen_by_agent_ids": null, "properties_hs_merged_object_ids": null, "properties_hs_most_relevant_sla_status": null, "properties_hs_most_relevant_sla_type": null, "properties_hs_msteams_message_id": null, "properties_hs_nextactivitydate": null, "properties_hs_num_associated_companies": 0, "properties_hs_num_associated_conversations": null, "properties_hs_num_times_contacted": null, "properties_hs_object_id": 312972611, "properties_hs_object_source": null, "properties_hs_object_source_id": null, "properties_hs_object_source_label": null, "properties_hs_object_source_user_id": null, "properties_hs_originating_channel_instance_id": null, "properties_hs_originating_email_engagement_id": null, "properties_hs_originating_generic_channel_id": null, "properties_hs_pinned_engagement_id": null, "properties_hs_pipeline": "0", "properties_hs_pipeline_stage": "2", "properties_hs_primary_company": null, "properties_hs_primary_company_id": null, "properties_hs_primary_company_name": null, "properties_hs_read_only": null, "properties_hs_resolution": null, "properties_hs_sales_email_last_replied": null, "properties_hs_tag_ids": null, "properties_hs_thread_ids_to_restore": null, "properties_hs_ticket_category": null, "properties_hs_ticket_id": 312972611, "properties_hs_ticket_priority": "LOW", "properties_hs_time_in_1": 0, "properties_hs_time_in_2": 87748604132, "properties_hs_time_in_3": null, "properties_hs_time_in_4": null, "properties_hs_time_to_close_sla_at": null, "properties_hs_time_to_close_sla_status": null, "properties_hs_time_to_first_response_sla_at": null, "properties_hs_time_to_first_response_sla_status": null, "properties_hs_unique_creation_key": null, "properties_hs_updated_by_user_id": null, "properties_hs_user_ids_of_all_notification_followers": null, "properties_hs_user_ids_of_all_notification_unfollowers": null, "properties_hs_user_ids_of_all_owners": null, "properties_hs_was_imported": true, "properties_hubspot_owner_assigneddate": null, "properties_hubspot_owner_id": null, "properties_hubspot_team_id": null, "properties_last_engagement_date": null, "properties_last_reply_date": null, "properties_notes_last_contacted": null, "properties_notes_last_updated": null, "properties_notes_next_activity_date": null, "properties_nps_follow_up_answer": null, "properties_nps_follow_up_question_version": null, "properties_nps_score": null, "properties_num_contacted_notes": null, "properties_num_notes": null, "properties_source_ref": null, "properties_source_thread_id": null, "properties_source_type": "FORM", "properties_subject": "Sales Starter", "properties_tags": null, "properties_time_to_close": null, "properties_time_to_first_agent_reply": null}, "emitted_at": 1701859534672}
-{"stream": "tickets", "data": {"id": "312975112", "properties": {"closed_date": null, "content": null, "created_by": null, "createdate": "2021-02-23T20:08:49.603000+00:00", "first_agent_reply_date": null, "hs_all_accessible_team_ids": null, "hs_all_associated_contact_companies": null, "hs_all_associated_contact_emails": null, "hs_all_associated_contact_firstnames": null, "hs_all_associated_contact_lastnames": null, "hs_all_associated_contact_mobilephones": null, "hs_all_associated_contact_phones": null, "hs_all_conversation_mentions": null, "hs_all_owner_ids": null, "hs_all_team_ids": null, "hs_assignment_method": null, "hs_auto_generated_from_thread_id": null, "hs_conversations_originating_message_id": null, "hs_conversations_originating_thread_id": null, "hs_created_by_user_id": null, "hs_createdate": null, "hs_custom_inbox": null, "hs_date_entered_1": "2021-02-23T20:08:49.603000+00:00", "hs_date_entered_2": null, "hs_date_entered_3": null, "hs_date_entered_4": null, "hs_date_exited_1": null, "hs_date_exited_2": null, "hs_date_exited_3": null, "hs_date_exited_4": null, "hs_external_object_ids": null, "hs_feedback_last_ces_follow_up": null, "hs_feedback_last_ces_rating": null, "hs_feedback_last_survey_date": null, "hs_file_upload": null, "hs_first_agent_message_sent_at": null, "hs_helpdesk_sort_timestamp": "2021-02-23T20:08:49.603000+00:00", "hs_in_helpdesk": null, "hs_inbox_id": null, "hs_is_visible_in_help_desk": null, "hs_last_email_activity": null, "hs_last_email_date": null, "hs_last_message_from_visitor": false, "hs_last_message_received_at": null, "hs_last_message_sent_at": null, "hs_lastactivitydate": null, "hs_lastcontacted": null, "hs_lastmodifieddate": "2021-02-23T20:08:52.515000+00:00", "hs_latest_message_seen_by_agent_ids": null, "hs_merged_object_ids": null, "hs_most_relevant_sla_status": null, "hs_most_relevant_sla_type": null, "hs_msteams_message_id": null, "hs_nextactivitydate": null, "hs_num_associated_companies": 0, "hs_num_associated_conversations": null, "hs_num_times_contacted": null, "hs_object_id": 312975112, "hs_object_source": null, "hs_object_source_id": null, "hs_object_source_label": null, "hs_object_source_user_id": null, "hs_originating_channel_instance_id": null, "hs_originating_email_engagement_id": null, "hs_originating_generic_channel_id": null, "hs_pinned_engagement_id": null, "hs_pipeline": "0", "hs_pipeline_stage": "1", "hs_primary_company": null, "hs_primary_company_id": null, "hs_primary_company_name": null, "hs_read_only": null, "hs_resolution": null, "hs_sales_email_last_replied": null, "hs_tag_ids": null, "hs_thread_ids_to_restore": null, "hs_ticket_category": null, "hs_ticket_id": 312975112, "hs_ticket_priority": "MEDIUM", "hs_time_in_1": 87748604134, "hs_time_in_2": null, "hs_time_in_3": null, "hs_time_in_4": null, "hs_time_to_close_sla_at": null, "hs_time_to_close_sla_status": null, "hs_time_to_first_response_sla_at": null, "hs_time_to_first_response_sla_status": null, "hs_unique_creation_key": null, "hs_updated_by_user_id": null, "hs_user_ids_of_all_notification_followers": null, "hs_user_ids_of_all_notification_unfollowers": null, "hs_user_ids_of_all_owners": null, "hs_was_imported": true, "hubspot_owner_assigneddate": null, "hubspot_owner_id": null, "hubspot_team_id": null, "last_engagement_date": null, "last_reply_date": null, "notes_last_contacted": null, "notes_last_updated": null, "notes_next_activity_date": null, "nps_follow_up_answer": null, "nps_follow_up_question_version": null, "nps_score": null, "num_contacted_notes": null, "num_notes": null, "source_ref": null, "source_thread_id": null, "source_type": "PHONE", "subject": "Free CRM", "tags": null, "time_to_close": null, "time_to_first_agent_reply": null}, "createdAt": "2021-02-23T20:08:49.603Z", "updatedAt": "2021-02-23T20:08:52.515Z", "archived": false, "properties_closed_date": null, "properties_content": null, "properties_created_by": null, "properties_createdate": "2021-02-23T20:08:49.603000+00:00", "properties_first_agent_reply_date": null, "properties_hs_all_accessible_team_ids": null, "properties_hs_all_associated_contact_companies": null, "properties_hs_all_associated_contact_emails": null, "properties_hs_all_associated_contact_firstnames": null, "properties_hs_all_associated_contact_lastnames": null, "properties_hs_all_associated_contact_mobilephones": null, "properties_hs_all_associated_contact_phones": null, "properties_hs_all_conversation_mentions": null, "properties_hs_all_owner_ids": null, "properties_hs_all_team_ids": null, "properties_hs_assignment_method": null, "properties_hs_auto_generated_from_thread_id": null, "properties_hs_conversations_originating_message_id": null, "properties_hs_conversations_originating_thread_id": null, "properties_hs_created_by_user_id": null, "properties_hs_createdate": null, "properties_hs_custom_inbox": null, "properties_hs_date_entered_1": "2021-02-23T20:08:49.603000+00:00", "properties_hs_date_entered_2": null, "properties_hs_date_entered_3": null, "properties_hs_date_entered_4": null, "properties_hs_date_exited_1": null, "properties_hs_date_exited_2": null, "properties_hs_date_exited_3": null, "properties_hs_date_exited_4": null, "properties_hs_external_object_ids": null, "properties_hs_feedback_last_ces_follow_up": null, "properties_hs_feedback_last_ces_rating": null, "properties_hs_feedback_last_survey_date": null, "properties_hs_file_upload": null, "properties_hs_first_agent_message_sent_at": null, "properties_hs_helpdesk_sort_timestamp": "2021-02-23T20:08:49.603000+00:00", "properties_hs_in_helpdesk": null, "properties_hs_inbox_id": null, "properties_hs_is_visible_in_help_desk": null, "properties_hs_last_email_activity": null, "properties_hs_last_email_date": null, "properties_hs_last_message_from_visitor": false, "properties_hs_last_message_received_at": null, "properties_hs_last_message_sent_at": null, "properties_hs_lastactivitydate": null, "properties_hs_lastcontacted": null, "properties_hs_lastmodifieddate": "2021-02-23T20:08:52.515000+00:00", "properties_hs_latest_message_seen_by_agent_ids": null, "properties_hs_merged_object_ids": null, "properties_hs_most_relevant_sla_status": null, "properties_hs_most_relevant_sla_type": null, "properties_hs_msteams_message_id": null, "properties_hs_nextactivitydate": null, "properties_hs_num_associated_companies": 0, "properties_hs_num_associated_conversations": null, "properties_hs_num_times_contacted": null, "properties_hs_object_id": 312975112, "properties_hs_object_source": null, "properties_hs_object_source_id": null, "properties_hs_object_source_label": null, "properties_hs_object_source_user_id": null, "properties_hs_originating_channel_instance_id": null, "properties_hs_originating_email_engagement_id": null, "properties_hs_originating_generic_channel_id": null, "properties_hs_pinned_engagement_id": null, "properties_hs_pipeline": "0", "properties_hs_pipeline_stage": "1", "properties_hs_primary_company": null, "properties_hs_primary_company_id": null, "properties_hs_primary_company_name": null, "properties_hs_read_only": null, "properties_hs_resolution": null, "properties_hs_sales_email_last_replied": null, "properties_hs_tag_ids": null, "properties_hs_thread_ids_to_restore": null, "properties_hs_ticket_category": null, "properties_hs_ticket_id": 312975112, "properties_hs_ticket_priority": "MEDIUM", "properties_hs_time_in_1": 87748604134, "properties_hs_time_in_2": null, "properties_hs_time_in_3": null, "properties_hs_time_in_4": null, "properties_hs_time_to_close_sla_at": null, "properties_hs_time_to_close_sla_status": null, "properties_hs_time_to_first_response_sla_at": null, "properties_hs_time_to_first_response_sla_status": null, "properties_hs_unique_creation_key": null, "properties_hs_updated_by_user_id": null, "properties_hs_user_ids_of_all_notification_followers": null, "properties_hs_user_ids_of_all_notification_unfollowers": null, "properties_hs_user_ids_of_all_owners": null, "properties_hs_was_imported": true, "properties_hubspot_owner_assigneddate": null, "properties_hubspot_owner_id": null, "properties_hubspot_team_id": null, "properties_last_engagement_date": null, "properties_last_reply_date": null, "properties_notes_last_contacted": null, "properties_notes_last_updated": null, "properties_notes_next_activity_date": null, "properties_nps_follow_up_answer": null, "properties_nps_follow_up_question_version": null, "properties_nps_score": null, "properties_num_contacted_notes": null, "properties_num_notes": null, "properties_source_ref": null, "properties_source_thread_id": null, "properties_source_type": "PHONE", "properties_subject": "Free CRM", "properties_tags": null, "properties_time_to_close": null, "properties_time_to_first_agent_reply": null}, "emitted_at": 1701859534673}
+{"stream": "tickets", "data": {"id": "312929579", "properties": {"closed_date": "2021-02-23T20:08:49.603000+00:00", "content": null, "created_by": null, "createdate": "2021-02-23T20:08:49.603000+00:00", "first_agent_reply_date": null, "hs_all_accessible_team_ids": null, "hs_all_associated_contact_companies": null, "hs_all_associated_contact_emails": null, "hs_all_associated_contact_firstnames": null, "hs_all_associated_contact_lastnames": null, "hs_all_associated_contact_mobilephones": null, "hs_all_associated_contact_phones": null, "hs_all_conversation_mentions": null, "hs_all_owner_ids": null, "hs_all_team_ids": null, "hs_assignment_method": null, "hs_auto_generated_from_thread_id": null, "hs_conversations_originating_message_id": null, "hs_conversations_originating_thread_id": null, "hs_created_by_user_id": null, "hs_createdate": null, "hs_custom_inbox": null, "hs_date_entered_1": "2021-02-23T20:08:49.603000+00:00", "hs_date_entered_2": "2021-02-23T20:08:49.603000+00:00", "hs_date_entered_3": "2021-02-23T20:08:49.603000+00:00", "hs_date_entered_4": "2021-02-23T20:08:49.603000+00:00", "hs_date_exited_1": "2021-02-23T20:08:49.603000+00:00", "hs_date_exited_2": "2021-02-23T20:08:49.603000+00:00", "hs_date_exited_3": "2021-02-23T20:08:49.603000+00:00", "hs_date_exited_4": null, "hs_external_object_ids": null, "hs_feedback_last_ces_follow_up": null, "hs_feedback_last_ces_rating": null, "hs_feedback_last_survey_date": null, "hs_file_upload": null, "hs_first_agent_message_sent_at": null, "hs_helpdesk_sort_timestamp": "2021-02-23T20:08:49.603000+00:00", "hs_in_helpdesk": null, "hs_inbox_id": null, "hs_is_visible_in_help_desk": null, "hs_last_email_activity": null, "hs_last_email_date": null, "hs_last_message_from_visitor": false, "hs_last_message_received_at": null, "hs_last_message_sent_at": null, "hs_lastactivitydate": null, "hs_lastcontacted": null, "hs_lastmodifieddate": "2021-02-23T20:08:53.371000+00:00", "hs_latest_message_seen_by_agent_ids": null, "hs_merged_object_ids": null, "hs_most_relevant_sla_status": null, "hs_most_relevant_sla_type": null, "hs_msteams_message_id": null, "hs_nextactivitydate": null, "hs_num_associated_companies": 0, "hs_num_associated_conversations": null, "hs_num_times_contacted": null, "hs_object_id": 312929579, "hs_object_source": "IMPORT", "hs_object_source_id": null, "hs_object_source_label": "IMPORT", "hs_object_source_user_id": null, "hs_originating_email_engagement_id": null, "hs_pinned_engagement_id": null, "hs_pipeline": "0", "hs_pipeline_stage": "4", "hs_primary_company": null, "hs_primary_company_id": null, "hs_primary_company_name": null, "hs_read_only": null, "hs_resolution": null, "hs_sales_email_last_replied": null, "hs_tag_ids": null, "hs_thread_ids_to_restore": null, "hs_ticket_category": null, "hs_ticket_id": 312929579, "hs_ticket_priority": "LOW", "hs_time_in_1": 0, "hs_time_in_2": 0, "hs_time_in_3": 0, "hs_time_in_4": 92081969615, "hs_time_to_close_sla_at": null, "hs_time_to_close_sla_status": null, "hs_time_to_first_response_sla_at": null, "hs_time_to_first_response_sla_status": null, "hs_unique_creation_key": null, "hs_updated_by_user_id": null, "hs_user_ids_of_all_notification_followers": null, "hs_user_ids_of_all_notification_unfollowers": null, "hs_user_ids_of_all_owners": null, "hs_was_imported": true, "hubspot_owner_assigneddate": null, "hubspot_owner_id": null, "hubspot_team_id": null, "last_engagement_date": null, "last_reply_date": null, "notes_last_contacted": null, "notes_last_updated": null, "notes_next_activity_date": null, "nps_follow_up_answer": null, "nps_follow_up_question_version": null, "nps_score": null, "num_contacted_notes": null, "num_notes": null, "source_ref": null, "source_thread_id": null, "source_type": "CHAT", "subject": "Marketing Starter", "tags": null, "time_to_close": 0, "time_to_first_agent_reply": null}, "createdAt": "2021-02-23T20:08:49.603Z", "updatedAt": "2021-02-23T20:08:53.371Z", "archived": false, "properties_closed_date": "2021-02-23T20:08:49.603000+00:00", "properties_content": null, "properties_created_by": null, "properties_createdate": "2021-02-23T20:08:49.603000+00:00", "properties_first_agent_reply_date": null, "properties_hs_all_accessible_team_ids": null, "properties_hs_all_associated_contact_companies": null, "properties_hs_all_associated_contact_emails": null, "properties_hs_all_associated_contact_firstnames": null, "properties_hs_all_associated_contact_lastnames": null, "properties_hs_all_associated_contact_mobilephones": null, "properties_hs_all_associated_contact_phones": null, "properties_hs_all_conversation_mentions": null, "properties_hs_all_owner_ids": null, "properties_hs_all_team_ids": null, "properties_hs_assignment_method": null, "properties_hs_auto_generated_from_thread_id": null, "properties_hs_conversations_originating_message_id": null, "properties_hs_conversations_originating_thread_id": null, "properties_hs_created_by_user_id": null, "properties_hs_createdate": null, "properties_hs_custom_inbox": null, "properties_hs_date_entered_1": "2021-02-23T20:08:49.603000+00:00", "properties_hs_date_entered_2": "2021-02-23T20:08:49.603000+00:00", "properties_hs_date_entered_3": "2021-02-23T20:08:49.603000+00:00", "properties_hs_date_entered_4": "2021-02-23T20:08:49.603000+00:00", "properties_hs_date_exited_1": "2021-02-23T20:08:49.603000+00:00", "properties_hs_date_exited_2": "2021-02-23T20:08:49.603000+00:00", "properties_hs_date_exited_3": "2021-02-23T20:08:49.603000+00:00", "properties_hs_date_exited_4": null, "properties_hs_external_object_ids": null, "properties_hs_feedback_last_ces_follow_up": null, "properties_hs_feedback_last_ces_rating": null, "properties_hs_feedback_last_survey_date": null, "properties_hs_file_upload": null, "properties_hs_first_agent_message_sent_at": null, "properties_hs_helpdesk_sort_timestamp": "2021-02-23T20:08:49.603000+00:00", "properties_hs_in_helpdesk": null, "properties_hs_inbox_id": null, "properties_hs_is_visible_in_help_desk": null, "properties_hs_last_email_activity": null, "properties_hs_last_email_date": null, "properties_hs_last_message_from_visitor": false, "properties_hs_last_message_received_at": null, "properties_hs_last_message_sent_at": null, "properties_hs_lastactivitydate": null, "properties_hs_lastcontacted": null, "properties_hs_lastmodifieddate": "2021-02-23T20:08:53.371000+00:00", "properties_hs_latest_message_seen_by_agent_ids": null, "properties_hs_merged_object_ids": null, "properties_hs_most_relevant_sla_status": null, "properties_hs_most_relevant_sla_type": null, "properties_hs_msteams_message_id": null, "properties_hs_nextactivitydate": null, "properties_hs_num_associated_companies": 0, "properties_hs_num_associated_conversations": null, "properties_hs_num_times_contacted": null, "properties_hs_object_id": 312929579, "properties_hs_object_source": "IMPORT", "properties_hs_object_source_id": null, "properties_hs_object_source_label": "IMPORT", "properties_hs_object_source_user_id": null, "properties_hs_originating_email_engagement_id": null, "properties_hs_pinned_engagement_id": null, "properties_hs_pipeline": "0", "properties_hs_pipeline_stage": "4", "properties_hs_primary_company": null, "properties_hs_primary_company_id": null, "properties_hs_primary_company_name": null, "properties_hs_read_only": null, "properties_hs_resolution": null, "properties_hs_sales_email_last_replied": null, "properties_hs_tag_ids": null, "properties_hs_thread_ids_to_restore": null, "properties_hs_ticket_category": null, "properties_hs_ticket_id": 312929579, "properties_hs_ticket_priority": "LOW", "properties_hs_time_in_1": 0, "properties_hs_time_in_2": 0, "properties_hs_time_in_3": 0, "properties_hs_time_in_4": 92081969615, "properties_hs_time_to_close_sla_at": null, "properties_hs_time_to_close_sla_status": null, "properties_hs_time_to_first_response_sla_at": null, "properties_hs_time_to_first_response_sla_status": null, "properties_hs_unique_creation_key": null, "properties_hs_updated_by_user_id": null, "properties_hs_user_ids_of_all_notification_followers": null, "properties_hs_user_ids_of_all_notification_unfollowers": null, "properties_hs_user_ids_of_all_owners": null, "properties_hs_was_imported": true, "properties_hubspot_owner_assigneddate": null, "properties_hubspot_owner_id": null, "properties_hubspot_team_id": null, "properties_last_engagement_date": null, "properties_last_reply_date": null, "properties_notes_last_contacted": null, "properties_notes_last_updated": null, "properties_notes_next_activity_date": null, "properties_nps_follow_up_answer": null, "properties_nps_follow_up_question_version": null, "properties_nps_score": null, "properties_num_contacted_notes": null, "properties_num_notes": null, "properties_source_ref": null, "properties_source_thread_id": null, "properties_source_type": "CHAT", "properties_subject": "Marketing Starter", "properties_tags": null, "properties_time_to_close": 0, "properties_time_to_first_agent_reply": null}, "emitted_at": 1706192899343}
+{"stream": "tickets", "data": {"id": "312972611", "properties": {"closed_date": null, "content": null, "created_by": null, "createdate": "2021-02-23T20:08:49.603000+00:00", "first_agent_reply_date": null, "hs_all_accessible_team_ids": null, "hs_all_associated_contact_companies": null, "hs_all_associated_contact_emails": null, "hs_all_associated_contact_firstnames": null, "hs_all_associated_contact_lastnames": null, "hs_all_associated_contact_mobilephones": null, "hs_all_associated_contact_phones": null, "hs_all_conversation_mentions": null, "hs_all_owner_ids": null, "hs_all_team_ids": null, "hs_assignment_method": null, "hs_auto_generated_from_thread_id": null, "hs_conversations_originating_message_id": null, "hs_conversations_originating_thread_id": null, "hs_created_by_user_id": null, "hs_createdate": null, "hs_custom_inbox": null, "hs_date_entered_1": "2021-02-23T20:08:49.603000+00:00", "hs_date_entered_2": "2021-02-23T20:08:49.603000+00:00", "hs_date_entered_3": null, "hs_date_entered_4": null, "hs_date_exited_1": "2021-02-23T20:08:49.603000+00:00", "hs_date_exited_2": null, "hs_date_exited_3": null, "hs_date_exited_4": null, "hs_external_object_ids": null, "hs_feedback_last_ces_follow_up": null, "hs_feedback_last_ces_rating": null, "hs_feedback_last_survey_date": null, "hs_file_upload": null, "hs_first_agent_message_sent_at": null, "hs_helpdesk_sort_timestamp": "2021-02-23T20:08:49.603000+00:00", "hs_in_helpdesk": null, "hs_inbox_id": null, "hs_is_visible_in_help_desk": null, "hs_last_email_activity": null, "hs_last_email_date": null, "hs_last_message_from_visitor": false, "hs_last_message_received_at": null, "hs_last_message_sent_at": null, "hs_lastactivitydate": null, "hs_lastcontacted": null, "hs_lastmodifieddate": "2021-02-23T20:08:52.663000+00:00", "hs_latest_message_seen_by_agent_ids": null, "hs_merged_object_ids": null, "hs_most_relevant_sla_status": null, "hs_most_relevant_sla_type": null, "hs_msteams_message_id": null, "hs_nextactivitydate": null, "hs_num_associated_companies": 0, "hs_num_associated_conversations": null, "hs_num_times_contacted": null, "hs_object_id": 312972611, "hs_object_source": "IMPORT", "hs_object_source_id": null, "hs_object_source_label": "IMPORT", "hs_object_source_user_id": null, "hs_originating_email_engagement_id": null, "hs_pinned_engagement_id": null, "hs_pipeline": "0", "hs_pipeline_stage": "2", "hs_primary_company": null, "hs_primary_company_id": null, "hs_primary_company_name": null, "hs_read_only": null, "hs_resolution": null, "hs_sales_email_last_replied": null, "hs_tag_ids": null, "hs_thread_ids_to_restore": null, "hs_ticket_category": null, "hs_ticket_id": 312972611, "hs_ticket_priority": "LOW", "hs_time_in_1": 0, "hs_time_in_2": 92081969613, "hs_time_in_3": null, "hs_time_in_4": null, "hs_time_to_close_sla_at": null, "hs_time_to_close_sla_status": null, "hs_time_to_first_response_sla_at": null, "hs_time_to_first_response_sla_status": null, "hs_unique_creation_key": null, "hs_updated_by_user_id": null, "hs_user_ids_of_all_notification_followers": null, "hs_user_ids_of_all_notification_unfollowers": null, "hs_user_ids_of_all_owners": null, "hs_was_imported": true, "hubspot_owner_assigneddate": null, "hubspot_owner_id": null, "hubspot_team_id": null, "last_engagement_date": null, "last_reply_date": null, "notes_last_contacted": null, "notes_last_updated": null, "notes_next_activity_date": null, "nps_follow_up_answer": null, "nps_follow_up_question_version": null, "nps_score": null, "num_contacted_notes": null, "num_notes": null, "source_ref": null, "source_thread_id": null, "source_type": "FORM", "subject": "Sales Starter", "tags": null, "time_to_close": null, "time_to_first_agent_reply": null}, "createdAt": "2021-02-23T20:08:49.603Z", "updatedAt": "2021-02-23T20:08:52.663Z", "archived": false, "properties_closed_date": null, "properties_content": null, "properties_created_by": null, "properties_createdate": "2021-02-23T20:08:49.603000+00:00", "properties_first_agent_reply_date": null, "properties_hs_all_accessible_team_ids": null, "properties_hs_all_associated_contact_companies": null, "properties_hs_all_associated_contact_emails": null, "properties_hs_all_associated_contact_firstnames": null, "properties_hs_all_associated_contact_lastnames": null, "properties_hs_all_associated_contact_mobilephones": null, "properties_hs_all_associated_contact_phones": null, "properties_hs_all_conversation_mentions": null, "properties_hs_all_owner_ids": null, "properties_hs_all_team_ids": null, "properties_hs_assignment_method": null, "properties_hs_auto_generated_from_thread_id": null, "properties_hs_conversations_originating_message_id": null, "properties_hs_conversations_originating_thread_id": null, "properties_hs_created_by_user_id": null, "properties_hs_createdate": null, "properties_hs_custom_inbox": null, "properties_hs_date_entered_1": "2021-02-23T20:08:49.603000+00:00", "properties_hs_date_entered_2": "2021-02-23T20:08:49.603000+00:00", "properties_hs_date_entered_3": null, "properties_hs_date_entered_4": null, "properties_hs_date_exited_1": "2021-02-23T20:08:49.603000+00:00", "properties_hs_date_exited_2": null, "properties_hs_date_exited_3": null, "properties_hs_date_exited_4": null, "properties_hs_external_object_ids": null, "properties_hs_feedback_last_ces_follow_up": null, "properties_hs_feedback_last_ces_rating": null, "properties_hs_feedback_last_survey_date": null, "properties_hs_file_upload": null, "properties_hs_first_agent_message_sent_at": null, "properties_hs_helpdesk_sort_timestamp": "2021-02-23T20:08:49.603000+00:00", "properties_hs_in_helpdesk": null, "properties_hs_inbox_id": null, "properties_hs_is_visible_in_help_desk": null, "properties_hs_last_email_activity": null, "properties_hs_last_email_date": null, "properties_hs_last_message_from_visitor": false, "properties_hs_last_message_received_at": null, "properties_hs_last_message_sent_at": null, "properties_hs_lastactivitydate": null, "properties_hs_lastcontacted": null, "properties_hs_lastmodifieddate": "2021-02-23T20:08:52.663000+00:00", "properties_hs_latest_message_seen_by_agent_ids": null, "properties_hs_merged_object_ids": null, "properties_hs_most_relevant_sla_status": null, "properties_hs_most_relevant_sla_type": null, "properties_hs_msteams_message_id": null, "properties_hs_nextactivitydate": null, "properties_hs_num_associated_companies": 0, "properties_hs_num_associated_conversations": null, "properties_hs_num_times_contacted": null, "properties_hs_object_id": 312972611, "properties_hs_object_source": "IMPORT", "properties_hs_object_source_id": null, "properties_hs_object_source_label": "IMPORT", "properties_hs_object_source_user_id": null, "properties_hs_originating_email_engagement_id": null, "properties_hs_pinned_engagement_id": null, "properties_hs_pipeline": "0", "properties_hs_pipeline_stage": "2", "properties_hs_primary_company": null, "properties_hs_primary_company_id": null, "properties_hs_primary_company_name": null, "properties_hs_read_only": null, "properties_hs_resolution": null, "properties_hs_sales_email_last_replied": null, "properties_hs_tag_ids": null, "properties_hs_thread_ids_to_restore": null, "properties_hs_ticket_category": null, "properties_hs_ticket_id": 312972611, "properties_hs_ticket_priority": "LOW", "properties_hs_time_in_1": 0, "properties_hs_time_in_2": 92081969613, "properties_hs_time_in_3": null, "properties_hs_time_in_4": null, "properties_hs_time_to_close_sla_at": null, "properties_hs_time_to_close_sla_status": null, "properties_hs_time_to_first_response_sla_at": null, "properties_hs_time_to_first_response_sla_status": null, "properties_hs_unique_creation_key": null, "properties_hs_updated_by_user_id": null, "properties_hs_user_ids_of_all_notification_followers": null, "properties_hs_user_ids_of_all_notification_unfollowers": null, "properties_hs_user_ids_of_all_owners": null, "properties_hs_was_imported": true, "properties_hubspot_owner_assigneddate": null, "properties_hubspot_owner_id": null, "properties_hubspot_team_id": null, "properties_last_engagement_date": null, "properties_last_reply_date": null, "properties_notes_last_contacted": null, "properties_notes_last_updated": null, "properties_notes_next_activity_date": null, "properties_nps_follow_up_answer": null, "properties_nps_follow_up_question_version": null, "properties_nps_score": null, "properties_num_contacted_notes": null, "properties_num_notes": null, "properties_source_ref": null, "properties_source_thread_id": null, "properties_source_type": "FORM", "properties_subject": "Sales Starter", "properties_tags": null, "properties_time_to_close": null, "properties_time_to_first_agent_reply": null}, "emitted_at": 1706192899345}
+{"stream": "tickets", "data": {"id": "312975112", "properties": {"closed_date": null, "content": null, "created_by": null, "createdate": "2021-02-23T20:08:49.603000+00:00", "first_agent_reply_date": null, "hs_all_accessible_team_ids": null, "hs_all_associated_contact_companies": null, "hs_all_associated_contact_emails": null, "hs_all_associated_contact_firstnames": null, "hs_all_associated_contact_lastnames": null, "hs_all_associated_contact_mobilephones": null, "hs_all_associated_contact_phones": null, "hs_all_conversation_mentions": null, "hs_all_owner_ids": null, "hs_all_team_ids": null, "hs_assignment_method": null, "hs_auto_generated_from_thread_id": null, "hs_conversations_originating_message_id": null, "hs_conversations_originating_thread_id": null, "hs_created_by_user_id": null, "hs_createdate": null, "hs_custom_inbox": null, "hs_date_entered_1": "2021-02-23T20:08:49.603000+00:00", "hs_date_entered_2": null, "hs_date_entered_3": null, "hs_date_entered_4": null, "hs_date_exited_1": null, "hs_date_exited_2": null, "hs_date_exited_3": null, "hs_date_exited_4": null, "hs_external_object_ids": null, "hs_feedback_last_ces_follow_up": null, "hs_feedback_last_ces_rating": null, "hs_feedback_last_survey_date": null, "hs_file_upload": null, "hs_first_agent_message_sent_at": null, "hs_helpdesk_sort_timestamp": "2021-02-23T20:08:49.603000+00:00", "hs_in_helpdesk": null, "hs_inbox_id": null, "hs_is_visible_in_help_desk": null, "hs_last_email_activity": null, "hs_last_email_date": null, "hs_last_message_from_visitor": false, "hs_last_message_received_at": null, "hs_last_message_sent_at": null, "hs_lastactivitydate": null, "hs_lastcontacted": null, "hs_lastmodifieddate": "2021-02-23T20:08:52.515000+00:00", "hs_latest_message_seen_by_agent_ids": null, "hs_merged_object_ids": null, "hs_most_relevant_sla_status": null, "hs_most_relevant_sla_type": null, "hs_msteams_message_id": null, "hs_nextactivitydate": null, "hs_num_associated_companies": 0, "hs_num_associated_conversations": null, "hs_num_times_contacted": null, "hs_object_id": 312975112, "hs_object_source": "IMPORT", "hs_object_source_id": null, "hs_object_source_label": "IMPORT", "hs_object_source_user_id": null, "hs_originating_email_engagement_id": null, "hs_pinned_engagement_id": null, "hs_pipeline": "0", "hs_pipeline_stage": "1", "hs_primary_company": null, "hs_primary_company_id": null, "hs_primary_company_name": null, "hs_read_only": null, "hs_resolution": null, "hs_sales_email_last_replied": null, "hs_tag_ids": null, "hs_thread_ids_to_restore": null, "hs_ticket_category": null, "hs_ticket_id": 312975112, "hs_ticket_priority": "MEDIUM", "hs_time_in_1": 92081969614, "hs_time_in_2": null, "hs_time_in_3": null, "hs_time_in_4": null, "hs_time_to_close_sla_at": null, "hs_time_to_close_sla_status": null, "hs_time_to_first_response_sla_at": null, "hs_time_to_first_response_sla_status": null, "hs_unique_creation_key": null, "hs_updated_by_user_id": null, "hs_user_ids_of_all_notification_followers": null, "hs_user_ids_of_all_notification_unfollowers": null, "hs_user_ids_of_all_owners": null, "hs_was_imported": true, "hubspot_owner_assigneddate": null, "hubspot_owner_id": null, "hubspot_team_id": null, "last_engagement_date": null, "last_reply_date": null, "notes_last_contacted": null, "notes_last_updated": null, "notes_next_activity_date": null, "nps_follow_up_answer": null, "nps_follow_up_question_version": null, "nps_score": null, "num_contacted_notes": null, "num_notes": null, "source_ref": null, "source_thread_id": null, "source_type": "PHONE", "subject": "Free CRM", "tags": null, "time_to_close": null, "time_to_first_agent_reply": null}, "createdAt": "2021-02-23T20:08:49.603Z", "updatedAt": "2021-02-23T20:08:52.515Z", "archived": false, "properties_closed_date": null, "properties_content": null, "properties_created_by": null, "properties_createdate": "2021-02-23T20:08:49.603000+00:00", "properties_first_agent_reply_date": null, "properties_hs_all_accessible_team_ids": null, "properties_hs_all_associated_contact_companies": null, "properties_hs_all_associated_contact_emails": null, "properties_hs_all_associated_contact_firstnames": null, "properties_hs_all_associated_contact_lastnames": null, "properties_hs_all_associated_contact_mobilephones": null, "properties_hs_all_associated_contact_phones": null, "properties_hs_all_conversation_mentions": null, "properties_hs_all_owner_ids": null, "properties_hs_all_team_ids": null, "properties_hs_assignment_method": null, "properties_hs_auto_generated_from_thread_id": null, "properties_hs_conversations_originating_message_id": null, "properties_hs_conversations_originating_thread_id": null, "properties_hs_created_by_user_id": null, "properties_hs_createdate": null, "properties_hs_custom_inbox": null, "properties_hs_date_entered_1": "2021-02-23T20:08:49.603000+00:00", "properties_hs_date_entered_2": null, "properties_hs_date_entered_3": null, "properties_hs_date_entered_4": null, "properties_hs_date_exited_1": null, "properties_hs_date_exited_2": null, "properties_hs_date_exited_3": null, "properties_hs_date_exited_4": null, "properties_hs_external_object_ids": null, "properties_hs_feedback_last_ces_follow_up": null, "properties_hs_feedback_last_ces_rating": null, "properties_hs_feedback_last_survey_date": null, "properties_hs_file_upload": null, "properties_hs_first_agent_message_sent_at": null, "properties_hs_helpdesk_sort_timestamp": "2021-02-23T20:08:49.603000+00:00", "properties_hs_in_helpdesk": null, "properties_hs_inbox_id": null, "properties_hs_is_visible_in_help_desk": null, "properties_hs_last_email_activity": null, "properties_hs_last_email_date": null, "properties_hs_last_message_from_visitor": false, "properties_hs_last_message_received_at": null, "properties_hs_last_message_sent_at": null, "properties_hs_lastactivitydate": null, "properties_hs_lastcontacted": null, "properties_hs_lastmodifieddate": "2021-02-23T20:08:52.515000+00:00", "properties_hs_latest_message_seen_by_agent_ids": null, "properties_hs_merged_object_ids": null, "properties_hs_most_relevant_sla_status": null, "properties_hs_most_relevant_sla_type": null, "properties_hs_msteams_message_id": null, "properties_hs_nextactivitydate": null, "properties_hs_num_associated_companies": 0, "properties_hs_num_associated_conversations": null, "properties_hs_num_times_contacted": null, "properties_hs_object_id": 312975112, "properties_hs_object_source": "IMPORT", "properties_hs_object_source_id": null, "properties_hs_object_source_label": "IMPORT", "properties_hs_object_source_user_id": null, "properties_hs_originating_email_engagement_id": null, "properties_hs_pinned_engagement_id": null, "properties_hs_pipeline": "0", "properties_hs_pipeline_stage": "1", "properties_hs_primary_company": null, "properties_hs_primary_company_id": null, "properties_hs_primary_company_name": null, "properties_hs_read_only": null, "properties_hs_resolution": null, "properties_hs_sales_email_last_replied": null, "properties_hs_tag_ids": null, "properties_hs_thread_ids_to_restore": null, "properties_hs_ticket_category": null, "properties_hs_ticket_id": 312975112, "properties_hs_ticket_priority": "MEDIUM", "properties_hs_time_in_1": 92081969614, "properties_hs_time_in_2": null, "properties_hs_time_in_3": null, "properties_hs_time_in_4": null, "properties_hs_time_to_close_sla_at": null, "properties_hs_time_to_close_sla_status": null, "properties_hs_time_to_first_response_sla_at": null, "properties_hs_time_to_first_response_sla_status": null, "properties_hs_unique_creation_key": null, "properties_hs_updated_by_user_id": null, "properties_hs_user_ids_of_all_notification_followers": null, "properties_hs_user_ids_of_all_notification_unfollowers": null, "properties_hs_user_ids_of_all_owners": null, "properties_hs_was_imported": true, "properties_hubspot_owner_assigneddate": null, "properties_hubspot_owner_id": null, "properties_hubspot_team_id": null, "properties_last_engagement_date": null, "properties_last_reply_date": null, "properties_notes_last_contacted": null, "properties_notes_last_updated": null, "properties_notes_next_activity_date": null, "properties_nps_follow_up_answer": null, "properties_nps_follow_up_question_version": null, "properties_nps_score": null, "properties_num_contacted_notes": null, "properties_num_notes": null, "properties_source_ref": null, "properties_source_thread_id": null, "properties_source_type": "PHONE", "properties_subject": "Free CRM", "properties_tags": null, "properties_time_to_close": null, "properties_time_to_first_agent_reply": null}, "emitted_at": 1706192899346}
 {"stream": "workflows", "data": {"migrationStatus": {"portalId": 8727216, "workflowId": 21058115, "migrationStatus": "EXECUTION_MIGRATED", "enrollmentMigrationStatus": "PLATFORM_OWNED", "platformOwnsActions": true, "lastSuccessfulMigrationTimestamp": null, "enrollmentMigrationTimestamp": null, "flowId": 50206671}, "name": "Test Workflow", "id": 21058115, "type": "DRIP_DELAY", "enabled": false, "creationSource": {"sourceApplication": {"source": "DIRECT_API"}, "createdAt": 1610635826795}, "updateSource": {"sourceApplication": {"source": "DIRECT_API", "serviceName": "AutomationPlatformService-web_BackfillILSListIds"}, "updatedAt": 1611847907577}, "contactListIds": {"enrolled": 12, "active": 13, "completed": 14, "succeeded": 15}, "personaTagIds": [], "contactCounts": {"active": 0, "enrolled": 0}, "portalId": 8727216, "insertedAt": 1610635826921, "updatedAt": 1611847907577, "contactListIds_enrolled": 12, "contactListIds_active": 13, "contactListIds_completed": 14, "contactListIds_succeeded": 15}, "emitted_at": 1697714264418}
 {"stream": "workflows", "data": {"migrationStatus": {"portalId": 8727216, "workflowId": 21058121, "migrationStatus": "EXECUTION_MIGRATED", "enrollmentMigrationStatus": "PLATFORM_OWNED", "platformOwnsActions": true, "lastSuccessfulMigrationTimestamp": null, "enrollmentMigrationTimestamp": null, "flowId": 50205684}, "name": "Test Workflow 1", "id": 21058121, "type": "DRIP_DELAY", "enabled": false, "creationSource": {"sourceApplication": {"source": "DIRECT_API"}, "createdAt": 1610635850713}, "updateSource": {"sourceApplication": {"source": "DIRECT_API", "serviceName": "AutomationPlatformService-web_BackfillILSListIds"}, "updatedAt": 1611847907579}, "contactListIds": {"enrolled": 16, "active": 17, "completed": 18, "succeeded": 19}, "personaTagIds": [], "contactCounts": {"active": 0, "enrolled": 0}, "portalId": 8727216, "insertedAt": 1610635850758, "updatedAt": 1611847907579, "contactListIds_enrolled": 16, "contactListIds_active": 17, "contactListIds_completed": 18, "contactListIds_succeeded": 19}, "emitted_at": 1697714264419}
 {"stream": "workflows", "data": {"migrationStatus": {"portalId": 8727216, "workflowId": 21058122, "migrationStatus": "EXECUTION_MIGRATED", "enrollmentMigrationStatus": "PLATFORM_OWNED", "platformOwnsActions": true, "lastSuccessfulMigrationTimestamp": null, "enrollmentMigrationTimestamp": null, "flowId": 50205036}, "name": "Test Workflow 2", "id": 21058122, "type": "DRIP_DELAY", "enabled": false, "creationSource": {"sourceApplication": {"source": "DIRECT_API"}, "createdAt": 1610635859664}, "updateSource": {"sourceApplication": {"source": "DIRECT_API", "serviceName": "AutomationPlatformService-web_BackfillILSListIds"}, "updatedAt": 1611847907578}, "contactListIds": {"enrolled": 20, "active": 21, "completed": 22, "succeeded": 23}, "personaTagIds": [], "contactCounts": {"active": 0, "enrolled": 0}, "portalId": 8727216, "insertedAt": 1610635859748, "updatedAt": 1611847907578, "contactListIds_enrolled": 20, "contactListIds_active": 21, "contactListIds_completed": 22, "contactListIds_succeeded": 23}, "emitted_at": 1697714264420}
@@ -69,4 +69,4 @@
 {"stream": "pets", "data": {"id": "5936415312", "properties": {"hs_all_accessible_team_ids": null, "hs_all_assigned_business_unit_ids": null, "hs_all_owner_ids": null, "hs_all_team_ids": null, "hs_created_by_user_id": 12282590, "hs_createdate": "2023-04-12T17:08:50.632000+00:00", "hs_lastmodifieddate": "2023-04-12T17:08:50.632000+00:00", "hs_merged_object_ids": null, "hs_object_id": 5936415312, "hs_object_source": "CRM_UI", "hs_object_source_id": "userId:12282590", "hs_object_source_label": "CRM_UI", "hs_object_source_user_id": 12282590, "hs_pinned_engagement_id": null, "hs_read_only": null, "hs_unique_creation_key": null, "hs_updated_by_user_id": 12282590, "hs_user_ids_of_all_notification_followers": null, "hs_user_ids_of_all_notification_unfollowers": null, "hs_user_ids_of_all_owners": null, "hs_was_imported": null, "hubspot_owner_assigneddate": null, "hubspot_owner_id": null, "hubspot_team_id": null, "pet_name": "Marcos Pet", "pet_type": "Dog"}, "createdAt": "2023-04-12T17:08:50.632Z", "updatedAt": "2023-04-12T17:08:50.632Z", "archived": false, "properties_hs_all_accessible_team_ids": null, "properties_hs_all_assigned_business_unit_ids": null, "properties_hs_all_owner_ids": null, "properties_hs_all_team_ids": null, "properties_hs_created_by_user_id": 12282590, "properties_hs_createdate": "2023-04-12T17:08:50.632000+00:00", "properties_hs_lastmodifieddate": "2023-04-12T17:08:50.632000+00:00", "properties_hs_merged_object_ids": null, "properties_hs_object_id": 5936415312, "properties_hs_object_source": "CRM_UI", "properties_hs_object_source_id": "userId:12282590", "properties_hs_object_source_label": "CRM_UI", "properties_hs_object_source_user_id": 12282590, "properties_hs_pinned_engagement_id": null, "properties_hs_read_only": null, "properties_hs_unique_creation_key": null, "properties_hs_updated_by_user_id": 12282590, "properties_hs_user_ids_of_all_notification_followers": null, "properties_hs_user_ids_of_all_notification_unfollowers": null, "properties_hs_user_ids_of_all_owners": null, "properties_hs_was_imported": null, "properties_hubspot_owner_assigneddate": null, "properties_hubspot_owner_id": null, "properties_hubspot_team_id": null, "properties_pet_name": "Marcos Pet", "properties_pet_type": "Dog"}, "emitted_at": 1703886126793}
 {"stream": "pets", "data": {"id": "5938880054", "properties": {"hs_all_accessible_team_ids": null, "hs_all_assigned_business_unit_ids": null, "hs_all_owner_ids": null, "hs_all_team_ids": null, "hs_created_by_user_id": 12282590, "hs_createdate": "2023-04-12T17:53:12.692000+00:00", "hs_lastmodifieddate": "2023-04-12T17:53:12.692000+00:00", "hs_merged_object_ids": null, "hs_object_id": 5938880054, "hs_object_source": "CRM_UI", "hs_object_source_id": "userId:12282590", "hs_object_source_label": "CRM_UI", "hs_object_source_user_id": 12282590, "hs_pinned_engagement_id": null, "hs_read_only": null, "hs_unique_creation_key": null, "hs_updated_by_user_id": 12282590, "hs_user_ids_of_all_notification_followers": null, "hs_user_ids_of_all_notification_unfollowers": null, "hs_user_ids_of_all_owners": null, "hs_was_imported": null, "hubspot_owner_assigneddate": null, "hubspot_owner_id": null, "hubspot_team_id": null, "pet_name": "Integration Test Pet", "pet_type": "Unknown"}, "createdAt": "2023-04-12T17:53:12.692Z", "updatedAt": "2023-04-12T17:53:12.692Z", "archived": false, "properties_hs_all_accessible_team_ids": null, "properties_hs_all_assigned_business_unit_ids": null, "properties_hs_all_owner_ids": null, "properties_hs_all_team_ids": null, "properties_hs_created_by_user_id": 12282590, "properties_hs_createdate": "2023-04-12T17:53:12.692000+00:00", "properties_hs_lastmodifieddate": "2023-04-12T17:53:12.692000+00:00", "properties_hs_merged_object_ids": null, "properties_hs_object_id": 5938880054, "properties_hs_object_source": "CRM_UI", "properties_hs_object_source_id": "userId:12282590", "properties_hs_object_source_label": "CRM_UI", "properties_hs_object_source_user_id": 12282590, "properties_hs_pinned_engagement_id": null, "properties_hs_read_only": null, "properties_hs_unique_creation_key": null, "properties_hs_updated_by_user_id": 12282590, "properties_hs_user_ids_of_all_notification_followers": null, "properties_hs_user_ids_of_all_notification_unfollowers": null, "properties_hs_user_ids_of_all_owners": null, "properties_hs_was_imported": null, "properties_hubspot_owner_assigneddate": null, "properties_hubspot_owner_id": null, "properties_hubspot_team_id": null, "properties_pet_name": "Integration Test Pet", "properties_pet_type": "Unknown"}, "emitted_at": 1703886126795}
 {"stream": "contacts_web_analytics", "data": {"objectType": "CONTACT", "objectId": "401", "eventType": "pe8727216_airbyte_contact_custom_event", "occurredAt": "2023-12-01T22:08:25.435Z", "id": "d287cdb7-3e8a-4f4d-92db-486e32f99ad4", "properties_hs_region": "officiis exercitationem modi adipisicing odit Hic", "properties_hs_campaign_id": "libero", "properties_hs_page_url": "Lorem", "properties_hs_element_id": "dolor sit", "properties_hs_browser": "architecto molestias, officiis exercitationem sit", "properties_hs_screen_width": "1531.0", "properties_hs_device_type": "sit adipisicing nobis officiis modi dolor sit", "properties_hs_link_href": "dolor magnam,", "properties_hs_element_class": "exercitationem modi nobis amet odit molestias,", "properties_hs_operating_system": "culpa! ipsum adipisicing consectetur nobis culpa!", "properties_hs_touchpoint_source": "libero modi odit ipsum Lorem accusantium culpa!", "properties_hs_utm_medium": "elit. ipsum officiis molestias, ipsum dolor quas"}, "emitted_at": 1701822848687}
-{"stream": "contacts_web_analytics", "data": {"objectType": "CONTACT", "objectId": "401", "eventType": "pe8727216_airbyte_contact_custom_event", "occurredAt": "2023-12-01T22:08:25.723Z", "id": "2f756b9a-a68d-4566-8e63-bc66b9149b41", "properties_hs_page_id": "modi sit", "properties_hs_city": "possimus modi culpa! veniam Lorem odit Lorem quas", "properties_hs_parent_module_id": "reprehenderit exercitationem dolor adipisicing", "properties_hs_user_agent": "possimus reprehenderit architecto odit ipsum, sit", "properties_hs_operating_version": "adipisicing", "properties_hs_element_id": "architecto exercitationem consectetur modi Lorem", "properties_hs_page_content_type": "amet", "properties_hs_screen_height": "4588.0", "properties_hs_operating_system": "reiciendis placeat possimus ipsum, adipisicing", "properties_hs_language": "adipisicing reprehenderit sit ipsum, amet nobis", "properties_hs_region": "placeat accusantium adipisicing culpa! modi quas", "properties_hs_utm_source": "molestias, reprehenderit reprehenderit", "properties_hs_referrer": "possimus consectetur odit sit Lorem nobis culpa!"}, "emitted_at": 1701822848688}
\ No newline at end of file
+{"stream": "contacts_web_analytics", "data": {"objectType": "CONTACT", "objectId": "401", "eventType": "pe8727216_airbyte_contact_custom_event", "occurredAt": "2023-12-01T22:08:25.723Z", "id": "2f756b9a-a68d-4566-8e63-bc66b9149b41", "properties_hs_page_id": "modi sit", "properties_hs_city": "possimus modi culpa! veniam Lorem odit Lorem quas", "properties_hs_parent_module_id": "reprehenderit exercitationem dolor adipisicing", "properties_hs_user_agent": "possimus reprehenderit architecto odit ipsum, sit", "properties_hs_operating_version": "adipisicing", "properties_hs_element_id": "architecto exercitationem consectetur modi Lorem", "properties_hs_page_content_type": "amet", "properties_hs_screen_height": "4588.0", "properties_hs_operating_system": "reiciendis placeat possimus ipsum, adipisicing", "properties_hs_language": "adipisicing reprehenderit sit ipsum, amet nobis", "properties_hs_region": "placeat accusantium adipisicing culpa! modi quas", "properties_hs_utm_source": "molestias, reprehenderit reprehenderit", "properties_hs_referrer": "possimus consectetur odit sit Lorem nobis culpa!"}, "emitted_at": 1701822848688}
diff --git a/airbyte-integrations/connectors/source-hubspot/metadata.yaml b/airbyte-integrations/connectors/source-hubspot/metadata.yaml
index 0a6414cf98bd4..6438581617b84 100644
--- a/airbyte-integrations/connectors/source-hubspot/metadata.yaml
+++ b/airbyte-integrations/connectors/source-hubspot/metadata.yaml
@@ -10,7 +10,7 @@ data:
   connectorSubtype: api
   connectorType: source
   definitionId: 36c891d9-4bd9-43ac-bad2-10e12756272c
-  dockerImageTag: 2.0.2
+  dockerImageTag: 3.0.0
   dockerRepository: airbyte/source-hubspot
   documentationUrl: https://docs.airbyte.com/integrations/sources/hubspot
   githubIssueLabel: source-hubspot
@@ -34,6 +34,14 @@ data:
           This version eliminates the Property History stream in favor of creating 3 different streams, Contacts, Companies, and Deals, which can now all fetch their property history.
           It will affect only users who use Property History stream, who will need to fix schema conflicts and sync Contacts Property History stream instead of Property History.
         upgradeDeadline: 2024-01-15
+      3.0.0:
+        message: >-
+          This update brings extended schema with data type changes for the Marketing Emails stream.
+          Users will need to refresh it and reset this stream after upgrading.
+        upgradeDeadline: 2024-02-12
+        scopedImpact:
+          - scopeType: stream
+            impactedScopes: ["marketing_emails"]
   suggestedStreams:
     streams:
       - contacts
diff --git a/airbyte-integrations/connectors/source-hubspot/source_hubspot/schemas/contact_lists.json b/airbyte-integrations/connectors/source-hubspot/source_hubspot/schemas/contact_lists.json
index 4da808123cc16..a81f43a1b4236 100644
--- a/airbyte-integrations/connectors/source-hubspot/source_hubspot/schemas/contact_lists.json
+++ b/airbyte-integrations/connectors/source-hubspot/source_hubspot/schemas/contact_lists.json
@@ -22,6 +22,12 @@
         },
         "lastSizeChangeAt": {
           "type": ["null", "integer"]
+        },
+        "listReferencesCount": {
+          "type": ["null", "integer"]
+        },
+        "parentFolderId": {
+          "type": ["null", "integer"]
         }
       }
     },
diff --git a/airbyte-integrations/connectors/source-hubspot/source_hubspot/schemas/engagements.json b/airbyte-integrations/connectors/source-hubspot/source_hubspot/schemas/engagements.json
index 43ac501b429fd..1e76c445fd7f4 100644
--- a/airbyte-integrations/connectors/source-hubspot/source_hubspot/schemas/engagements.json
+++ b/airbyte-integrations/connectors/source-hubspot/source_hubspot/schemas/engagements.json
@@ -109,6 +109,24 @@
           "items": {
             "type": ["null", "integer"]
           }
+        },
+        "contentIds": {
+          "type": ["null", "array"],
+          "items": {
+            "type": ["null", "integer"]
+          }
+        },
+        "quoteIds": {
+          "type": ["null", "array"],
+          "items": {
+            "type": ["null", "integer"]
+          }
+        },
+        "marketingEventIds": {
+          "type": ["null", "array"],
+          "items": {
+            "type": ["null", "integer"]
+          }
         }
       }
     },
diff --git a/airbyte-integrations/connectors/source-hubspot/source_hubspot/schemas/forms.json b/airbyte-integrations/connectors/source-hubspot/source_hubspot/schemas/forms.json
index c1f20f05459f6..48e77f1ef8ede 100644
--- a/airbyte-integrations/connectors/source-hubspot/source_hubspot/schemas/forms.json
+++ b/airbyte-integrations/connectors/source-hubspot/source_hubspot/schemas/forms.json
@@ -52,6 +52,20 @@
                 },
                 "fieldType": {
                   "type": ["null", "string"]
+                },
+                "validation": {
+                  "type": ["null", "object"],
+                  "properties": {
+                    "blockedEmailDomains": {
+                      "type": ["null", "array"],
+                      "items": {
+                        "type": ["null", "string"]
+                      }
+                    },
+                    "useDefaultBlockList": {
+                      "type": ["null", "boolean"]
+                    }
+                  }
                 }
               }
             }
@@ -169,6 +183,9 @@
               "type": ["null", "string"]
             }
           }
+        },
+        "cssClass": {
+          "type": ["null", "string"]
         }
       }
     },
diff --git a/airbyte-integrations/connectors/source-hubspot/source_hubspot/schemas/marketing_emails.json b/airbyte-integrations/connectors/source-hubspot/source_hubspot/schemas/marketing_emails.json
index aa15243a3daf0..f36b58d95e6fe 100644
--- a/airbyte-integrations/connectors/source-hubspot/source_hubspot/schemas/marketing_emails.json
+++ b/airbyte-integrations/connectors/source-hubspot/source_hubspot/schemas/marketing_emails.json
@@ -33,7 +33,7 @@
       "type": ["null", "string"]
     },
     "aifeatures": {
-      "type": ["null", "string"]
+      "type": ["null", "object"]
     },
     "allEmailCampaignIds": {
       "type": ["null", "array"],
@@ -215,6 +215,9 @@
     "resolvedDomain": {
       "type": ["null", "string"]
     },
+    "rootMicId": {
+      "type": ["null", "string"]
+    },
     "selected": {
       "type": ["null", "integer"]
     },
@@ -233,6 +236,9 @@
         "counters": {
           "type": ["null", "object"],
           "properties": {
+            "sent": {
+              "type": ["null", "integer"]
+            },
             "open": {
               "type": ["null", "integer"]
             },
@@ -248,6 +254,9 @@
             "click": {
               "type": ["null", "integer"]
             },
+            "reply": {
+              "type": ["null", "integer"]
+            },
             "dropped": {
               "type": ["null", "integer"]
             },
@@ -313,6 +322,9 @@
         "failedToLoad": {
           "type": ["null", "boolean"]
         },
+        "qualifierStats": {
+          "type": ["null", "object"]
+        },
         "ratios": {
           "type": ["null", "object"],
           "properties": {
@@ -328,6 +340,9 @@
             "openratio": {
               "type": ["null", "number"]
             },
+            "replyratio": {
+              "type": ["null", "number"]
+            },
             "unsubscribedratio": {
               "type": ["null", "number"]
             },
@@ -455,164 +470,61 @@
     "flexAreas": {
       "type": ["null", "object"],
       "properties": {
-        "properties": {
-          "main": {
-            "type": ["null", "object"],
-            "properties": {
-              "boxed": {
-                "type": ["null", "boolean"]
-              },
-              "isSingleColumnFullWidth": {
-                "type": ["null", "boolean"]
-              },
-              "sections": {
-                "type": ["null", "array"],
-                "items": [
-                  {
-                    "type": ["null", "object"],
-                    "properties": {
-                      "columns": {
-                        "type": ["null", "array"],
-                        "items": [
-                          {
-                            "type": ["null", "object"],
-                            "properties": {
-                              "id": {
-                                "type": ["null", "string"]
-                              },
-                              "widgets": {
-                                "type": ["null", "array"],
-                                "items": [
-                                  {
-                                    "type": ["null", "string"]
-                                  }
-                                ]
-                              },
-                              "width": {
-                                "type": ["null", "integer"]
-                              }
-                            }
-                          }
-                        ]
-                      },
-                      "id": {
-                        "type": ["null", "string"]
-                      },
-                      "style": {
-                        "type": ["null", "object"],
-                        "properties": {
-                          "backgroundColor": {
-                            "type": ["null", "string"]
-                          },
-                          "backgroundType": {
-                            "type": ["null", "string"]
-                          },
-                          "paddingBottom": {
-                            "type": ["null", "string"]
-                          },
-                          "paddingTop": {
+        "main": {
+          "type": ["null", "object"],
+          "properties": {
+            "boxed": {
+              "type": ["null", "boolean"]
+            },
+            "isSingleColumnFullWidth": {
+              "type": ["null", "boolean"]
+            },
+            "sections": {
+              "type": ["null", "array"],
+              "items": {
+                "type": ["null", "object"],
+                "properties": {
+                  "columns": {
+                    "type": ["null", "array"],
+                    "items": {
+                      "type": ["null", "object"],
+                      "properties": {
+                        "id": {
+                          "type": ["null", "string"]
+                        },
+                        "widgets": {
+                          "type": ["null", "array"],
+                          "items": {
                             "type": ["null", "string"]
                           }
+                        },
+                        "width": {
+                          "type": ["null", "integer"]
                         }
                       }
                     }
                   },
-                  {
+                  "id": {
+                    "type": ["null", "string"]
+                  },
+                  "style": {
                     "type": ["null", "object"],
                     "properties": {
-                      "columns": {
-                        "type": ["null", "array"],
-                        "items": [
-                          {
-                            "type": ["null", "object"],
-                            "properties": {
-                              "id": {
-                                "type": ["null", "string"]
-                              },
-                              "widgets": {
-                                "type": ["null", "array"],
-                                "items": [
-                                  {
-                                    "type": ["null", "string"]
-                                  }
-                                ]
-                              },
-                              "width": {
-                                "type": ["null", "integer"]
-                              }
-                            }
-                          }
-                        ]
-                      },
-                      "id": {
+                      "backgroundColor": {
                         "type": ["null", "string"]
                       },
-                      "style": {
-                        "type": ["null", "object"],
-                        "properties": {
-                          "backgroundType": {
-                            "type": ["null", "string"]
-                          },
-                          "paddingBottom": {
-                            "type": ["null", "string"]
-                          },
-                          "paddingTop": {
-                            "type": ["null", "string"]
-                          }
-                        }
-                      }
-                    }
-                  },
-                  {
-                    "type": ["null", "object"],
-                    "properties": {
-                      "columns": {
-                        "type": ["null", "array"],
-                        "items": [
-                          {
-                            "type": ["null", "object"],
-                            "properties": {
-                              "id": {
-                                "type": ["null", "string"]
-                              },
-                              "widgets": {
-                                "type": ["null", "array"],
-                                "items": [
-                                  {
-                                    "type": ["null", "string"]
-                                  }
-                                ]
-                              },
-                              "width": {
-                                "type": ["null", "integer"]
-                              }
-                            }
-                          }
-                        ]
+                      "backgroundType": {
+                        "type": ["null", "string"]
                       },
-                      "id": {
+                      "paddingBottom": {
                         "type": ["null", "string"]
                       },
-                      "style": {
-                        "type": ["null", "object"],
-                        "properties": {
-                          "backgroundColor": {
-                            "type": ["null", "string"]
-                          },
-                          "backgroundType": {
-                            "type": ["null", "string"]
-                          },
-                          "paddingBottom": {
-                            "type": ["null", "string"]
-                          },
-                          "paddingTop": {
-                            "type": ["null", "string"]
-                          }
-                        }
+                      "paddingTop": {
+                        "type": ["null", "string"]
                       }
                     }
                   }
-                ]
+                }
               }
             }
           }
@@ -659,14 +571,96 @@
         "email_body_padding": { "type": ["null", "string"] },
         "email_body_width": { "type": ["null", "string"] },
         "heading_one_font": {
+          "type": ["null", "object"],
+          "properties": {
+            "bold": { "type": ["null", "boolean"] },
+            "color": { "type": ["null", "string"] },
+            "font": { "type": ["null", "string"] },
+            "font_style": { "type": ["null", "object"] },
+            "italic": { "type": ["null", "boolean"] },
+            "size": { "type": ["null", "string"] },
+            "underline": { "type": ["null", "boolean"] }
+          }
+        },
+        "heading_two_font": {
+          "type": ["null", "object"],
           "properties": {
-            "bold": { "type": ["null", "string"] },
+            "bold": { "type": ["null", "boolean"] },
             "color": { "type": ["null", "string"] },
             "font": { "type": ["null", "string"] },
             "font_style": { "type": ["null", "object"] },
-            "italic": { "type": ["null", "string"] },
+            "italic": { "type": ["null", "boolean"] },
             "size": { "type": ["null", "string"] },
-            "underline": { "type": ["null", "string"] }
+            "underline": { "type": ["null", "boolean"] }
+          }
+        },
+        "links_font": {
+          "type": ["null", "object"],
+          "properties": {
+            "bold": { "type": ["null", "boolean"] },
+            "color": { "type": ["null", "string"] },
+            "font": { "type": ["null", "string"] },
+            "font_style": { "type": ["null", "object"] },
+            "italic": { "type": ["null", "boolean"] },
+            "size": { "type": ["null", "string"] },
+            "underline": { "type": ["null", "boolean"] }
+          }
+        },
+        "primary_accent_color": {
+          "type": ["null", "string"]
+        },
+        "primary_font": {
+          "type": ["null", "string"]
+        },
+        "primary_font_color": {
+          "type": ["null", "string"]
+        },
+        "primary_font_line_height": {
+          "type": ["null", "string"]
+        },
+        "primary_font_size": {
+          "type": ["null", "string"]
+        },
+        "secondary_accent_color": {
+          "type": ["null", "string"]
+        },
+        "secondary_font": {
+          "type": ["null", "string"]
+        },
+        "secondary_font_color": {
+          "type": ["null", "string"]
+        },
+        "secondary_font_line_height": {
+          "type": ["null", "string"]
+        },
+        "secondary_font_size": {
+          "type": ["null", "string"]
+        },
+        "use_email_client_default_settings": {
+          "type": ["null", "boolean"]
+        },
+        "user_module_defaults": {
+          "type": ["null", "object"],
+          "properties": {
+            "button_email": {
+              "type": ["null", "object"],
+              "properties": {
+                "background_color": { "type": ["null", "string"] },
+                "corner_radius": { "type": ["null", "integer"] },
+                "font": { "type": ["null", "string"] },
+                "font_color": { "type": ["null", "string"] },
+                "font_size": { "type": ["null", "integer"] },
+                "font_style": { "type": ["null", "object"] }
+              }
+            },
+            "email_divider": {
+              "type": ["null", "object"],
+              "properties": {
+                "color": { "type": ["null", "object"] },
+                "height": { "type": ["null", "integer"] },
+                "line_type": { "type": ["null", "string"] }
+              }
+            }
           }
         }
       }
diff --git a/airbyte-integrations/connectors/source-hubspot/source_hubspot/schemas/workflows.json b/airbyte-integrations/connectors/source-hubspot/source_hubspot/schemas/workflows.json
index 228121336cd76..2c40a25a4630c 100644
--- a/airbyte-integrations/connectors/source-hubspot/source_hubspot/schemas/workflows.json
+++ b/airbyte-integrations/connectors/source-hubspot/source_hubspot/schemas/workflows.json
@@ -40,6 +40,12 @@
           "items": {
             "type": ["null", "string"]
           }
+        },
+        "completed": {
+          "type": ["null", "integer"]
+        },
+        "succeeded": {
+          "type": ["null", "integer"]
         }
       }
     },
diff --git a/airbyte-integrations/connectors/source-hubspot/unit_tests/test_source.py b/airbyte-integrations/connectors/source-hubspot/unit_tests/test_source.py
index 6989843ff717d..bf043aeea2e3c 100644
--- a/airbyte-integrations/connectors/source-hubspot/unit_tests/test_source.py
+++ b/airbyte-integrations/connectors/source-hubspot/unit_tests/test_source.py
@@ -135,18 +135,18 @@ def test_convert_datetime_to_string():
 
 def test_cast_datetime(common_params, caplog):
     field_value = pendulum.now()
-    field_name = "curent_time"
+    field_name = "current_time"
 
     Companies(**common_params)._cast_datetime(field_name, field_value)
 
-    expected_warining_message = {
+    expected_warning_message = {
         "type": "LOG",
         "log": {
             "level": "WARN",
-            "message": f"Couldn't parse date/datetime string in {field_name}, trying to parse timestamp... Field value: {field_value}. Ex: argument 'input': 'DateTime' object cannot be converted to 'PyString'",
+            "message": f"Couldn't parse date/datetime string in {field_name}, trying to parse timestamp... Field value: {field_value}. Ex: argument of type 'DateTime' is not iterable",
         },
     }
-    assert expected_warining_message["log"]["message"] in caplog.text
+    assert expected_warning_message["log"]["message"] in caplog.text
 
 
 def test_check_connection_backoff_on_limit_reached(requests_mock, config):
diff --git a/docs/integrations/sources/hubspot-migrations.md b/docs/integrations/sources/hubspot-migrations.md
index 498959ee58849..32c8f6ff99975 100644
--- a/docs/integrations/sources/hubspot-migrations.md
+++ b/docs/integrations/sources/hubspot-migrations.md
@@ -1,5 +1,45 @@
 # HubSpot Migration Guide
 
+## Upgrading to 3.0.0
+
+:::note
+This change is only breaking if you are syncing the Marketing Emails stream.
+:::
+
+This update brings extended schema with data type changes for the Marketing Emails stream.
+
+Users should:
+ - Refresh the source schema for the Marketing Emails stream.
+ - Reset the stream after upgrading to ensure uninterrupted syncs.
+
+### Refresh affected schemas and reset data
+
+1. Select **Connections** in the main nav bar.
+    1. Select the connection affected by the update.
+2. Select the **Replication** tab.
+    1. Select **Refresh source schema**.
+    2. Select **OK**.
+
+:::note
+Any detected schema changes will be listed for your review.
+:::
+
+3. Select **Save changes** at the bottom of the page.
+    1. Ensure the **Reset affected streams** option is checked.
+
+:::note
+Depending on destination type you may not be prompted to reset your data.
+:::
+
+4. Select **Save connection**. 
+
+:::note
+This will reset the data in your destination and initiate a fresh sync.
+:::
+
+For more information on resetting your data in Airbyte, see [this page](https://docs.airbyte.com/operator-guides/reset)
+
+
 ## Upgrading to 2.0.0
 
 :::note
diff --git a/docs/integrations/sources/hubspot.md b/docs/integrations/sources/hubspot.md
index 97d00e2a9b94d..31af061d5a1cf 100644
--- a/docs/integrations/sources/hubspot.md
+++ b/docs/integrations/sources/hubspot.md
@@ -304,6 +304,7 @@ The connector is restricted by normal HubSpot [rate limitations](https://legacyd
 
 | Version | Date       | Pull Request                                             | Subject                                                                                                                                                                            |
 |:--------|:-----------|:---------------------------------------------------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| 3.0.0   | 2024-01-25 | [34492](https://github.com/airbytehq/airbyte/pull/34492) | Update `marketing_emails` stream schema                                                                                                                                            |
 | 2.0.2   | 2023-12-15 | [33844](https://github.com/airbytehq/airbyte/pull/33844) | Make property_history PK combined to support Incremental/Deduped sync type                                                                                                         |
 | 2.0.1   | 2023-12-15 | [33527](https://github.com/airbytehq/airbyte/pull/33527) | Make query string calculated correctly for ProertyHistory streams to avoid 414 HTTP Errors                                                                                         |
 | 2.0.0   | 2023-12-08 | [33266](https://github.com/airbytehq/airbyte/pull/33266) | Added ContactsPropertyHistory, CompaniesPropertyHistory, DealsPropertyHistory streams                                                                                              |

From 1e80b8df24397a0fa5faed70d82852ca99067044 Mon Sep 17 00:00:00 2001
From: Joe Reuter <joe@airbyte.io>
Date: Wed, 31 Jan 2024 16:32:50 +0100
Subject: [PATCH 44/96] Publish to pypi batch8 (#34690)

---
 airbyte-integrations/connectors/source-orbit/metadata.yaml    | 4 ++++
 airbyte-integrations/connectors/source-oura/metadata.yaml     | 4 ++++
 .../connectors/source-outbrain-amplify/metadata.yaml          | 4 ++++
 airbyte-integrations/connectors/source-outreach/metadata.yaml | 4 ++++
 .../connectors/source-pagerduty/metadata.yaml                 | 4 ++++
 airbyte-integrations/connectors/source-pardot/metadata.yaml   | 4 ++++
 .../connectors/source-partnerstack/metadata.yaml              | 4 ++++
 airbyte-integrations/connectors/source-paystack/metadata.yaml | 4 ++++
 airbyte-integrations/connectors/source-pendo/metadata.yaml    | 4 ++++
 .../connectors/source-persistiq/metadata.yaml                 | 4 ++++
 .../connectors/source-pexels-api/metadata.yaml                | 4 ++++
 .../connectors/source-pinterest/metadata.yaml                 | 4 ++++
 .../connectors/source-pivotal-tracker/metadata.yaml           | 4 ++++
 airbyte-integrations/connectors/source-plaid/metadata.yaml    | 4 ++++
 .../connectors/source-plausible/metadata.yaml                 | 4 ++++
 airbyte-integrations/connectors/source-pocket/metadata.yaml   | 4 ++++
 .../connectors/source-polygon-stock-api/metadata.yaml         | 4 ++++
 airbyte-integrations/connectors/source-posthog/metadata.yaml  | 4 ++++
 .../connectors/source-postmarkapp/metadata.yaml               | 4 ++++
 19 files changed, 76 insertions(+)

diff --git a/airbyte-integrations/connectors/source-orbit/metadata.yaml b/airbyte-integrations/connectors/source-orbit/metadata.yaml
index 5accdc1941407..c4ce50c056f21 100644
--- a/airbyte-integrations/connectors/source-orbit/metadata.yaml
+++ b/airbyte-integrations/connectors/source-orbit/metadata.yaml
@@ -2,6 +2,10 @@ data:
   allowedHosts:
     hosts:
       - "*"
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-orbit
   registries:
     oss:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-oura/metadata.yaml b/airbyte-integrations/connectors/source-oura/metadata.yaml
index 01992bf8de55f..a8279f08a9339 100644
--- a/airbyte-integrations/connectors/source-oura/metadata.yaml
+++ b/airbyte-integrations/connectors/source-oura/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: oura.svg
   license: MIT
   name: Oura
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-oura
   registries:
     cloud:
       enabled: false
diff --git a/airbyte-integrations/connectors/source-outbrain-amplify/metadata.yaml b/airbyte-integrations/connectors/source-outbrain-amplify/metadata.yaml
index 502c3d43ef58c..06fd36aa0e7d9 100644
--- a/airbyte-integrations/connectors/source-outbrain-amplify/metadata.yaml
+++ b/airbyte-integrations/connectors/source-outbrain-amplify/metadata.yaml
@@ -1,4 +1,8 @@
 data:
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-outbrain-amplify
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-outreach/metadata.yaml b/airbyte-integrations/connectors/source-outreach/metadata.yaml
index 30fa657439646..3e5d2a105c5e2 100644
--- a/airbyte-integrations/connectors/source-outreach/metadata.yaml
+++ b/airbyte-integrations/connectors/source-outreach/metadata.yaml
@@ -12,6 +12,10 @@ data:
   icon: outreach.svg
   license: MIT
   name: Outreach
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-outreach
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-pagerduty/metadata.yaml b/airbyte-integrations/connectors/source-pagerduty/metadata.yaml
index 0b471649a4a4d..1d1bce47b87ec 100644
--- a/airbyte-integrations/connectors/source-pagerduty/metadata.yaml
+++ b/airbyte-integrations/connectors/source-pagerduty/metadata.yaml
@@ -2,6 +2,10 @@ data:
   allowedHosts:
     hosts:
       - api.pagerduty.com
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-pagerduty
   registries:
     oss:
       enabled: false
diff --git a/airbyte-integrations/connectors/source-pardot/metadata.yaml b/airbyte-integrations/connectors/source-pardot/metadata.yaml
index 6a0ab9f2d1ff9..6bc3843e5f5c6 100644
--- a/airbyte-integrations/connectors/source-pardot/metadata.yaml
+++ b/airbyte-integrations/connectors/source-pardot/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: salesforcepardot.svg
   license: MIT
   name: Pardot
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-pardot
   registries:
     cloud:
       enabled: false
diff --git a/airbyte-integrations/connectors/source-partnerstack/metadata.yaml b/airbyte-integrations/connectors/source-partnerstack/metadata.yaml
index 726c61a4f52db..cf6483ba48993 100644
--- a/airbyte-integrations/connectors/source-partnerstack/metadata.yaml
+++ b/airbyte-integrations/connectors/source-partnerstack/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: partnerstack.svg
   license: MIT
   name: PartnerStack
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-partnerstack
   registries:
     cloud:
       enabled: false
diff --git a/airbyte-integrations/connectors/source-paystack/metadata.yaml b/airbyte-integrations/connectors/source-paystack/metadata.yaml
index d65d615b940bb..203dd02b642c2 100644
--- a/airbyte-integrations/connectors/source-paystack/metadata.yaml
+++ b/airbyte-integrations/connectors/source-paystack/metadata.yaml
@@ -11,6 +11,10 @@ data:
   icon: paystack.svg
   license: MIT
   name: Paystack
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-paystack
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-pendo/metadata.yaml b/airbyte-integrations/connectors/source-pendo/metadata.yaml
index c3f0ee28127a5..be8343b55fa15 100644
--- a/airbyte-integrations/connectors/source-pendo/metadata.yaml
+++ b/airbyte-integrations/connectors/source-pendo/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: pendo.svg
   license: MIT
   name: Pendo
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-pendo
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-persistiq/metadata.yaml b/airbyte-integrations/connectors/source-persistiq/metadata.yaml
index 2d06105f0138a..90a020fc773b2 100644
--- a/airbyte-integrations/connectors/source-persistiq/metadata.yaml
+++ b/airbyte-integrations/connectors/source-persistiq/metadata.yaml
@@ -2,6 +2,10 @@ data:
   allowedHosts:
     hosts:
       - api.persistiq.com
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-persistiq
   registries:
     oss:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-pexels-api/metadata.yaml b/airbyte-integrations/connectors/source-pexels-api/metadata.yaml
index 5a90b9a93769d..9e5e8cab8fa34 100644
--- a/airbyte-integrations/connectors/source-pexels-api/metadata.yaml
+++ b/airbyte-integrations/connectors/source-pexels-api/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: pexels.svg
   license: MIT
   name: Pexels API
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-pexels-api
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-pinterest/metadata.yaml b/airbyte-integrations/connectors/source-pinterest/metadata.yaml
index e496ea4154c69..61d7f60529dfb 100644
--- a/airbyte-integrations/connectors/source-pinterest/metadata.yaml
+++ b/airbyte-integrations/connectors/source-pinterest/metadata.yaml
@@ -13,6 +13,10 @@ data:
   icon: pinterest.svg
   license: MIT
   name: Pinterest
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-pinterest
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-pivotal-tracker/metadata.yaml b/airbyte-integrations/connectors/source-pivotal-tracker/metadata.yaml
index 013eac02808a9..a41a1713b0160 100644
--- a/airbyte-integrations/connectors/source-pivotal-tracker/metadata.yaml
+++ b/airbyte-integrations/connectors/source-pivotal-tracker/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: pivotal-tracker.svg
   license: MIT
   name: Pivotal Tracker
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-pivotal-tracker
   registries:
     cloud:
       enabled: false
diff --git a/airbyte-integrations/connectors/source-plaid/metadata.yaml b/airbyte-integrations/connectors/source-plaid/metadata.yaml
index e05ecb3ad445c..a8407c8ad2b1f 100644
--- a/airbyte-integrations/connectors/source-plaid/metadata.yaml
+++ b/airbyte-integrations/connectors/source-plaid/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: plaid.svg
   license: MIT
   name: Plaid
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-plaid
   registries:
     cloud:
       enabled: false
diff --git a/airbyte-integrations/connectors/source-plausible/metadata.yaml b/airbyte-integrations/connectors/source-plausible/metadata.yaml
index 042fa88dd49a8..086d1c33a3c02 100644
--- a/airbyte-integrations/connectors/source-plausible/metadata.yaml
+++ b/airbyte-integrations/connectors/source-plausible/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: plausible.svg
   license: MIT
   name: Plausible
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-plausible
   registries:
     cloud:
       enabled: false
diff --git a/airbyte-integrations/connectors/source-pocket/metadata.yaml b/airbyte-integrations/connectors/source-pocket/metadata.yaml
index 145bf1b927e4a..219e92e32df28 100644
--- a/airbyte-integrations/connectors/source-pocket/metadata.yaml
+++ b/airbyte-integrations/connectors/source-pocket/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: pocket.svg
   license: MIT
   name: Pocket
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-pocket
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-polygon-stock-api/metadata.yaml b/airbyte-integrations/connectors/source-polygon-stock-api/metadata.yaml
index 9be804fef482c..897591536c318 100644
--- a/airbyte-integrations/connectors/source-polygon-stock-api/metadata.yaml
+++ b/airbyte-integrations/connectors/source-polygon-stock-api/metadata.yaml
@@ -11,6 +11,10 @@ data:
   icon: polygon.svg
   license: MIT
   name: Polygon Stock API
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-polygon-stock-api
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-posthog/metadata.yaml b/airbyte-integrations/connectors/source-posthog/metadata.yaml
index 792e53553194d..cfd5c0c747796 100644
--- a/airbyte-integrations/connectors/source-posthog/metadata.yaml
+++ b/airbyte-integrations/connectors/source-posthog/metadata.yaml
@@ -16,6 +16,10 @@ data:
   icon: posthog.svg
   license: MIT
   name: PostHog
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-posthog
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-postmarkapp/metadata.yaml b/airbyte-integrations/connectors/source-postmarkapp/metadata.yaml
index bac99f12668c8..58849623dd1cc 100644
--- a/airbyte-integrations/connectors/source-postmarkapp/metadata.yaml
+++ b/airbyte-integrations/connectors/source-postmarkapp/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: postmark.svg
   license: MIT
   name: Postmark App
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-postmarkapp
   registries:
     cloud:
       enabled: true

From a5d3bad02f9d2909b86773a3ea83a49cb2163559 Mon Sep 17 00:00:00 2001
From: Christo Grabowski <108154848+ChristoGrab@users.noreply.github.com>
Date: Wed, 31 Jan 2024 10:47:50 -0500
Subject: [PATCH 45/96] Source Azure Table Storage: CDK Update (#34576)

---
 .../connectors/source-azure-table/Dockerfile  |   2 +-
 .../acceptance-test-config.yml                |  41 ++++---
 .../integration_tests/abnormal_state.json     |  12 +-
 .../integration_tests/catalog.json            |  21 ----
 .../integration_tests/configured_catalog.json |  22 ++--
 .../integration_tests/state.json              |   5 -
 .../source-azure-table/metadata.yaml          |   2 +-
 .../source_azure_table/source.py              |   6 +-
 .../source_azure_table/streams.py             |   2 +-
 .../source-azure-table/unit_tests/conftest.py |  43 ++++++++
 .../unit_tests/test_azure_table.py            | 103 ++++++++++++++++++
 .../unit_tests/test_source.py                 |  31 +-----
 docs/integrations/sources/azure-table.md      |   3 +-
 13 files changed, 200 insertions(+), 93 deletions(-)
 delete mode 100644 airbyte-integrations/connectors/source-azure-table/integration_tests/catalog.json
 delete mode 100644 airbyte-integrations/connectors/source-azure-table/integration_tests/state.json
 create mode 100644 airbyte-integrations/connectors/source-azure-table/unit_tests/conftest.py
 create mode 100644 airbyte-integrations/connectors/source-azure-table/unit_tests/test_azure_table.py

diff --git a/airbyte-integrations/connectors/source-azure-table/Dockerfile b/airbyte-integrations/connectors/source-azure-table/Dockerfile
index 6b59fb5dbbb7b..ce1a741668d06 100644
--- a/airbyte-integrations/connectors/source-azure-table/Dockerfile
+++ b/airbyte-integrations/connectors/source-azure-table/Dockerfile
@@ -34,5 +34,5 @@ COPY source_azure_table ./source_azure_table
 ENV AIRBYTE_ENTRYPOINT "python /airbyte/integration_code/main.py"
 ENTRYPOINT ["python", "/airbyte/integration_code/main.py"]
 
-LABEL io.airbyte.version=0.1.3
+LABEL io.airbyte.version=0.1.4
 LABEL io.airbyte.name=airbyte/source-azure-table
diff --git a/airbyte-integrations/connectors/source-azure-table/acceptance-test-config.yml b/airbyte-integrations/connectors/source-azure-table/acceptance-test-config.yml
index 89f5b61d61a3d..dfb70d970ab83 100644
--- a/airbyte-integrations/connectors/source-azure-table/acceptance-test-config.yml
+++ b/airbyte-integrations/connectors/source-azure-table/acceptance-test-config.yml
@@ -1,27 +1,32 @@
 # See [Connector Acceptance Tests](https://docs.airbyte.com/connector-development/testing-connectors/connector-acceptance-tests-reference)
 # for more information about how to configure these tests
 connector_image: airbyte/source-azure-table:dev
-tests:
+acceptance_tests:
   spec:
-    - spec_path: "source_azure_table/spec.json"
+    tests:
+      - spec_path: "source_azure_table/spec.json"
   connection:
-    - config_path: "secrets/config.json"
-      status: "succeed"
-    - config_path: "integration_tests/invalid_config.json"
-      status: "failed"
+    tests:
+      - config_path: "secrets/config.json"
+        status: "succeed"
+      - config_path: "integration_tests/invalid_config.json"
+        status: "failed"
   discovery:
-    - config_path: "secrets/config.json"
+    tests:
+      - config_path: "secrets/config.json"
   basic_read:
-    - config_path: "secrets/config.json"
-      configured_catalog_path: "integration_tests/configured_catalog.json"
-      empty_streams: []
-      validate_schema: False
+    tests:
+      - config_path: "secrets/config.json"
+        configured_catalog_path: "integration_tests/configured_catalog.json"
+        empty_streams: []
+        validate_schema: False
   incremental:
-    - config_path: "secrets/config.json"
-      configured_catalog_path: "integration_tests/configured_catalog.json"
-      future_state_path: "integration_tests/abnormal_state.json"
+    tests:
+      - config_path: "secrets/config.json"
+        configured_catalog_path: "integration_tests/configured_catalog.json"
+        future_state:
+          future_state_path: "integration_tests/abnormal_state.json"
   full_refresh:
-    - config_path: "secrets/config.json"
-      configured_catalog_path: "integration_tests/configured_catalog.json"
-      ignored_fields:
-        "AirbyteTest": ["record"]
+    tests:
+      - config_path: "secrets/config.json"
+        configured_catalog_path: "integration_tests/configured_catalog.json"
diff --git a/airbyte-integrations/connectors/source-azure-table/integration_tests/abnormal_state.json b/airbyte-integrations/connectors/source-azure-table/integration_tests/abnormal_state.json
index ac616e99229ba..c0596a4d3d31c 100644
--- a/airbyte-integrations/connectors/source-azure-table/integration_tests/abnormal_state.json
+++ b/airbyte-integrations/connectors/source-azure-table/integration_tests/abnormal_state.json
@@ -1,5 +1,9 @@
-{
-  "Test": {
-    "PartitionKey": "abcd"
+[
+  {
+    "type": "STREAM",
+    "stream": {
+      "stream_state": { "PartitionKey": "999" },
+      "stream_descriptor": { "name": "pokemon" }
+    }
   }
-}
+]
diff --git a/airbyte-integrations/connectors/source-azure-table/integration_tests/catalog.json b/airbyte-integrations/connectors/source-azure-table/integration_tests/catalog.json
deleted file mode 100644
index 40d0d8b72734e..0000000000000
--- a/airbyte-integrations/connectors/source-azure-table/integration_tests/catalog.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
-  "streams": [
-    {
-      "stream": {
-        "name": "Test",
-        "json_schema": {
-          "properties": {
-            "PartitionKey": {
-              "type": "string"
-            }
-          }
-        },
-        "supported_sync_modes": ["full_refresh", "incremental"]
-      },
-      "source_defined_cursor": true,
-      "sync_mode": "incremental",
-      "destination_sync_mode": "append",
-      "cursor_field": ["PartitionKey"]
-    }
-  ]
-}
diff --git a/airbyte-integrations/connectors/source-azure-table/integration_tests/configured_catalog.json b/airbyte-integrations/connectors/source-azure-table/integration_tests/configured_catalog.json
index 40d0d8b72734e..bfa35916e08ed 100644
--- a/airbyte-integrations/connectors/source-azure-table/integration_tests/configured_catalog.json
+++ b/airbyte-integrations/connectors/source-azure-table/integration_tests/configured_catalog.json
@@ -2,20 +2,24 @@
   "streams": [
     {
       "stream": {
-        "name": "Test",
-        "json_schema": {
-          "properties": {
-            "PartitionKey": {
-              "type": "string"
-            }
-          }
-        },
+        "name": "pokemon",
+        "json_schema": {},
+        "source_defined_cursor": true,
         "supported_sync_modes": ["full_refresh", "incremental"]
       },
-      "source_defined_cursor": true,
       "sync_mode": "incremental",
       "destination_sync_mode": "append",
       "cursor_field": ["PartitionKey"]
+    },
+    {
+      "stream": {
+        "name": "campaigns",
+        "json_schema": {},
+        "source_defined_cursor": true,
+        "supported_sync_modes": ["full_refresh", "incremental"]
+      },
+      "sync_mode": "full_refresh",
+      "destination_sync_mode": "overwrite"
     }
   ]
 }
diff --git a/airbyte-integrations/connectors/source-azure-table/integration_tests/state.json b/airbyte-integrations/connectors/source-azure-table/integration_tests/state.json
deleted file mode 100644
index 3859e6df625f2..0000000000000
--- a/airbyte-integrations/connectors/source-azure-table/integration_tests/state.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-  "Test": {
-    "PartitionKey": "1"
-  }
-}
diff --git a/airbyte-integrations/connectors/source-azure-table/metadata.yaml b/airbyte-integrations/connectors/source-azure-table/metadata.yaml
index 6fa88db581247..f709d284dcee4 100644
--- a/airbyte-integrations/connectors/source-azure-table/metadata.yaml
+++ b/airbyte-integrations/connectors/source-azure-table/metadata.yaml
@@ -2,7 +2,7 @@ data:
   connectorSubtype: database
   connectorType: source
   definitionId: 798ae795-5189-42b6-b64e-3cb91db93338
-  dockerImageTag: 0.1.3
+  dockerImageTag: 0.1.4
   dockerRepository: airbyte/source-azure-table
   githubIssueLabel: source-azure-table
   icon: azureblobstorage.svg
diff --git a/airbyte-integrations/connectors/source-azure-table/source_azure_table/source.py b/airbyte-integrations/connectors/source-azure-table/source_azure_table/source.py
index e5ef7b3f6967e..9a2fcc8f567e6 100644
--- a/airbyte-integrations/connectors/source-azure-table/source_azure_table/source.py
+++ b/airbyte-integrations/connectors/source-azure-table/source_azure_table/source.py
@@ -39,6 +39,7 @@ def get_typed_schema(self) -> object:
         return {
             "$schema": "http://json-schema.org/draft-07/schema#",
             "type": "object",
+            "additionalProperties": True,
             "properties": {"PartitionKey": {"type": "string"}},
         }
 
@@ -50,7 +51,7 @@ def check(self, logger: AirbyteLogger, config: Mapping[str, Any]) -> AirbyteConn
             next(tables_iterator)
             return AirbyteConnectionStatus(status=Status.SUCCEEDED)
         except StopIteration:
-            logger.log("No tables found, but credentials are correct.")
+            logger.info("The credentials you provided are valid, but no tables were found in the Storage Account.")
             return AirbyteConnectionStatus(status=Status.SUCCEEDED)
         except Exception as e:
             return AirbyteConnectionStatus(status=Status.FAILED, message=f"An exception occurred: {str(e)}")
@@ -70,8 +71,7 @@ def discover(self, logger: AirbyteLogger, config: Mapping[str, Any]) -> AirbyteC
                 default_cursor_field=["PartitionKey"],
             )
             streams.append(stream)
-        logger.info(f"Total {streams.count} streams found.")
-
+        logger.info(f"Total {len(streams)} streams found.")
         return AirbyteCatalog(streams=streams)
 
     def streams(self, logger: AirbyteLogger, config: Mapping[str, Any]) -> List[Stream]:
diff --git a/airbyte-integrations/connectors/source-azure-table/source_azure_table/streams.py b/airbyte-integrations/connectors/source-azure-table/source_azure_table/streams.py
index 13f68760f540d..d4f2669109a27 100644
--- a/airbyte-integrations/connectors/source-azure-table/source_azure_table/streams.py
+++ b/airbyte-integrations/connectors/source-azure-table/source_azure_table/streams.py
@@ -24,7 +24,7 @@ def name(self):
         return self.stream_name
 
     def get_updated_state(self, current_stream_state: MutableMapping[str, Any], latest_record: Mapping[str, Any]):
-        return {self.cursor_field[0]: latest_record.record.data.get(self.cursor_field[0])}
+        return {self.cursor_field[0]: latest_record.data.get(self.cursor_field[0])}
 
     def _update_state(self, latest_cursor):
         self._state = latest_cursor
diff --git a/airbyte-integrations/connectors/source-azure-table/unit_tests/conftest.py b/airbyte-integrations/connectors/source-azure-table/unit_tests/conftest.py
new file mode 100644
index 0000000000000..4b78c28bb43d4
--- /dev/null
+++ b/airbyte-integrations/connectors/source-azure-table/unit_tests/conftest.py
@@ -0,0 +1,43 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+import logging
+from unittest import mock
+
+import pytest
+from source_azure_table.azure_table import AzureTableReader
+from source_azure_table.source import SourceAzureTable
+
+
+# Fixtures
+@pytest.fixture
+def config():
+    return {"storage_account_name": "dummy-value", "storage_access_key": "dummy-value", "storage_endpoint_suffix": "dummy-value"}
+
+
+@pytest.fixture
+def tables():
+    table1 = mock.Mock()
+    table1.name = "AzureTable1"
+    table2 = mock.Mock()
+    table2.name = "AzureTable2"
+
+    tables = mock.MagicMock()
+    tables.__iter__.return_value = [table1, table2]
+    return tables
+
+
+@pytest.fixture
+def source():
+    return SourceAzureTable()
+
+
+@pytest.fixture
+def logger():
+    return logging.getLogger("airbyte")
+
+
+@pytest.fixture
+def reader(config, logger):
+    return AzureTableReader(logger, config)
diff --git a/airbyte-integrations/connectors/source-azure-table/unit_tests/test_azure_table.py b/airbyte-integrations/connectors/source-azure-table/unit_tests/test_azure_table.py
new file mode 100644
index 0000000000000..752e8472480cf
--- /dev/null
+++ b/airbyte-integrations/connectors/source-azure-table/unit_tests/test_azure_table.py
@@ -0,0 +1,103 @@
+#
+# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
+#
+
+import pytest
+
+
+def test_get_table_service_client_return(mocker, reader):
+    """
+    Test that the get_table_service_client method returns the expected Table Service Client.
+    """
+    mock_client = "dummy-client"
+    mocker.patch(
+        "source_azure_table.azure_table.TableServiceClient.from_connection_string",
+        return_value=mock_client,
+    )
+
+    client = reader.get_table_service_client()
+    assert client == mock_client
+
+
+def test_get_table_service_client_handles_exception(mocker, reader):
+    """
+    Test that get_table_service_client method handles exceptions correctly.
+    """
+    mocker.patch(
+        "source_azure_table.azure_table.TableServiceClient.from_connection_string",
+        side_effect=Exception("Connection error")
+    )
+
+    with pytest.raises(Exception) as exc_info:
+        reader.get_table_service_client()
+    
+    assert "Connection error" in str(exc_info.value)
+
+
+def test_get_table_client_return(mocker, reader):
+    """
+    Test that the get_table_client method returns the expected Table Client.
+    """
+    mock_client = "dummy-client"
+    mocker.patch(
+        "source_azure_table.azure_table.TableClient.from_connection_string",
+        return_value=mock_client,
+    )
+
+    table = reader.get_table_client("dummy-table")
+    assert table == mock_client
+
+
+def test_get_table_client_handles_exception(mocker, reader):
+    """
+    Test that get_table_client method handles exceptions correctly.
+    """
+
+    # The method throws its own exception for empty table names
+    with pytest.raises(Exception) as exc_info:
+        reader.get_table_client("")
+    assert "table name is not valid." in str(exc_info.value)
+
+    mocker.patch(
+        "source_azure_table.azure_table.TableClient.from_connection_string",
+        side_effect=Exception("Connection error")
+    )
+
+    with pytest.raises(Exception) as exc_info:
+        reader.get_table_client("valid_table_name")
+    assert "Connection error" in str(exc_info.value)
+
+
+def test_get_tables_return(mocker, reader, tables):
+    """
+    Test that the get_tables method returns the expected tables.
+    """
+    mock_client = mocker.MagicMock()
+    mock_client.list_tables.return_value = tables.__iter__()
+    mocker.patch(
+        "azure.data.tables.TableServiceClient.from_connection_string",
+        return_value=mock_client
+    )
+
+    result = reader.get_tables()
+    result_table_names = [table.name for table in result]
+
+    expected_table_names = ["AzureTable1", "AzureTable2"]
+    assert result_table_names == expected_table_names
+
+
+def test_get_tables_handles_exception(mocker, reader):
+    """
+    Test that get_tables method handles exceptions correctly.
+    """
+    mock_client = mocker.MagicMock()
+    mock_client.list_tables.side_effect = Exception("Failed to list tables")
+    mocker.patch(
+        "azure.data.tables.TableServiceClient.from_connection_string",
+        return_value=mock_client
+    )
+
+    with pytest.raises(Exception) as exc_info:
+        reader.get_tables()
+
+    assert "Failed to list tables" in str(exc_info.value)
diff --git a/airbyte-integrations/connectors/source-azure-table/unit_tests/test_source.py b/airbyte-integrations/connectors/source-azure-table/unit_tests/test_source.py
index bc1ce50f12bca..956375acda0bf 100644
--- a/airbyte-integrations/connectors/source-azure-table/unit_tests/test_source.py
+++ b/airbyte-integrations/connectors/source-azure-table/unit_tests/test_source.py
@@ -2,38 +2,12 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-import logging
-from unittest import mock
-
-import pytest
 from airbyte_cdk.models import AirbyteCatalog, SyncMode
-from source_azure_table.source import SourceAzureTable
 from source_azure_table.streams import AzureTableStream
 
-source = SourceAzureTable()
-logger = logging.getLogger()
-
-
-# Fixtures
-@pytest.fixture
-def config():
-    return {"storage_account_name": "dummy-value", "storage_access_key": "dummy-value", "storage_endpoint_suffix": "dummy-value"}
-
-
-@pytest.fixture
-def tables():
-    table1 = mock.Mock()
-    table1.name = "AzureTable1"
-    table2 = mock.Mock()
-    table2.name = "AzureTable2"
-
-    tables = mock.MagicMock()
-    tables.__iter__.return_value = [table1, table2]
-    return tables
-
 
 # Tests
-def test_discover(mocker, config, tables):
+def test_discover(mocker, config, tables, source, logger):
     mocker.patch(
         "source_azure_table.azure_table.AzureTableReader.get_tables",
         return_value=tables,
@@ -47,6 +21,7 @@ def test_discover(mocker, config, tables):
     assert stream.json_schema == {
         "$schema": "http://json-schema.org/draft-07/schema#",
         "type": "object",
+        "additionalProperties": True,
         "properties": {"PartitionKey": {"type": "string"}},
     }
     assert stream.supported_sync_modes == [SyncMode.full_refresh, SyncMode.incremental]
@@ -54,7 +29,7 @@ def test_discover(mocker, config, tables):
     assert stream.default_cursor_field == ["PartitionKey"]
 
 
-def test_streams(mocker, config, tables):
+def test_streams(mocker, config, tables, source, logger):
     mocker.patch(
         "source_azure_table.azure_table.AzureTableReader.get_tables",
         return_value=tables,
diff --git a/docs/integrations/sources/azure-table.md b/docs/integrations/sources/azure-table.md
index 6ea26ec6c34ee..f617018961a63 100644
--- a/docs/integrations/sources/azure-table.md
+++ b/docs/integrations/sources/azure-table.md
@@ -62,12 +62,11 @@ Visit the [Azure Portal](https://portal.azure.com). Go to your storage account,
 
 We recommend creating a restricted key specifically for Airbyte access. This will allow you to control which resources Airbyte should be able to access. However, shared access key authentication is not supported by this connector yet.
 
-
 ## Changelog
 
 | Version | Date       | Pull Request                                             | Subject                                           |
 | :------ | :--------- | :------------------------------------------------------- | :------------------------------------------------ |
+| 0.1.4   | 2024-01-26 | [34576](https://github.com/airbytehq/airbyte/pull/34576) | Migrate to per-stream/global state                |
 | 0.1.3   | 2022-08-12 | [15591](https://github.com/airbytehq/airbyte/pull/15591) | Clean instantiation of AirbyteStream              |
 | 0.1.2   | 2021-12-23 | [14212](https://github.com/airbytehq/airbyte/pull/14212) | Adding incremental load capability                |
 | 0.1.1   | 2021-12-23 | [8434](https://github.com/airbytehq/airbyte/pull/8434)   | Update fields in source-connectors specifications |
-

From 2cff69041bfa39cbeab75459eab4ead2d2d44f62 Mon Sep 17 00:00:00 2001
From: Joe Reuter <joe@airbyte.io>
Date: Wed, 31 Jan 2024 17:34:02 +0100
Subject: [PATCH 46/96] Publish to pypi batch9 (#34691)

---
 .../connectors/source-prestashop/metadata.yaml                | 4 ++++
 .../connectors/source-primetric/metadata.yaml                 | 4 ++++
 .../connectors/source-public-apis/metadata.yaml               | 4 ++++
 airbyte-integrations/connectors/source-punk-api/metadata.yaml | 4 ++++
 airbyte-integrations/connectors/source-pypi/metadata.yaml     | 4 ++++
 airbyte-integrations/connectors/source-qualaroo/metadata.yaml | 4 ++++
 .../connectors/source-quickbooks/metadata.yaml                | 4 ++++
 airbyte-integrations/connectors/source-railz/metadata.yaml    | 4 ++++
 .../connectors/source-rd-station-marketing/metadata.yaml      | 4 ++++
 airbyte-integrations/connectors/source-recharge/metadata.yaml | 4 ++++
 .../connectors/source-recreation/metadata.yaml                | 4 ++++
 .../connectors/source-recruitee/metadata.yaml                 | 4 ++++
 airbyte-integrations/connectors/source-recurly/metadata.yaml  | 4 ++++
 airbyte-integrations/connectors/source-reply-io/metadata.yaml | 4 ++++
 airbyte-integrations/connectors/source-retently/metadata.yaml | 4 ++++
 .../connectors/source-ringcentral/metadata.yaml               | 4 ++++
 .../connectors/source-rki-covid/metadata.yaml                 | 4 ++++
 .../connectors/source-rocket-chat/metadata.yaml               | 4 ++++
 18 files changed, 72 insertions(+)

diff --git a/airbyte-integrations/connectors/source-prestashop/metadata.yaml b/airbyte-integrations/connectors/source-prestashop/metadata.yaml
index 1843470086851..dbbf6240c1872 100644
--- a/airbyte-integrations/connectors/source-prestashop/metadata.yaml
+++ b/airbyte-integrations/connectors/source-prestashop/metadata.yaml
@@ -15,6 +15,10 @@ data:
   icon: prestashop.svg
   license: MIT
   name: PrestaShop
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-prestashop
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-primetric/metadata.yaml b/airbyte-integrations/connectors/source-primetric/metadata.yaml
index 38b37950abad1..83bd3b3ecda99 100644
--- a/airbyte-integrations/connectors/source-primetric/metadata.yaml
+++ b/airbyte-integrations/connectors/source-primetric/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: primetric.svg
   license: MIT
   name: Primetric
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-primetric
   registries:
     cloud:
       enabled: false
diff --git a/airbyte-integrations/connectors/source-public-apis/metadata.yaml b/airbyte-integrations/connectors/source-public-apis/metadata.yaml
index c83aba288893c..fe8481eaf1f1f 100644
--- a/airbyte-integrations/connectors/source-public-apis/metadata.yaml
+++ b/airbyte-integrations/connectors/source-public-apis/metadata.yaml
@@ -2,6 +2,10 @@ data:
   allowedHosts:
     hosts:
       - "*"
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-public-apis
   registries:
     cloud:
       enabled: false
diff --git a/airbyte-integrations/connectors/source-punk-api/metadata.yaml b/airbyte-integrations/connectors/source-punk-api/metadata.yaml
index 942b617b200fd..80d6d03f5a1a4 100644
--- a/airbyte-integrations/connectors/source-punk-api/metadata.yaml
+++ b/airbyte-integrations/connectors/source-punk-api/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: punkapi.svg
   license: MIT
   name: Punk API
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-punk-api
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-pypi/metadata.yaml b/airbyte-integrations/connectors/source-pypi/metadata.yaml
index 90cd84ad65098..978205dca0d57 100644
--- a/airbyte-integrations/connectors/source-pypi/metadata.yaml
+++ b/airbyte-integrations/connectors/source-pypi/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: pypi.svg
   license: MIT
   name: PyPI
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-pypi
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-qualaroo/metadata.yaml b/airbyte-integrations/connectors/source-qualaroo/metadata.yaml
index e291b82f879a1..f33f9ef7bdecd 100644
--- a/airbyte-integrations/connectors/source-qualaroo/metadata.yaml
+++ b/airbyte-integrations/connectors/source-qualaroo/metadata.yaml
@@ -2,6 +2,10 @@ data:
   allowedHosts:
     hosts:
       - "*" # Please change to the hostname of the source.
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-qualaroo
   registries:
     oss:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-quickbooks/metadata.yaml b/airbyte-integrations/connectors/source-quickbooks/metadata.yaml
index 0961738252b37..c75af443cb2cf 100644
--- a/airbyte-integrations/connectors/source-quickbooks/metadata.yaml
+++ b/airbyte-integrations/connectors/source-quickbooks/metadata.yaml
@@ -13,6 +13,10 @@ data:
   icon: quickbooks.svg
   license: MIT
   name: QuickBooks
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-quickbooks
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-railz/metadata.yaml b/airbyte-integrations/connectors/source-railz/metadata.yaml
index ea4aa848d7298..eb0870a1779a9 100644
--- a/airbyte-integrations/connectors/source-railz/metadata.yaml
+++ b/airbyte-integrations/connectors/source-railz/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: railz.svg
   license: MIT
   name: Railz
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-railz
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-rd-station-marketing/metadata.yaml b/airbyte-integrations/connectors/source-rd-station-marketing/metadata.yaml
index 42135ace43a08..dbfc299e01bb5 100644
--- a/airbyte-integrations/connectors/source-rd-station-marketing/metadata.yaml
+++ b/airbyte-integrations/connectors/source-rd-station-marketing/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: rdstation.svg
   license: MIT
   name: RD Station Marketing
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-rd-station-marketing
   registries:
     cloud:
       enabled: false
diff --git a/airbyte-integrations/connectors/source-recharge/metadata.yaml b/airbyte-integrations/connectors/source-recharge/metadata.yaml
index af32cc6399919..c6850d60ea3f1 100644
--- a/airbyte-integrations/connectors/source-recharge/metadata.yaml
+++ b/airbyte-integrations/connectors/source-recharge/metadata.yaml
@@ -13,6 +13,10 @@ data:
   icon: recharge.svg
   license: MIT
   name: Recharge
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-recharge
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-recreation/metadata.yaml b/airbyte-integrations/connectors/source-recreation/metadata.yaml
index b217b6b65c048..821554d94e1d6 100644
--- a/airbyte-integrations/connectors/source-recreation/metadata.yaml
+++ b/airbyte-integrations/connectors/source-recreation/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: recreation.svg
   license: MIT
   name: Recreation
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-recreation
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-recruitee/metadata.yaml b/airbyte-integrations/connectors/source-recruitee/metadata.yaml
index 42407ff998bf9..71061b162cbd4 100644
--- a/airbyte-integrations/connectors/source-recruitee/metadata.yaml
+++ b/airbyte-integrations/connectors/source-recruitee/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: recruitee.svg
   license: MIT
   name: Recruitee
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-recruitee
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-recurly/metadata.yaml b/airbyte-integrations/connectors/source-recurly/metadata.yaml
index d10aee87e0848..4d39d72c0b58a 100644
--- a/airbyte-integrations/connectors/source-recurly/metadata.yaml
+++ b/airbyte-integrations/connectors/source-recurly/metadata.yaml
@@ -12,6 +12,10 @@ data:
   icon: recurly.svg
   license: MIT
   name: Recurly
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-recurly
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-reply-io/metadata.yaml b/airbyte-integrations/connectors/source-reply-io/metadata.yaml
index 9ad7fcafafd68..d57e6cb62bdfb 100644
--- a/airbyte-integrations/connectors/source-reply-io/metadata.yaml
+++ b/airbyte-integrations/connectors/source-reply-io/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: reply-io.svg
   license: MIT
   name: Reply.io
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-reply-io
   registries:
     cloud:
       enabled: false
diff --git a/airbyte-integrations/connectors/source-retently/metadata.yaml b/airbyte-integrations/connectors/source-retently/metadata.yaml
index 40818fb95bca6..77e0ea8d3fd71 100644
--- a/airbyte-integrations/connectors/source-retently/metadata.yaml
+++ b/airbyte-integrations/connectors/source-retently/metadata.yaml
@@ -2,6 +2,10 @@ data:
   allowedHosts:
     hosts:
       - "*" # Please change to the hostname of the source.
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-retently
   registries:
     oss:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-ringcentral/metadata.yaml b/airbyte-integrations/connectors/source-ringcentral/metadata.yaml
index e92f20f242b9e..62c18c12ec9d9 100644
--- a/airbyte-integrations/connectors/source-ringcentral/metadata.yaml
+++ b/airbyte-integrations/connectors/source-ringcentral/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: ringcentral.svg
   license: MIT
   name: Ringcentral
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-ringcentral
   registries:
     cloud:
       enabled: false
diff --git a/airbyte-integrations/connectors/source-rki-covid/metadata.yaml b/airbyte-integrations/connectors/source-rki-covid/metadata.yaml
index fb3acfd909234..d11317580f3de 100644
--- a/airbyte-integrations/connectors/source-rki-covid/metadata.yaml
+++ b/airbyte-integrations/connectors/source-rki-covid/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: rki.svg
   license: MIT
   name: RKI Covid
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-rki-covid
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-rocket-chat/metadata.yaml b/airbyte-integrations/connectors/source-rocket-chat/metadata.yaml
index b78e013975805..35229f1316954 100644
--- a/airbyte-integrations/connectors/source-rocket-chat/metadata.yaml
+++ b/airbyte-integrations/connectors/source-rocket-chat/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: rocket-chat.svg
   license: MIT
   name: Rocket.chat
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-rocket-chat
   registries:
     cloud:
       enabled: false

From 1ba7b213902a7e487c7dda29fa68d5681e1eddc1 Mon Sep 17 00:00:00 2001
From: Rodi Reich Zilberman <867491+rodireich@users.noreply.github.com>
Date: Wed, 31 Jan 2024 09:48:12 -0800
Subject: [PATCH 47/96] Build a resume token with a pipeline consisting of
 selected streams (#34594)

Co-authored-by: Akash Kulkarni <akash@airbyte.io>
Co-authored-by: Akash Kulkarni <113392464+akashkulk@users.noreply.github.com>
---
 .../connectors/source-mongodb-v2/build.gradle |  2 +-
 .../source-mongodb-v2/metadata.yaml           |  2 +-
 .../mongodb/cdc/MongoDbCdcInitializer.java    |  2 +-
 .../mongodb/cdc/MongoDbCdcProperties.java     |  3 +
 .../cdc/MongoDbDebeziumPropertiesManager.java |  2 +
 .../mongodb/cdc/MongoDbResumeTokenHelper.java | 19 ++++-
 .../mongodb/MongoDbSourceAcceptanceTest.java  |  8 +-
 .../cdc/MongoDbCdcInitializerTest.java        |  7 ++
 .../mongodb/cdc/MongoDbCdcPropertiesTest.java |  5 +-
 .../cdc/MongoDbCdcTargetPositionTest.java     | 74 ++++++++++++++-----
 .../MongoDbDebeziumPropertiesManagerTest.java |  8 +-
 .../cdc/MongoDbResumeTokenHelperTest.java     | 18 ++++-
 docs/integrations/sources/mongodb-v2.md       |  3 +-
 13 files changed, 120 insertions(+), 33 deletions(-)

diff --git a/airbyte-integrations/connectors/source-mongodb-v2/build.gradle b/airbyte-integrations/connectors/source-mongodb-v2/build.gradle
index e273d8950bdfc..43fb1b80b40dc 100644
--- a/airbyte-integrations/connectors/source-mongodb-v2/build.gradle
+++ b/airbyte-integrations/connectors/source-mongodb-v2/build.gradle
@@ -5,7 +5,7 @@ plugins {
 }
 
 airbyteJavaConnector {
-    cdkVersionRequired = '0.16.0'
+    cdkVersionRequired = '0.16.3'
     features = ['db-sources']
     useLocalCdk = false
 }
diff --git a/airbyte-integrations/connectors/source-mongodb-v2/metadata.yaml b/airbyte-integrations/connectors/source-mongodb-v2/metadata.yaml
index 469a031351f25..6d4aa4f311c11 100644
--- a/airbyte-integrations/connectors/source-mongodb-v2/metadata.yaml
+++ b/airbyte-integrations/connectors/source-mongodb-v2/metadata.yaml
@@ -5,7 +5,7 @@ data:
   connectorSubtype: database
   connectorType: source
   definitionId: b2e713cd-cc36-4c0a-b5bd-b47cb8a0561e
-  dockerImageTag: 1.2.5
+  dockerImageTag: 1.2.6
   dockerRepository: airbyte/source-mongodb-v2
   documentationUrl: https://docs.airbyte.com/integrations/sources/mongodb-v2
   githubIssueLabel: source-mongodb-v2
diff --git a/airbyte-integrations/connectors/source-mongodb-v2/src/main/java/io/airbyte/integrations/source/mongodb/cdc/MongoDbCdcInitializer.java b/airbyte-integrations/connectors/source-mongodb-v2/src/main/java/io/airbyte/integrations/source/mongodb/cdc/MongoDbCdcInitializer.java
index 57059a86ce446..4e6078a6b2f3a 100644
--- a/airbyte-integrations/connectors/source-mongodb-v2/src/main/java/io/airbyte/integrations/source/mongodb/cdc/MongoDbCdcInitializer.java
+++ b/airbyte-integrations/connectors/source-mongodb-v2/src/main/java/io/airbyte/integrations/source/mongodb/cdc/MongoDbCdcInitializer.java
@@ -87,7 +87,7 @@ public List<AutoCloseableIterator<AirbyteMessage>> createCdcIterators(
     final boolean isEnforceSchema = config.getEnforceSchema();
     final Properties defaultDebeziumProperties = MongoDbCdcProperties.getDebeziumProperties();
     logOplogInfo(mongoClient);
-    final BsonDocument initialResumeToken = MongoDbResumeTokenHelper.getMostRecentResumeToken(mongoClient);
+    final BsonDocument initialResumeToken = MongoDbResumeTokenHelper.getMostRecentResumeToken(mongoClient, databaseName, catalog);
     final JsonNode initialDebeziumState =
         mongoDbDebeziumStateUtil.constructInitialDebeziumState(initialResumeToken, mongoClient, databaseName);
     final MongoDbCdcState cdcState = (stateManager.getCdcState() == null || stateManager.getCdcState().state() == null)
diff --git a/airbyte-integrations/connectors/source-mongodb-v2/src/main/java/io/airbyte/integrations/source/mongodb/cdc/MongoDbCdcProperties.java b/airbyte-integrations/connectors/source-mongodb-v2/src/main/java/io/airbyte/integrations/source/mongodb/cdc/MongoDbCdcProperties.java
index e567d190da326..0e559a634c2af 100644
--- a/airbyte-integrations/connectors/source-mongodb-v2/src/main/java/io/airbyte/integrations/source/mongodb/cdc/MongoDbCdcProperties.java
+++ b/airbyte-integrations/connectors/source-mongodb-v2/src/main/java/io/airbyte/integrations/source/mongodb/cdc/MongoDbCdcProperties.java
@@ -20,6 +20,8 @@ public class MongoDbCdcProperties {
   static final String HEARTBEAT_INTERVAL_KEY = "heartbeat.interval.ms";
   static final String SNAPSHOT_MODE_KEY = "snapshot.mode";
   static final String SNAPSHOT_MODE_VALUE = "never";
+  static final String CAPTURE_SCOPE_KEY = "capture.scope";
+  static final String CAPTURE_SCOPE_VALUE = "database";
   static final String TOMBSTONE_ON_DELETE_KEY = "tombstones.on.delete";
   static final String TOMBSTONE_ON_DELETE_VALUE = Boolean.FALSE.toString();
 
@@ -33,6 +35,7 @@ public static Properties getDebeziumProperties() {
 
     props.setProperty(CONNECTOR_CLASS_KEY, CONNECTOR_CLASS_VALUE);
     props.setProperty(SNAPSHOT_MODE_KEY, SNAPSHOT_MODE_VALUE);
+    props.setProperty(CAPTURE_SCOPE_KEY, CAPTURE_SCOPE_VALUE);
     props.setProperty(CAPTURE_MODE_KEY, CAPTURE_MODE_VALUE);
     props.setProperty(HEARTBEAT_INTERVAL_KEY, HEARTBEAT_FREQUENCY_MS);
     props.setProperty(TOMBSTONE_ON_DELETE_KEY, TOMBSTONE_ON_DELETE_VALUE);
diff --git a/airbyte-integrations/connectors/source-mongodb-v2/src/main/java/io/airbyte/integrations/source/mongodb/cdc/MongoDbDebeziumPropertiesManager.java b/airbyte-integrations/connectors/source-mongodb-v2/src/main/java/io/airbyte/integrations/source/mongodb/cdc/MongoDbDebeziumPropertiesManager.java
index dde6d653802e0..c715be6080cd7 100644
--- a/airbyte-integrations/connectors/source-mongodb-v2/src/main/java/io/airbyte/integrations/source/mongodb/cdc/MongoDbDebeziumPropertiesManager.java
+++ b/airbyte-integrations/connectors/source-mongodb-v2/src/main/java/io/airbyte/integrations/source/mongodb/cdc/MongoDbDebeziumPropertiesManager.java
@@ -31,6 +31,7 @@ public class MongoDbDebeziumPropertiesManager extends DebeziumPropertiesManager
 
   static final String COLLECTION_INCLUDE_LIST_KEY = "collection.include.list";
   static final String DATABASE_INCLUDE_LIST_KEY = "database.include.list";
+  static final String CAPTURE_TARGET_KEY = "capture.target";
   static final String DOUBLE_QUOTES_PATTERN = "\"";
   static final String MONGODB_AUTHSOURCE_KEY = "mongodb.authsource";
   static final String MONGODB_CONNECTION_MODE_KEY = "mongodb.connection.mode";
@@ -79,6 +80,7 @@ protected Properties getIncludeConfiguration(final ConfiguredAirbyteCatalog cata
     // Database/collection selection
     properties.setProperty(COLLECTION_INCLUDE_LIST_KEY, createCollectionIncludeString(catalog.getStreams()));
     properties.setProperty(DATABASE_INCLUDE_LIST_KEY, config.get(DATABASE_CONFIGURATION_KEY).asText());
+    properties.setProperty(CAPTURE_TARGET_KEY, config.get(DATABASE_CONFIGURATION_KEY).asText());
 
     return properties;
   }
diff --git a/airbyte-integrations/connectors/source-mongodb-v2/src/main/java/io/airbyte/integrations/source/mongodb/cdc/MongoDbResumeTokenHelper.java b/airbyte-integrations/connectors/source-mongodb-v2/src/main/java/io/airbyte/integrations/source/mongodb/cdc/MongoDbResumeTokenHelper.java
index de8c4d44a66ca..0493efa11cda4 100644
--- a/airbyte-integrations/connectors/source-mongodb-v2/src/main/java/io/airbyte/integrations/source/mongodb/cdc/MongoDbResumeTokenHelper.java
+++ b/airbyte-integrations/connectors/source-mongodb-v2/src/main/java/io/airbyte/integrations/source/mongodb/cdc/MongoDbResumeTokenHelper.java
@@ -8,11 +8,18 @@
 import com.mongodb.client.ChangeStreamIterable;
 import com.mongodb.client.MongoChangeStreamCursor;
 import com.mongodb.client.MongoClient;
+import com.mongodb.client.model.Aggregates;
+import com.mongodb.client.model.Filters;
 import com.mongodb.client.model.changestream.ChangeStreamDocument;
+import io.airbyte.protocol.models.v0.ConfiguredAirbyteCatalog;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
 import java.util.Optional;
 import java.util.concurrent.TimeUnit;
 import org.bson.BsonDocument;
 import org.bson.BsonTimestamp;
+import org.bson.conversions.Bson;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -29,8 +36,16 @@ public class MongoDbResumeTokenHelper {
    * @param mongoClient The {@link MongoClient} used to query the MongoDB server.
    * @return The most recent resume token value.
    */
-  public static BsonDocument getMostRecentResumeToken(final MongoClient mongoClient) {
-    final ChangeStreamIterable<BsonDocument> eventStream = mongoClient.watch(BsonDocument.class);
+  public static BsonDocument getMostRecentResumeToken(final MongoClient mongoClient,
+                                                      final String databaseName,
+                                                      final ConfiguredAirbyteCatalog catalog) {
+    final List<String> collectionsList = catalog.getStreams().stream()
+        .map(s -> s.getStream().getName())
+        .toList();
+    LOGGER.info("Resume token for db {} with collection filter {}", databaseName, Arrays.toString(collectionsList.toArray()));
+    final List<Bson> pipeline = Collections.singletonList(Aggregates.match(
+        Filters.in("ns.coll", collectionsList)));
+    final ChangeStreamIterable<BsonDocument> eventStream = mongoClient.getDatabase(databaseName).watch(pipeline, BsonDocument.class);
     try (final MongoChangeStreamCursor<ChangeStreamDocument<BsonDocument>> eventStreamCursor = eventStream.cursor()) {
       /*
        * Must call tryNext before attempting to get the resume token from the cursor directly. Otherwise,
diff --git a/airbyte-integrations/connectors/source-mongodb-v2/src/test-integration/java/io/airbyte/integrations/source/mongodb/MongoDbSourceAcceptanceTest.java b/airbyte-integrations/connectors/source-mongodb-v2/src/test-integration/java/io/airbyte/integrations/source/mongodb/MongoDbSourceAcceptanceTest.java
index b82144007b16c..fa220e4386dbf 100644
--- a/airbyte-integrations/connectors/source-mongodb-v2/src/test-integration/java/io/airbyte/integrations/source/mongodb/MongoDbSourceAcceptanceTest.java
+++ b/airbyte-integrations/connectors/source-mongodb-v2/src/test-integration/java/io/airbyte/integrations/source/mongodb/MongoDbSourceAcceptanceTest.java
@@ -522,7 +522,8 @@ void testSyncShouldHandlePurgedLogsGracefully() throws Exception {
   void testReachedTargetPosition() {
     final long eventTimestamp = Long.MAX_VALUE;
     final Integer order = 0;
-    final MongoDbCdcTargetPosition targetPosition = new MongoDbCdcTargetPosition(MongoDbResumeTokenHelper.getMostRecentResumeToken(mongoClient));
+    final MongoDbCdcTargetPosition targetPosition =
+        new MongoDbCdcTargetPosition(MongoDbResumeTokenHelper.getMostRecentResumeToken(mongoClient, databaseName, getConfiguredCatalog()));
     final ChangeEventWithMetadata changeEventWithMetadata = mock(ChangeEventWithMetadata.class);
 
     when(changeEventWithMetadata.isSnapshotEvent()).thenReturn(true);
@@ -549,8 +550,9 @@ void testReachedTargetPosition() {
 
   @Test
   void testIsSameOffset() {
-    final MongoDbCdcTargetPosition targetPosition = new MongoDbCdcTargetPosition(MongoDbResumeTokenHelper.getMostRecentResumeToken(mongoClient));
-    final BsonDocument resumeToken = MongoDbResumeTokenHelper.getMostRecentResumeToken(mongoClient);
+    final MongoDbCdcTargetPosition targetPosition =
+        new MongoDbCdcTargetPosition(MongoDbResumeTokenHelper.getMostRecentResumeToken(mongoClient, databaseName, getConfiguredCatalog()));
+    final BsonDocument resumeToken = MongoDbResumeTokenHelper.getMostRecentResumeToken(mongoClient, databaseName, getConfiguredCatalog());
     final String resumeTokenString = resumeToken.get("_data").asString().getValue();
     final String replicaSet = MongoDbDebeziumStateUtil.getReplicaSetName(mongoClient);
     final Map<String, String> emptyOffsetA = Map.of();
diff --git a/airbyte-integrations/connectors/source-mongodb-v2/src/test/java/io/airbyte/integrations/source/mongodb/cdc/MongoDbCdcInitializerTest.java b/airbyte-integrations/connectors/source-mongodb-v2/src/test/java/io/airbyte/integrations/source/mongodb/cdc/MongoDbCdcInitializerTest.java
index 59b62ee0688ba..9b87de23c1a36 100644
--- a/airbyte-integrations/connectors/source-mongodb-v2/src/test/java/io/airbyte/integrations/source/mongodb/cdc/MongoDbCdcInitializerTest.java
+++ b/airbyte-integrations/connectors/source-mongodb-v2/src/test/java/io/airbyte/integrations/source/mongodb/cdc/MongoDbCdcInitializerTest.java
@@ -30,6 +30,8 @@
 import com.mongodb.client.MongoCollection;
 import com.mongodb.client.MongoCursor;
 import com.mongodb.client.MongoDatabase;
+import com.mongodb.client.model.Aggregates;
+import com.mongodb.client.model.Filters;
 import com.mongodb.client.model.changestream.ChangeStreamDocument;
 import com.mongodb.connection.ClusterDescription;
 import com.mongodb.connection.ClusterType;
@@ -58,6 +60,7 @@
 import io.airbyte.protocol.models.v0.SyncMode;
 import java.time.Instant;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
@@ -65,6 +68,7 @@
 import org.bson.BsonDocument;
 import org.bson.BsonString;
 import org.bson.Document;
+import org.bson.conversions.Bson;
 import org.bson.types.ObjectId;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
@@ -106,6 +110,8 @@ class MongoDbCdcInitializerTest {
   private MongoCursor<Document> findCursor;
   private ChangeStreamIterable<BsonDocument> changeStreamIterable;
   private MongoDbCdcConnectorMetadataInjector cdcConnectorMetadataInjector;
+  private static final List<Bson> PIPELINE = Collections.singletonList(Aggregates.match(
+      Filters.in("ns.coll", List.of(COLLECTION))));
 
   @BeforeEach
   void setUp() {
@@ -132,6 +138,7 @@ void setUp() {
     when(clusterDescription.getServerDescriptions()).thenReturn(List.of(serverDescription));
     when(clusterDescription.getType()).thenReturn(ClusterType.REPLICA_SET);
     when(mongoClient.watch(BsonDocument.class)).thenReturn(changeStreamIterable);
+    when(mongoDatabase.watch(PIPELINE, BsonDocument.class)).thenReturn(changeStreamIterable);
     when(mongoClient.getDatabase(DATABASE)).thenReturn(mongoDatabase);
     when(mongoClient.getClusterDescription()).thenReturn(clusterDescription);
     when(mongoDatabase.getCollection(COLLECTION)).thenReturn(mongoCollection);
diff --git a/airbyte-integrations/connectors/source-mongodb-v2/src/test/java/io/airbyte/integrations/source/mongodb/cdc/MongoDbCdcPropertiesTest.java b/airbyte-integrations/connectors/source-mongodb-v2/src/test/java/io/airbyte/integrations/source/mongodb/cdc/MongoDbCdcPropertiesTest.java
index 0bb2bfba05f30..f6ea739be5835 100644
--- a/airbyte-integrations/connectors/source-mongodb-v2/src/test/java/io/airbyte/integrations/source/mongodb/cdc/MongoDbCdcPropertiesTest.java
+++ b/airbyte-integrations/connectors/source-mongodb-v2/src/test/java/io/airbyte/integrations/source/mongodb/cdc/MongoDbCdcPropertiesTest.java
@@ -6,6 +6,8 @@
 
 import static io.airbyte.integrations.source.mongodb.cdc.MongoDbCdcProperties.CAPTURE_MODE_KEY;
 import static io.airbyte.integrations.source.mongodb.cdc.MongoDbCdcProperties.CAPTURE_MODE_VALUE;
+import static io.airbyte.integrations.source.mongodb.cdc.MongoDbCdcProperties.CAPTURE_SCOPE_KEY;
+import static io.airbyte.integrations.source.mongodb.cdc.MongoDbCdcProperties.CAPTURE_SCOPE_VALUE;
 import static io.airbyte.integrations.source.mongodb.cdc.MongoDbCdcProperties.CONNECTOR_CLASS_KEY;
 import static io.airbyte.integrations.source.mongodb.cdc.MongoDbCdcProperties.CONNECTOR_CLASS_VALUE;
 import static io.airbyte.integrations.source.mongodb.cdc.MongoDbCdcProperties.HEARTBEAT_FREQUENCY_MS;
@@ -24,12 +26,13 @@ class MongoDbCdcPropertiesTest {
   @Test
   void testDebeziumProperties() {
     final Properties debeziumProperties = MongoDbCdcProperties.getDebeziumProperties();
-    assertEquals(5, debeziumProperties.size());
+    assertEquals(6, debeziumProperties.size());
     assertEquals(CONNECTOR_CLASS_VALUE, debeziumProperties.get(CONNECTOR_CLASS_KEY));
     assertEquals(SNAPSHOT_MODE_VALUE, debeziumProperties.get(SNAPSHOT_MODE_KEY));
     assertEquals(CAPTURE_MODE_VALUE, debeziumProperties.get(CAPTURE_MODE_KEY));
     assertEquals(HEARTBEAT_FREQUENCY_MS, debeziumProperties.get(HEARTBEAT_INTERVAL_KEY));
     assertEquals(TOMBSTONE_ON_DELETE_VALUE, debeziumProperties.get(TOMBSTONE_ON_DELETE_KEY));
+    assertEquals(CAPTURE_SCOPE_VALUE, debeziumProperties.get(CAPTURE_SCOPE_KEY));
   }
 
 }
diff --git a/airbyte-integrations/connectors/source-mongodb-v2/src/test/java/io/airbyte/integrations/source/mongodb/cdc/MongoDbCdcTargetPositionTest.java b/airbyte-integrations/connectors/source-mongodb-v2/src/test/java/io/airbyte/integrations/source/mongodb/cdc/MongoDbCdcTargetPositionTest.java
index 9e015d786a658..20cf0b1ef9cb2 100644
--- a/airbyte-integrations/connectors/source-mongodb-v2/src/test/java/io/airbyte/integrations/source/mongodb/cdc/MongoDbCdcTargetPositionTest.java
+++ b/airbyte-integrations/connectors/source-mongodb-v2/src/test/java/io/airbyte/integrations/source/mongodb/cdc/MongoDbCdcTargetPositionTest.java
@@ -10,6 +10,7 @@
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
@@ -17,17 +18,24 @@
 import com.mongodb.client.ChangeStreamIterable;
 import com.mongodb.client.MongoChangeStreamCursor;
 import com.mongodb.client.MongoClient;
+import com.mongodb.client.MongoDatabase;
+import com.mongodb.client.model.Aggregates;
+import com.mongodb.client.model.Filters;
 import com.mongodb.client.model.changestream.ChangeStreamDocument;
 import io.airbyte.cdk.integrations.debezium.internals.ChangeEventWithMetadata;
 import io.airbyte.commons.resources.MoreResources;
 import io.airbyte.protocol.models.Jsons;
+import io.airbyte.protocol.models.v0.ConfiguredAirbyteCatalog;
 import io.debezium.connector.mongodb.ResumeTokens;
 import io.debezium.engine.ChangeEvent;
 import java.io.IOException;
+import java.util.Collections;
+import java.util.List;
 import java.util.Map;
 import java.util.concurrent.TimeUnit;
 import org.bson.BsonDocument;
 import org.bson.BsonTimestamp;
+import org.bson.conversions.Bson;
 import org.junit.jupiter.api.Test;
 
 class MongoDbCdcTargetPositionTest {
@@ -35,6 +43,10 @@ class MongoDbCdcTargetPositionTest {
   private static final String OBJECT_ID = "64f24244f95155351c4185b1";
   private static final String RESUME_TOKEN = "8264BEB9F3000000012B0229296E04";
   private static final String OTHER_RESUME_TOKEN = "8264BEB9F3000000012B0229296E05";
+  private static final ConfiguredAirbyteCatalog CATALOG = new ConfiguredAirbyteCatalog();
+  private static final String DATABASE = "test-database";
+  private static final List<Bson> PIPELINE = Collections.singletonList(Aggregates.match(
+      Filters.in("ns.coll", Collections.emptyList())));
 
   @Test
   void testCreateTargetPosition() {
@@ -43,12 +55,15 @@ void testCreateTargetPosition() {
     final MongoChangeStreamCursor<ChangeStreamDocument<BsonDocument>> mongoChangeStreamCursor =
         mock(MongoChangeStreamCursor.class);
     final MongoClient mongoClient = mock(MongoClient.class);
+    final MongoDatabase mongoDatabase = mock(MongoDatabase.class);
 
     when(mongoChangeStreamCursor.getResumeToken()).thenReturn(resumeTokenDocument);
     when(changeStreamIterable.cursor()).thenReturn(mongoChangeStreamCursor);
-    when(mongoClient.watch(BsonDocument.class)).thenReturn(changeStreamIterable);
+    when(mongoClient.getDatabase(anyString())).thenReturn(mongoDatabase);
+    when(mongoDatabase.watch(PIPELINE, BsonDocument.class)).thenReturn(changeStreamIterable);
 
-    final MongoDbCdcTargetPosition targetPosition = new MongoDbCdcTargetPosition(MongoDbResumeTokenHelper.getMostRecentResumeToken(mongoClient));
+    final MongoDbCdcTargetPosition targetPosition =
+        new MongoDbCdcTargetPosition(MongoDbResumeTokenHelper.getMostRecentResumeToken(mongoClient, DATABASE, CATALOG));
     assertNotNull(targetPosition);
     assertEquals(ResumeTokens.getTimestamp(resumeTokenDocument), targetPosition.getResumeTokenTimestamp());
   }
@@ -61,16 +76,19 @@ void testReachedTargetPosition() throws IOException {
     final MongoChangeStreamCursor<ChangeStreamDocument<BsonDocument>> mongoChangeStreamCursor =
         mock(MongoChangeStreamCursor.class);
     final MongoClient mongoClient = mock(MongoClient.class);
+    final MongoDatabase mongoDatabase = mock(MongoDatabase.class);
     final ChangeEvent<String, String> changeEvent = mock(ChangeEvent.class);
 
     when(changeEvent.key()).thenReturn("{\"" + ID_FIELD + "\":\"{\\\"" + OBJECT_ID_FIELD + "\\\": \\\"" + OBJECT_ID + "\\\"}\"}");
     when(changeEvent.value()).thenReturn(changeEventJson);
     when(mongoChangeStreamCursor.getResumeToken()).thenReturn(resumeTokenDocument);
     when(changeStreamIterable.cursor()).thenReturn(mongoChangeStreamCursor);
-    when(mongoClient.watch(BsonDocument.class)).thenReturn(changeStreamIterable);
+    when(mongoClient.getDatabase(anyString())).thenReturn(mongoDatabase);
+    when(mongoDatabase.watch(PIPELINE, BsonDocument.class)).thenReturn(changeStreamIterable);
 
     final ChangeEventWithMetadata changeEventWithMetadata = new ChangeEventWithMetadata(changeEvent);
-    final MongoDbCdcTargetPosition targetPosition = new MongoDbCdcTargetPosition(MongoDbResumeTokenHelper.getMostRecentResumeToken(mongoClient));
+    final MongoDbCdcTargetPosition targetPosition =
+        new MongoDbCdcTargetPosition(MongoDbResumeTokenHelper.getMostRecentResumeToken(mongoClient, DATABASE, CATALOG));
     assertTrue(targetPosition.reachedTargetPosition(changeEventWithMetadata));
 
     when(changeEvent.value()).thenReturn(changeEventJson.replaceAll("\"ts_ms\": \\d+,", "\"ts_ms\": 1590221043000,"));
@@ -86,16 +104,19 @@ void testReachedTargetPositionSnapshotEvent() throws IOException {
     final MongoChangeStreamCursor<ChangeStreamDocument<BsonDocument>> mongoChangeStreamCursor =
         mock(MongoChangeStreamCursor.class);
     final MongoClient mongoClient = mock(MongoClient.class);
+    final MongoDatabase mongoDatabase = mock(MongoDatabase.class);
     final ChangeEvent<String, String> changeEvent = mock(ChangeEvent.class);
 
     when(changeEvent.key()).thenReturn("{\"" + ID_FIELD + "\":\"{\\\"" + OBJECT_ID_FIELD + "\\\": \\\"" + OBJECT_ID + "\\\"}\"}");
     when(changeEvent.value()).thenReturn(changeEventJson);
     when(mongoChangeStreamCursor.getResumeToken()).thenReturn(resumeTokenDocument);
     when(changeStreamIterable.cursor()).thenReturn(mongoChangeStreamCursor);
-    when(mongoClient.watch(BsonDocument.class)).thenReturn(changeStreamIterable);
+    when(mongoClient.getDatabase(anyString())).thenReturn(mongoDatabase);
+    when(mongoDatabase.watch(PIPELINE, BsonDocument.class)).thenReturn(changeStreamIterable);
 
     final ChangeEventWithMetadata changeEventWithMetadata = new ChangeEventWithMetadata(changeEvent);
-    final MongoDbCdcTargetPosition targetPosition = new MongoDbCdcTargetPosition(MongoDbResumeTokenHelper.getMostRecentResumeToken(mongoClient));
+    final MongoDbCdcTargetPosition targetPosition =
+        new MongoDbCdcTargetPosition(MongoDbResumeTokenHelper.getMostRecentResumeToken(mongoClient, DATABASE, CATALOG));
     assertFalse(targetPosition.reachedTargetPosition(changeEventWithMetadata));
   }
 
@@ -107,16 +128,20 @@ void testReachedTargetPositionSnapshotLastEvent() throws IOException {
     final MongoChangeStreamCursor<ChangeStreamDocument<BsonDocument>> mongoChangeStreamCursor =
         mock(MongoChangeStreamCursor.class);
     final MongoClient mongoClient = mock(MongoClient.class);
+    final MongoDatabase mongoDatabase = mock(MongoDatabase.class);
     final ChangeEvent<String, String> changeEvent = mock(ChangeEvent.class);
 
     when(changeEvent.key()).thenReturn("{\"" + ID_FIELD + "\":\"{\\\"" + OBJECT_ID_FIELD + "\\\": \\\"" + OBJECT_ID + "\\\"}\"}");
     when(changeEvent.value()).thenReturn(changeEventJson);
     when(mongoChangeStreamCursor.getResumeToken()).thenReturn(resumeTokenDocument);
+    when(mongoClient.getDatabase(anyString())).thenReturn(mongoDatabase);
+    when(mongoDatabase.watch(PIPELINE, BsonDocument.class)).thenReturn(changeStreamIterable);
     when(changeStreamIterable.cursor()).thenReturn(mongoChangeStreamCursor);
     when(mongoClient.watch(BsonDocument.class)).thenReturn(changeStreamIterable);
 
     final ChangeEventWithMetadata changeEventWithMetadata = new ChangeEventWithMetadata(changeEvent);
-    final MongoDbCdcTargetPosition targetPosition = new MongoDbCdcTargetPosition(MongoDbResumeTokenHelper.getMostRecentResumeToken(mongoClient));
+    final MongoDbCdcTargetPosition targetPosition =
+        new MongoDbCdcTargetPosition(MongoDbResumeTokenHelper.getMostRecentResumeToken(mongoClient, DATABASE, CATALOG));
     assertTrue(targetPosition.reachedTargetPosition(changeEventWithMetadata));
   }
 
@@ -127,12 +152,15 @@ void testReachedTargetPositionFromHeartbeat() {
     final MongoChangeStreamCursor<ChangeStreamDocument<BsonDocument>> mongoChangeStreamCursor =
         mock(MongoChangeStreamCursor.class);
     final MongoClient mongoClient = mock(MongoClient.class);
+    final MongoDatabase mongoDatabase = mock(MongoDatabase.class);
 
     when(mongoChangeStreamCursor.getResumeToken()).thenReturn(resumeTokenDocument);
     when(changeStreamIterable.cursor()).thenReturn(mongoChangeStreamCursor);
-    when(mongoClient.watch(BsonDocument.class)).thenReturn(changeStreamIterable);
+    when(mongoClient.getDatabase(anyString())).thenReturn(mongoDatabase);
+    when(mongoDatabase.watch(PIPELINE, BsonDocument.class)).thenReturn(changeStreamIterable);
 
-    final MongoDbCdcTargetPosition targetPosition = new MongoDbCdcTargetPosition(MongoDbResumeTokenHelper.getMostRecentResumeToken(mongoClient));
+    final MongoDbCdcTargetPosition targetPosition =
+        new MongoDbCdcTargetPosition(MongoDbResumeTokenHelper.getMostRecentResumeToken(mongoClient, DATABASE, CATALOG));
     final BsonTimestamp heartbeatTimestamp = new BsonTimestamp(
         Long.valueOf(ResumeTokens.getTimestamp(resumeTokenDocument).getTime() + TimeUnit.HOURS.toSeconds(1)).intValue(),
         0);
@@ -148,12 +176,15 @@ void testIsHeartbeatSupported() {
     final MongoChangeStreamCursor<ChangeStreamDocument<BsonDocument>> mongoChangeStreamCursor =
         mock(MongoChangeStreamCursor.class);
     final MongoClient mongoClient = mock(MongoClient.class);
+    final MongoDatabase mongoDatabase = mock(MongoDatabase.class);
 
     when(mongoChangeStreamCursor.getResumeToken()).thenReturn(resumeTokenDocument);
     when(changeStreamIterable.cursor()).thenReturn(mongoChangeStreamCursor);
-    when(mongoClient.watch(BsonDocument.class)).thenReturn(changeStreamIterable);
+    when(mongoClient.getDatabase(anyString())).thenReturn(mongoDatabase);
+    when(mongoDatabase.watch(PIPELINE, BsonDocument.class)).thenReturn(changeStreamIterable);
 
-    final MongoDbCdcTargetPosition targetPosition = new MongoDbCdcTargetPosition(MongoDbResumeTokenHelper.getMostRecentResumeToken(mongoClient));
+    final MongoDbCdcTargetPosition targetPosition =
+        new MongoDbCdcTargetPosition(MongoDbResumeTokenHelper.getMostRecentResumeToken(mongoClient, DATABASE, CATALOG));
 
     assertTrue(targetPosition.isHeartbeatSupported());
   }
@@ -166,12 +197,15 @@ void testExtractPositionFromHeartbeatOffset() {
     final MongoChangeStreamCursor<ChangeStreamDocument<BsonDocument>> mongoChangeStreamCursor =
         mock(MongoChangeStreamCursor.class);
     final MongoClient mongoClient = mock(MongoClient.class);
+    final MongoDatabase mongoDatabase = mock(MongoDatabase.class);
 
     when(mongoChangeStreamCursor.getResumeToken()).thenReturn(resumeTokenDocument);
     when(changeStreamIterable.cursor()).thenReturn(mongoChangeStreamCursor);
-    when(mongoClient.watch(BsonDocument.class)).thenReturn(changeStreamIterable);
+    when(mongoClient.getDatabase(anyString())).thenReturn(mongoDatabase);
+    when(mongoDatabase.watch(PIPELINE, BsonDocument.class)).thenReturn(changeStreamIterable);
 
-    final MongoDbCdcTargetPosition targetPosition = new MongoDbCdcTargetPosition(MongoDbResumeTokenHelper.getMostRecentResumeToken(mongoClient));
+    final MongoDbCdcTargetPosition targetPosition =
+        new MongoDbCdcTargetPosition(MongoDbResumeTokenHelper.getMostRecentResumeToken(mongoClient, DATABASE, CATALOG));
 
     final Map<String, ?> sourceOffset = Map.of(
         MongoDbDebeziumConstants.ChangeEvent.SOURCE_SECONDS, resumeTokenTimestamp.getTime(),
@@ -189,6 +223,7 @@ void testIsEventAheadOfOffset() throws IOException {
     final MongoChangeStreamCursor<ChangeStreamDocument<BsonDocument>> mongoChangeStreamCursor =
         mock(MongoChangeStreamCursor.class);
     final MongoClient mongoClient = mock(MongoClient.class);
+    final MongoDatabase mongoDatabase = mock(MongoDatabase.class);
     final String changeEventJson = MoreResources.readResource("mongodb/change_event.json");
     final ChangeEvent<String, String> changeEvent = mock(ChangeEvent.class);
 
@@ -196,13 +231,15 @@ void testIsEventAheadOfOffset() throws IOException {
     when(changeEvent.value()).thenReturn(changeEventJson);
     when(mongoChangeStreamCursor.getResumeToken()).thenReturn(resumeTokenDocument);
     when(changeStreamIterable.cursor()).thenReturn(mongoChangeStreamCursor);
-    when(mongoClient.watch(BsonDocument.class)).thenReturn(changeStreamIterable);
+    when(mongoClient.getDatabase(anyString())).thenReturn(mongoDatabase);
+    when(mongoDatabase.watch(PIPELINE, BsonDocument.class)).thenReturn(changeStreamIterable);
 
     final ChangeEventWithMetadata changeEventWithMetadata = new ChangeEventWithMetadata(changeEvent);
     final Map<String, String> offset =
         Jsons.object(MongoDbDebeziumStateUtil.formatState(null, null, RESUME_TOKEN), new TypeReference<>() {});
 
-    final MongoDbCdcTargetPosition targetPosition = new MongoDbCdcTargetPosition(MongoDbResumeTokenHelper.getMostRecentResumeToken(mongoClient));
+    final MongoDbCdcTargetPosition targetPosition =
+        new MongoDbCdcTargetPosition(MongoDbResumeTokenHelper.getMostRecentResumeToken(mongoClient, DATABASE, CATALOG));
     final boolean result = targetPosition.isEventAheadOffset(offset, changeEventWithMetadata);
     assertTrue(result);
   }
@@ -214,10 +251,12 @@ void testIsSameOffset() {
     final MongoChangeStreamCursor<ChangeStreamDocument<BsonDocument>> mongoChangeStreamCursor =
         mock(MongoChangeStreamCursor.class);
     final MongoClient mongoClient = mock(MongoClient.class);
+    final MongoDatabase mongoDatabase = mock(MongoDatabase.class);
 
     when(mongoChangeStreamCursor.getResumeToken()).thenReturn(resumeTokenDocument);
     when(changeStreamIterable.cursor()).thenReturn(mongoChangeStreamCursor);
-    when(mongoClient.watch(BsonDocument.class)).thenReturn(changeStreamIterable);
+    when(mongoClient.getDatabase(anyString())).thenReturn(mongoDatabase);
+    when(mongoDatabase.watch(PIPELINE, BsonDocument.class)).thenReturn(changeStreamIterable);
 
     final Map<String, String> offsetA =
         Jsons.object(MongoDbDebeziumStateUtil.formatState(null, null, RESUME_TOKEN), new TypeReference<>() {});
@@ -226,7 +265,8 @@ void testIsSameOffset() {
     final Map<String, String> offsetC =
         Jsons.object(MongoDbDebeziumStateUtil.formatState(null, null, OTHER_RESUME_TOKEN), new TypeReference<>() {});
 
-    final MongoDbCdcTargetPosition targetPosition = new MongoDbCdcTargetPosition(MongoDbResumeTokenHelper.getMostRecentResumeToken(mongoClient));
+    final MongoDbCdcTargetPosition targetPosition =
+        new MongoDbCdcTargetPosition(MongoDbResumeTokenHelper.getMostRecentResumeToken(mongoClient, DATABASE, CATALOG));
 
     assertTrue(targetPosition.isSameOffset(offsetA, offsetA));
     assertTrue(targetPosition.isSameOffset(offsetA, offsetB));
diff --git a/airbyte-integrations/connectors/source-mongodb-v2/src/test/java/io/airbyte/integrations/source/mongodb/cdc/MongoDbDebeziumPropertiesManagerTest.java b/airbyte-integrations/connectors/source-mongodb-v2/src/test/java/io/airbyte/integrations/source/mongodb/cdc/MongoDbDebeziumPropertiesManagerTest.java
index e2f87486fb0c8..c635a8e37dded 100644
--- a/airbyte-integrations/connectors/source-mongodb-v2/src/test/java/io/airbyte/integrations/source/mongodb/cdc/MongoDbDebeziumPropertiesManagerTest.java
+++ b/airbyte-integrations/connectors/source-mongodb-v2/src/test/java/io/airbyte/integrations/source/mongodb/cdc/MongoDbDebeziumPropertiesManagerTest.java
@@ -67,7 +67,7 @@ void testDebeziumProperties() {
     final var debeziumPropertiesManager = new MongoDbDebeziumPropertiesManager(cdcProperties, config, catalog);
 
     final Properties debeziumProperties = debeziumPropertiesManager.getDebeziumProperties(offsetManager);
-    assertEquals(19 + cdcProperties.size(), debeziumProperties.size());
+    assertEquals(20 + cdcProperties.size(), debeziumProperties.size());
     assertEquals(MongoDbDebeziumPropertiesManager.normalizeName(DATABASE_NAME), debeziumProperties.get(NAME_KEY));
     assertEquals(MongoDbDebeziumPropertiesManager.normalizeName(DATABASE_NAME), debeziumProperties.get(TOPIC_PREFIX_KEY));
     assertEquals(EXPECTED_CONNECTION_STRING, debeziumProperties.get(MONGODB_CONNECTION_STRING_KEY));
@@ -97,7 +97,7 @@ void testDebeziumPropertiesConnectionStringCredentialsPlaceholder() {
     final var debeziumPropertiesManager = new MongoDbDebeziumPropertiesManager(cdcProperties, config, catalog);
 
     final Properties debeziumProperties = debeziumPropertiesManager.getDebeziumProperties(offsetManager);
-    assertEquals(19 + cdcProperties.size(), debeziumProperties.size());
+    assertEquals(20 + cdcProperties.size(), debeziumProperties.size());
     assertEquals(MongoDbDebeziumPropertiesManager.normalizeName(DATABASE_NAME), debeziumProperties.get(NAME_KEY));
     assertEquals(MongoDbDebeziumPropertiesManager.normalizeName(DATABASE_NAME), debeziumProperties.get(TOPIC_PREFIX_KEY));
     assertEquals(EXPECTED_CONNECTION_STRING, debeziumProperties.get(MONGODB_CONNECTION_STRING_KEY));
@@ -126,7 +126,7 @@ void testDebeziumPropertiesQuotedConnectionString() {
     final var debeziumPropertiesManager = new MongoDbDebeziumPropertiesManager(cdcProperties, config, catalog);
 
     final Properties debeziumProperties = debeziumPropertiesManager.getDebeziumProperties(offsetManager);
-    assertEquals(19 + cdcProperties.size(), debeziumProperties.size());
+    assertEquals(20 + cdcProperties.size(), debeziumProperties.size());
     assertEquals(MongoDbDebeziumPropertiesManager.normalizeName(DATABASE_NAME), debeziumProperties.get(NAME_KEY));
     assertEquals(MongoDbDebeziumPropertiesManager.normalizeName(DATABASE_NAME), debeziumProperties.get(TOPIC_PREFIX_KEY));
     assertEquals(EXPECTED_CONNECTION_STRING, debeziumProperties.get(MONGODB_CONNECTION_STRING_KEY));
@@ -155,7 +155,7 @@ void testDebeziumPropertiesNoCredentials() {
     final var debeziumPropertiesManager = new MongoDbDebeziumPropertiesManager(cdcProperties, config, catalog);
 
     final Properties debeziumProperties = debeziumPropertiesManager.getDebeziumProperties(offsetManager);
-    assertEquals(16 + cdcProperties.size(), debeziumProperties.size());
+    assertEquals(17 + cdcProperties.size(), debeziumProperties.size());
     assertEquals(MongoDbDebeziumPropertiesManager.normalizeName(DATABASE_NAME), debeziumProperties.get(NAME_KEY));
     assertEquals(MongoDbDebeziumPropertiesManager.normalizeName(DATABASE_NAME), debeziumProperties.get(TOPIC_PREFIX_KEY));
     assertEquals(EXPECTED_CONNECTION_STRING, debeziumProperties.get(MONGODB_CONNECTION_STRING_KEY));
diff --git a/airbyte-integrations/connectors/source-mongodb-v2/src/test/java/io/airbyte/integrations/source/mongodb/cdc/MongoDbResumeTokenHelperTest.java b/airbyte-integrations/connectors/source-mongodb-v2/src/test/java/io/airbyte/integrations/source/mongodb/cdc/MongoDbResumeTokenHelperTest.java
index dfddbfeef6be7..39fd65567eac0 100644
--- a/airbyte-integrations/connectors/source-mongodb-v2/src/test/java/io/airbyte/integrations/source/mongodb/cdc/MongoDbResumeTokenHelperTest.java
+++ b/airbyte-integrations/connectors/source-mongodb-v2/src/test/java/io/airbyte/integrations/source/mongodb/cdc/MongoDbResumeTokenHelperTest.java
@@ -7,6 +7,7 @@
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
@@ -14,32 +15,45 @@
 import com.mongodb.client.ChangeStreamIterable;
 import com.mongodb.client.MongoChangeStreamCursor;
 import com.mongodb.client.MongoClient;
+import com.mongodb.client.MongoDatabase;
+import com.mongodb.client.model.Aggregates;
+import com.mongodb.client.model.Filters;
 import com.mongodb.client.model.changestream.ChangeStreamDocument;
 import io.airbyte.commons.json.Jsons;
 import io.airbyte.commons.resources.MoreResources;
+import io.airbyte.protocol.models.v0.ConfiguredAirbyteCatalog;
 import io.debezium.connector.mongodb.ResumeTokens;
 import java.io.IOException;
+import java.util.Collections;
+import java.util.List;
 import java.util.concurrent.TimeUnit;
 import org.bson.BsonDocument;
 import org.bson.BsonTimestamp;
+import org.bson.conversions.Bson;
 import org.junit.jupiter.api.Test;
 
 class MongoDbResumeTokenHelperTest {
 
+  private static final String DATABASE = "test-database";
+
   @Test
   void testRetrievingResumeToken() {
     final String resumeToken = "8264BEB9F3000000012B0229296E04";
     final BsonDocument resumeTokenDocument = ResumeTokens.fromData(resumeToken);
     final ChangeStreamIterable<BsonDocument> changeStreamIterable = mock(ChangeStreamIterable.class);
+    final MongoDatabase mongoDatabase = mock(MongoDatabase.class);
     final MongoChangeStreamCursor<ChangeStreamDocument<BsonDocument>> mongoChangeStreamCursor =
         mock(MongoChangeStreamCursor.class);
     final MongoClient mongoClient = mock(MongoClient.class);
 
     when(mongoChangeStreamCursor.getResumeToken()).thenReturn(resumeTokenDocument);
     when(changeStreamIterable.cursor()).thenReturn(mongoChangeStreamCursor);
-    when(mongoClient.watch(BsonDocument.class)).thenReturn(changeStreamIterable);
+    when(mongoClient.getDatabase(anyString())).thenReturn(mongoDatabase);
+    final List<Bson> pipeline = Collections.singletonList(Aggregates.match(
+        Filters.in("ns.coll", Collections.emptyList())));
+    when(mongoDatabase.watch(pipeline, BsonDocument.class)).thenReturn(changeStreamIterable);
 
-    final BsonDocument actualResumeToken = MongoDbResumeTokenHelper.getMostRecentResumeToken(mongoClient);
+    final BsonDocument actualResumeToken = MongoDbResumeTokenHelper.getMostRecentResumeToken(mongoClient, DATABASE, new ConfiguredAirbyteCatalog());
     assertEquals(resumeTokenDocument, actualResumeToken);
   }
 
diff --git a/docs/integrations/sources/mongodb-v2.md b/docs/integrations/sources/mongodb-v2.md
index dfd5de71bb391..a406039a1e2c3 100644
--- a/docs/integrations/sources/mongodb-v2.md
+++ b/docs/integrations/sources/mongodb-v2.md
@@ -214,7 +214,8 @@ For more information regarding configuration parameters, please see [MongoDb Doc
 
 | Version | Date       | Pull Request                                             | Subject                                                                                                   |
 |:--------|:-----------|:---------------------------------------------------------|:----------------------------------------------------------------------------------------------------------|
-| 1.2.5   | 2024-01-29 | [34573](https://github.com/airbytehq/airbyte/pull/34573) | Allow resuming an initial snapshot when Id type is not of default ObjectId .                              |
+| 1.2.6   | 2024-01-31 | [34594](https://github.com/airbytehq/airbyte/pull/34594) | Scope initial resume token to streams of interest.                                                        |
+| 1.2.5   | 2024-01-29 | [34641](https://github.com/airbytehq/airbyte/pull/34641) | Allow resuming an initial snapshot when Id type is not of default ObjectId .                              |
 | 1.2.4   | 2024-01-26 | [34573](https://github.com/airbytehq/airbyte/pull/34573) | Adopt CDK v0.16.0.                                                                                        |
 | 1.2.3   | 2024-01-18 | [34364](https://github.com/airbytehq/airbyte/pull/34364) | Add additional logging for resume token + reduce discovery size to 10.                                    |
 | 1.2.2   | 2024-01-16 | [34314](https://github.com/airbytehq/airbyte/pull/34314) | Reduce minimum document discovery size to 100.                                                            |

From c6bc976c861e4f55fc70e202a0ba2a60662be793 Mon Sep 17 00:00:00 2001
From: Joe Reuter <joe@airbyte.io>
Date: Wed, 31 Jan 2024 18:51:35 +0100
Subject: [PATCH 48/96] Publish to pypi batch10 (#34692)

---
 airbyte-integrations/connectors/source-rss/metadata.yaml      | 4 ++++
 .../connectors/source-salesloft/metadata.yaml                 | 4 ++++
 .../connectors/source-sap-fieldglass/metadata.yaml            | 4 ++++
 .../connectors/source-scaffold-source-http/metadata.yaml      | 4 ++++
 .../connectors/source-scaffold-source-python/metadata.yaml    | 4 ++++
 .../connectors/source-search-metrics/metadata.yaml            | 4 ++++
 airbyte-integrations/connectors/source-secoda/metadata.yaml   | 4 ++++
 airbyte-integrations/connectors/source-sendgrid/metadata.yaml | 4 ++++
 .../connectors/source-sendinblue/metadata.yaml                | 4 ++++
 .../connectors/source-senseforce/metadata.yaml                | 4 ++++
 airbyte-integrations/connectors/source-sentry/metadata.yaml   | 4 ++++
 airbyte-integrations/connectors/source-serpstat/metadata.yaml | 4 ++++
 .../connectors/source-sftp-bulk/metadata.yaml                 | 4 ++++
 airbyte-integrations/connectors/source-shortio/metadata.yaml  | 4 ++++
 airbyte-integrations/connectors/source-smaily/metadata.yaml   | 4 ++++
 .../connectors/source-smartengage/metadata.yaml               | 4 ++++
 .../connectors/source-snapchat-marketing/metadata.yaml        | 4 ++++
 .../connectors/source-sonar-cloud/metadata.yaml               | 4 ++++
 .../connectors/source-spacex-api/metadata.yaml                | 4 ++++
 airbyte-integrations/connectors/source-square/metadata.yaml   | 4 ++++
 20 files changed, 80 insertions(+)

diff --git a/airbyte-integrations/connectors/source-rss/metadata.yaml b/airbyte-integrations/connectors/source-rss/metadata.yaml
index 50a3f9531e7bb..8e7d7b8fdc911 100644
--- a/airbyte-integrations/connectors/source-rss/metadata.yaml
+++ b/airbyte-integrations/connectors/source-rss/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: rss.svg
   license: MIT
   name: RSS
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-rss
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-salesloft/metadata.yaml b/airbyte-integrations/connectors/source-salesloft/metadata.yaml
index 7fdf8beebb6b6..a5c2cc049e9e5 100644
--- a/airbyte-integrations/connectors/source-salesloft/metadata.yaml
+++ b/airbyte-integrations/connectors/source-salesloft/metadata.yaml
@@ -15,6 +15,10 @@ data:
   icon: salesloft.svg
   license: MIT
   name: SalesLoft
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-salesloft
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-sap-fieldglass/metadata.yaml b/airbyte-integrations/connectors/source-sap-fieldglass/metadata.yaml
index 2fdfa8eeeba47..6362a99fd3484 100644
--- a/airbyte-integrations/connectors/source-sap-fieldglass/metadata.yaml
+++ b/airbyte-integrations/connectors/source-sap-fieldglass/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: sapfieldglass.svg
   license: MIT
   name: SAP Fieldglass
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-sap-fieldglass
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-scaffold-source-http/metadata.yaml b/airbyte-integrations/connectors/source-scaffold-source-http/metadata.yaml
index 3e50afa2130e3..c56a4810bde9d 100644
--- a/airbyte-integrations/connectors/source-scaffold-source-http/metadata.yaml
+++ b/airbyte-integrations/connectors/source-scaffold-source-http/metadata.yaml
@@ -2,6 +2,10 @@ data:
   allowedHosts:
     hosts:
       - TODO # Please change to the hostname of the source.
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-scaffold-source-http
   registries:
     oss:
       enabled: false
diff --git a/airbyte-integrations/connectors/source-scaffold-source-python/metadata.yaml b/airbyte-integrations/connectors/source-scaffold-source-python/metadata.yaml
index 2a740dccdc561..24ab5f9c09c14 100644
--- a/airbyte-integrations/connectors/source-scaffold-source-python/metadata.yaml
+++ b/airbyte-integrations/connectors/source-scaffold-source-python/metadata.yaml
@@ -2,6 +2,10 @@ data:
   allowedHosts:
     hosts:
       - TODO # Please change to the hostname of the source.
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-scaffold-source-python
   registries:
     oss:
       enabled: false
diff --git a/airbyte-integrations/connectors/source-search-metrics/metadata.yaml b/airbyte-integrations/connectors/source-search-metrics/metadata.yaml
index ee0f969317bda..347c807bf39fc 100644
--- a/airbyte-integrations/connectors/source-search-metrics/metadata.yaml
+++ b/airbyte-integrations/connectors/source-search-metrics/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: searchmetrics.svg
   license: MIT
   name: SearchMetrics
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-search-metrics
   registries:
     cloud:
       enabled: false
diff --git a/airbyte-integrations/connectors/source-secoda/metadata.yaml b/airbyte-integrations/connectors/source-secoda/metadata.yaml
index 03c428b402066..cc7a8383aefe1 100644
--- a/airbyte-integrations/connectors/source-secoda/metadata.yaml
+++ b/airbyte-integrations/connectors/source-secoda/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: secoda.svg
   license: MIT
   name: Secoda
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-secoda
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-sendgrid/metadata.yaml b/airbyte-integrations/connectors/source-sendgrid/metadata.yaml
index fae7388cf808e..8466dc5aa32e7 100644
--- a/airbyte-integrations/connectors/source-sendgrid/metadata.yaml
+++ b/airbyte-integrations/connectors/source-sendgrid/metadata.yaml
@@ -17,6 +17,10 @@ data:
   icon: sendgrid.svg
   license: MIT
   name: Sendgrid
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-sendgrid
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-sendinblue/metadata.yaml b/airbyte-integrations/connectors/source-sendinblue/metadata.yaml
index 4cebe426e4a38..0318419f4d858 100644
--- a/airbyte-integrations/connectors/source-sendinblue/metadata.yaml
+++ b/airbyte-integrations/connectors/source-sendinblue/metadata.yaml
@@ -12,6 +12,10 @@ data:
   icon: sendinblue.svg
   license: MIT
   name: Sendinblue
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-sendinblue
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-senseforce/metadata.yaml b/airbyte-integrations/connectors/source-senseforce/metadata.yaml
index 3c9417880e605..c5d5d8dd76953 100644
--- a/airbyte-integrations/connectors/source-senseforce/metadata.yaml
+++ b/airbyte-integrations/connectors/source-senseforce/metadata.yaml
@@ -12,6 +12,10 @@ data:
   icon: senseforce.svg
   license: MIT
   name: Senseforce
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-senseforce
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-sentry/metadata.yaml b/airbyte-integrations/connectors/source-sentry/metadata.yaml
index 724e98d0823f6..2b77883ec609f 100644
--- a/airbyte-integrations/connectors/source-sentry/metadata.yaml
+++ b/airbyte-integrations/connectors/source-sentry/metadata.yaml
@@ -18,6 +18,10 @@ data:
   license: MIT
   maxSecondsBetweenMessages: 64800
   name: Sentry
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-sentry
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-serpstat/metadata.yaml b/airbyte-integrations/connectors/source-serpstat/metadata.yaml
index fb9d7de247376..849ad93a11da0 100644
--- a/airbyte-integrations/connectors/source-serpstat/metadata.yaml
+++ b/airbyte-integrations/connectors/source-serpstat/metadata.yaml
@@ -2,6 +2,10 @@ data:
   allowedHosts:
     hosts:
       - api.serpstat.com
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-serpstat
   registries:
     oss:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-sftp-bulk/metadata.yaml b/airbyte-integrations/connectors/source-sftp-bulk/metadata.yaml
index 9adbfaedfa336..6bddeaa476e55 100644
--- a/airbyte-integrations/connectors/source-sftp-bulk/metadata.yaml
+++ b/airbyte-integrations/connectors/source-sftp-bulk/metadata.yaml
@@ -12,6 +12,10 @@ data:
   icon: sftp.svg
   license: MIT
   name: SFTP Bulk
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-sftp-bulk
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-shortio/metadata.yaml b/airbyte-integrations/connectors/source-shortio/metadata.yaml
index 6eced88a6f028..b14f05840fa23 100644
--- a/airbyte-integrations/connectors/source-shortio/metadata.yaml
+++ b/airbyte-integrations/connectors/source-shortio/metadata.yaml
@@ -3,6 +3,10 @@ data:
     hosts:
       - https://api.short.io
       - https://api-v2.short.cm
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-shortio
   registries:
     oss:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-smaily/metadata.yaml b/airbyte-integrations/connectors/source-smaily/metadata.yaml
index f2105bbe100b7..408ce79e8f329 100644
--- a/airbyte-integrations/connectors/source-smaily/metadata.yaml
+++ b/airbyte-integrations/connectors/source-smaily/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: smaily.svg
   license: MIT
   name: Smaily
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-smaily
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-smartengage/metadata.yaml b/airbyte-integrations/connectors/source-smartengage/metadata.yaml
index 25485ef405e63..4fd15c960d1ad 100644
--- a/airbyte-integrations/connectors/source-smartengage/metadata.yaml
+++ b/airbyte-integrations/connectors/source-smartengage/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: smartengage.svg
   license: MIT
   name: SmartEngage
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-smartengage
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-snapchat-marketing/metadata.yaml b/airbyte-integrations/connectors/source-snapchat-marketing/metadata.yaml
index 060d8a709d1ed..36c060f33fdf6 100644
--- a/airbyte-integrations/connectors/source-snapchat-marketing/metadata.yaml
+++ b/airbyte-integrations/connectors/source-snapchat-marketing/metadata.yaml
@@ -12,6 +12,10 @@ data:
   icon: snapchat.svg
   license: MIT
   name: Snapchat Marketing
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-snapchat-marketing
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-sonar-cloud/metadata.yaml b/airbyte-integrations/connectors/source-sonar-cloud/metadata.yaml
index 1d1cf8e9b4884..cc224211c7bdb 100644
--- a/airbyte-integrations/connectors/source-sonar-cloud/metadata.yaml
+++ b/airbyte-integrations/connectors/source-sonar-cloud/metadata.yaml
@@ -11,6 +11,10 @@ data:
   icon: sonarcloud.svg
   license: MIT
   name: Sonar Cloud
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-sonar-cloud
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-spacex-api/metadata.yaml b/airbyte-integrations/connectors/source-spacex-api/metadata.yaml
index 1da6b6776c156..6f1677c520b9a 100644
--- a/airbyte-integrations/connectors/source-spacex-api/metadata.yaml
+++ b/airbyte-integrations/connectors/source-spacex-api/metadata.yaml
@@ -8,6 +8,10 @@ data:
   icon: spacex.svg
   license: MIT
   name: SpaceX API
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-spacex-api
   registries:
     cloud:
       enabled: true
diff --git a/airbyte-integrations/connectors/source-square/metadata.yaml b/airbyte-integrations/connectors/source-square/metadata.yaml
index 71b100e1f7c11..7e85289fa5205 100644
--- a/airbyte-integrations/connectors/source-square/metadata.yaml
+++ b/airbyte-integrations/connectors/source-square/metadata.yaml
@@ -16,6 +16,10 @@ data:
   icon: square.svg
   license: MIT
   name: Square
+  remoteRegistries:
+    pypi:
+      enabled: true
+      packageName: airbyte-source-square
   registries:
     cloud:
       enabled: true

From a2e4026d873ffcf95d89a0f7a84a7fcb2173a292 Mon Sep 17 00:00:00 2001
From: Gireesh Sreepathi <gisripa@gmail.com>
Date: Wed, 31 Jan 2024 09:58:18 -0800
Subject: [PATCH 49/96] Destination Postgres: Upgrade CDK with fixed dependency
 and unpin cloud (#34683)

---
 .../destination-postgres-strict-encrypt/build.gradle           | 2 +-
 .../destination-postgres-strict-encrypt/metadata.yaml          | 3 +--
 .../connectors/destination-postgres/build.gradle               | 2 +-
 .../connectors/destination-postgres/metadata.yaml              | 3 +--
 docs/integrations/destinations/postgres.md                     | 1 +
 5 files changed, 5 insertions(+), 6 deletions(-)

diff --git a/airbyte-integrations/connectors/destination-postgres-strict-encrypt/build.gradle b/airbyte-integrations/connectors/destination-postgres-strict-encrypt/build.gradle
index ffb340acfbb1b..6d672fa3616e5 100644
--- a/airbyte-integrations/connectors/destination-postgres-strict-encrypt/build.gradle
+++ b/airbyte-integrations/connectors/destination-postgres-strict-encrypt/build.gradle
@@ -4,7 +4,7 @@ plugins {
 }
 
 airbyteJavaConnector {
-    cdkVersionRequired = '0.16.2'
+    cdkVersionRequired = '0.16.3'
     features = [
             'db-sources', // required for tests
             'db-destinations'
diff --git a/airbyte-integrations/connectors/destination-postgres-strict-encrypt/metadata.yaml b/airbyte-integrations/connectors/destination-postgres-strict-encrypt/metadata.yaml
index 6403177cee3ad..2b99bfe3d7e4a 100644
--- a/airbyte-integrations/connectors/destination-postgres-strict-encrypt/metadata.yaml
+++ b/airbyte-integrations/connectors/destination-postgres-strict-encrypt/metadata.yaml
@@ -2,7 +2,7 @@ data:
   connectorSubtype: database
   connectorType: destination
   definitionId: 25c5221d-dce2-4163-ade9-739ef790f503
-  dockerImageTag: 0.6.1
+  dockerImageTag: 0.6.2
   dockerRepository: airbyte/destination-postgres-strict-encrypt
   documentationUrl: https://docs.airbyte.com/integrations/destinations/postgres
   githubIssueLabel: destination-postgres
@@ -16,7 +16,6 @@ data:
   registries:
     cloud:
       enabled: false
-      dockerImageTag: 0.6.0
     oss:
       enabled: false
   releaseStage: alpha
diff --git a/airbyte-integrations/connectors/destination-postgres/build.gradle b/airbyte-integrations/connectors/destination-postgres/build.gradle
index 35b66019d54d9..6b49a55578df3 100644
--- a/airbyte-integrations/connectors/destination-postgres/build.gradle
+++ b/airbyte-integrations/connectors/destination-postgres/build.gradle
@@ -4,7 +4,7 @@ plugins {
 }
 
 airbyteJavaConnector {
-    cdkVersionRequired = '0.16.2'
+    cdkVersionRequired = '0.16.3'
     features = [
             'db-sources', // required for tests
             'db-destinations',
diff --git a/airbyte-integrations/connectors/destination-postgres/metadata.yaml b/airbyte-integrations/connectors/destination-postgres/metadata.yaml
index 730c511df3b83..99b6d29ef6b58 100644
--- a/airbyte-integrations/connectors/destination-postgres/metadata.yaml
+++ b/airbyte-integrations/connectors/destination-postgres/metadata.yaml
@@ -5,7 +5,7 @@ data:
   connectorSubtype: database
   connectorType: destination
   definitionId: 25c5221d-dce2-4163-ade9-739ef790f503
-  dockerImageTag: 0.6.1
+  dockerImageTag: 0.6.2
   dockerRepository: airbyte/destination-postgres
   documentationUrl: https://docs.airbyte.com/integrations/destinations/postgres
   githubIssueLabel: destination-postgres
@@ -19,7 +19,6 @@ data:
   registries:
     cloud:
       dockerRepository: airbyte/destination-postgres-strict-encrypt
-      dockerImageTag: 0.6.0
       enabled: true
     oss:
       enabled: true
diff --git a/docs/integrations/destinations/postgres.md b/docs/integrations/destinations/postgres.md
index a546308aef91a..9552b38a3e842 100644
--- a/docs/integrations/destinations/postgres.md
+++ b/docs/integrations/destinations/postgres.md
@@ -170,6 +170,7 @@ Now that you have set up the Postgres destination connector, check out the follo
 
 | Version | Date       | Pull Request                                               | Subject                                                                                             |
 |:--------|:-----------|:-----------------------------------------------------------|:----------------------------------------------------------------------------------------------------|
+| 0.6.2   | 2024-01-30 | [34683](https://github.com/airbytehq/airbyte/pull/34683)   | CDK Upgrade 0.16.3; Fix dependency mismatches in slf4j lib                                          |
 | 0.6.1   | 2024-01-29 | [34630](https://github.com/airbytehq/airbyte/pull/34630)   | CDK Upgrade; Use lowercase raw table in T+D queries.                                                |
 | 0.6.0   | 2024-01-19 | [34372](https://github.com/airbytehq/airbyte/pull/34372)   | Add dv2 flag in spec                                                                                |
 | 0.5.5   | 2024-01-18 | [34236](https://github.com/airbytehq/airbyte/pull/34236)   | Upgrade CDK to 0.13.1; Add indexes in raw table for query optimization                              |

From 2c861063870394206a41301b97e4588071508e4b Mon Sep 17 00:00:00 2001
From: Artem Inzhyyants <36314070+artem1205@users.noreply.github.com>
Date: Wed, 31 Jan 2024 19:23:21 +0100
Subject: [PATCH 50/96] CAT: fix NoAdditionalPropertiesValidator (#34709)

---
 .../bases/connector-acceptance-test/CHANGELOG.md               | 3 +++
 .../connector_acceptance_test/utils/asserts.py                 | 2 +-
 .../bases/connector-acceptance-test/pyproject.toml             | 2 +-
 3 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/airbyte-integrations/bases/connector-acceptance-test/CHANGELOG.md b/airbyte-integrations/bases/connector-acceptance-test/CHANGELOG.md
index bf133bde47a84..b7e87e84ed86b 100644
--- a/airbyte-integrations/bases/connector-acceptance-test/CHANGELOG.md
+++ b/airbyte-integrations/bases/connector-acceptance-test/CHANGELOG.md
@@ -1,5 +1,8 @@
 # Changelog
 
+## 3.3.3
+Аix `NoAdditionalPropertiesValidator` if no type found in `items` 
+
 ## 3.3.2
 Fix TestBasicRead.test_read.validate_schema: set `additionalProperties` to False recursively for objects
 
diff --git a/airbyte-integrations/bases/connector-acceptance-test/connector_acceptance_test/utils/asserts.py b/airbyte-integrations/bases/connector-acceptance-test/connector_acceptance_test/utils/asserts.py
index cb4fe51154b68..8362aac100537 100644
--- a/airbyte-integrations/bases/connector-acceptance-test/connector_acceptance_test/utils/asserts.py
+++ b/airbyte-integrations/bases/connector-acceptance-test/connector_acceptance_test/utils/asserts.py
@@ -48,7 +48,7 @@ def add_properties(properties):
                 elif "type" in prop_value and "array" in prop_value["type"]:
                     if (
                         prop_value.get("items")
-                        and "object" in prop_value.get("items", {}).get("type")
+                        and "object" in prop_value.get("items", {}).get("type", [])
                         and len(prop_value.get("items", {}).get("properties", []))
                     ):
                         prop_value["items"]["additionalProperties"] = False
diff --git a/airbyte-integrations/bases/connector-acceptance-test/pyproject.toml b/airbyte-integrations/bases/connector-acceptance-test/pyproject.toml
index 728c9112ceffc..e38d6f7939ba3 100644
--- a/airbyte-integrations/bases/connector-acceptance-test/pyproject.toml
+++ b/airbyte-integrations/bases/connector-acceptance-test/pyproject.toml
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
 
 [tool.poetry]
 name = "connector-acceptance-test"
-version = "3.3.1"
+version = "3.3.3"
 description = "Contains acceptance tests for connectors."
 authors = ["Airbyte <contact@airbyte.io>"]
 license = "MIT"

From b81aa62ccc987fef24c28492e3aba6d6edb8d9b8 Mon Sep 17 00:00:00 2001
From: Joe Bell <jbfbell@gmail.com>
Date: Thu, 1 Feb 2024 14:23:04 -0800
Subject: [PATCH 51/96] source recharge for some reason

---
 .../connectors/source-recharge/main.py        |  9 +++++++--
 .../connectors/source-recharge/setup.py       | 19 +------------------
 2 files changed, 8 insertions(+), 20 deletions(-)

diff --git a/airbyte-integrations/connectors/source-recharge/main.py b/airbyte-integrations/connectors/source-recharge/main.py
index d8ccf40b711ea..c61ef445b68d9 100644
--- a/airbyte-integrations/connectors/source-recharge/main.py
+++ b/airbyte-integrations/connectors/source-recharge/main.py
@@ -2,7 +2,12 @@
 # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
 #
 
-from source_recharge.run import run
+
+import sys
+
+from airbyte_cdk.entrypoint import launch
+from source_recharge import SourceRecharge
 
 if __name__ == "__main__":
-    run()
+    source = SourceRecharge()
+    launch(source, sys.argv[1:])
diff --git a/airbyte-integrations/connectors/source-recharge/setup.py b/airbyte-integrations/connectors/source-recharge/setup.py
index 3e80432c9c577..bb091a439b28b 100644
--- a/airbyte-integrations/connectors/source-recharge/setup.py
+++ b/airbyte-integrations/connectors/source-recharge/setup.py
@@ -16,30 +16,13 @@
 ]
 
 setup(
-    entry_points={
-        "console_scripts": [
-            "source-recharge=source_recharge.run:run",
-        ],
-    },
     name="source_recharge",
     description="Source implementation for Recharge.",
     author="Airbyte",
     author_email="contact@airbyte.io",
     packages=find_packages(),
     install_requires=MAIN_REQUIREMENTS,
-    package_data={
-        "": [
-            # Include yaml files in the package (if any)
-            "*.yml",
-            "*.yaml",
-            # Include all json files in the package, up to 4 levels deep
-            "*.json",
-            "*/*.json",
-            "*/*/*.json",
-            "*/*/*/*.json",
-            "*/*/*/*/*.json",
-        ]
-    },
+    package_data={"": ["*.json", "schemas/*.json", "schemas/shared/*.json"]},
     extras_require={
         "tests": TEST_REQUIREMENTS,
     },

From 61d96d113c6542fcf119485035e99ff3298eec06 Mon Sep 17 00:00:00 2001
From: Joe Bell <jbfbell@gmail.com>
Date: Thu, 1 Feb 2024 14:28:10 -0800
Subject: [PATCH 52/96] delete file

---
 .../source-recharge/source_recharge/run.py         | 14 --------------
 1 file changed, 14 deletions(-)
 delete mode 100644 airbyte-integrations/connectors/source-recharge/source_recharge/run.py

diff --git a/airbyte-integrations/connectors/source-recharge/source_recharge/run.py b/airbyte-integrations/connectors/source-recharge/source_recharge/run.py
deleted file mode 100644
index 2a56566c41c2b..0000000000000
--- a/airbyte-integrations/connectors/source-recharge/source_recharge/run.py
+++ /dev/null
@@ -1,14 +0,0 @@
-#
-# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
-#
-
-
-import sys
-
-from airbyte_cdk.entrypoint import launch
-from source_recharge import SourceRecharge
-
-
-def run():
-    source = SourceRecharge()
-    launch(source, sys.argv[1:])

From 79d6db06c0fc053241c0f2d45e9bcb312d9a2074 Mon Sep 17 00:00:00 2001
From: Joe Bell <jbfbell@gmail.com>
Date: Thu, 1 Feb 2024 17:21:34 -0800
Subject: [PATCH 53/96] passing tests

---
 .../destination/StandardNameTransformer.java  |  1 +
 .../clickhouse/ClickhouseDestinationTest.java | 23 ++++++++++++-------
 2 files changed, 16 insertions(+), 8 deletions(-)

diff --git a/airbyte-cdk/java/airbyte-cdk/core/src/main/java/io/airbyte/cdk/integrations/destination/StandardNameTransformer.java b/airbyte-cdk/java/airbyte-cdk/core/src/main/java/io/airbyte/cdk/integrations/destination/StandardNameTransformer.java
index a0bb39cc5d255..8601f70c49e6e 100644
--- a/airbyte-cdk/java/airbyte-cdk/core/src/main/java/io/airbyte/cdk/integrations/destination/StandardNameTransformer.java
+++ b/airbyte-cdk/java/airbyte-cdk/core/src/main/java/io/airbyte/cdk/integrations/destination/StandardNameTransformer.java
@@ -31,6 +31,7 @@ public String getNamespace(final String namespace) {
   }
 
   @Override
+  @Deprecated
   public String getRawTableName(final String streamName) {
     return convertStreamName("_airbyte_raw_" + streamName);
   }
diff --git a/airbyte-integrations/connectors/destination-clickhouse/src/test/java/io/airbyte/integrations/destination/clickhouse/ClickhouseDestinationTest.java b/airbyte-integrations/connectors/destination-clickhouse/src/test/java/io/airbyte/integrations/destination/clickhouse/ClickhouseDestinationTest.java
index 0b05cb932a8ec..6b38b89d79ea8 100644
--- a/airbyte-integrations/connectors/destination-clickhouse/src/test/java/io/airbyte/integrations/destination/clickhouse/ClickhouseDestinationTest.java
+++ b/airbyte-integrations/connectors/destination-clickhouse/src/test/java/io/airbyte/integrations/destination/clickhouse/ClickhouseDestinationTest.java
@@ -13,11 +13,13 @@
 import io.airbyte.cdk.db.jdbc.DefaultJdbcDatabase;
 import io.airbyte.cdk.db.jdbc.JdbcDatabase;
 import io.airbyte.cdk.db.jdbc.JdbcUtils;
-import io.airbyte.cdk.integrations.base.AirbyteMessageConsumer;
 import io.airbyte.cdk.integrations.base.Destination;
+import io.airbyte.cdk.integrations.base.DestinationConfig;
+import io.airbyte.cdk.integrations.base.SerializedAirbyteMessageConsumer;
 import io.airbyte.cdk.integrations.destination.StandardNameTransformer;
 import io.airbyte.commons.json.Jsons;
 import io.airbyte.commons.map.MoreMaps;
+import io.airbyte.integrations.base.destination.typing_deduping.StreamId;
 import io.airbyte.protocol.models.Field;
 import io.airbyte.protocol.models.JsonSchemaType;
 import io.airbyte.protocol.models.v0.AirbyteMessage;
@@ -26,6 +28,7 @@
 import io.airbyte.protocol.models.v0.AirbyteStateMessage;
 import io.airbyte.protocol.models.v0.CatalogHelpers;
 import io.airbyte.protocol.models.v0.ConfiguredAirbyteCatalog;
+import java.nio.charset.StandardCharsets;
 import java.time.Instant;
 import java.util.Comparator;
 import java.util.List;
@@ -95,22 +98,26 @@ static void cleanUp() {
   @Test
   void sanityTest() throws Exception {
     final Destination dest = new ClickhouseDestination();
-    final AirbyteMessageConsumer consumer = dest.getConsumer(config, catalog,
-        Destination::defaultOutputRecordCollector);
+    DestinationConfig.initialize(config, dest.isV2Destination());
+    final SerializedAirbyteMessageConsumer consumer = dest.getSerializedMessageConsumer(config, catalog,
+                                                                                        Destination::defaultOutputRecordCollector);
     final List<AirbyteMessage> expectedRecords = generateRecords(10);
 
     consumer.start();
     expectedRecords.forEach(m -> {
       try {
-        consumer.accept(m);
+        final var strMessage = Jsons.jsonNode(m).toString();
+        consumer.accept(strMessage, strMessage.getBytes(StandardCharsets.UTF_8).length);
       } catch (final Exception e) {
         throw new RuntimeException(e);
       }
     });
-    consumer.accept(new AirbyteMessage()
+    final var abMessage = Jsons.jsonNode(new AirbyteMessage()
         .withType(Type.STATE)
         .withState(new AirbyteStateMessage()
-            .withData(Jsons.jsonNode(ImmutableMap.of(DB_NAME + "." + STREAM_NAME, 10)))));
+                       .withData(Jsons.jsonNode(ImmutableMap.of(DB_NAME + "." + STREAM_NAME, 10)))
+        )).toString();
+    consumer.accept(abMessage, abMessage.getBytes(StandardCharsets.UTF_8).length);
     consumer.close();
 
     final JdbcDatabase database = new DefaultJdbcDatabase(
@@ -126,8 +133,8 @@ void sanityTest() throws Exception {
 
     final List<JsonNode> actualRecords = database.bufferedResultSetQuery(
         connection -> connection.createStatement().executeQuery(
-            String.format("SELECT * FROM %s.%s;", DB_NAME,
-                namingResolver.getRawTableName(STREAM_NAME))),
+            String.format("SELECT * FROM %s.%s;", "airbyte_internal",
+                          StreamId.concatenateRawTableName(DB_NAME, STREAM_NAME))),
         JdbcUtils.getDefaultSourceOperations()::rowToJson);
 
     assertEquals(

From a59b052a3a0a8316430aeab2146445a6dd8f8239 Mon Sep 17 00:00:00 2001
From: Joe Bell <jbfbell@gmail.com>
Date: Thu, 1 Feb 2024 17:25:09 -0800
Subject: [PATCH 54/96] formatting

---
 .../destination/clickhouse/ClickhouseDestinationTest.java | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/airbyte-integrations/connectors/destination-clickhouse/src/test/java/io/airbyte/integrations/destination/clickhouse/ClickhouseDestinationTest.java b/airbyte-integrations/connectors/destination-clickhouse/src/test/java/io/airbyte/integrations/destination/clickhouse/ClickhouseDestinationTest.java
index 6b38b89d79ea8..e414e428e63dc 100644
--- a/airbyte-integrations/connectors/destination-clickhouse/src/test/java/io/airbyte/integrations/destination/clickhouse/ClickhouseDestinationTest.java
+++ b/airbyte-integrations/connectors/destination-clickhouse/src/test/java/io/airbyte/integrations/destination/clickhouse/ClickhouseDestinationTest.java
@@ -100,7 +100,7 @@ void sanityTest() throws Exception {
     final Destination dest = new ClickhouseDestination();
     DestinationConfig.initialize(config, dest.isV2Destination());
     final SerializedAirbyteMessageConsumer consumer = dest.getSerializedMessageConsumer(config, catalog,
-                                                                                        Destination::defaultOutputRecordCollector);
+        Destination::defaultOutputRecordCollector);
     final List<AirbyteMessage> expectedRecords = generateRecords(10);
 
     consumer.start();
@@ -115,8 +115,8 @@ void sanityTest() throws Exception {
     final var abMessage = Jsons.jsonNode(new AirbyteMessage()
         .withType(Type.STATE)
         .withState(new AirbyteStateMessage()
-                       .withData(Jsons.jsonNode(ImmutableMap.of(DB_NAME + "." + STREAM_NAME, 10)))
-        )).toString();
+            .withData(Jsons.jsonNode(ImmutableMap.of(DB_NAME + "." + STREAM_NAME, 10)))))
+        .toString();
     consumer.accept(abMessage, abMessage.getBytes(StandardCharsets.UTF_8).length);
     consumer.close();
 
@@ -134,7 +134,7 @@ void sanityTest() throws Exception {
     final List<JsonNode> actualRecords = database.bufferedResultSetQuery(
         connection -> connection.createStatement().executeQuery(
             String.format("SELECT * FROM %s.%s;", "airbyte_internal",
-                          StreamId.concatenateRawTableName(DB_NAME, STREAM_NAME))),
+                StreamId.concatenateRawTableName(DB_NAME, STREAM_NAME))),
         JdbcUtils.getDefaultSourceOperations()::rowToJson);
 
     assertEquals(

From d5c1cca2028fdf6b0f32c3a79aa1fdc89cc25cac Mon Sep 17 00:00:00 2001
From: Joe Bell <jbfbell@gmail.com>
Date: Fri, 2 Feb 2024 11:13:56 -0800
Subject: [PATCH 55/96] PR Feedback non gradle

---
 .../jdbc/AbstractJdbcDestination.java         |  5 +--
 .../typing_deduping/RawOnlySqlGenerator.kt    | 24 ++++++++------
 .../typing_deduping/FutureUtils.java          | 31 +++++++++++++------
 3 files changed, 39 insertions(+), 21 deletions(-)

diff --git a/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/AbstractJdbcDestination.java b/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/AbstractJdbcDestination.java
index 89b837408e55b..2ad41ebc86bba 100644
--- a/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/AbstractJdbcDestination.java
+++ b/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/AbstractJdbcDestination.java
@@ -6,6 +6,7 @@
 
 import static io.airbyte.cdk.integrations.base.errors.messages.ErrorMessage.getErrorMessage;
 import static io.airbyte.cdk.integrations.util.ConfiguredCatalogUtilKt.addDefaultNamespaceToStreams;
+import static io.airbyte.integrations.base.destination.typing_deduping.FutureUtils.countOfTypingDedupingThreads;
 
 import com.fasterxml.jackson.databind.JsonNode;
 import com.google.common.annotations.VisibleForTesting;
@@ -323,10 +324,10 @@ private TyperDeduper getV2TyperDeduper(final JsonNode config, final ConfiguredAi
     final TyperDeduper typerDeduper;
     if (disableTypeDedupe) {
       typerDeduper = new NoOpTyperDeduperWithV1V2Migrations<>(sqlGenerator, destinationHandler, parsedCatalog, migrator, v2TableMigrator,
-          8);
+                                                              countOfTypingDedupingThreads());
     } else {
       typerDeduper =
-          new DefaultTyperDeduper<>(sqlGenerator, destinationHandler, parsedCatalog, migrator, v2TableMigrator, 8);
+          new DefaultTyperDeduper<>(sqlGenerator, destinationHandler, parsedCatalog, migrator, v2TableMigrator, countOfTypingDedupingThreads());
     }
     return typerDeduper;
   }
diff --git a/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/typing_deduping/RawOnlySqlGenerator.kt b/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/typing_deduping/RawOnlySqlGenerator.kt
index 7a8eb52499e62..17447dbf0833f 100644
--- a/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/typing_deduping/RawOnlySqlGenerator.kt
+++ b/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/typing_deduping/RawOnlySqlGenerator.kt
@@ -11,50 +11,56 @@ import org.jooq.Field
 import org.jooq.SQLDialect
 import java.util.*
 
+/**
+ * Some Destinations do not support Typing and Deduping but have the updated raw table format
+ * SqlGenerator implementations are only for "final" tables and are a required input for
+ * TyperDeduper classes. This implementation appeases that requirement but does not implement
+ * any "final" table operations.
+ */
 class RawOnlySqlGenerator(private val namingTransformer: NamingConventionTransformer) :
     JdbcSqlGenerator(namingTransformer) {
     override fun getStructType(): DataType<*>? {
-        throw NotImplementedError("This Destination Does not support final tables")
+        throw NotImplementedError("This Destination does not support final tables")
     }
 
     override fun getArrayType(): DataType<*>? {
-        throw NotImplementedError("This Destination Does not support final tables")
+        throw NotImplementedError("This Destination does not support final tables")
     }
 
     override fun getWidestType(): DataType<*>? {
-        throw NotImplementedError("This Destination Does not support final tables")
+        throw NotImplementedError("This Destination does not support final tables")
     }
 
     override fun getDialect(): SQLDialect? {
-        throw NotImplementedError("This Destination Does not support final tables")
+        throw NotImplementedError("This Destination does not support final tables")
     }
 
     override fun extractRawDataFields(
         columns: LinkedHashMap<ColumnId, AirbyteType>,
         useExpensiveSaferCasting: Boolean
     ): List<Field<*>>? {
-        throw NotImplementedError("This Destination Does not support final tables")
+        throw NotImplementedError("This Destination does not support final tables")
     }
 
     override fun buildAirbyteMetaColumn(columns: LinkedHashMap<ColumnId, AirbyteType>): Field<*>? {
-        throw NotImplementedError("This Destination Does not support final tables")
+        throw NotImplementedError("This Destination does not support final tables")
     }
 
     override fun cdcDeletedAtNotNullCondition(): Condition? {
-        throw NotImplementedError("This Destination Does not support final tables")
+        throw NotImplementedError("This Destination does not support final tables")
     }
 
     override fun getRowNumber(
         primaryKey: List<ColumnId>,
         cursorField: Optional<ColumnId>
     ): Field<Int>? {
-        throw NotImplementedError("This Destination Does not support final tables")
+        throw NotImplementedError("This Destination does not support final tables")
     }
 
     override fun existingSchemaMatchesStreamConfig(
         stream: StreamConfig,
         existingTable: TableDefinition
     ): Boolean {
-        throw NotImplementedError("This Destination Does not support final tables")
+        throw NotImplementedError("This Destination does not support final tables")
     }
 }
diff --git a/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/FutureUtils.java b/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/FutureUtils.java
index 349437e4acecf..9e05ec6643bcf 100644
--- a/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/FutureUtils.java
+++ b/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/FutureUtils.java
@@ -12,29 +12,40 @@
 
 public class FutureUtils {
 
+  public static final int DEFAULT_TD_THREAD_COUNT = 8;
+
+
   /**
-   * Allow for configuring the number of typing and deduping threads via an enviornment variable in
-   * the destination container.
+   * Allow for configuring the number of typing and deduping threads via an environment variable in the destination container.
    *
    * @return the number of threads to use in the typing and deduping pool
    */
   public static int countOfTypingDedupingThreads(final int defaultThreads) {
     return Optional.ofNullable(System.getenv("TD_THREADS"))
-        .map(Integer::valueOf)
-        .orElse(defaultThreads);
+                   .map(Integer::valueOf)
+                   .orElse(defaultThreads);
+  }
+
+  /**
+   * Allow for configuring the number of typing and deduping threads via an environment variable in the destination container.
+   *
+   * @return the number of threads to use in the typing and deduping pool
+   */
+  public static int countOfTypingDedupingThreads() {
+    return countOfTypingDedupingThreads(DEFAULT_TD_THREAD_COUNT);
   }
 
   /**
-   * Log all exceptions from a list of futures, and rethrow the first exception if there is one. This
-   * mimics the behavior of running the futures in serial, where the first failure
+   * Log all exceptions from a list of futures, and rethrow the first exception if there is one. This mimics the behavior of running the futures in
+   * serial, where the first failure
    */
   public static void reduceExceptions(final Collection<CompletableFuture<Optional<Exception>>> potentialExceptions, final String initialMessage)
       throws Exception {
     final List<Exception> exceptions = potentialExceptions.stream()
-        .map(CompletableFuture::join)
-        .filter(Optional::isPresent)
-        .map(Optional::get)
-        .toList();
+                                                          .map(CompletableFuture::join)
+                                                          .filter(Optional::isPresent)
+                                                          .map(Optional::get)
+                                                          .toList();
     ConnectorExceptionUtil.logAllAndThrowFirst(initialMessage, exceptions);
   }
 

From eeae2247d1015b86a8501bedde487824380c169a Mon Sep 17 00:00:00 2001
From: Joe Bell <jbfbell@gmail.com>
Date: Fri, 2 Feb 2024 11:29:57 -0800
Subject: [PATCH 56/96] PR Feedback non gradle - 2

---
 .../typing_deduping/NoOpRawTableTDLock.kt        |  9 ++-------
 .../NoOpTyperDeduperWithV1V2Migrations.java      |  2 +-
 .../typing_deduping/TyperDeduperUtil.kt          | 14 ++++----------
 .../clickhouse/ClickhouseSqlOperations.java      | 16 ++++++++--------
 4 files changed, 15 insertions(+), 26 deletions(-)

diff --git a/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/NoOpRawTableTDLock.kt b/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/NoOpRawTableTDLock.kt
index 3cc88d70fdd55..9c26e4d605b8f 100644
--- a/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/NoOpRawTableTDLock.kt
+++ b/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/NoOpRawTableTDLock.kt
@@ -9,14 +9,9 @@ class NoOpRawTableTDLock: Lock {
 
     override fun lockInterruptibly() {}
 
-    override fun tryLock(): Boolean {
-        // To mimic NoOp behavior always return true that lock is acquired
-        return true
-    }
+    override fun tryLock() = true
 
-    override fun tryLock(time: Long, unit: TimeUnit): Boolean {
-        return tryLock()
-    }
+    override fun tryLock(time: Long, unit: TimeUnit) = tryLock()
 
     override fun unlock() {}
 
diff --git a/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/NoOpTyperDeduperWithV1V2Migrations.java b/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/NoOpTyperDeduperWithV1V2Migrations.java
index 703b8446711ae..218de3632de84 100644
--- a/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/NoOpTyperDeduperWithV1V2Migrations.java
+++ b/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/NoOpTyperDeduperWithV1V2Migrations.java
@@ -57,7 +57,7 @@ public NoOpTyperDeduperWithV1V2Migrations(final SqlGenerator<DialectTableDefinit
   @Override
   public void prepareTables() throws Exception {
     try {
-      log.info("ensuring schemas exist for prepareTables with V1V2 migrations");
+      log.info("Ensuring schemas exist for prepareTables with V1V2 migrations");
       prepareAllSchemas(parsedCatalog, sqlGenerator, destinationHandler);
       final Set<CompletableFuture<Optional<Exception>>> prepareTablesTasks = new HashSet<>();
       for (final StreamConfig stream : parsedCatalog.streams()) {
diff --git a/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/TyperDeduperUtil.kt b/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/TyperDeduperUtil.kt
index f1ed3d1ba38a7..c8020d561826f 100644
--- a/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/TyperDeduperUtil.kt
+++ b/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/TyperDeduperUtil.kt
@@ -1,21 +1,15 @@
 package io.airbyte.integrations.base.destination.typing_deduping
 
-import com.google.common.collect.Streams
-import java.util.*
 
 /**
  * Extracts all the "raw" and "final" schemas identified in the [parsedCatalog] and ensures they
  * exist in the Destination Database.
  */
 fun <T> prepareAllSchemas(parsedCatalog: ParsedCatalog, sqlGenerator: SqlGenerator<T>, destinationHandler: DestinationHandler<T>) {
-    val rawSchema =
-        parsedCatalog.streams.stream().map { stream: StreamConfig -> stream.id.rawNamespace }
-    val finalSchema =
-        parsedCatalog.streams.stream().map { stream: StreamConfig -> stream.id.finalNamespace }
-    val createAllSchemasSql = Streams.concat(rawSchema, finalSchema)
-        .filter { obj: String? -> Objects.nonNull(obj) }
-        .distinct()
-        .map { schema: String? -> sqlGenerator.createSchema(schema) }
+    val rawSchema = parsedCatalog.streams.mapNotNull { it.id.rawNamespace }
+    val finalSchema = parsedCatalog.streams.mapNotNull { it.id.finalNamespace }
+    val createAllSchemasSql = rawSchema.union(finalSchema)
+        .map { sqlGenerator.createSchema(it) }
         .toList()
     destinationHandler.execute(Sql.concat(createAllSchemasSql))
 }
diff --git a/airbyte-integrations/connectors/destination-clickhouse/src/main/java/io/airbyte/integrations/destination/clickhouse/ClickhouseSqlOperations.java b/airbyte-integrations/connectors/destination-clickhouse/src/main/java/io/airbyte/integrations/destination/clickhouse/ClickhouseSqlOperations.java
index 80f13c47c7a2e..8bfd8442984be 100644
--- a/airbyte-integrations/connectors/destination-clickhouse/src/main/java/io/airbyte/integrations/destination/clickhouse/ClickhouseSqlOperations.java
+++ b/airbyte-integrations/connectors/destination-clickhouse/src/main/java/io/airbyte/integrations/destination/clickhouse/ClickhouseSqlOperations.java
@@ -37,14 +37,14 @@ public boolean isSchemaRequired() {
   public String createTableQuery(final JdbcDatabase database, final String schemaName, final String tableName) {
     return String.format(
         """
-        CREATE TABLE IF NOT EXISTS %s.%s (
-        %s String,
-        %s String,
-        %s DateTime64(3, 'GMT') DEFAULT now(),
-        %s DateTime64(3, 'GMT') NULL,
-        PRIMARY KEY(%s)
-        )
-        ENGINE = MergeTree;
+          CREATE TABLE IF NOT EXISTS %s.%s (
+          %s String,
+          %s String,
+          %s DateTime64(3, 'GMT') DEFAULT now(),
+          %s DateTime64(3, 'GMT') NULL,
+          PRIMARY KEY(%s)
+          )
+          ENGINE = MergeTree;
         """,
         schemaName, tableName,
         JavaBaseConstants.COLUMN_NAME_AB_RAW_ID,

From b7c4b2d9d6502c7740982a5cb51b72a4afa65321 Mon Sep 17 00:00:00 2001
From: Joe Bell <jbfbell@gmail.com>
Date: Fri, 2 Feb 2024 14:52:21 -0800
Subject: [PATCH 57/96] unneccessary class

---
 .../base/destination/typing_deduping/LoggingUtil.kt   | 11 -----------
 1 file changed, 11 deletions(-)
 delete mode 100644 airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/LoggingUtil.kt

diff --git a/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/LoggingUtil.kt b/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/LoggingUtil.kt
deleted file mode 100644
index ed3552b0ff706..0000000000000
--- a/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/LoggingUtil.kt
+++ /dev/null
@@ -1,11 +0,0 @@
-package io.airbyte.integrations.base.destination.typing_deduping
-
-import org.slf4j.Logger
-import org.slf4j.LoggerFactory
-
-/**
- * Extends all classes to lazily initialize a Slf4j [Logger]
- */
-fun <R: Any> R.logger(): Lazy<Logger> {
-    return lazy { LoggerFactory.getLogger(this.javaClass) }
-}

From 64486852193228d095d0b3bfdfbcb0f1442a49c4 Mon Sep 17 00:00:00 2001
From: Joe Bell <jbfbell@gmail.com>
Date: Fri, 2 Feb 2024 16:25:09 -0800
Subject: [PATCH 58/96] change jvm target

---
 airbyte-cdk/java/airbyte-cdk/core/build.gradle    | 15 ++++++++++++---
 .../java/airbyte-cdk/db-destinations/build.gradle | 14 ++++++++++++--
 .../java/airbyte-cdk/typing-deduping/build.gradle | 14 ++++++++++++--
 3 files changed, 36 insertions(+), 7 deletions(-)

diff --git a/airbyte-cdk/java/airbyte-cdk/core/build.gradle b/airbyte-cdk/java/airbyte-cdk/core/build.gradle
index f32d8ab53f458..9bf7fdabb3222 100644
--- a/airbyte-cdk/java/airbyte-cdk/core/build.gradle
+++ b/airbyte-cdk/java/airbyte-cdk/core/build.gradle
@@ -105,8 +105,17 @@ dependencies {
     testImplementation 'org.apache.commons:commons-lang3:3.11'
     testImplementation 'org.xerial.snappy:snappy-java:1.1.8.4'
     testImplementation 'org.mockito:mockito-core:4.6.1'
-    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
 }
 
-compileKotlin {}
-compileTestKotlin {}
+compileKotlin {
+    compilerOptions {
+        jvmTarget = "17"
+        languageVersion = "1.9"
+    }
+}
+compileTestKotlin {
+    compilerOptions {
+        jvmTarget = "17"
+        languageVersion = "1.9"
+    }
+}
diff --git a/airbyte-cdk/java/airbyte-cdk/db-destinations/build.gradle b/airbyte-cdk/java/airbyte-cdk/db-destinations/build.gradle
index b606d3b7cd1c1..178ab248db8f7 100644
--- a/airbyte-cdk/java/airbyte-cdk/db-destinations/build.gradle
+++ b/airbyte-cdk/java/airbyte-cdk/db-destinations/build.gradle
@@ -95,5 +95,15 @@ dependencies {
     testImplementation libs.junit.jupiter.system.stubs
 }
 
-compileKotlin {}
-compileTestKotlin {}
+compileKotlin {
+    compilerOptions {
+        jvmTarget = "17"
+        languageVersion = "1.9"
+    }
+}
+compileTestKotlin {
+    compilerOptions {
+        jvmTarget = "17"
+        languageVersion = "1.9"
+    }
+}
diff --git a/airbyte-cdk/java/airbyte-cdk/typing-deduping/build.gradle b/airbyte-cdk/java/airbyte-cdk/typing-deduping/build.gradle
index 4160813789d68..dbc79f699f556 100644
--- a/airbyte-cdk/java/airbyte-cdk/typing-deduping/build.gradle
+++ b/airbyte-cdk/java/airbyte-cdk/typing-deduping/build.gradle
@@ -26,5 +26,15 @@ java {
     }
 }
 
-compileKotlin {}
-compileTestKotlin {}
+compileKotlin {
+    compilerOptions {
+        jvmTarget = "17"
+        languageVersion = "1.9"
+    }
+}
+compileTestKotlin {
+    compilerOptions {
+        jvmTarget = "17"
+        languageVersion = "1.9"
+    }
+}

From 05f3b7cd5b13d2923c9217457b293315f37964c4 Mon Sep 17 00:00:00 2001
From: Joe Bell <jbfbell@gmail.com>
Date: Fri, 2 Feb 2024 18:19:30 -0800
Subject: [PATCH 59/96] gradle changes

---
 airbyte-cdk/java/airbyte-cdk/build.gradle     | 21 +++++++++++++++++++
 .../java/airbyte-cdk/core/build.gradle        | 17 ---------------
 .../airbyte-cdk/db-destinations/build.gradle  | 17 ---------------
 .../airbyte-cdk/typing-deduping/build.gradle  | 14 -------------
 4 files changed, 21 insertions(+), 48 deletions(-)

diff --git a/airbyte-cdk/java/airbyte-cdk/build.gradle b/airbyte-cdk/java/airbyte-cdk/build.gradle
index 1523d78df648e..51f098f3b860b 100644
--- a/airbyte-cdk/java/airbyte-cdk/build.gradle
+++ b/airbyte-cdk/java/airbyte-cdk/build.gradle
@@ -1,3 +1,9 @@
+import org.jetbrains.kotlin.gradle.dsl.JvmTarget
+import org.jetbrains.kotlin.gradle.dsl.KotlinVersion
+plugins {
+    id 'org.jetbrains.kotlin.jvm' version '1.9.22'
+}
+
 allprojects {
     apply plugin: 'java-library'
     apply plugin: 'maven-publish'
@@ -5,6 +11,7 @@ allprojects {
     apply plugin: 'airbyte-integration-test-java'
     apply plugin: 'airbyte-performance-test-java'
     apply plugin: 'java-test-fixtures'
+    apply plugin: 'org.jetbrains.kotlin.jvm'
 
     group 'io.airbyte.cdk'
     version = getCdkTargetVersion()
@@ -41,6 +48,19 @@ subprojects { subproject ->
                 }
             }
         }
+
+        compileKotlin {
+            compilerOptions {
+                jvmTarget = JvmTarget.JVM_17
+                languageVersion = KotlinVersion.KOTLIN_1_9
+            }
+        }
+        compileTestKotlin {
+            compilerOptions {
+                jvmTarget = JvmTarget.JVM_17
+                languageVersion = KotlinVersion.KOTLIN_1_9
+            }
+        }
     }
 
     project.configurations {
@@ -118,3 +138,4 @@ cleanLocalCache.configure {
     dependsOn tasks.named('clean')
     dependsOn subprojects.collect { it.tasks.named('clean') }
 }
+
diff --git a/airbyte-cdk/java/airbyte-cdk/core/build.gradle b/airbyte-cdk/java/airbyte-cdk/core/build.gradle
index 9bf7fdabb3222..1a5922d4172e8 100644
--- a/airbyte-cdk/java/airbyte-cdk/core/build.gradle
+++ b/airbyte-cdk/java/airbyte-cdk/core/build.gradle
@@ -1,7 +1,3 @@
-plugins {
-    id 'org.jetbrains.kotlin.jvm' version '1.9.22'
-}
-
 java {
     compileJava {
         options.compilerArgs += "-Xlint:-deprecation,-try,-rawtypes,-overloads,-cast,-unchecked"
@@ -106,16 +102,3 @@ dependencies {
     testImplementation 'org.xerial.snappy:snappy-java:1.1.8.4'
     testImplementation 'org.mockito:mockito-core:4.6.1'
 }
-
-compileKotlin {
-    compilerOptions {
-        jvmTarget = "17"
-        languageVersion = "1.9"
-    }
-}
-compileTestKotlin {
-    compilerOptions {
-        jvmTarget = "17"
-        languageVersion = "1.9"
-    }
-}
diff --git a/airbyte-cdk/java/airbyte-cdk/db-destinations/build.gradle b/airbyte-cdk/java/airbyte-cdk/db-destinations/build.gradle
index 178ab248db8f7..64319a920171e 100644
--- a/airbyte-cdk/java/airbyte-cdk/db-destinations/build.gradle
+++ b/airbyte-cdk/java/airbyte-cdk/db-destinations/build.gradle
@@ -1,7 +1,3 @@
-plugins {
-    id "org.jetbrains.kotlin.jvm" version "1.9.22"
-}
-
 java {
     compileJava {
         options.compilerArgs += "-Xlint:-deprecation"
@@ -94,16 +90,3 @@ dependencies {
 
     testImplementation libs.junit.jupiter.system.stubs
 }
-
-compileKotlin {
-    compilerOptions {
-        jvmTarget = "17"
-        languageVersion = "1.9"
-    }
-}
-compileTestKotlin {
-    compilerOptions {
-        jvmTarget = "17"
-        languageVersion = "1.9"
-    }
-}
diff --git a/airbyte-cdk/java/airbyte-cdk/typing-deduping/build.gradle b/airbyte-cdk/java/airbyte-cdk/typing-deduping/build.gradle
index dbc79f699f556..fc3ba8f061e83 100644
--- a/airbyte-cdk/java/airbyte-cdk/typing-deduping/build.gradle
+++ b/airbyte-cdk/java/airbyte-cdk/typing-deduping/build.gradle
@@ -1,6 +1,5 @@
 plugins {
     id 'java-library'
-    id 'org.jetbrains.kotlin.jvm' version '1.9.22'
 }
 
 dependencies {
@@ -25,16 +24,3 @@ java {
         options.compilerArgs.remove("-Werror")
     }
 }
-
-compileKotlin {
-    compilerOptions {
-        jvmTarget = "17"
-        languageVersion = "1.9"
-    }
-}
-compileTestKotlin {
-    compilerOptions {
-        jvmTarget = "17"
-        languageVersion = "1.9"
-    }
-}

From 86bbd1204a61529d45dc54db38adc0d100775636 Mon Sep 17 00:00:00 2001
From: Joe Bell <jbfbell@gmail.com>
Date: Mon, 5 Feb 2024 13:06:11 -0800
Subject: [PATCH 60/96] clean up thread count access

---
 .../jdbc/AbstractJdbcDestination.java            |  6 ++----
 .../typing_deduping/DefaultTyperDeduper.java     | 11 +++++------
 .../destination/typing_deduping/FutureUtils.java | 16 +++-------------
 .../NoOpTyperDeduperWithV1V2Migrations.java      |  9 ++++-----
 4 files changed, 14 insertions(+), 28 deletions(-)

diff --git a/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/AbstractJdbcDestination.java b/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/AbstractJdbcDestination.java
index 2ad41ebc86bba..f43e1abdea057 100644
--- a/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/AbstractJdbcDestination.java
+++ b/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/AbstractJdbcDestination.java
@@ -6,7 +6,6 @@
 
 import static io.airbyte.cdk.integrations.base.errors.messages.ErrorMessage.getErrorMessage;
 import static io.airbyte.cdk.integrations.util.ConfiguredCatalogUtilKt.addDefaultNamespaceToStreams;
-import static io.airbyte.integrations.base.destination.typing_deduping.FutureUtils.countOfTypingDedupingThreads;
 
 import com.fasterxml.jackson.databind.JsonNode;
 import com.google.common.annotations.VisibleForTesting;
@@ -323,11 +322,10 @@ private TyperDeduper getV2TyperDeduper(final JsonNode config, final ConfiguredAi
     final boolean disableTypeDedupe = !config.has(DISABLE_TYPE_DEDUPE) || config.get(DISABLE_TYPE_DEDUPE).asBoolean(false);
     final TyperDeduper typerDeduper;
     if (disableTypeDedupe) {
-      typerDeduper = new NoOpTyperDeduperWithV1V2Migrations<>(sqlGenerator, destinationHandler, parsedCatalog, migrator, v2TableMigrator,
-                                                              countOfTypingDedupingThreads());
+      typerDeduper = new NoOpTyperDeduperWithV1V2Migrations<>(sqlGenerator, destinationHandler, parsedCatalog, migrator, v2TableMigrator);
     } else {
       typerDeduper =
-          new DefaultTyperDeduper<>(sqlGenerator, destinationHandler, parsedCatalog, migrator, v2TableMigrator, countOfTypingDedupingThreads());
+          new DefaultTyperDeduper<>(sqlGenerator, destinationHandler, parsedCatalog, migrator, v2TableMigrator);
     }
     return typerDeduper;
   }
diff --git a/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/DefaultTyperDeduper.java b/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/DefaultTyperDeduper.java
index 2678500a271b6..3a6a166a0b220 100644
--- a/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/DefaultTyperDeduper.java
+++ b/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/DefaultTyperDeduper.java
@@ -5,7 +5,7 @@
 package io.airbyte.integrations.base.destination.typing_deduping;
 
 import static io.airbyte.cdk.integrations.base.IntegrationRunner.TYPE_AND_DEDUPE_THREAD_NAME;
-import static io.airbyte.integrations.base.destination.typing_deduping.FutureUtils.countOfTypingDedupingThreads;
+import static io.airbyte.integrations.base.destination.typing_deduping.FutureUtils.getCountOfTypeAndDedupeThreads;
 import static io.airbyte.integrations.base.destination.typing_deduping.FutureUtils.reduceExceptions;
 import static io.airbyte.integrations.base.destination.typing_deduping.TyperDeduperUtilKt.prepareAllSchemas;
 import static java.util.Collections.singleton;
@@ -78,8 +78,7 @@ public DefaultTyperDeduper(final SqlGenerator<DialectTableDefinition> sqlGenerat
                              final DestinationHandler<DialectTableDefinition> destinationHandler,
                              final ParsedCatalog parsedCatalog,
                              final DestinationV1V2Migrator<DialectTableDefinition> v1V2Migrator,
-                             final V2TableMigrator v2TableMigrator,
-                             final int defaultThreadCount) {
+                             final V2TableMigrator v2TableMigrator) {
     this.sqlGenerator = sqlGenerator;
     this.destinationHandler = destinationHandler;
     this.parsedCatalog = parsedCatalog;
@@ -89,8 +88,8 @@ public DefaultTyperDeduper(final SqlGenerator<DialectTableDefinition> sqlGenerat
     this.streamsWithSuccessfulSetup = ConcurrentHashMap.newKeySet(parsedCatalog.streams().size());
     this.tdLocks = new ConcurrentHashMap<>();
     this.internalTdLocks = new ConcurrentHashMap<>();
-    this.executorService = Executors.newFixedThreadPool(countOfTypingDedupingThreads(defaultThreadCount),
-        new BasicThreadFactory.Builder().namingPattern(TYPE_AND_DEDUPE_THREAD_NAME).build());
+    this.executorService = Executors.newFixedThreadPool(getCountOfTypeAndDedupeThreads(),
+                                                        new BasicThreadFactory.Builder().namingPattern(TYPE_AND_DEDUPE_THREAD_NAME).build());
   }
 
   public DefaultTyperDeduper(
@@ -99,7 +98,7 @@ public DefaultTyperDeduper(
                              final ParsedCatalog parsedCatalog,
                              final DestinationV1V2Migrator<DialectTableDefinition> v1V2Migrator,
                              final int defaultThreadCount) {
-    this(sqlGenerator, destinationHandler, parsedCatalog, v1V2Migrator, new NoopV2TableMigrator(), defaultThreadCount);
+    this(sqlGenerator, destinationHandler, parsedCatalog, v1V2Migrator, new NoopV2TableMigrator());
   }
 
   private void prepareSchemas(final ParsedCatalog parsedCatalog) throws Exception {
diff --git a/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/FutureUtils.java b/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/FutureUtils.java
index 9e05ec6643bcf..c2fe1d5895c1a 100644
--- a/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/FutureUtils.java
+++ b/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/FutureUtils.java
@@ -12,27 +12,17 @@
 
 public class FutureUtils {
 
-  public static final int DEFAULT_TD_THREAD_COUNT = 8;
-
+  private static final int DEFAULT_TD_THREAD_COUNT = 8;
 
   /**
    * Allow for configuring the number of typing and deduping threads via an environment variable in the destination container.
    *
    * @return the number of threads to use in the typing and deduping pool
    */
-  public static int countOfTypingDedupingThreads(final int defaultThreads) {
+  public static int getCountOfTypeAndDedupeThreads() {
     return Optional.ofNullable(System.getenv("TD_THREADS"))
                    .map(Integer::valueOf)
-                   .orElse(defaultThreads);
-  }
-
-  /**
-   * Allow for configuring the number of typing and deduping threads via an environment variable in the destination container.
-   *
-   * @return the number of threads to use in the typing and deduping pool
-   */
-  public static int countOfTypingDedupingThreads() {
-    return countOfTypingDedupingThreads(DEFAULT_TD_THREAD_COUNT);
+                   .orElse(DEFAULT_TD_THREAD_COUNT);
   }
 
   /**
diff --git a/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/NoOpTyperDeduperWithV1V2Migrations.java b/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/NoOpTyperDeduperWithV1V2Migrations.java
index 218de3632de84..581fee4adbf46 100644
--- a/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/NoOpTyperDeduperWithV1V2Migrations.java
+++ b/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/NoOpTyperDeduperWithV1V2Migrations.java
@@ -5,7 +5,7 @@
 package io.airbyte.integrations.base.destination.typing_deduping;
 
 import static io.airbyte.cdk.integrations.base.IntegrationRunner.TYPE_AND_DEDUPE_THREAD_NAME;
-import static io.airbyte.integrations.base.destination.typing_deduping.FutureUtils.countOfTypingDedupingThreads;
+import static io.airbyte.integrations.base.destination.typing_deduping.FutureUtils.getCountOfTypeAndDedupeThreads;
 import static io.airbyte.integrations.base.destination.typing_deduping.FutureUtils.reduceExceptions;
 import static io.airbyte.integrations.base.destination.typing_deduping.TyperDeduperUtilKt.prepareAllSchemas;
 
@@ -43,15 +43,14 @@ public NoOpTyperDeduperWithV1V2Migrations(final SqlGenerator<DialectTableDefinit
                                             final DestinationHandler<DialectTableDefinition> destinationHandler,
                                             final ParsedCatalog parsedCatalog,
                                             final DestinationV1V2Migrator<DialectTableDefinition> v1V2Migrator,
-                                            final V2TableMigrator v2TableMigrator,
-                                            final int defaultThreadCount) {
+                                            final V2TableMigrator v2TableMigrator) {
     this.sqlGenerator = sqlGenerator;
     this.destinationHandler = destinationHandler;
     this.parsedCatalog = parsedCatalog;
     this.v1V2Migrator = v1V2Migrator;
     this.v2TableMigrator = v2TableMigrator;
-    this.executorService = Executors.newFixedThreadPool(countOfTypingDedupingThreads(defaultThreadCount),
-        new BasicThreadFactory.Builder().namingPattern(TYPE_AND_DEDUPE_THREAD_NAME).build());
+    this.executorService = Executors.newFixedThreadPool(getCountOfTypeAndDedupeThreads(),
+                                                        new BasicThreadFactory.Builder().namingPattern(TYPE_AND_DEDUPE_THREAD_NAME).build());
   }
 
   @Override

From 1e654f80bd6e72bc78e80ff68d83830ad46e8f5e Mon Sep 17 00:00:00 2001
From: Joe Bell <jbfbell@gmail.com>
Date: Mon, 5 Feb 2024 13:10:52 -0800
Subject: [PATCH 61/96] formatting

---
 airbyte-cdk/java/airbyte-cdk/build.gradle     |  1 -
 .../typing_deduping/DefaultTyperDeduper.java  |  2 +-
 .../typing_deduping/FutureUtils.java          | 19 ++++++++++---------
 .../NoOpTyperDeduperWithV1V2Migrations.java   |  2 +-
 4 files changed, 12 insertions(+), 12 deletions(-)

diff --git a/airbyte-cdk/java/airbyte-cdk/build.gradle b/airbyte-cdk/java/airbyte-cdk/build.gradle
index 51f098f3b860b..7696b46dd69a6 100644
--- a/airbyte-cdk/java/airbyte-cdk/build.gradle
+++ b/airbyte-cdk/java/airbyte-cdk/build.gradle
@@ -138,4 +138,3 @@ cleanLocalCache.configure {
     dependsOn tasks.named('clean')
     dependsOn subprojects.collect { it.tasks.named('clean') }
 }
-
diff --git a/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/DefaultTyperDeduper.java b/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/DefaultTyperDeduper.java
index 3a6a166a0b220..764f888c4e169 100644
--- a/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/DefaultTyperDeduper.java
+++ b/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/DefaultTyperDeduper.java
@@ -89,7 +89,7 @@ public DefaultTyperDeduper(final SqlGenerator<DialectTableDefinition> sqlGenerat
     this.tdLocks = new ConcurrentHashMap<>();
     this.internalTdLocks = new ConcurrentHashMap<>();
     this.executorService = Executors.newFixedThreadPool(getCountOfTypeAndDedupeThreads(),
-                                                        new BasicThreadFactory.Builder().namingPattern(TYPE_AND_DEDUPE_THREAD_NAME).build());
+        new BasicThreadFactory.Builder().namingPattern(TYPE_AND_DEDUPE_THREAD_NAME).build());
   }
 
   public DefaultTyperDeduper(
diff --git a/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/FutureUtils.java b/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/FutureUtils.java
index c2fe1d5895c1a..3319af8297a06 100644
--- a/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/FutureUtils.java
+++ b/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/FutureUtils.java
@@ -15,27 +15,28 @@ public class FutureUtils {
   private static final int DEFAULT_TD_THREAD_COUNT = 8;
 
   /**
-   * Allow for configuring the number of typing and deduping threads via an environment variable in the destination container.
+   * Allow for configuring the number of typing and deduping threads via an environment variable in
+   * the destination container.
    *
    * @return the number of threads to use in the typing and deduping pool
    */
   public static int getCountOfTypeAndDedupeThreads() {
     return Optional.ofNullable(System.getenv("TD_THREADS"))
-                   .map(Integer::valueOf)
-                   .orElse(DEFAULT_TD_THREAD_COUNT);
+        .map(Integer::valueOf)
+        .orElse(DEFAULT_TD_THREAD_COUNT);
   }
 
   /**
-   * Log all exceptions from a list of futures, and rethrow the first exception if there is one. This mimics the behavior of running the futures in
-   * serial, where the first failure
+   * Log all exceptions from a list of futures, and rethrow the first exception if there is one. This
+   * mimics the behavior of running the futures in serial, where the first failure
    */
   public static void reduceExceptions(final Collection<CompletableFuture<Optional<Exception>>> potentialExceptions, final String initialMessage)
       throws Exception {
     final List<Exception> exceptions = potentialExceptions.stream()
-                                                          .map(CompletableFuture::join)
-                                                          .filter(Optional::isPresent)
-                                                          .map(Optional::get)
-                                                          .toList();
+        .map(CompletableFuture::join)
+        .filter(Optional::isPresent)
+        .map(Optional::get)
+        .toList();
     ConnectorExceptionUtil.logAllAndThrowFirst(initialMessage, exceptions);
   }
 
diff --git a/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/NoOpTyperDeduperWithV1V2Migrations.java b/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/NoOpTyperDeduperWithV1V2Migrations.java
index 581fee4adbf46..1fb3faf59defe 100644
--- a/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/NoOpTyperDeduperWithV1V2Migrations.java
+++ b/airbyte-cdk/java/airbyte-cdk/typing-deduping/src/main/java/io/airbyte/integrations/base/destination/typing_deduping/NoOpTyperDeduperWithV1V2Migrations.java
@@ -50,7 +50,7 @@ public NoOpTyperDeduperWithV1V2Migrations(final SqlGenerator<DialectTableDefinit
     this.v1V2Migrator = v1V2Migrator;
     this.v2TableMigrator = v2TableMigrator;
     this.executorService = Executors.newFixedThreadPool(getCountOfTypeAndDedupeThreads(),
-                                                        new BasicThreadFactory.Builder().namingPattern(TYPE_AND_DEDUPE_THREAD_NAME).build());
+        new BasicThreadFactory.Builder().namingPattern(TYPE_AND_DEDUPE_THREAD_NAME).build());
   }
 
   @Override

From 470b70ba7f10d1240d87196eb7bec8e1b8fe17a2 Mon Sep 17 00:00:00 2001
From: Joe Bell <jbfbell@gmail.com>
Date: Mon, 5 Feb 2024 13:44:48 -0800
Subject: [PATCH 62/96] update yaml and markdown

---
 .../destination-clickhouse/metadata.yaml      |  1 +
 .../destinations/clickhouse-migrations.md     | 32 +++++++++++++++++++
 docs/integrations/destinations/clickhouse.md  |  3 +-
 3 files changed, 35 insertions(+), 1 deletion(-)
 create mode 100644 docs/integrations/destinations/clickhouse-migrations.md

diff --git a/airbyte-integrations/connectors/destination-clickhouse/metadata.yaml b/airbyte-integrations/connectors/destination-clickhouse/metadata.yaml
index e0775a1f33513..b6cc2b944a79c 100644
--- a/airbyte-integrations/connectors/destination-clickhouse/metadata.yaml
+++ b/airbyte-integrations/connectors/destination-clickhouse/metadata.yaml
@@ -17,6 +17,7 @@ data:
   releases:
     breakingChanges:
       1.0.0:
+        upgradeDeadline: "2024-03-15"
         message: >
           This version removes the option to use "normalization" with clickhouse. It also changes
           the schema and database of Airbyte's "raw" tables to be compatible with the new
diff --git a/docs/integrations/destinations/clickhouse-migrations.md b/docs/integrations/destinations/clickhouse-migrations.md
new file mode 100644
index 0000000000000..8386e911b8040
--- /dev/null
+++ b/docs/integrations/destinations/clickhouse-migrations.md
@@ -0,0 +1,32 @@
+# Clickhouse Migration Guide
+
+## Upgrading to 1.0.0
+
+This version removes the option to use "normalization" with clickhouse. It also changes
+the schema and database of Airbyte's "raw" tables to be compatible with the new
+[Destinations V2](https://docs.airbyte.com/release_notes/upgrading_to_destinations_v2/#what-is-destinations-v2)
+format. These changes will likely require updates to downstream dbt / SQL models.
+
+### Database/Schema and the Internal Schema
+For other v2 destinations, we have split the raw and final tables into their own schemas,
+which in clickhouse is analogous to a `database`. For the Clickhouse destination, this means that
+we will only write into the raw table which will live in the `airbyte_internal` database.
+The tables written into this schema will be prefixed with either the default database provided in 
+the `DB Name` field when configuring clickhouse (but can also be overriden in the connection). You can
+change the "raw" database from the default `airbyte_internal` by supplying a value for 
+`Raw Table Schema Name`.
+
+For Example:
+
+ - DB Name: `default`
+ - Stream Name: `my_stream`
+
+Writes to `airbyte_intneral.default_raw__stream_my_stream`
+
+where as:
+
+ - DB Name: `default`
+ - Stream Name: `my_stream`
+ - Raw Table Schema Name: `raw_data`
+
+Writes to: `raw_data.default_raw__stream_my_stream`
diff --git a/docs/integrations/destinations/clickhouse.md b/docs/integrations/destinations/clickhouse.md
index 64c3da36f6b8b..4495cb79e3da5 100644
--- a/docs/integrations/destinations/clickhouse.md
+++ b/docs/integrations/destinations/clickhouse.md
@@ -89,7 +89,8 @@ Therefore, Airbyte ClickHouse destination will create tables and schemas using t
 ## Changelog
 
 | Version | Date       | Pull Request                                               | Subject                                                                                       |
-| :------ | :--------- | :--------------------------------------------------------- | :-------------------------------------------------------------------------------------------- |
+|:--------|:-----------| :--------------------------------------------------------- |:----------------------------------------------------------------------------------------------|
+| 1.0.0   | 2024-02-07 | [\#34637](https://github.com/airbytehq/airbyte/pull/34637) | Update the raw table schema                                                                   |
 | 0.2.5   | 2023-06-21 | [\#27555](https://github.com/airbytehq/airbyte/pull/27555) | Reduce image size                                                                             |
 | 0.2.4   | 2023-06-05 | [\#27036](https://github.com/airbytehq/airbyte/pull/27036) | Internal code change for future development (install normalization packages inside connector) |
 | 0.2.3   | 2023-04-04 | [\#24604](https://github.com/airbytehq/airbyte/pull/24604) | Support for destination checkpointing                                                         |

From 2139544962b9a9e5e621ff3aec70f8eab2f66e32 Mon Sep 17 00:00:00 2001
From: Joe Bell <jbfbell@gmail.com>
Date: Wed, 7 Feb 2024 09:56:30 -0800
Subject: [PATCH 63/96] test updates

---
 .../DestinationAcceptanceTest.java            | 27 ++++++-------------
 .../clickhouse/ClickhouseSqlOperations.java   |  2 +-
 .../ClickhouseDestinationAcceptanceTest.java  |  6 +++--
 3 files changed, 13 insertions(+), 22 deletions(-)

diff --git a/airbyte-cdk/java/airbyte-cdk/db-destinations/src/testFixtures/java/io/airbyte/cdk/integrations/standardtest/destination/DestinationAcceptanceTest.java b/airbyte-cdk/java/airbyte-cdk/db-destinations/src/testFixtures/java/io/airbyte/cdk/integrations/standardtest/destination/DestinationAcceptanceTest.java
index d2aa70a1449c4..826d4fb4c0fa1 100644
--- a/airbyte-cdk/java/airbyte-cdk/db-destinations/src/testFixtures/java/io/airbyte/cdk/integrations/standardtest/destination/DestinationAcceptanceTest.java
+++ b/airbyte-cdk/java/airbyte-cdk/db-destinations/src/testFixtures/java/io/airbyte/cdk/integrations/standardtest/destination/DestinationAcceptanceTest.java
@@ -790,7 +790,7 @@ public void testIncrementalDedupeSync() throws Exception {
         .map(record -> Jsons.deserialize(record, AirbyteMessage.class))
         .collect(Collectors.toList());
     final JsonNode config = getConfig();
-    runSyncAndVerifyStateOutput(config, firstSyncMessages, configuredCatalog, true);
+    runSyncAndVerifyStateOutput(config, firstSyncMessages, configuredCatalog, false);
 
     final List<AirbyteMessage> secondSyncMessages = Lists.newArrayList(
         new AirbyteMessage()
@@ -821,7 +821,7 @@ public void testIncrementalDedupeSync() throws Exception {
             .withType(Type.STATE)
             .withState(new AirbyteStateMessage().withData(
                 Jsons.jsonNode(ImmutableMap.of("checkpoint", 2)))));
-    runSyncAndVerifyStateOutput(config, secondSyncMessages, configuredCatalog, true);
+    runSyncAndVerifyStateOutput(config, secondSyncMessages, configuredCatalog, false);
 
     final List<AirbyteMessage> expectedMessagesAfterSecondSync = new ArrayList<>();
     expectedMessagesAfterSecondSync.addAll(firstSyncMessages);
@@ -854,22 +854,11 @@ public void testIncrementalDedupeSync() throws Exception {
     final String defaultSchema = getDefaultSchema(config);
     retrieveRawRecordsAndAssertSameMessages(catalog, expectedMessagesAfterSecondSync,
         defaultSchema);
-    final List<AirbyteRecordMessage> actualMessages = retrieveNormalizedRecords(catalog,
-        defaultSchema);
-    assertSameMessages(expectedMessages, actualMessages, true);
-  }
-
-  private String generateBigString(final int addExtraCharacters) {
-    final int length = getMaxRecordValueLimit() + addExtraCharacters;
-    return RANDOM
-        .ints('a', 'z' + 1)
-        .limit(length)
-        .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
-        .toString();
-  }
-
-  protected int getGenerateBigStringAddExtraCharacters() {
-    return 0;
+    if (normalizationFromDefinition()) {
+      final List<AirbyteRecordMessage> actualMessages = retrieveNormalizedRecords(catalog,
+          defaultSchema);
+      assertSameMessages(expectedMessages, actualMessages, true);
+    }
   }
 
   /**
@@ -1348,7 +1337,7 @@ private List<AirbyteMessage> runSync(
 
     destination.close();
 
-    if (!runNormalization || (runNormalization && supportsInDestinationNormalization())) {
+    if (!runNormalization || (supportsInDestinationNormalization())) {
       return destinationOutput;
     }
 
diff --git a/airbyte-integrations/connectors/destination-clickhouse/src/main/java/io/airbyte/integrations/destination/clickhouse/ClickhouseSqlOperations.java b/airbyte-integrations/connectors/destination-clickhouse/src/main/java/io/airbyte/integrations/destination/clickhouse/ClickhouseSqlOperations.java
index 8bfd8442984be..0d0acf62d5ee9 100644
--- a/airbyte-integrations/connectors/destination-clickhouse/src/main/java/io/airbyte/integrations/destination/clickhouse/ClickhouseSqlOperations.java
+++ b/airbyte-integrations/connectors/destination-clickhouse/src/main/java/io/airbyte/integrations/destination/clickhouse/ClickhouseSqlOperations.java
@@ -37,7 +37,7 @@ public boolean isSchemaRequired() {
   public String createTableQuery(final JdbcDatabase database, final String schemaName, final String tableName) {
     return String.format(
         """
-          CREATE TABLE IF NOT EXISTS %s.%s (
+          CREATE TABLE IF NOT EXISTS `%s`.`%s` (
           %s String,
           %s String,
           %s DateTime64(3, 'GMT') DEFAULT now(),
diff --git a/airbyte-integrations/connectors/destination-clickhouse/src/test-integration/java/io/airbyte/integrations/destination/clickhouse/ClickhouseDestinationAcceptanceTest.java b/airbyte-integrations/connectors/destination-clickhouse/src/test-integration/java/io/airbyte/integrations/destination/clickhouse/ClickhouseDestinationAcceptanceTest.java
index 5f5c3ae948fa1..0a18db6cd839a 100644
--- a/airbyte-integrations/connectors/destination-clickhouse/src/test-integration/java/io/airbyte/integrations/destination/clickhouse/ClickhouseDestinationAcceptanceTest.java
+++ b/airbyte-integrations/connectors/destination-clickhouse/src/test-integration/java/io/airbyte/integrations/destination/clickhouse/ClickhouseDestinationAcceptanceTest.java
@@ -21,6 +21,7 @@
 import io.airbyte.cdk.integrations.standardtest.destination.comparator.TestDataComparator;
 import io.airbyte.cdk.integrations.util.HostPortResolver;
 import io.airbyte.commons.json.Jsons;
+import io.airbyte.integrations.base.destination.typing_deduping.StreamId;
 import java.sql.SQLException;
 import java.time.Duration;
 import java.util.HashSet;
@@ -111,7 +112,7 @@ protected List<JsonNode> retrieveRecords(final TestDestinationEnv testEnv,
                                            final String namespace,
                                            final JsonNode streamSchema)
       throws Exception {
-    return retrieveRecordsFromTable(namingResolver.getRawTableName(streamName), namespace)
+    return retrieveRecordsFromTable(StreamId.concatenateRawTableName(namespace, streamName), "airbyte_internal")
         .stream()
         .map(r -> Jsons.deserialize(r.get(JavaBaseConstants.COLUMN_NAME_DATA).asText()))
         .collect(Collectors.toList());
@@ -119,7 +120,8 @@ protected List<JsonNode> retrieveRecords(final TestDestinationEnv testEnv,
 
   private List<JsonNode> retrieveRecordsFromTable(final String tableName, final String schemaName) throws SQLException {
     final JdbcDatabase jdbcDB = getDatabase(getConfig());
-    final String query = String.format("SELECT * FROM %s.%s ORDER BY %s ASC", schemaName, tableName, JavaBaseConstants.COLUMN_NAME_EMITTED_AT);
+    final var nameTransformer = new StandardNameTransformer();
+    final String query = String.format("SELECT * FROM `%s`.`%s` ORDER BY %s ASC", schemaName, nameTransformer.convertStreamName(tableName), JavaBaseConstants.COLUMN_NAME_AB_EXTRACTED_AT);
     return jdbcDB.queryJsons(query);
   }
 

From 541e694395a82a9ec94a1f9be6ca7a59606810dc Mon Sep 17 00:00:00 2001
From: Joe Bell <jbfbell@gmail.com>
Date: Wed, 7 Feb 2024 10:28:51 -0800
Subject: [PATCH 64/96] formatting

---
 .../clickhouse/ClickhouseDestinationAcceptanceTest.java        | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/airbyte-integrations/connectors/destination-clickhouse/src/test-integration/java/io/airbyte/integrations/destination/clickhouse/ClickhouseDestinationAcceptanceTest.java b/airbyte-integrations/connectors/destination-clickhouse/src/test-integration/java/io/airbyte/integrations/destination/clickhouse/ClickhouseDestinationAcceptanceTest.java
index 0a18db6cd839a..c7e7d7a5b6a63 100644
--- a/airbyte-integrations/connectors/destination-clickhouse/src/test-integration/java/io/airbyte/integrations/destination/clickhouse/ClickhouseDestinationAcceptanceTest.java
+++ b/airbyte-integrations/connectors/destination-clickhouse/src/test-integration/java/io/airbyte/integrations/destination/clickhouse/ClickhouseDestinationAcceptanceTest.java
@@ -121,7 +121,8 @@ protected List<JsonNode> retrieveRecords(final TestDestinationEnv testEnv,
   private List<JsonNode> retrieveRecordsFromTable(final String tableName, final String schemaName) throws SQLException {
     final JdbcDatabase jdbcDB = getDatabase(getConfig());
     final var nameTransformer = new StandardNameTransformer();
-    final String query = String.format("SELECT * FROM `%s`.`%s` ORDER BY %s ASC", schemaName, nameTransformer.convertStreamName(tableName), JavaBaseConstants.COLUMN_NAME_AB_EXTRACTED_AT);
+    final String query = String.format("SELECT * FROM `%s`.`%s` ORDER BY %s ASC", schemaName, nameTransformer.convertStreamName(tableName),
+        JavaBaseConstants.COLUMN_NAME_AB_EXTRACTED_AT);
     return jdbcDB.queryJsons(query);
   }
 

From 1011b795f80ef5cbddfdb981349b5608cab4ce4f Mon Sep 17 00:00:00 2001
From: Joe Bell <jbfbell@gmail.com>
Date: Wed, 7 Feb 2024 13:31:05 -0800
Subject: [PATCH 65/96] disable ssh tests

---
 .../clickhouse/SshKeyClickhouseDestinationAcceptanceTest.java   | 2 ++
 .../SshPasswordClickhouseDestinationAcceptanceTest.java         | 2 ++
 2 files changed, 4 insertions(+)

diff --git a/airbyte-integrations/connectors/destination-clickhouse/src/test-integration/java/io/airbyte/integrations/destination/clickhouse/SshKeyClickhouseDestinationAcceptanceTest.java b/airbyte-integrations/connectors/destination-clickhouse/src/test-integration/java/io/airbyte/integrations/destination/clickhouse/SshKeyClickhouseDestinationAcceptanceTest.java
index d5ebc6f26f991..4d46da0c56ae6 100644
--- a/airbyte-integrations/connectors/destination-clickhouse/src/test-integration/java/io/airbyte/integrations/destination/clickhouse/SshKeyClickhouseDestinationAcceptanceTest.java
+++ b/airbyte-integrations/connectors/destination-clickhouse/src/test-integration/java/io/airbyte/integrations/destination/clickhouse/SshKeyClickhouseDestinationAcceptanceTest.java
@@ -5,7 +5,9 @@
 package io.airbyte.integrations.destination.clickhouse;
 
 import io.airbyte.cdk.integrations.base.ssh.SshTunnel;
+import org.junit.jupiter.api.Disabled;
 
+@Disabled
 public class SshKeyClickhouseDestinationAcceptanceTest extends SshClickhouseDestinationAcceptanceTest {
 
   @Override
diff --git a/airbyte-integrations/connectors/destination-clickhouse/src/test-integration/java/io/airbyte/integrations/destination/clickhouse/SshPasswordClickhouseDestinationAcceptanceTest.java b/airbyte-integrations/connectors/destination-clickhouse/src/test-integration/java/io/airbyte/integrations/destination/clickhouse/SshPasswordClickhouseDestinationAcceptanceTest.java
index 56ccb4d81e1d5..27c254f8201b5 100644
--- a/airbyte-integrations/connectors/destination-clickhouse/src/test-integration/java/io/airbyte/integrations/destination/clickhouse/SshPasswordClickhouseDestinationAcceptanceTest.java
+++ b/airbyte-integrations/connectors/destination-clickhouse/src/test-integration/java/io/airbyte/integrations/destination/clickhouse/SshPasswordClickhouseDestinationAcceptanceTest.java
@@ -5,7 +5,9 @@
 package io.airbyte.integrations.destination.clickhouse;
 
 import io.airbyte.cdk.integrations.base.ssh.SshTunnel;
+import org.junit.jupiter.api.Disabled;
 
+@Disabled
 public class SshPasswordClickhouseDestinationAcceptanceTest extends SshClickhouseDestinationAcceptanceTest {
 
   @Override

From 0c5fcd40ecbfffa3b304b52b56fe28694c572a1b Mon Sep 17 00:00:00 2001
From: Joe Bell <jbfbell@gmail.com>
Date: Thu, 8 Feb 2024 17:21:23 -0800
Subject: [PATCH 66/96] remove normalization from oracle

---
 .../integrations/base/JavaBaseConstants.java  |  5 ++
 ...trictEncryptDestinationAcceptanceTest.java |  6 +-
 .../destination-oracle/build.gradle           |  6 +-
 .../destination-oracle/metadata.yaml          | 16 +++--
 .../destination/oracle/OracleDestination.java | 20 +++---
 .../oracle/OracleNameTransformer.java         |  1 +
 .../destination/oracle/OracleOperations.java  | 61 +++++++++++--------
 .../src/main/resources/spec.json              |  6 ++
 .../SshOracleDestinationAcceptanceTest.java   |  4 +-
 ...ryptedOracleDestinationAcceptanceTest.java |  9 ++-
 10 files changed, 86 insertions(+), 48 deletions(-)

diff --git a/airbyte-cdk/java/airbyte-cdk/core/src/main/java/io/airbyte/cdk/integrations/base/JavaBaseConstants.java b/airbyte-cdk/java/airbyte-cdk/core/src/main/java/io/airbyte/cdk/integrations/base/JavaBaseConstants.java
index 5001d6119e7aa..56c16f1375246 100644
--- a/airbyte-cdk/java/airbyte-cdk/core/src/main/java/io/airbyte/cdk/integrations/base/JavaBaseConstants.java
+++ b/airbyte-cdk/java/airbyte-cdk/core/src/main/java/io/airbyte/cdk/integrations/base/JavaBaseConstants.java
@@ -5,6 +5,7 @@
 package io.airbyte.cdk.integrations.base;
 
 import java.util.List;
+import org.apache.commons.lang3.StringUtils;
 
 public final class JavaBaseConstants {
 
@@ -43,4 +44,8 @@ private JavaBaseConstants() {}
 
   public static final String DEFAULT_AIRBYTE_INTERNAL_NAMESPACE = "airbyte_internal";
 
+  public static String upperQuoted(final String column) {
+    return StringUtils.wrap(column.toUpperCase(), "\"");
+  }
+
 }
diff --git a/airbyte-integrations/connectors/destination-oracle-strict-encrypt/src/test-integration/java/io/airbyte/integrations/destination/oracle_strict_encrypt/OracleStrictEncryptDestinationAcceptanceTest.java b/airbyte-integrations/connectors/destination-oracle-strict-encrypt/src/test-integration/java/io/airbyte/integrations/destination/oracle_strict_encrypt/OracleStrictEncryptDestinationAcceptanceTest.java
index 72e2a11ce32f9..a37e41918ed1e 100644
--- a/airbyte-integrations/connectors/destination-oracle-strict-encrypt/src/test-integration/java/io/airbyte/integrations/destination/oracle_strict_encrypt/OracleStrictEncryptDestinationAcceptanceTest.java
+++ b/airbyte-integrations/connectors/destination-oracle-strict-encrypt/src/test-integration/java/io/airbyte/integrations/destination/oracle_strict_encrypt/OracleStrictEncryptDestinationAcceptanceTest.java
@@ -17,11 +17,11 @@
 import io.airbyte.cdk.db.jdbc.DefaultJdbcDatabase;
 import io.airbyte.cdk.db.jdbc.JdbcDatabase;
 import io.airbyte.cdk.db.jdbc.JdbcUtils;
+import io.airbyte.cdk.integrations.base.JavaBaseConstants;
 import io.airbyte.cdk.integrations.destination.StandardNameTransformer;
 import io.airbyte.cdk.integrations.standardtest.destination.DestinationAcceptanceTest;
 import io.airbyte.commons.json.Jsons;
 import io.airbyte.commons.string.Strings;
-import io.airbyte.integrations.destination.oracle.OracleDestination;
 import io.airbyte.integrations.destination.oracle.OracleNameTransformer;
 import java.sql.SQLException;
 import java.util.ArrayList;
@@ -73,7 +73,7 @@ protected List<JsonNode> retrieveRecords(final TestDestinationEnv env,
     return retrieveRecordsFromTable(namingResolver.getRawTableName(streamName), namespace)
         .stream()
         .map(r -> Jsons.deserialize(
-            r.get(OracleDestination.COLUMN_NAME_DATA.replace("\"", "")).asText()))
+            r.get(JavaBaseConstants.COLUMN_NAME_DATA).asText()))
         .collect(Collectors.toList());
   }
 
@@ -113,7 +113,7 @@ protected List<String> resolveIdentifier(final String identifier) {
 
   private List<JsonNode> retrieveRecordsFromTable(final String tableName, final String schemaName)
       throws SQLException {
-    final String query = String.format("SELECT * FROM %s.%s ORDER BY %s ASC", schemaName, tableName, OracleDestination.COLUMN_NAME_EMITTED_AT);
+    final String query = String.format("SELECT * FROM %s.%s ORDER BY %s ASC", schemaName, tableName, JavaBaseConstants.COLUMN_NAME_AB_EXTRACTED_AT.toUpperCase());
 
     try (final DSLContext dslContext = getDslContext(config)) {
       final List<org.jooq.Record> result = getDatabase(dslContext).query(ctx -> ctx.fetch(query).stream().toList());
diff --git a/airbyte-integrations/connectors/destination-oracle/build.gradle b/airbyte-integrations/connectors/destination-oracle/build.gradle
index a192ee34744a3..157740184b44f 100644
--- a/airbyte-integrations/connectors/destination-oracle/build.gradle
+++ b/airbyte-integrations/connectors/destination-oracle/build.gradle
@@ -4,9 +4,9 @@ plugins {
 }
 
 airbyteJavaConnector {
-    cdkVersionRequired = '0.2.0'
-    features = ['db-destinations']
-    useLocalCdk = false
+    cdkVersionRequired = '0.17.0'
+    features = ['db-destinations', 's3-destinations', 'typing-deduping']
+    useLocalCdk = true
 }
 
 //remove once upgrading the CDK version to 0.4.x or later
diff --git a/airbyte-integrations/connectors/destination-oracle/metadata.yaml b/airbyte-integrations/connectors/destination-oracle/metadata.yaml
index f6f1acf44c377..a4bc8d5420ff3 100644
--- a/airbyte-integrations/connectors/destination-oracle/metadata.yaml
+++ b/airbyte-integrations/connectors/destination-oracle/metadata.yaml
@@ -2,16 +2,12 @@ data:
   connectorSubtype: database
   connectorType: destination
   definitionId: 3986776d-2319-4de9-8af8-db14c0996e72
-  dockerImageTag: 0.2.0
+  dockerImageTag: 1.0.0
   dockerRepository: airbyte/destination-oracle
   githubIssueLabel: destination-oracle
   icon: oracle.svg
   license: ELv2
   name: Oracle
-  normalizationConfig:
-    normalizationIntegrationType: oracle
-    normalizationRepository: airbyte/normalization-oracle
-    normalizationTag: 0.4.3
   registries:
     cloud:
       dockerRepository: airbyte/destination-oracle-strict-encrypt
@@ -21,6 +17,16 @@ data:
   releaseStage: alpha
   documentationUrl: https://docs.airbyte.com/integrations/destinations/oracle
   supportsDbt: true
+  releases:
+    breakingChanges:
+      1.0.0:
+        upgradeDeadline: "2024-03-15"
+        message: >
+          This version removes the option to use "normalization" with Oracle. It also changes
+          the schema and database of Airbyte's "raw" tables to be compatible with the new
+          [Destinations V2](https://docs.airbyte.com/release_notes/upgrading_to_destinations_v2/#what-is-destinations-v2)
+          format. These changes will likely require updates to downstream dbt / SQL models.
+          Selecting `Upgrade` will upgrade **all** connections using this destination at their next sync.
   tags:
     - language:java
   ab_internal:
diff --git a/airbyte-integrations/connectors/destination-oracle/src/main/java/io/airbyte/integrations/destination/oracle/OracleDestination.java b/airbyte-integrations/connectors/destination-oracle/src/main/java/io/airbyte/integrations/destination/oracle/OracleDestination.java
index 9a515ef1f74e6..d83300f33777e 100644
--- a/airbyte-integrations/connectors/destination-oracle/src/main/java/io/airbyte/integrations/destination/oracle/OracleDestination.java
+++ b/airbyte-integrations/connectors/destination-oracle/src/main/java/io/airbyte/integrations/destination/oracle/OracleDestination.java
@@ -10,9 +10,10 @@
 import io.airbyte.cdk.db.jdbc.JdbcUtils;
 import io.airbyte.cdk.integrations.base.Destination;
 import io.airbyte.cdk.integrations.base.IntegrationRunner;
-import io.airbyte.cdk.integrations.base.JavaBaseConstants;
 import io.airbyte.cdk.integrations.base.ssh.SshWrappedDestination;
 import io.airbyte.cdk.integrations.destination.jdbc.AbstractJdbcDestination;
+import io.airbyte.cdk.integrations.destination.jdbc.typing_deduping.JdbcSqlGenerator;
+import io.airbyte.cdk.integrations.destination.jdbc.typing_deduping.RawOnlySqlGenerator;
 import io.airbyte.commons.json.Jsons;
 import java.io.IOException;
 import java.io.PrintWriter;
@@ -29,13 +30,6 @@ public class OracleDestination extends AbstractJdbcDestination implements Destin
   private static final Logger LOGGER = LoggerFactory.getLogger(OracleDestination.class);
   public static final String DRIVER_CLASS = DatabaseDriver.ORACLE.getDriverClassName();
 
-  public static final String COLUMN_NAME_AB_ID =
-      "\"" + JavaBaseConstants.COLUMN_NAME_AB_ID.toUpperCase() + "\"";
-  public static final String COLUMN_NAME_DATA =
-      "\"" + JavaBaseConstants.COLUMN_NAME_DATA.toUpperCase() + "\"";
-  public static final String COLUMN_NAME_EMITTED_AT =
-      "\"" + JavaBaseConstants.COLUMN_NAME_EMITTED_AT.toUpperCase() + "\"";
-
   protected static final String KEY_STORE_FILE_PATH = "clientkeystore.jks";
   private static final String KEY_STORE_PASS = RandomStringUtils.randomAlphanumeric(8);
   public static final String ENCRYPTION_METHOD_KEY = "encryption_method";
@@ -134,6 +128,16 @@ private static void tryConvertAndImportCertificate(final String certificate) {
     }
   }
 
+  @Override
+  public boolean isV2Destination() {
+    return true;
+  }
+
+  @Override
+  protected JdbcSqlGenerator getSqlGenerator() {
+    return new RawOnlySqlGenerator(new OracleNameTransformer());
+  }
+
   private static void convertAndImportCertificate(final String certificate)
       throws IOException, InterruptedException {
     final Runtime run = Runtime.getRuntime();
diff --git a/airbyte-integrations/connectors/destination-oracle/src/main/java/io/airbyte/integrations/destination/oracle/OracleNameTransformer.java b/airbyte-integrations/connectors/destination-oracle/src/main/java/io/airbyte/integrations/destination/oracle/OracleNameTransformer.java
index ace5753550503..18fbe69950717 100644
--- a/airbyte-integrations/connectors/destination-oracle/src/main/java/io/airbyte/integrations/destination/oracle/OracleNameTransformer.java
+++ b/airbyte-integrations/connectors/destination-oracle/src/main/java/io/airbyte/integrations/destination/oracle/OracleNameTransformer.java
@@ -17,6 +17,7 @@ public String applyDefaultCase(final String input) {
   }
 
   @Override
+  @Deprecated
   public String getRawTableName(final String streamName) {
     return convertStreamName("airbyte_raw_" + streamName);
   }
diff --git a/airbyte-integrations/connectors/destination-oracle/src/main/java/io/airbyte/integrations/destination/oracle/OracleOperations.java b/airbyte-integrations/connectors/destination-oracle/src/main/java/io/airbyte/integrations/destination/oracle/OracleOperations.java
index 468e33bd7345d..dd55caed976e8 100644
--- a/airbyte-integrations/connectors/destination-oracle/src/main/java/io/airbyte/integrations/destination/oracle/OracleOperations.java
+++ b/airbyte-integrations/connectors/destination-oracle/src/main/java/io/airbyte/integrations/destination/oracle/OracleOperations.java
@@ -4,15 +4,19 @@
 
 package io.airbyte.integrations.destination.oracle;
 
+import static io.airbyte.cdk.integrations.base.JavaBaseConstants.upperQuoted;
+
 import com.fasterxml.jackson.databind.JsonNode;
 import io.airbyte.cdk.db.jdbc.JdbcDatabase;
+import io.airbyte.cdk.integrations.base.JavaBaseConstants;
 import io.airbyte.cdk.integrations.destination.StandardNameTransformer;
 import io.airbyte.cdk.integrations.destination.jdbc.SqlOperations;
+import io.airbyte.cdk.integrations.destination_async.partial_messages.PartialAirbyteMessage;
 import io.airbyte.commons.json.Jsons;
-import io.airbyte.protocol.models.v0.AirbyteRecordMessage;
 import java.sql.PreparedStatement;
 import java.sql.SQLException;
 import java.sql.Timestamp;
+import java.sql.Types;
 import java.time.Instant;
 import java.util.List;
 import java.util.UUID;
@@ -58,18 +62,24 @@ public void createTableIfNotExists(final JdbcDatabase database, final String sch
   @Override
   public String createTableQuery(final JdbcDatabase database, final String schemaName, final String tableName) {
     return String.format(
-        "CREATE TABLE %s.%s ( \n"
-            + "%s VARCHAR(64) PRIMARY KEY,\n"
-            + "%s NCLOB,\n"
-            + "%s TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP\n"
-            + ")",
-        schemaName, tableName,
-        OracleDestination.COLUMN_NAME_AB_ID, OracleDestination.COLUMN_NAME_DATA, OracleDestination.COLUMN_NAME_EMITTED_AT,
-        OracleDestination.COLUMN_NAME_DATA);
+      """
+        CREATE TABLE %s.%s (
+        %s VARCHAR(64) PRIMARY KEY,
+        %s NCLOB,
+        %s TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
+        %s TIMESTAMP WITH TIME ZONE DEFAULT NULL
+        )
+      """,
+      schemaName, tableName,
+      upperQuoted(JavaBaseConstants.COLUMN_NAME_AB_RAW_ID),
+      upperQuoted(JavaBaseConstants.COLUMN_NAME_DATA),
+      upperQuoted(JavaBaseConstants.COLUMN_NAME_AB_EXTRACTED_AT),
+      upperQuoted(JavaBaseConstants.COLUMN_NAME_AB_LOADED_AT)
+      );
   }
 
   private boolean tableExists(final JdbcDatabase database, final String schemaName, final String tableName) throws Exception {
-    final Integer count = database.queryInt("select count(*) \n from all_tables\n where upper(owner) = upper(?) and upper(table_name) = upper(?)",
+    final int count = database.queryInt("select count(*) \n from all_tables\n where upper(owner) = upper(?) and upper(table_name) = upper(?)",
         schemaName, tableName);
     return count == 1;
   }
@@ -94,23 +104,25 @@ public String truncateTableQuery(final JdbcDatabase database, final String schem
 
   @Override
   public void insertRecords(final JdbcDatabase database,
-                            final List<AirbyteRecordMessage> records,
+                            final List<PartialAirbyteMessage> records,
                             final String schemaName,
                             final String tempTableName)
       throws Exception {
     final String tableName = String.format("%s.%s", schemaName, tempTableName);
-    final String columns = String.format("(%s, %s, %s)",
-        OracleDestination.COLUMN_NAME_AB_ID, OracleDestination.COLUMN_NAME_DATA, OracleDestination.COLUMN_NAME_EMITTED_AT);
-    final String recordQueryComponent = "(?, ?, ?)\n";
-    insertRawRecordsInSingleQuery(tableName, columns, recordQueryComponent, database, records, UUID::randomUUID);
+    final String columns = String.format("(%s, %s, %s, %s)",
+                                         upperQuoted(JavaBaseConstants.COLUMN_NAME_AB_RAW_ID),
+                                         upperQuoted(JavaBaseConstants.COLUMN_NAME_DATA),
+                                         upperQuoted(JavaBaseConstants.COLUMN_NAME_AB_EXTRACTED_AT),
+                                         upperQuoted(JavaBaseConstants.COLUMN_NAME_AB_LOADED_AT)
+    );
+    insertRawRecordsInSingleQuery(tableName, columns, database, records, UUID::randomUUID);
   }
 
   // Adapted from SqlUtils.insertRawRecordsInSingleQuery to meet some needs specific to Oracle syntax
   private static void insertRawRecordsInSingleQuery(final String tableName,
                                                     final String columns,
-                                                    final String recordQueryComponent,
                                                     final JdbcDatabase jdbcDatabase,
-                                                    final List<AirbyteRecordMessage> records,
+                                                    final List<PartialAirbyteMessage> records,
                                                     final Supplier<UUID> uuidSupplier)
       throws SQLException {
     if (records.isEmpty()) {
@@ -129,20 +141,20 @@ private static void insertRawRecordsInSingleQuery(final String tableName,
       // The "SELECT 1 FROM DUAL" at the end is a formality to satisfy the needs of the Oracle syntax.
       // (see https://stackoverflow.com/a/93724 for details)
       final StringBuilder sql = new StringBuilder("INSERT ALL ");
-      records.forEach(r -> sql.append(String.format("INTO %s %s VALUES %s", tableName, columns, recordQueryComponent)));
+      records.forEach(r -> sql.append(String.format("INTO %s %s VALUES %s", tableName, columns, "(?, ?, ?, ?)\n")));
       sql.append(" SELECT 1 FROM DUAL");
       final String query = sql.toString();
 
       try (final PreparedStatement statement = connection.prepareStatement(query)) {
         // second loop: bind values to the SQL string.
         int i = 1;
-        for (final AirbyteRecordMessage message : records) {
+        for (final PartialAirbyteMessage message : records) {
           // 1-indexed
-          final JsonNode formattedData = StandardNameTransformer.formatJsonPath(message.getData());
-          statement.setString(i, uuidSupplier.get().toString());
-          statement.setString(i + 1, Jsons.serialize(formattedData));
-          statement.setTimestamp(i + 2, Timestamp.from(Instant.ofEpochMilli(message.getEmittedAt())));
-          i += 3;
+          final JsonNode formattedData = StandardNameTransformer.formatJsonPath(message.getRecord().getData());
+          statement.setString(i++, uuidSupplier.get().toString());
+          statement.setString(i++, Jsons.serialize(formattedData));
+          statement.setTimestamp(i++, Timestamp.from(Instant.ofEpochMilli(message.getRecord().getEmittedAt())));
+          statement.setNull(i++, Types.TIMESTAMP);
         }
 
         statement.execute();
@@ -173,5 +185,4 @@ public boolean isValidData(final JsonNode data) {
   public boolean isSchemaRequired() {
     return true;
   }
-
 }
diff --git a/airbyte-integrations/connectors/destination-oracle/src/main/resources/spec.json b/airbyte-integrations/connectors/destination-oracle/src/main/resources/spec.json
index 35aa4090b786d..c5cd4f20adf26 100644
--- a/airbyte-integrations/connectors/destination-oracle/src/main/resources/spec.json
+++ b/airbyte-integrations/connectors/destination-oracle/src/main/resources/spec.json
@@ -120,6 +120,12 @@
             }
           }
         ]
+      },
+      "raw_data_schema": {
+        "type": "string",
+        "description": "The schema to write raw tables into (default: airbyte_internal)",
+        "title": "Raw Table Schema Name",
+        "order": 7
       }
     }
   }
diff --git a/airbyte-integrations/connectors/destination-oracle/src/test-integration/java/io/airbyte/integrations/destination/oracle/SshOracleDestinationAcceptanceTest.java b/airbyte-integrations/connectors/destination-oracle/src/test-integration/java/io/airbyte/integrations/destination/oracle/SshOracleDestinationAcceptanceTest.java
index 10ce0fde6c7ac..aa54a3348ed51 100644
--- a/airbyte-integrations/connectors/destination-oracle/src/test-integration/java/io/airbyte/integrations/destination/oracle/SshOracleDestinationAcceptanceTest.java
+++ b/airbyte-integrations/connectors/destination-oracle/src/test-integration/java/io/airbyte/integrations/destination/oracle/SshOracleDestinationAcceptanceTest.java
@@ -4,6 +4,8 @@
 
 package io.airbyte.integrations.destination.oracle;
 
+import static io.airbyte.cdk.integrations.base.JavaBaseConstants.upperQuoted;
+
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.google.common.collect.ImmutableMap;
@@ -124,7 +126,7 @@ private List<JsonNode> retrieveRecordsFromTable(final String tableName, final St
         (CheckedFunction<JsonNode, List<JsonNode>, Exception>) mangledConfig -> getDatabaseFromConfig(mangledConfig)
             .query(
                 ctx -> ctx
-                    .fetch(String.format("SELECT * FROM %s.%s ORDER BY %s ASC", schemaName, tableName, OracleDestination.COLUMN_NAME_EMITTED_AT)))
+                    .fetch(String.format("SELECT * FROM %s.%s ORDER BY %s ASC", schemaName, tableName, upperQuoted(JavaBaseConstants.COLUMN_NAME_AB_EXTRACTED_AT))))
             .stream()
             .map(r -> r.formatJSON(JdbcUtils.getDefaultJSONFormat()))
             .map(Jsons::deserialize)
diff --git a/airbyte-integrations/connectors/destination-oracle/src/test-integration/java/io/airbyte/integrations/destination/oracle/UnencryptedOracleDestinationAcceptanceTest.java b/airbyte-integrations/connectors/destination-oracle/src/test-integration/java/io/airbyte/integrations/destination/oracle/UnencryptedOracleDestinationAcceptanceTest.java
index d87d36041168f..28eef3951b89c 100644
--- a/airbyte-integrations/connectors/destination-oracle/src/test-integration/java/io/airbyte/integrations/destination/oracle/UnencryptedOracleDestinationAcceptanceTest.java
+++ b/airbyte-integrations/connectors/destination-oracle/src/test-integration/java/io/airbyte/integrations/destination/oracle/UnencryptedOracleDestinationAcceptanceTest.java
@@ -4,6 +4,7 @@
 
 package io.airbyte.integrations.destination.oracle;
 
+import static io.airbyte.cdk.integrations.base.JavaBaseConstants.upperQuoted;
 import static io.airbyte.cdk.integrations.util.HostPortResolver.resolveHost;
 import static io.airbyte.cdk.integrations.util.HostPortResolver.resolvePort;
 import static org.hamcrest.CoreMatchers.equalTo;
@@ -20,11 +21,13 @@
 import io.airbyte.cdk.db.jdbc.DefaultJdbcDatabase;
 import io.airbyte.cdk.db.jdbc.JdbcDatabase;
 import io.airbyte.cdk.db.jdbc.JdbcUtils;
+import io.airbyte.cdk.integrations.base.JavaBaseConstants;
 import io.airbyte.cdk.integrations.destination.StandardNameTransformer;
 import io.airbyte.cdk.integrations.standardtest.destination.DestinationAcceptanceTest;
 import io.airbyte.cdk.integrations.standardtest.destination.comparator.TestDataComparator;
 import io.airbyte.commons.json.Jsons;
 import io.airbyte.commons.string.Strings;
+import io.airbyte.integrations.base.destination.typing_deduping.StreamId;
 import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.HashSet;
@@ -72,10 +75,10 @@ protected List<JsonNode> retrieveRecords(final TestDestinationEnv env,
                                            final String namespace,
                                            final JsonNode streamSchema)
       throws Exception {
-    return retrieveRecordsFromTable(namingResolver.getRawTableName(streamName), namespace)
+    return retrieveRecordsFromTable(namingResolver.convertStreamName(StreamId.concatenateRawTableName(namespace, streamName)), namespace)
         .stream()
         .map(r -> Jsons.deserialize(
-            r.get(OracleDestination.COLUMN_NAME_DATA.replace("\"", "")).asText()))
+            r.get(JavaBaseConstants.COLUMN_NAME_DATA.toUpperCase()).asText()))
         .collect(Collectors.toList());
   }
 
@@ -126,7 +129,7 @@ private List<JsonNode> retrieveRecordsFromTable(final String tableName, final St
       final List<org.jooq.Record> result = getDatabase(dslContext)
           .query(ctx -> new ArrayList<>(ctx.fetch(
               String.format("SELECT * FROM %s.%s ORDER BY %s ASC", schemaName, tableName,
-                  OracleDestination.COLUMN_NAME_EMITTED_AT))));
+                  upperQuoted(JavaBaseConstants.COLUMN_NAME_AB_EXTRACTED_AT)))));
       return result
           .stream()
           .map(r -> r.formatJSON(JdbcUtils.getDefaultJSONFormat()))

From c486e3e10f24b050e1e3a214c7ece0372a42ff67 Mon Sep 17 00:00:00 2001
From: Joe Bell <jbfbell@gmail.com>
Date: Tue, 13 Feb 2024 17:18:27 -0800
Subject: [PATCH 67/96] java 21 upgrade

---
 airbyte-cdk/java/airbyte-cdk/build.gradle | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/airbyte-cdk/java/airbyte-cdk/build.gradle b/airbyte-cdk/java/airbyte-cdk/build.gradle
index 7696b46dd69a6..4b3132396c05f 100644
--- a/airbyte-cdk/java/airbyte-cdk/build.gradle
+++ b/airbyte-cdk/java/airbyte-cdk/build.gradle
@@ -51,13 +51,13 @@ subprojects { subproject ->
 
         compileKotlin {
             compilerOptions {
-                jvmTarget = JvmTarget.JVM_17
+                jvmTarget = JvmTarget.JVM_21
                 languageVersion = KotlinVersion.KOTLIN_1_9
             }
         }
         compileTestKotlin {
             compilerOptions {
-                jvmTarget = JvmTarget.JVM_17
+                jvmTarget = JvmTarget.JVM_21
                 languageVersion = KotlinVersion.KOTLIN_1_9
             }
         }

From 59219c60ddc8c4f78a1a1b99036a147a4d4ffaa6 Mon Sep 17 00:00:00 2001
From: Joe Bell <jbfbell@gmail.com>
Date: Wed, 14 Feb 2024 14:06:29 -0800
Subject: [PATCH 68/96] java 21 upgrade

---
 .../bases/base-normalization/build.gradle        |  6 ++++--
 .../build.gradle                                 |  6 +++---
 .../metadata.yaml                                | 16 +++++++++++-----
 .../destination-clickhouse/build.gradle          |  2 +-
 4 files changed, 19 insertions(+), 11 deletions(-)

diff --git a/airbyte-integrations/bases/base-normalization/build.gradle b/airbyte-integrations/bases/base-normalization/build.gradle
index 0be8b3f954d4a..13f2dd53c9f94 100644
--- a/airbyte-integrations/bases/base-normalization/build.gradle
+++ b/airbyte-integrations/bases/base-normalization/build.gradle
@@ -1,5 +1,3 @@
-import org.apache.tools.ant.taskdefs.condition.Os
-
 plugins {
     id 'airbyte-docker-legacy'
     id 'airbyte-python'
@@ -38,6 +36,10 @@ tasks.named('check').configure {
     dependsOn generate
 }
 
+tasks.named("jar").configure {
+    dependsOn copySshScript
+}
+
 [
         'bigquery',
         'mysql',
diff --git a/airbyte-integrations/connectors/destination-clickhouse-strict-encrypt/build.gradle b/airbyte-integrations/connectors/destination-clickhouse-strict-encrypt/build.gradle
index d1a316d740a4b..a799c3b2598be 100644
--- a/airbyte-integrations/connectors/destination-clickhouse-strict-encrypt/build.gradle
+++ b/airbyte-integrations/connectors/destination-clickhouse-strict-encrypt/build.gradle
@@ -4,9 +4,9 @@ plugins {
 }
 
 airbyteJavaConnector {
-    cdkVersionRequired = '0.2.0'
-    features = ['db-destinations']
-    useLocalCdk = false
+    cdkVersionRequired = '0.21.0'
+    features = ['db-destinations', 's3-destinations', 'typing-deduping']
+    useLocalCdk = true
 }
 
 //remove once upgrading the CDK version to 0.4.x or later
diff --git a/airbyte-integrations/connectors/destination-clickhouse-strict-encrypt/metadata.yaml b/airbyte-integrations/connectors/destination-clickhouse-strict-encrypt/metadata.yaml
index b58fc5f5d3e5b..c5023258510ca 100644
--- a/airbyte-integrations/connectors/destination-clickhouse-strict-encrypt/metadata.yaml
+++ b/airbyte-integrations/connectors/destination-clickhouse-strict-encrypt/metadata.yaml
@@ -7,16 +7,22 @@ data:
   connectorSubtype: database
   connectorType: destination
   definitionId: ce0d828e-1dc4-496c-b122-2da42e637e48
-  dockerImageTag: 0.2.5
+  dockerImageTag: 1.0.0
   dockerRepository: airbyte/destination-clickhouse-strict-encrypt
   githubIssueLabel: destination-clickhouse
   icon: clickhouse.svg
   license: MIT
   name: Clickhouse
-  normalizationConfig:
-    normalizationIntegrationType: clickhouse
-    normalizationRepository: airbyte/normalization-clickhouse
-    normalizationTag: 0.4.1
+  releases:
+    breakingChanges:
+      1.0.0:
+        upgradeDeadline: "2024-03-15"
+        message: >
+          This version removes the option to use "normalization" with clickhouse. It also changes
+          the schema and database of Airbyte's "raw" tables to be compatible with the new
+          [Destinations V2](https://docs.airbyte.com/release_notes/upgrading_to_destinations_v2/#what-is-destinations-v2)
+          format. These changes will likely require updates to downstream dbt / SQL models.
+          Selecting `Upgrade` will upgrade **all** connections using this destination at their next sync.
   releaseStage: alpha
   documentationUrl: https://docs.airbyte.com/integrations/destinations/clickhouse
   supportsDbt: false
diff --git a/airbyte-integrations/connectors/destination-clickhouse/build.gradle b/airbyte-integrations/connectors/destination-clickhouse/build.gradle
index daf34f9f933a0..ec3e75139b093 100644
--- a/airbyte-integrations/connectors/destination-clickhouse/build.gradle
+++ b/airbyte-integrations/connectors/destination-clickhouse/build.gradle
@@ -4,7 +4,7 @@ plugins {
 }
 
 airbyteJavaConnector {
-    cdkVersionRequired = '0.17.0'
+    cdkVersionRequired = '0.21.0'
     features = ['db-destinations', 's3-destinations', 'typing-deduping']
     useLocalCdk = true
 }

From 40f934793bc93edba0dce1795051e51a5b01a37f Mon Sep 17 00:00:00 2001
From: Joe Bell <jbfbell@gmail.com>
Date: Wed, 14 Feb 2024 14:19:05 -0800
Subject: [PATCH 69/96] disable tests comment

---
 .../clickhouse/SshKeyClickhouseDestinationAcceptanceTest.java   | 2 +-
 .../SshPasswordClickhouseDestinationAcceptanceTest.java         | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/airbyte-integrations/connectors/destination-clickhouse/src/test-integration/java/io/airbyte/integrations/destination/clickhouse/SshKeyClickhouseDestinationAcceptanceTest.java b/airbyte-integrations/connectors/destination-clickhouse/src/test-integration/java/io/airbyte/integrations/destination/clickhouse/SshKeyClickhouseDestinationAcceptanceTest.java
index 4d46da0c56ae6..b3863d321e629 100644
--- a/airbyte-integrations/connectors/destination-clickhouse/src/test-integration/java/io/airbyte/integrations/destination/clickhouse/SshKeyClickhouseDestinationAcceptanceTest.java
+++ b/airbyte-integrations/connectors/destination-clickhouse/src/test-integration/java/io/airbyte/integrations/destination/clickhouse/SshKeyClickhouseDestinationAcceptanceTest.java
@@ -7,7 +7,7 @@
 import io.airbyte.cdk.integrations.base.ssh.SshTunnel;
 import org.junit.jupiter.api.Disabled;
 
-@Disabled
+@Disabled("This test was failing on the master branch and seems unrelated to any changes in the PR")
 public class SshKeyClickhouseDestinationAcceptanceTest extends SshClickhouseDestinationAcceptanceTest {
 
   @Override
diff --git a/airbyte-integrations/connectors/destination-clickhouse/src/test-integration/java/io/airbyte/integrations/destination/clickhouse/SshPasswordClickhouseDestinationAcceptanceTest.java b/airbyte-integrations/connectors/destination-clickhouse/src/test-integration/java/io/airbyte/integrations/destination/clickhouse/SshPasswordClickhouseDestinationAcceptanceTest.java
index 27c254f8201b5..aa66acd75ec53 100644
--- a/airbyte-integrations/connectors/destination-clickhouse/src/test-integration/java/io/airbyte/integrations/destination/clickhouse/SshPasswordClickhouseDestinationAcceptanceTest.java
+++ b/airbyte-integrations/connectors/destination-clickhouse/src/test-integration/java/io/airbyte/integrations/destination/clickhouse/SshPasswordClickhouseDestinationAcceptanceTest.java
@@ -7,7 +7,7 @@
 import io.airbyte.cdk.integrations.base.ssh.SshTunnel;
 import org.junit.jupiter.api.Disabled;
 
-@Disabled
+@Disabled("This test was failing on the master branch and seems unrelated to any changes in the PR")
 public class SshPasswordClickhouseDestinationAcceptanceTest extends SshClickhouseDestinationAcceptanceTest {
 
   @Override

From 4908a81bc1b61521755e096878c82776ff8cef85 Mon Sep 17 00:00:00 2001
From: Joe Bell <jbfbell@gmail.com>
Date: Wed, 14 Feb 2024 14:58:39 -0800
Subject: [PATCH 70/96] pr feedback

---
 .../airbyte/cdk/integrations/util/ConfiguredCatalogUtil.kt | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

diff --git a/airbyte-cdk/java/airbyte-cdk/core/src/main/java/io/airbyte/cdk/integrations/util/ConfiguredCatalogUtil.kt b/airbyte-cdk/java/airbyte-cdk/core/src/main/java/io/airbyte/cdk/integrations/util/ConfiguredCatalogUtil.kt
index 44d8245effd6b..42183f51fcbe2 100644
--- a/airbyte-cdk/java/airbyte-cdk/core/src/main/java/io/airbyte/cdk/integrations/util/ConfiguredCatalogUtil.kt
+++ b/airbyte-cdk/java/airbyte-cdk/core/src/main/java/io/airbyte/cdk/integrations/util/ConfiguredCatalogUtil.kt
@@ -1,7 +1,6 @@
 package io.airbyte.cdk.integrations.util
 
 import io.airbyte.protocol.models.v0.ConfiguredAirbyteCatalog
-import org.apache.commons.lang3.StringUtils
 
 /**
  * For streams in [catalog] which do not have a namespace specified, explicitly set their namespace
@@ -13,9 +12,9 @@ import org.apache.commons.lang3.StringUtils
      }
     // TODO: This logic exists in all V2 destinations.
     // This is sad that if we forget to add this, there will be a null pointer during parseCatalog
-    for (stream in catalog.streams) {
-        if (StringUtils.isEmpty(stream.stream.namespace)) {
-            stream.stream.namespace = defaultNamespace
+    for (catalogStream in catalog.streams) {
+        if (catalogStream.stream.namespace.isNullOrEmpty()) {
+            catalogStream.stream.namespace = defaultNamespace
         }
     }
 }

From 32fcb0ffe4afded85e1358cff9c5370a7c1e608a Mon Sep 17 00:00:00 2001
From: Joe Bell <jbfbell@gmail.com>
Date: Wed, 14 Feb 2024 16:59:31 -0800
Subject: [PATCH 71/96] pr feedback

---
 .../destination/DestinationAcceptanceTest.java             | 6 +++++-
 .../clickhouse/SshClickhouseDestinationAcceptanceTest.java | 7 ++++---
 .../SshKeyClickhouseDestinationAcceptanceTest.java         | 2 --
 .../SshPasswordClickhouseDestinationAcceptanceTest.java    | 2 --
 4 files changed, 9 insertions(+), 8 deletions(-)

diff --git a/airbyte-cdk/java/airbyte-cdk/db-destinations/src/testFixtures/java/io/airbyte/cdk/integrations/standardtest/destination/DestinationAcceptanceTest.java b/airbyte-cdk/java/airbyte-cdk/db-destinations/src/testFixtures/java/io/airbyte/cdk/integrations/standardtest/destination/DestinationAcceptanceTest.java
index 5cf03352e8e51..8094c8fc214c7 100644
--- a/airbyte-cdk/java/airbyte-cdk/db-destinations/src/testFixtures/java/io/airbyte/cdk/integrations/standardtest/destination/DestinationAcceptanceTest.java
+++ b/airbyte-cdk/java/airbyte-cdk/db-destinations/src/testFixtures/java/io/airbyte/cdk/integrations/standardtest/destination/DestinationAcceptanceTest.java
@@ -789,7 +789,7 @@ public void testIncrementalDedupeSync() throws Exception {
         .map(record -> Jsons.deserialize(record, AirbyteMessage.class))
         .collect(Collectors.toList());
     final JsonNode config = getConfig();
-    runSyncAndVerifyStateOutput(config, firstSyncMessages, configuredCatalog, false);
+    runSyncAndVerifyStateOutput(config, firstSyncMessages, configuredCatalog, supportsNormalization());
 
     final List<AirbyteMessage> secondSyncMessages = Lists.newArrayList(
         new AirbyteMessage()
@@ -1849,6 +1849,10 @@ public Stream<? extends Arguments> provideArguments(final ExtensionContext conte
 
   }
 
+  private boolean supportsNormalization() {
+    return supportsInDestinationNormalization() || normalizationFromDefinition();
+  }
+
   private static <V0, V1> V0 convertProtocolObject(final V1 v1, final Class<V0> klass) {
     return Jsons.object(Jsons.jsonNode(v1), klass);
   }
diff --git a/airbyte-integrations/connectors/destination-clickhouse/src/test-integration/java/io/airbyte/integrations/destination/clickhouse/SshClickhouseDestinationAcceptanceTest.java b/airbyte-integrations/connectors/destination-clickhouse/src/test-integration/java/io/airbyte/integrations/destination/clickhouse/SshClickhouseDestinationAcceptanceTest.java
index c82dfca207c15..5d3c45f822400 100644
--- a/airbyte-integrations/connectors/destination-clickhouse/src/test-integration/java/io/airbyte/integrations/destination/clickhouse/SshClickhouseDestinationAcceptanceTest.java
+++ b/airbyte-integrations/connectors/destination-clickhouse/src/test-integration/java/io/airbyte/integrations/destination/clickhouse/SshClickhouseDestinationAcceptanceTest.java
@@ -19,6 +19,7 @@
 import io.airbyte.cdk.integrations.standardtest.destination.argproviders.DataTypeTestArgumentProvider;
 import io.airbyte.cdk.integrations.standardtest.destination.comparator.TestDataComparator;
 import io.airbyte.commons.json.Jsons;
+import io.airbyte.integrations.base.destination.typing_deduping.StreamId;
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
@@ -85,7 +86,7 @@ protected String getDefaultSchema(final JsonNode config) {
   @Override
   protected JsonNode getConfig() throws Exception {
     return bastion.getTunnelConfig(getTunnelMethod(), bastion.getBasicDbConfigBuider(db, DB_NAME)
-        .put("schema", DB_NAME), false);
+        .put("schema", DB_NAME), true);
   }
 
   @Override
@@ -109,7 +110,7 @@ protected List<JsonNode> retrieveRecords(final TestDestinationEnv testEnv,
                                            final String namespace,
                                            final JsonNode streamSchema)
       throws Exception {
-    return retrieveRecordsFromTable(namingResolver.getRawTableName(streamName), namespace)
+    return retrieveRecordsFromTable(StreamId.concatenateRawTableName(namespace, streamName), "airbyte_internal")
         .stream()
         .map(r -> Jsons.deserialize(r.get(JavaBaseConstants.COLUMN_NAME_DATA).asText()))
         .collect(Collectors.toList());
@@ -122,7 +123,7 @@ private List<JsonNode> retrieveRecordsFromTable(final String tableName, final St
         JdbcUtils.PORT_LIST_KEY,
         mangledConfig -> {
           final JdbcDatabase database = getDatabase(mangledConfig);
-          final String query = String.format("SELECT * FROM %s.%s ORDER BY %s ASC", schemaName, tableName, JavaBaseConstants.COLUMN_NAME_EMITTED_AT);
+          final String query = String.format("SELECT * FROM `%s`.`%s` ORDER BY %s ASC", schemaName, namingResolver.convertStreamName(tableName), JavaBaseConstants.COLUMN_NAME_AB_EXTRACTED_AT);
           return database.queryJsons(query);
         });
   }
diff --git a/airbyte-integrations/connectors/destination-clickhouse/src/test-integration/java/io/airbyte/integrations/destination/clickhouse/SshKeyClickhouseDestinationAcceptanceTest.java b/airbyte-integrations/connectors/destination-clickhouse/src/test-integration/java/io/airbyte/integrations/destination/clickhouse/SshKeyClickhouseDestinationAcceptanceTest.java
index b3863d321e629..d5ebc6f26f991 100644
--- a/airbyte-integrations/connectors/destination-clickhouse/src/test-integration/java/io/airbyte/integrations/destination/clickhouse/SshKeyClickhouseDestinationAcceptanceTest.java
+++ b/airbyte-integrations/connectors/destination-clickhouse/src/test-integration/java/io/airbyte/integrations/destination/clickhouse/SshKeyClickhouseDestinationAcceptanceTest.java
@@ -5,9 +5,7 @@
 package io.airbyte.integrations.destination.clickhouse;
 
 import io.airbyte.cdk.integrations.base.ssh.SshTunnel;
-import org.junit.jupiter.api.Disabled;
 
-@Disabled("This test was failing on the master branch and seems unrelated to any changes in the PR")
 public class SshKeyClickhouseDestinationAcceptanceTest extends SshClickhouseDestinationAcceptanceTest {
 
   @Override
diff --git a/airbyte-integrations/connectors/destination-clickhouse/src/test-integration/java/io/airbyte/integrations/destination/clickhouse/SshPasswordClickhouseDestinationAcceptanceTest.java b/airbyte-integrations/connectors/destination-clickhouse/src/test-integration/java/io/airbyte/integrations/destination/clickhouse/SshPasswordClickhouseDestinationAcceptanceTest.java
index aa66acd75ec53..56ccb4d81e1d5 100644
--- a/airbyte-integrations/connectors/destination-clickhouse/src/test-integration/java/io/airbyte/integrations/destination/clickhouse/SshPasswordClickhouseDestinationAcceptanceTest.java
+++ b/airbyte-integrations/connectors/destination-clickhouse/src/test-integration/java/io/airbyte/integrations/destination/clickhouse/SshPasswordClickhouseDestinationAcceptanceTest.java
@@ -5,9 +5,7 @@
 package io.airbyte.integrations.destination.clickhouse;
 
 import io.airbyte.cdk.integrations.base.ssh.SshTunnel;
-import org.junit.jupiter.api.Disabled;
 
-@Disabled("This test was failing on the master branch and seems unrelated to any changes in the PR")
 public class SshPasswordClickhouseDestinationAcceptanceTest extends SshClickhouseDestinationAcceptanceTest {
 
   @Override

From da317762928939b5dc992fdf23a195df33a785a3 Mon Sep 17 00:00:00 2001
From: Joe Bell <jbfbell@gmail.com>
Date: Wed, 14 Feb 2024 17:11:24 -0800
Subject: [PATCH 72/96] formatting

---
 .../clickhouse/SshClickhouseDestinationAcceptanceTest.java     | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/airbyte-integrations/connectors/destination-clickhouse/src/test-integration/java/io/airbyte/integrations/destination/clickhouse/SshClickhouseDestinationAcceptanceTest.java b/airbyte-integrations/connectors/destination-clickhouse/src/test-integration/java/io/airbyte/integrations/destination/clickhouse/SshClickhouseDestinationAcceptanceTest.java
index 5d3c45f822400..163c9a6e36c61 100644
--- a/airbyte-integrations/connectors/destination-clickhouse/src/test-integration/java/io/airbyte/integrations/destination/clickhouse/SshClickhouseDestinationAcceptanceTest.java
+++ b/airbyte-integrations/connectors/destination-clickhouse/src/test-integration/java/io/airbyte/integrations/destination/clickhouse/SshClickhouseDestinationAcceptanceTest.java
@@ -123,7 +123,8 @@ private List<JsonNode> retrieveRecordsFromTable(final String tableName, final St
         JdbcUtils.PORT_LIST_KEY,
         mangledConfig -> {
           final JdbcDatabase database = getDatabase(mangledConfig);
-          final String query = String.format("SELECT * FROM `%s`.`%s` ORDER BY %s ASC", schemaName, namingResolver.convertStreamName(tableName), JavaBaseConstants.COLUMN_NAME_AB_EXTRACTED_AT);
+          final String query = String.format("SELECT * FROM `%s`.`%s` ORDER BY %s ASC", schemaName, namingResolver.convertStreamName(tableName),
+              JavaBaseConstants.COLUMN_NAME_AB_EXTRACTED_AT);
           return database.queryJsons(query);
         });
   }

From 19b6ab4dd550d3d88f4eacff5da9e62f04b04b8a Mon Sep 17 00:00:00 2001
From: Joe Bell <jbfbell@gmail.com>
Date: Thu, 15 Feb 2024 18:01:59 -0800
Subject: [PATCH 73/96] fix strict encrypt tests

---
 .../destination/StandardNameTransformer.java          |  2 +-
 .../ClickhouseDestinationStrictEncrypt.java           |  4 ++++
 ...ckhouseDestinationStrictEncryptAcceptanceTest.java |  7 +++++--
 .../destinations/clickhouse-migrations.md             | 11 ++++++++---
 4 files changed, 18 insertions(+), 6 deletions(-)

diff --git a/airbyte-cdk/java/airbyte-cdk/core/src/main/java/io/airbyte/cdk/integrations/destination/StandardNameTransformer.java b/airbyte-cdk/java/airbyte-cdk/core/src/main/java/io/airbyte/cdk/integrations/destination/StandardNameTransformer.java
index 8601f70c49e6e..c92345a22b8f3 100644
--- a/airbyte-cdk/java/airbyte-cdk/core/src/main/java/io/airbyte/cdk/integrations/destination/StandardNameTransformer.java
+++ b/airbyte-cdk/java/airbyte-cdk/core/src/main/java/io/airbyte/cdk/integrations/destination/StandardNameTransformer.java
@@ -31,7 +31,7 @@ public String getNamespace(final String namespace) {
   }
 
   @Override
-  @Deprecated
+//  @Deprecated see https://github.com/airbytehq/airbyte/issues/35333
   public String getRawTableName(final String streamName) {
     return convertStreamName("_airbyte_raw_" + streamName);
   }
diff --git a/airbyte-integrations/connectors/destination-clickhouse-strict-encrypt/src/main/java/io/airbyte/integrations/destination/clickhouse/ClickhouseDestinationStrictEncrypt.java b/airbyte-integrations/connectors/destination-clickhouse-strict-encrypt/src/main/java/io/airbyte/integrations/destination/clickhouse/ClickhouseDestinationStrictEncrypt.java
index 98d998a9e3ef2..17c49aa3f8d35 100644
--- a/airbyte-integrations/connectors/destination-clickhouse-strict-encrypt/src/main/java/io/airbyte/integrations/destination/clickhouse/ClickhouseDestinationStrictEncrypt.java
+++ b/airbyte-integrations/connectors/destination-clickhouse-strict-encrypt/src/main/java/io/airbyte/integrations/destination/clickhouse/ClickhouseDestinationStrictEncrypt.java
@@ -36,4 +36,8 @@ public static void main(final String[] args) throws Exception {
     LOGGER.info("completed destination: {}", ClickhouseDestinationStrictEncrypt.class);
   }
 
+  @Override
+  public boolean isV2Destination() {
+    return true;
+  }
 }
diff --git a/airbyte-integrations/connectors/destination-clickhouse-strict-encrypt/src/test-integration/java/io/airbyte/integrations/destination/clickhouse/ClickhouseDestinationStrictEncryptAcceptanceTest.java b/airbyte-integrations/connectors/destination-clickhouse-strict-encrypt/src/test-integration/java/io/airbyte/integrations/destination/clickhouse/ClickhouseDestinationStrictEncryptAcceptanceTest.java
index 6769060d4ff1f..b999c62a87761 100644
--- a/airbyte-integrations/connectors/destination-clickhouse-strict-encrypt/src/test-integration/java/io/airbyte/integrations/destination/clickhouse/ClickhouseDestinationStrictEncryptAcceptanceTest.java
+++ b/airbyte-integrations/connectors/destination-clickhouse-strict-encrypt/src/test-integration/java/io/airbyte/integrations/destination/clickhouse/ClickhouseDestinationStrictEncryptAcceptanceTest.java
@@ -21,6 +21,7 @@
 import io.airbyte.cdk.integrations.standardtest.destination.comparator.TestDataComparator;
 import io.airbyte.cdk.integrations.util.HostPortResolver;
 import io.airbyte.commons.json.Jsons;
+import io.airbyte.integrations.base.destination.typing_deduping.StreamId;
 import java.sql.SQLException;
 import java.time.Duration;
 import java.util.ArrayList;
@@ -139,7 +140,7 @@ protected List<JsonNode> retrieveRecords(final TestDestinationEnv testEnv,
                                            final String namespace,
                                            final JsonNode streamSchema)
       throws Exception {
-    return retrieveRecordsFromTable(namingResolver.getRawTableName(streamName), namespace)
+    return retrieveRecordsFromTable(StreamId.concatenateRawTableName(namespace, streamName), "airbyte_internal")
         .stream()
         .map(r -> Jsons.deserialize(r.get(JavaBaseConstants.COLUMN_NAME_DATA).asText()))
         .collect(Collectors.toList());
@@ -147,7 +148,9 @@ protected List<JsonNode> retrieveRecords(final TestDestinationEnv testEnv,
 
   private List<JsonNode> retrieveRecordsFromTable(final String tableName, final String schemaName) throws SQLException {
     final JdbcDatabase jdbcDB = getDatabase(getConfig());
-    final String query = String.format("SELECT * FROM %s.%s ORDER BY %s ASC", schemaName, tableName, JavaBaseConstants.COLUMN_NAME_EMITTED_AT);
+    final var nameTransformer = new StandardNameTransformer();
+    final String query = String.format("SELECT * FROM `%s`.`%s` ORDER BY %s ASC", schemaName, nameTransformer.convertStreamName(tableName),
+                                       JavaBaseConstants.COLUMN_NAME_AB_EXTRACTED_AT);
     return jdbcDB.queryJsons(query);
   }
 
diff --git a/docs/integrations/destinations/clickhouse-migrations.md b/docs/integrations/destinations/clickhouse-migrations.md
index 8386e911b8040..5f1a715d40c12 100644
--- a/docs/integrations/destinations/clickhouse-migrations.md
+++ b/docs/integrations/destinations/clickhouse-migrations.md
@@ -5,14 +5,19 @@
 This version removes the option to use "normalization" with clickhouse. It also changes
 the schema and database of Airbyte's "raw" tables to be compatible with the new
 [Destinations V2](https://docs.airbyte.com/release_notes/upgrading_to_destinations_v2/#what-is-destinations-v2)
-format. These changes will likely require updates to downstream dbt / SQL models.
+format. These changes will likely require updates to downstream dbt / SQL models. After this update, 
+Airbyte will only produce the ‘raw’ v2 tables, which store all content in JSON. These changes remove 
+the ability to do deduplicated syncs with Clickhouse.  (Clickhouse has an overview)[[https://clickhouse.com/docs/en/integrations/dbt]]
+for integrating with dbt If you are interested in the Clickhouse destination gaining the full features
+of Destinations V2 (including final tables), click [[https://github.com/airbytehq/airbyte/discussions/35339]] 
+to register your interest.
 
 ### Database/Schema and the Internal Schema
-For other v2 destinations, we have split the raw and final tables into their own schemas,
+We have split the raw and final tables into their own schemas,
 which in clickhouse is analogous to a `database`. For the Clickhouse destination, this means that
 we will only write into the raw table which will live in the `airbyte_internal` database.
 The tables written into this schema will be prefixed with either the default database provided in 
-the `DB Name` field when configuring clickhouse (but can also be overriden in the connection). You can
+the `DB Name` field when configuring clickhouse (but can also be overridden in the connection). You can
 change the "raw" database from the default `airbyte_internal` by supplying a value for 
 `Raw Table Schema Name`.
 

From 369ffdc5c643fb4df983919ba5582f9ea683e7bb Mon Sep 17 00:00:00 2001
From: Joe Bell <jbfbell@gmail.com>
Date: Thu, 15 Feb 2024 18:07:05 -0800
Subject: [PATCH 74/96] formatting

---
 .../cdk/integrations/destination/StandardNameTransformer.java   | 2 +-
 .../clickhouse/ClickhouseDestinationStrictEncrypt.java          | 1 +
 .../ClickhouseDestinationStrictEncryptAcceptanceTest.java       | 2 +-
 3 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/airbyte-cdk/java/airbyte-cdk/core/src/main/java/io/airbyte/cdk/integrations/destination/StandardNameTransformer.java b/airbyte-cdk/java/airbyte-cdk/core/src/main/java/io/airbyte/cdk/integrations/destination/StandardNameTransformer.java
index c92345a22b8f3..cc9c2dc4cd15b 100644
--- a/airbyte-cdk/java/airbyte-cdk/core/src/main/java/io/airbyte/cdk/integrations/destination/StandardNameTransformer.java
+++ b/airbyte-cdk/java/airbyte-cdk/core/src/main/java/io/airbyte/cdk/integrations/destination/StandardNameTransformer.java
@@ -31,7 +31,7 @@ public String getNamespace(final String namespace) {
   }
 
   @Override
-//  @Deprecated see https://github.com/airbytehq/airbyte/issues/35333
+  // @Deprecated see https://github.com/airbytehq/airbyte/issues/35333
   public String getRawTableName(final String streamName) {
     return convertStreamName("_airbyte_raw_" + streamName);
   }
diff --git a/airbyte-integrations/connectors/destination-clickhouse-strict-encrypt/src/main/java/io/airbyte/integrations/destination/clickhouse/ClickhouseDestinationStrictEncrypt.java b/airbyte-integrations/connectors/destination-clickhouse-strict-encrypt/src/main/java/io/airbyte/integrations/destination/clickhouse/ClickhouseDestinationStrictEncrypt.java
index 17c49aa3f8d35..4efc4db3545c7 100644
--- a/airbyte-integrations/connectors/destination-clickhouse-strict-encrypt/src/main/java/io/airbyte/integrations/destination/clickhouse/ClickhouseDestinationStrictEncrypt.java
+++ b/airbyte-integrations/connectors/destination-clickhouse-strict-encrypt/src/main/java/io/airbyte/integrations/destination/clickhouse/ClickhouseDestinationStrictEncrypt.java
@@ -40,4 +40,5 @@ public static void main(final String[] args) throws Exception {
   public boolean isV2Destination() {
     return true;
   }
+
 }
diff --git a/airbyte-integrations/connectors/destination-clickhouse-strict-encrypt/src/test-integration/java/io/airbyte/integrations/destination/clickhouse/ClickhouseDestinationStrictEncryptAcceptanceTest.java b/airbyte-integrations/connectors/destination-clickhouse-strict-encrypt/src/test-integration/java/io/airbyte/integrations/destination/clickhouse/ClickhouseDestinationStrictEncryptAcceptanceTest.java
index b999c62a87761..991ef0e2cde43 100644
--- a/airbyte-integrations/connectors/destination-clickhouse-strict-encrypt/src/test-integration/java/io/airbyte/integrations/destination/clickhouse/ClickhouseDestinationStrictEncryptAcceptanceTest.java
+++ b/airbyte-integrations/connectors/destination-clickhouse-strict-encrypt/src/test-integration/java/io/airbyte/integrations/destination/clickhouse/ClickhouseDestinationStrictEncryptAcceptanceTest.java
@@ -150,7 +150,7 @@ private List<JsonNode> retrieveRecordsFromTable(final String tableName, final St
     final JdbcDatabase jdbcDB = getDatabase(getConfig());
     final var nameTransformer = new StandardNameTransformer();
     final String query = String.format("SELECT * FROM `%s`.`%s` ORDER BY %s ASC", schemaName, nameTransformer.convertStreamName(tableName),
-                                       JavaBaseConstants.COLUMN_NAME_AB_EXTRACTED_AT);
+        JavaBaseConstants.COLUMN_NAME_AB_EXTRACTED_AT);
     return jdbcDB.queryJsons(query);
   }
 

From 9ab52ae9b13b8702bc6290fa3c1cb65be39fe0b0 Mon Sep 17 00:00:00 2001
From: Joe Bell <jbfbell@gmail.com>
Date: Fri, 16 Feb 2024 15:38:56 -0800
Subject: [PATCH 75/96] clickhouse migration query

---
 .../destinations/clickhouse-migrations.md     | 29 +++++++++++++++++++
 1 file changed, 29 insertions(+)

diff --git a/docs/integrations/destinations/clickhouse-migrations.md b/docs/integrations/destinations/clickhouse-migrations.md
index 5f1a715d40c12..df8590b36a569 100644
--- a/docs/integrations/destinations/clickhouse-migrations.md
+++ b/docs/integrations/destinations/clickhouse-migrations.md
@@ -12,6 +12,35 @@ for integrating with dbt If you are interested in the Clickhouse destination gai
 of Destinations V2 (including final tables), click [[https://github.com/airbytehq/airbyte/discussions/35339]] 
 to register your interest.
 
+This upgrade will ignore any existing raw tables and will not migrate any data to the new schema.
+For each stream, you could perform the following query to migrate the data from the old raw table
+to the new raw table:
+
+```sql
+-- assumes your database was 'default'
+-- replace `{{stream_name}}` with replace your stream name
+
+CREATE TABLE airbyte_internal.default_raw__stream_{{stream_name}}
+(
+    `_airbyte_raw_id` String,
+    `_airbyte_extracted_at` DateTime64(3, 'GMT') DEFAULT now(),
+    `_airbyte_loaded_at` DateTime64(3, 'GMT') NULL,
+    `_airbyte_data` String,
+    PRIMARY KEY(`_airbyte_raw_id`)
+)
+ENGINE = MergeTree;
+
+INSERT INTO `airbyte_internal`.`default_raw__stream_{{stream_name}}`
+    SELECT
+        `_airbyte_ab_id` AS "_airbyte_raw_id",
+        `_airbyte_emitted_at` AS "_airbyte_extracted_at",
+        NULL AS "_airbyte_loaded_at",
+        _airbyte_data AS "_airbyte_data"
+    FROM default._airbyte_raw_{{stream_name}};
+```
+
+Airbyte will not delete any of your v1 data.
+
 ### Database/Schema and the Internal Schema
 We have split the raw and final tables into their own schemas,
 which in clickhouse is analogous to a `database`. For the Clickhouse destination, this means that

From 890ef954b4df1bd5a64e5c82eb41de0dffd0fd5a Mon Sep 17 00:00:00 2001
From: Joe Bell <jbfbell@gmail.com>
Date: Tue, 20 Feb 2024 16:07:36 -0800
Subject: [PATCH 76/96] remove append option

---
 .../destination-clickhouse/src/main/resources/spec.json         | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/airbyte-integrations/connectors/destination-clickhouse/src/main/resources/spec.json b/airbyte-integrations/connectors/destination-clickhouse/src/main/resources/spec.json
index 26b6fb7013812..a86a89f7f746f 100644
--- a/airbyte-integrations/connectors/destination-clickhouse/src/main/resources/spec.json
+++ b/airbyte-integrations/connectors/destination-clickhouse/src/main/resources/spec.json
@@ -3,7 +3,7 @@
   "supportsIncremental": true,
   "supportsNormalization": true,
   "supportsDBT": false,
-  "supported_destination_sync_modes": ["overwrite", "append", "append_dedup"],
+  "supported_destination_sync_modes": ["overwrite", "append"],
   "connectionSpecification": {
     "$schema": "http://json-schema.org/draft-07/schema#",
     "title": "ClickHouse Destination Spec",

From 907eb1cd8a713cf58cb88837a35d49f7d89d9434 Mon Sep 17 00:00:00 2001
From: Joe Bell <jbfbell@gmail.com>
Date: Wed, 21 Feb 2024 09:57:20 -0800
Subject: [PATCH 77/96] update tests and docs

---
 .../build.gradle                              |  6 +-
 .../metadata.yaml                             | 14 ++--
 .../destination-oracle/build.gradle           |  2 +-
 .../NneOracleDestinationAcceptanceTest.java   | 11 +++-
 .../destination/oracle/OracleContainer.java   |  2 +-
 ...ryptedOracleDestinationAcceptanceTest.java | 25 ++++---
 .../destinations/oracle-migrations.md         | 65 +++++++++++++++++++
 docs/integrations/destinations/oracle.md      |  3 +-
 8 files changed, 101 insertions(+), 27 deletions(-)
 create mode 100644 docs/integrations/destinations/oracle-migrations.md

diff --git a/airbyte-integrations/connectors/destination-oracle-strict-encrypt/build.gradle b/airbyte-integrations/connectors/destination-oracle-strict-encrypt/build.gradle
index 0e940345ab009..3b2ffa30ce595 100644
--- a/airbyte-integrations/connectors/destination-oracle-strict-encrypt/build.gradle
+++ b/airbyte-integrations/connectors/destination-oracle-strict-encrypt/build.gradle
@@ -4,9 +4,9 @@ plugins {
 }
 
 airbyteJavaConnector {
-    cdkVersionRequired = '0.2.0'
-    features = ['db-destinations']
-    useLocalCdk = false
+    cdkVersionRequired = '0.21.0'
+    features = ['db-destinations', 's3-destinations', 'typing-deduping']
+    useLocalCdk = true
 }
 
 //remove once upgrading the CDK version to 0.4.x or later
diff --git a/airbyte-integrations/connectors/destination-oracle-strict-encrypt/metadata.yaml b/airbyte-integrations/connectors/destination-oracle-strict-encrypt/metadata.yaml
index bd323c6fdbc51..2b4dbc001b7a9 100644
--- a/airbyte-integrations/connectors/destination-oracle-strict-encrypt/metadata.yaml
+++ b/airbyte-integrations/connectors/destination-oracle-strict-encrypt/metadata.yaml
@@ -13,11 +13,17 @@ data:
   icon: oracle.svg
   license: ELv2
   name: Oracle
-  normalizationConfig:
-    normalizationIntegrationType: oracle
-    normalizationRepository: airbyte/normalization-oracle
-    normalizationTag: 0.4.1
   releaseStage: alpha
+  releases:
+    breakingChanges:
+      1.0.0:
+        upgradeDeadline: "2024-03-15"
+        message: >
+          This version removes the option to use "normalization" with Oracle. It also changes
+          the schema and database of Airbyte's "raw" tables to be compatible with the new
+          [Destinations V2](https://docs.airbyte.com/release_notes/upgrading_to_destinations_v2/#what-is-destinations-v2)
+          format. These changes will likely require updates to downstream dbt / SQL models.
+          Selecting `Upgrade` will upgrade **all** connections using this destination at their next sync.
   documentationUrl: https://docs.airbyte.com/integrations/destinations/oracle
   supportsDbt: true
   tags:
diff --git a/airbyte-integrations/connectors/destination-oracle/build.gradle b/airbyte-integrations/connectors/destination-oracle/build.gradle
index 157740184b44f..49eb4a08ad79e 100644
--- a/airbyte-integrations/connectors/destination-oracle/build.gradle
+++ b/airbyte-integrations/connectors/destination-oracle/build.gradle
@@ -4,7 +4,7 @@ plugins {
 }
 
 airbyteJavaConnector {
-    cdkVersionRequired = '0.17.0'
+    cdkVersionRequired = '0.21.0'
     features = ['db-destinations', 's3-destinations', 'typing-deduping']
     useLocalCdk = true
 }
diff --git a/airbyte-integrations/connectors/destination-oracle/src/test-integration/java/io/airbyte/integrations/destination/oracle/NneOracleDestinationAcceptanceTest.java b/airbyte-integrations/connectors/destination-oracle/src/test-integration/java/io/airbyte/integrations/destination/oracle/NneOracleDestinationAcceptanceTest.java
index fc946fdddae9d..0a2d2daff0d9c 100644
--- a/airbyte-integrations/connectors/destination-oracle/src/test-integration/java/io/airbyte/integrations/destination/oracle/NneOracleDestinationAcceptanceTest.java
+++ b/airbyte-integrations/connectors/destination-oracle/src/test-integration/java/io/airbyte/integrations/destination/oracle/NneOracleDestinationAcceptanceTest.java
@@ -18,6 +18,7 @@
 import io.airbyte.cdk.db.jdbc.JdbcDatabase;
 import io.airbyte.commons.json.Jsons;
 import java.sql.SQLException;
+import java.time.Duration;
 import java.util.List;
 import java.util.Map;
 import org.junit.jupiter.api.Test;
@@ -42,8 +43,12 @@ public void testEncryption() throws SQLException {
             String.format(DatabaseDriver.ORACLE.getUrlFormatString(),
                 config.get("host").asText(),
                 config.get("port").asInt(),
-                config.get("sid").asText()),
-            getAdditionalProperties(algorithm)));
+                config.get("sid").asText()
+            ),
+            getAdditionalProperties(algorithm),
+            Duration.ofMinutes(5)
+        )
+    );
 
     final String networkServiceBanner =
         "select network_service_banner from v$session_connect_info where sid in (select distinct sid from v$mystat)";
@@ -78,7 +83,7 @@ public void testCheckProtocol() throws SQLException {
                 clone.get("host").asText(),
                 clone.get("port").asInt(),
                 clone.get("sid").asText()),
-            getAdditionalProperties(algorithm)));
+            getAdditionalProperties(algorithm), Duration.ofMinutes(5)));
 
     final String networkServiceBanner = "SELECT sys_context('USERENV', 'NETWORK_PROTOCOL') as network_protocol FROM dual";
     final List<JsonNode> collect = database.queryJsons(networkServiceBanner);
diff --git a/airbyte-integrations/connectors/destination-oracle/src/test-integration/java/io/airbyte/integrations/destination/oracle/OracleContainer.java b/airbyte-integrations/connectors/destination-oracle/src/test-integration/java/io/airbyte/integrations/destination/oracle/OracleContainer.java
index eaee5d0ea23c4..d7e99af185643 100644
--- a/airbyte-integrations/connectors/destination-oracle/src/test-integration/java/io/airbyte/integrations/destination/oracle/OracleContainer.java
+++ b/airbyte-integrations/connectors/destination-oracle/src/test-integration/java/io/airbyte/integrations/destination/oracle/OracleContainer.java
@@ -22,7 +22,7 @@ public class OracleContainer extends JdbcDatabaseContainer<OracleContainer> {
   public static final String NAME = "oracle";
   private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("gvenzl/oracle-xe");
 
-  static final String DEFAULT_TAG = "18.4.0-slim";
+  static final String DEFAULT_TAG = "21.3.0-slim";
   static final String IMAGE = DEFAULT_IMAGE_NAME.getUnversionedPart();
 
   private static final int ORACLE_PORT = 1521;
diff --git a/airbyte-integrations/connectors/destination-oracle/src/test-integration/java/io/airbyte/integrations/destination/oracle/UnencryptedOracleDestinationAcceptanceTest.java b/airbyte-integrations/connectors/destination-oracle/src/test-integration/java/io/airbyte/integrations/destination/oracle/UnencryptedOracleDestinationAcceptanceTest.java
index 28eef3951b89c..c86eff950713d 100644
--- a/airbyte-integrations/connectors/destination-oracle/src/test-integration/java/io/airbyte/integrations/destination/oracle/UnencryptedOracleDestinationAcceptanceTest.java
+++ b/airbyte-integrations/connectors/destination-oracle/src/test-integration/java/io/airbyte/integrations/destination/oracle/UnencryptedOracleDestinationAcceptanceTest.java
@@ -125,17 +125,16 @@ protected JsonNode getFailCheckConfig() {
 
   private List<JsonNode> retrieveRecordsFromTable(final String tableName, final String schemaName)
       throws SQLException {
-    try (final DSLContext dslContext = getDSLContext(config)) {
-      final List<org.jooq.Record> result = getDatabase(dslContext)
-          .query(ctx -> new ArrayList<>(ctx.fetch(
-              String.format("SELECT * FROM %s.%s ORDER BY %s ASC", schemaName, tableName,
-                  upperQuoted(JavaBaseConstants.COLUMN_NAME_AB_EXTRACTED_AT)))));
-      return result
-          .stream()
-          .map(r -> r.formatJSON(JdbcUtils.getDefaultJSONFormat()))
-          .map(Jsons::deserialize)
-          .collect(Collectors.toList());
-    }
+    final DSLContext dslContext = getDSLContext(config);
+    final List<org.jooq.Record> result = getDatabase(dslContext)
+      .query(ctx -> new ArrayList<>(ctx.fetch(
+          String.format("SELECT * FROM %s.%s ORDER BY %s ASC", schemaName, tableName,
+              upperQuoted(JavaBaseConstants.COLUMN_NAME_AB_EXTRACTED_AT)))));
+    return result
+      .stream()
+      .map(r -> r.formatJSON(JdbcUtils.getDefaultJSONFormat()))
+      .map(Jsons::deserialize)
+      .collect(Collectors.toList());
   }
 
   private static DSLContext getDSLContext(final JsonNode config) {
@@ -162,15 +161,13 @@ protected void setup(final TestDestinationEnv testEnv, HashSet<String> TEST_SCHE
     db.start();
 
     config = getConfig(db);
-
-    try (final DSLContext dslContext = getDSLContext(config)) {
+      final DSLContext dslContext = getDSLContext(config);
       final Database database = getDatabase(dslContext);
       database.query(
           ctx -> ctx.fetch(String.format("CREATE USER %s IDENTIFIED BY %s", schemaName, schemaName)));
       database.query(ctx -> ctx.fetch(String.format("GRANT ALL PRIVILEGES TO %s", schemaName)));
 
       ((ObjectNode) config).put(JdbcUtils.SCHEMA_KEY, dbName);
-    }
   }
 
   @Override
diff --git a/docs/integrations/destinations/oracle-migrations.md b/docs/integrations/destinations/oracle-migrations.md
new file mode 100644
index 0000000000000..478694083737c
--- /dev/null
+++ b/docs/integrations/destinations/oracle-migrations.md
@@ -0,0 +1,65 @@
+# Clickhouse Migration Guide
+
+## Upgrading to 1.0.0
+
+This version removes the option to use "normalization" with clickhouse. It also changes
+the schema and database of Airbyte's "raw" tables to be compatible with the new
+[Destinations V2](https://docs.airbyte.com/release_notes/upgrading_to_destinations_v2/#what-is-destinations-v2)
+format. These changes will likely require updates to downstream dbt / SQL models. After this update,
+Airbyte will only produce the ‘raw’ v2 tables, which store all content in JSON. These changes remove
+the ability to do deduplicated syncs with Clickhouse.  (Clickhouse has an overview)[[https://clickhouse.com/docs/en/integrations/dbt]]
+for integrating with dbt If you are interested in the Clickhouse destination gaining the full features
+of Destinations V2 (including final tables), click [[https://github.com/airbytehq/airbyte/discussions/35339]]
+to register your interest.
+
+This upgrade will ignore any existing raw tables and will not migrate any data to the new schema.
+For each stream, you could perform the following query to migrate the data from the old raw table
+to the new raw table:
+
+```sql
+-- assumes your database was 'default'
+-- replace `{{stream_name}}` with replace your stream name
+
+CREATE TABLE airbyte_internal.default_raw__stream_{{stream_name}}
+(
+    `_airbyte_raw_id` String,
+    `_airbyte_extracted_at` DateTime64(3, 'GMT') DEFAULT now(),
+    `_airbyte_loaded_at` DateTime64(3, 'GMT') NULL,
+    `_airbyte_data` String,
+    PRIMARY KEY(`_airbyte_raw_id`)
+)
+ENGINE = MergeTree;
+
+INSERT INTO `airbyte_internal`.`default_raw__stream_{{stream_name}}`
+    SELECT
+        `_airbyte_ab_id` AS "_airbyte_raw_id",
+        `_airbyte_emitted_at` AS "_airbyte_extracted_at",
+        NULL AS "_airbyte_loaded_at",
+        _airbyte_data AS "_airbyte_data"
+    FROM default._airbyte_raw_{{stream_name}};
+```
+
+Airbyte will not delete any of your v1 data.
+
+### Database/Schema and the Internal Schema
+We have split the raw and final tables into their own schemas, which means that
+we will only write into the raw table which will live in the `airbyte_internal` schema.
+The tables written into this schema will be prefixed with either the default database provided in
+the `DB Name` field when configuring clickhouse (but can also be overridden in the connection). You can
+change the "raw" database from the default `airbyte_internal` by supplying a value for
+`Raw Table Schema Name`.
+
+For Example:
+
+- Schema: `default`
+- Stream Name: `my_stream`
+
+Writes to `airbyte_intneral.default_raw__stream_my_stream`
+
+where as:
+
+- DB Name: `default`
+- Stream Name: `my_stream`
+- Raw Table Schema Name: `raw_data`
+
+Writes to: `raw_data.default_raw__stream_my_stream`
diff --git a/docs/integrations/destinations/oracle.md b/docs/integrations/destinations/oracle.md
index d2e9867eb04a4..fe0570a6f15f6 100644
--- a/docs/integrations/destinations/oracle.md
+++ b/docs/integrations/destinations/oracle.md
@@ -91,7 +91,8 @@ Airbyte has the ability to connect to the Oracle source with 3 network connectiv
 ## Changelog
 
 | Version     | Date       | Pull Request                                               | Subject                                                                                             |
-| :---------- | :--------- | :--------------------------------------------------------- | :-------------------------------------------------------------------------------------------------- |
+|:------------|:-----------| :--------------------------------------------------------- |:----------------------------------------------------------------------------------------------------|
+| 1.0.0       | 2024-02-20 | [\#35470](https://github.com/airbytehq/airbyte/pull/35470) | Removes Normalization, updates to V2 Raw Table Format                                               |
 | 0.2.0       | 2023-06-27 | [\#27781](https://github.com/airbytehq/airbyte/pull/27781) | License Update: Elv2                                                                                |
 | 0.1.19      | 2022-07-26 | [\#10719](https://github.com/airbytehq/airbyte/pull/)      | Destination Oracle: added custom JDBC parameters support.                                           |
 | 0.1.18      | 2022-07-14 | [\#14618](https://github.com/airbytehq/airbyte/pull/14618) | Removed additionalProperties: false from JDBC destination connectors                                |

From 89ebbc75a8d63327b9152a16be4cfa21915c4e1d Mon Sep 17 00:00:00 2001
From: Joe Bell <jbfbell@gmail.com>
Date: Wed, 21 Feb 2024 10:31:02 -0800
Subject: [PATCH 78/96] use non local cdk version

---
 .../destination-clickhouse-strict-encrypt/build.gradle          | 2 +-
 .../connectors/destination-clickhouse/build.gradle              | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/airbyte-integrations/connectors/destination-clickhouse-strict-encrypt/build.gradle b/airbyte-integrations/connectors/destination-clickhouse-strict-encrypt/build.gradle
index a799c3b2598be..abb7773e3bb62 100644
--- a/airbyte-integrations/connectors/destination-clickhouse-strict-encrypt/build.gradle
+++ b/airbyte-integrations/connectors/destination-clickhouse-strict-encrypt/build.gradle
@@ -6,7 +6,7 @@ plugins {
 airbyteJavaConnector {
     cdkVersionRequired = '0.21.0'
     features = ['db-destinations', 's3-destinations', 'typing-deduping']
-    useLocalCdk = true
+    useLocalCdk = false
 }
 
 //remove once upgrading the CDK version to 0.4.x or later
diff --git a/airbyte-integrations/connectors/destination-clickhouse/build.gradle b/airbyte-integrations/connectors/destination-clickhouse/build.gradle
index ec3e75139b093..3b921450798bf 100644
--- a/airbyte-integrations/connectors/destination-clickhouse/build.gradle
+++ b/airbyte-integrations/connectors/destination-clickhouse/build.gradle
@@ -6,7 +6,7 @@ plugins {
 airbyteJavaConnector {
     cdkVersionRequired = '0.21.0'
     features = ['db-destinations', 's3-destinations', 'typing-deduping']
-    useLocalCdk = true
+    useLocalCdk = false
 }
 
 //remove once upgrading the CDK version to 0.4.x or later

From ce5564f63d8024059a5a35c2d207bd20694b8233 Mon Sep 17 00:00:00 2001
From: Joe Bell <jbfbell@gmail.com>
Date: Wed, 21 Feb 2024 10:39:54 -0800
Subject: [PATCH 79/96] bump version

---
 .../airbyte-cdk/core/src/main/resources/version.properties    | 2 +-
 .../destination-clickhouse-strict-encrypt/build.gradle        | 4 ++--
 .../connectors/destination-clickhouse/build.gradle            | 4 ++--
 3 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/airbyte-cdk/java/airbyte-cdk/core/src/main/resources/version.properties b/airbyte-cdk/java/airbyte-cdk/core/src/main/resources/version.properties
index 177f844ea34a1..edf5dabc8075a 100644
--- a/airbyte-cdk/java/airbyte-cdk/core/src/main/resources/version.properties
+++ b/airbyte-cdk/java/airbyte-cdk/core/src/main/resources/version.properties
@@ -1 +1 @@
-version=0.21.3
+version=0.22.0
diff --git a/airbyte-integrations/connectors/destination-clickhouse-strict-encrypt/build.gradle b/airbyte-integrations/connectors/destination-clickhouse-strict-encrypt/build.gradle
index abb7773e3bb62..4248850af8a16 100644
--- a/airbyte-integrations/connectors/destination-clickhouse-strict-encrypt/build.gradle
+++ b/airbyte-integrations/connectors/destination-clickhouse-strict-encrypt/build.gradle
@@ -4,9 +4,9 @@ plugins {
 }
 
 airbyteJavaConnector {
-    cdkVersionRequired = '0.21.0'
+    cdkVersionRequired = '0.22.0'
     features = ['db-destinations', 's3-destinations', 'typing-deduping']
-    useLocalCdk = false
+    useLocalCdk = true
 }
 
 //remove once upgrading the CDK version to 0.4.x or later
diff --git a/airbyte-integrations/connectors/destination-clickhouse/build.gradle b/airbyte-integrations/connectors/destination-clickhouse/build.gradle
index 3b921450798bf..e93ab7ed0beb4 100644
--- a/airbyte-integrations/connectors/destination-clickhouse/build.gradle
+++ b/airbyte-integrations/connectors/destination-clickhouse/build.gradle
@@ -4,9 +4,9 @@ plugins {
 }
 
 airbyteJavaConnector {
-    cdkVersionRequired = '0.21.0'
+    cdkVersionRequired = '0.22.0'
     features = ['db-destinations', 's3-destinations', 'typing-deduping']
-    useLocalCdk = false
+    useLocalCdk = true
 }
 
 //remove once upgrading the CDK version to 0.4.x or later

From 3bec74e02bd8a2d2e8299745ca3784774140daff Mon Sep 17 00:00:00 2001
From: Joe Bell <jbfbell@gmail.com>
Date: Wed, 21 Feb 2024 10:45:45 -0800
Subject: [PATCH 80/96] remove local version

---
 .../destination-clickhouse-strict-encrypt/build.gradle          | 2 +-
 .../connectors/destination-clickhouse/build.gradle              | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/airbyte-integrations/connectors/destination-clickhouse-strict-encrypt/build.gradle b/airbyte-integrations/connectors/destination-clickhouse-strict-encrypt/build.gradle
index 4248850af8a16..8e4aa2ac9d2f0 100644
--- a/airbyte-integrations/connectors/destination-clickhouse-strict-encrypt/build.gradle
+++ b/airbyte-integrations/connectors/destination-clickhouse-strict-encrypt/build.gradle
@@ -6,7 +6,7 @@ plugins {
 airbyteJavaConnector {
     cdkVersionRequired = '0.22.0'
     features = ['db-destinations', 's3-destinations', 'typing-deduping']
-    useLocalCdk = true
+    useLocalCdk = false
 }
 
 //remove once upgrading the CDK version to 0.4.x or later
diff --git a/airbyte-integrations/connectors/destination-clickhouse/build.gradle b/airbyte-integrations/connectors/destination-clickhouse/build.gradle
index e93ab7ed0beb4..629ecb3750aa8 100644
--- a/airbyte-integrations/connectors/destination-clickhouse/build.gradle
+++ b/airbyte-integrations/connectors/destination-clickhouse/build.gradle
@@ -6,7 +6,7 @@ plugins {
 airbyteJavaConnector {
     cdkVersionRequired = '0.22.0'
     features = ['db-destinations', 's3-destinations', 'typing-deduping']
-    useLocalCdk = true
+    useLocalCdk = false
 }
 
 //remove once upgrading the CDK version to 0.4.x or later

From 376d1510630f947ffb86428471b81c4b4c743834 Mon Sep 17 00:00:00 2001
From: Joe Bell <jbfbell@gmail.com>
Date: Wed, 21 Feb 2024 13:43:48 -0800
Subject: [PATCH 81/96] use local again

---
 .../connectors/destination-clickhouse/build.gradle              | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/airbyte-integrations/connectors/destination-clickhouse/build.gradle b/airbyte-integrations/connectors/destination-clickhouse/build.gradle
index 629ecb3750aa8..e93ab7ed0beb4 100644
--- a/airbyte-integrations/connectors/destination-clickhouse/build.gradle
+++ b/airbyte-integrations/connectors/destination-clickhouse/build.gradle
@@ -6,7 +6,7 @@ plugins {
 airbyteJavaConnector {
     cdkVersionRequired = '0.22.0'
     features = ['db-destinations', 's3-destinations', 'typing-deduping']
-    useLocalCdk = false
+    useLocalCdk = true
 }
 
 //remove once upgrading the CDK version to 0.4.x or later

From 504a79b0722d1b4bd23a3ffa438cecd82b8787cf Mon Sep 17 00:00:00 2001
From: Joe Bell <jbfbell@gmail.com>
Date: Mon, 26 Feb 2024 15:41:51 -0800
Subject: [PATCH 82/96] formatting

---
 ...trictEncryptDestinationAcceptanceTest.java |  3 +-
 .../destination/oracle/OracleOperations.java  | 37 +++++++++----------
 .../NneOracleDestinationAcceptanceTest.java   |  7 +---
 .../SshOracleDestinationAcceptanceTest.java   |  3 +-
 ...ryptedOracleDestinationAcceptanceTest.java | 26 ++++++-------
 5 files changed, 37 insertions(+), 39 deletions(-)

diff --git a/airbyte-integrations/connectors/destination-oracle-strict-encrypt/src/test-integration/java/io/airbyte/integrations/destination/oracle_strict_encrypt/OracleStrictEncryptDestinationAcceptanceTest.java b/airbyte-integrations/connectors/destination-oracle-strict-encrypt/src/test-integration/java/io/airbyte/integrations/destination/oracle_strict_encrypt/OracleStrictEncryptDestinationAcceptanceTest.java
index a37e41918ed1e..2702b71b2ab94 100644
--- a/airbyte-integrations/connectors/destination-oracle-strict-encrypt/src/test-integration/java/io/airbyte/integrations/destination/oracle_strict_encrypt/OracleStrictEncryptDestinationAcceptanceTest.java
+++ b/airbyte-integrations/connectors/destination-oracle-strict-encrypt/src/test-integration/java/io/airbyte/integrations/destination/oracle_strict_encrypt/OracleStrictEncryptDestinationAcceptanceTest.java
@@ -113,7 +113,8 @@ protected List<String> resolveIdentifier(final String identifier) {
 
   private List<JsonNode> retrieveRecordsFromTable(final String tableName, final String schemaName)
       throws SQLException {
-    final String query = String.format("SELECT * FROM %s.%s ORDER BY %s ASC", schemaName, tableName, JavaBaseConstants.COLUMN_NAME_AB_EXTRACTED_AT.toUpperCase());
+    final String query =
+        String.format("SELECT * FROM %s.%s ORDER BY %s ASC", schemaName, tableName, JavaBaseConstants.COLUMN_NAME_AB_EXTRACTED_AT.toUpperCase());
 
     try (final DSLContext dslContext = getDslContext(config)) {
       final List<org.jooq.Record> result = getDatabase(dslContext).query(ctx -> ctx.fetch(query).stream().toList());
diff --git a/airbyte-integrations/connectors/destination-oracle/src/main/java/io/airbyte/integrations/destination/oracle/OracleOperations.java b/airbyte-integrations/connectors/destination-oracle/src/main/java/io/airbyte/integrations/destination/oracle/OracleOperations.java
index dd55caed976e8..d213667fdfd70 100644
--- a/airbyte-integrations/connectors/destination-oracle/src/main/java/io/airbyte/integrations/destination/oracle/OracleOperations.java
+++ b/airbyte-integrations/connectors/destination-oracle/src/main/java/io/airbyte/integrations/destination/oracle/OracleOperations.java
@@ -62,20 +62,19 @@ public void createTableIfNotExists(final JdbcDatabase database, final String sch
   @Override
   public String createTableQuery(final JdbcDatabase database, final String schemaName, final String tableName) {
     return String.format(
-      """
-        CREATE TABLE %s.%s (
-        %s VARCHAR(64) PRIMARY KEY,
-        %s NCLOB,
-        %s TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
-        %s TIMESTAMP WITH TIME ZONE DEFAULT NULL
-        )
-      """,
-      schemaName, tableName,
-      upperQuoted(JavaBaseConstants.COLUMN_NAME_AB_RAW_ID),
-      upperQuoted(JavaBaseConstants.COLUMN_NAME_DATA),
-      upperQuoted(JavaBaseConstants.COLUMN_NAME_AB_EXTRACTED_AT),
-      upperQuoted(JavaBaseConstants.COLUMN_NAME_AB_LOADED_AT)
-      );
+        """
+          CREATE TABLE %s.%s (
+          %s VARCHAR(64) PRIMARY KEY,
+          %s NCLOB,
+          %s TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
+          %s TIMESTAMP WITH TIME ZONE DEFAULT NULL
+          )
+        """,
+        schemaName, tableName,
+        upperQuoted(JavaBaseConstants.COLUMN_NAME_AB_RAW_ID),
+        upperQuoted(JavaBaseConstants.COLUMN_NAME_DATA),
+        upperQuoted(JavaBaseConstants.COLUMN_NAME_AB_EXTRACTED_AT),
+        upperQuoted(JavaBaseConstants.COLUMN_NAME_AB_LOADED_AT));
   }
 
   private boolean tableExists(final JdbcDatabase database, final String schemaName, final String tableName) throws Exception {
@@ -110,11 +109,10 @@ public void insertRecords(final JdbcDatabase database,
       throws Exception {
     final String tableName = String.format("%s.%s", schemaName, tempTableName);
     final String columns = String.format("(%s, %s, %s, %s)",
-                                         upperQuoted(JavaBaseConstants.COLUMN_NAME_AB_RAW_ID),
-                                         upperQuoted(JavaBaseConstants.COLUMN_NAME_DATA),
-                                         upperQuoted(JavaBaseConstants.COLUMN_NAME_AB_EXTRACTED_AT),
-                                         upperQuoted(JavaBaseConstants.COLUMN_NAME_AB_LOADED_AT)
-    );
+        upperQuoted(JavaBaseConstants.COLUMN_NAME_AB_RAW_ID),
+        upperQuoted(JavaBaseConstants.COLUMN_NAME_DATA),
+        upperQuoted(JavaBaseConstants.COLUMN_NAME_AB_EXTRACTED_AT),
+        upperQuoted(JavaBaseConstants.COLUMN_NAME_AB_LOADED_AT));
     insertRawRecordsInSingleQuery(tableName, columns, database, records, UUID::randomUUID);
   }
 
@@ -185,4 +183,5 @@ public boolean isValidData(final JsonNode data) {
   public boolean isSchemaRequired() {
     return true;
   }
+
 }
diff --git a/airbyte-integrations/connectors/destination-oracle/src/test-integration/java/io/airbyte/integrations/destination/oracle/NneOracleDestinationAcceptanceTest.java b/airbyte-integrations/connectors/destination-oracle/src/test-integration/java/io/airbyte/integrations/destination/oracle/NneOracleDestinationAcceptanceTest.java
index 0a2d2daff0d9c..599c50b76a5bf 100644
--- a/airbyte-integrations/connectors/destination-oracle/src/test-integration/java/io/airbyte/integrations/destination/oracle/NneOracleDestinationAcceptanceTest.java
+++ b/airbyte-integrations/connectors/destination-oracle/src/test-integration/java/io/airbyte/integrations/destination/oracle/NneOracleDestinationAcceptanceTest.java
@@ -43,12 +43,9 @@ public void testEncryption() throws SQLException {
             String.format(DatabaseDriver.ORACLE.getUrlFormatString(),
                 config.get("host").asText(),
                 config.get("port").asInt(),
-                config.get("sid").asText()
-            ),
+                config.get("sid").asText()),
             getAdditionalProperties(algorithm),
-            Duration.ofMinutes(5)
-        )
-    );
+            Duration.ofMinutes(5)));
 
     final String networkServiceBanner =
         "select network_service_banner from v$session_connect_info where sid in (select distinct sid from v$mystat)";
diff --git a/airbyte-integrations/connectors/destination-oracle/src/test-integration/java/io/airbyte/integrations/destination/oracle/SshOracleDestinationAcceptanceTest.java b/airbyte-integrations/connectors/destination-oracle/src/test-integration/java/io/airbyte/integrations/destination/oracle/SshOracleDestinationAcceptanceTest.java
index aa54a3348ed51..44221abcbd05e 100644
--- a/airbyte-integrations/connectors/destination-oracle/src/test-integration/java/io/airbyte/integrations/destination/oracle/SshOracleDestinationAcceptanceTest.java
+++ b/airbyte-integrations/connectors/destination-oracle/src/test-integration/java/io/airbyte/integrations/destination/oracle/SshOracleDestinationAcceptanceTest.java
@@ -126,7 +126,8 @@ private List<JsonNode> retrieveRecordsFromTable(final String tableName, final St
         (CheckedFunction<JsonNode, List<JsonNode>, Exception>) mangledConfig -> getDatabaseFromConfig(mangledConfig)
             .query(
                 ctx -> ctx
-                    .fetch(String.format("SELECT * FROM %s.%s ORDER BY %s ASC", schemaName, tableName, upperQuoted(JavaBaseConstants.COLUMN_NAME_AB_EXTRACTED_AT))))
+                    .fetch(String.format("SELECT * FROM %s.%s ORDER BY %s ASC", schemaName, tableName,
+                        upperQuoted(JavaBaseConstants.COLUMN_NAME_AB_EXTRACTED_AT))))
             .stream()
             .map(r -> r.formatJSON(JdbcUtils.getDefaultJSONFormat()))
             .map(Jsons::deserialize)
diff --git a/airbyte-integrations/connectors/destination-oracle/src/test-integration/java/io/airbyte/integrations/destination/oracle/UnencryptedOracleDestinationAcceptanceTest.java b/airbyte-integrations/connectors/destination-oracle/src/test-integration/java/io/airbyte/integrations/destination/oracle/UnencryptedOracleDestinationAcceptanceTest.java
index c86eff950713d..180a0a5431524 100644
--- a/airbyte-integrations/connectors/destination-oracle/src/test-integration/java/io/airbyte/integrations/destination/oracle/UnencryptedOracleDestinationAcceptanceTest.java
+++ b/airbyte-integrations/connectors/destination-oracle/src/test-integration/java/io/airbyte/integrations/destination/oracle/UnencryptedOracleDestinationAcceptanceTest.java
@@ -127,14 +127,14 @@ private List<JsonNode> retrieveRecordsFromTable(final String tableName, final St
       throws SQLException {
     final DSLContext dslContext = getDSLContext(config);
     final List<org.jooq.Record> result = getDatabase(dslContext)
-      .query(ctx -> new ArrayList<>(ctx.fetch(
-          String.format("SELECT * FROM %s.%s ORDER BY %s ASC", schemaName, tableName,
-              upperQuoted(JavaBaseConstants.COLUMN_NAME_AB_EXTRACTED_AT)))));
+        .query(ctx -> new ArrayList<>(ctx.fetch(
+            String.format("SELECT * FROM %s.%s ORDER BY %s ASC", schemaName, tableName,
+                upperQuoted(JavaBaseConstants.COLUMN_NAME_AB_EXTRACTED_AT)))));
     return result
-      .stream()
-      .map(r -> r.formatJSON(JdbcUtils.getDefaultJSONFormat()))
-      .map(Jsons::deserialize)
-      .collect(Collectors.toList());
+        .stream()
+        .map(r -> r.formatJSON(JdbcUtils.getDefaultJSONFormat()))
+        .map(Jsons::deserialize)
+        .collect(Collectors.toList());
   }
 
   private static DSLContext getDSLContext(final JsonNode config) {
@@ -161,13 +161,13 @@ protected void setup(final TestDestinationEnv testEnv, HashSet<String> TEST_SCHE
     db.start();
 
     config = getConfig(db);
-      final DSLContext dslContext = getDSLContext(config);
-      final Database database = getDatabase(dslContext);
-      database.query(
-          ctx -> ctx.fetch(String.format("CREATE USER %s IDENTIFIED BY %s", schemaName, schemaName)));
-      database.query(ctx -> ctx.fetch(String.format("GRANT ALL PRIVILEGES TO %s", schemaName)));
+    final DSLContext dslContext = getDSLContext(config);
+    final Database database = getDatabase(dslContext);
+    database.query(
+        ctx -> ctx.fetch(String.format("CREATE USER %s IDENTIFIED BY %s", schemaName, schemaName)));
+    database.query(ctx -> ctx.fetch(String.format("GRANT ALL PRIVILEGES TO %s", schemaName)));
 
-      ((ObjectNode) config).put(JdbcUtils.SCHEMA_KEY, dbName);
+    ((ObjectNode) config).put(JdbcUtils.SCHEMA_KEY, dbName);
   }
 
   @Override

From 1a91597e9d9328215eaa7a7ee48f4e486ce190ef Mon Sep 17 00:00:00 2001
From: Joe Bell <jbfbell@gmail.com>
Date: Mon, 26 Feb 2024 15:47:25 -0800
Subject: [PATCH 83/96] cdk version bump

---
 .../java/airbyte-cdk/core/src/main/resources/version.properties | 2 +-
 .../connectors/destination-oracle-strict-encrypt/build.gradle   | 2 +-
 airbyte-integrations/connectors/destination-oracle/build.gradle | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/airbyte-cdk/java/airbyte-cdk/core/src/main/resources/version.properties b/airbyte-cdk/java/airbyte-cdk/core/src/main/resources/version.properties
index b0d83063013b9..ac44b08aea592 100644
--- a/airbyte-cdk/java/airbyte-cdk/core/src/main/resources/version.properties
+++ b/airbyte-cdk/java/airbyte-cdk/core/src/main/resources/version.properties
@@ -1 +1 @@
-version=0.23.2
+version=0.23.3
diff --git a/airbyte-integrations/connectors/destination-oracle-strict-encrypt/build.gradle b/airbyte-integrations/connectors/destination-oracle-strict-encrypt/build.gradle
index 3b2ffa30ce595..f18ae64b01861 100644
--- a/airbyte-integrations/connectors/destination-oracle-strict-encrypt/build.gradle
+++ b/airbyte-integrations/connectors/destination-oracle-strict-encrypt/build.gradle
@@ -4,7 +4,7 @@ plugins {
 }
 
 airbyteJavaConnector {
-    cdkVersionRequired = '0.21.0'
+    cdkVersionRequired = '0.23.3'
     features = ['db-destinations', 's3-destinations', 'typing-deduping']
     useLocalCdk = true
 }
diff --git a/airbyte-integrations/connectors/destination-oracle/build.gradle b/airbyte-integrations/connectors/destination-oracle/build.gradle
index 49eb4a08ad79e..4e4163d2cf28b 100644
--- a/airbyte-integrations/connectors/destination-oracle/build.gradle
+++ b/airbyte-integrations/connectors/destination-oracle/build.gradle
@@ -4,7 +4,7 @@ plugins {
 }
 
 airbyteJavaConnector {
-    cdkVersionRequired = '0.21.0'
+    cdkVersionRequired = '0.23.3'
     features = ['db-destinations', 's3-destinations', 'typing-deduping']
     useLocalCdk = true
 }

From 78794b88a4af6b67158adf275ba6aed39f13dbae Mon Sep 17 00:00:00 2001
From: Joe Bell <jbfbell@gmail.com>
Date: Mon, 26 Feb 2024 17:44:22 -0800
Subject: [PATCH 84/96] appease the interface

---
 .../NoOpJdbcDestinationHandler.kt             | 31 +++++++++++++++++++
 .../destination/oracle/OracleDestination.java |  8 +++++
 2 files changed, 39 insertions(+)
 create mode 100644 airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/typing_deduping/NoOpJdbcDestinationHandler.kt

diff --git a/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/typing_deduping/NoOpJdbcDestinationHandler.kt b/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/typing_deduping/NoOpJdbcDestinationHandler.kt
new file mode 100644
index 0000000000000..a83b789ab008d
--- /dev/null
+++ b/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/typing_deduping/NoOpJdbcDestinationHandler.kt
@@ -0,0 +1,31 @@
+package io.airbyte.cdk.integrations.destination.jdbc.typing_deduping
+
+import io.airbyte.cdk.db.jdbc.JdbcDatabase
+import io.airbyte.cdk.integrations.destination.jdbc.TableDefinition
+import io.airbyte.integrations.base.destination.typing_deduping.AirbyteType
+import io.airbyte.integrations.base.destination.typing_deduping.DestinationInitialState
+import io.airbyte.integrations.base.destination.typing_deduping.Sql
+import io.airbyte.integrations.base.destination.typing_deduping.StreamConfig
+
+class NoOpJdbcDestinationHandler(databaseName: String,
+                                 jdbcDatabase: JdbcDatabase
+): JdbcDestinationHandler(databaseName, jdbcDatabase) {
+    override fun execute(sql: Sql?) {
+        throw NotImplementedError("This JDBC Destination Handler does not support typing deduping")
+    }
+
+    override fun gatherInitialState(streamConfigs: MutableList<StreamConfig>?): MutableList<DestinationInitialState> {
+        throw NotImplementedError("This JDBC Destination Handler does not support typing deduping")
+    }
+
+    override fun existingSchemaMatchesStreamConfig(
+        stream: StreamConfig?,
+        existingTable: TableDefinition?
+    ): Boolean {
+        throw NotImplementedError("This JDBC Destination Handler does not support typing deduping")
+    }
+
+    override fun toJdbcTypeName(airbyteType: AirbyteType?): String {
+        throw NotImplementedError("This JDBC Destination Handler does not support typing deduping")
+    }
+}
diff --git a/airbyte-integrations/connectors/destination-oracle/src/main/java/io/airbyte/integrations/destination/oracle/OracleDestination.java b/airbyte-integrations/connectors/destination-oracle/src/main/java/io/airbyte/integrations/destination/oracle/OracleDestination.java
index d83300f33777e..a7daa5b8abbdf 100644
--- a/airbyte-integrations/connectors/destination-oracle/src/main/java/io/airbyte/integrations/destination/oracle/OracleDestination.java
+++ b/airbyte-integrations/connectors/destination-oracle/src/main/java/io/airbyte/integrations/destination/oracle/OracleDestination.java
@@ -7,12 +7,15 @@
 import com.fasterxml.jackson.databind.JsonNode;
 import com.google.common.collect.ImmutableMap;
 import io.airbyte.cdk.db.factory.DatabaseDriver;
+import io.airbyte.cdk.db.jdbc.JdbcDatabase;
 import io.airbyte.cdk.db.jdbc.JdbcUtils;
 import io.airbyte.cdk.integrations.base.Destination;
 import io.airbyte.cdk.integrations.base.IntegrationRunner;
 import io.airbyte.cdk.integrations.base.ssh.SshWrappedDestination;
 import io.airbyte.cdk.integrations.destination.jdbc.AbstractJdbcDestination;
+import io.airbyte.cdk.integrations.destination.jdbc.typing_deduping.JdbcDestinationHandler;
 import io.airbyte.cdk.integrations.destination.jdbc.typing_deduping.JdbcSqlGenerator;
+import io.airbyte.cdk.integrations.destination.jdbc.typing_deduping.NoOpJdbcDestinationHandler;
 import io.airbyte.cdk.integrations.destination.jdbc.typing_deduping.RawOnlySqlGenerator;
 import io.airbyte.commons.json.Jsons;
 import java.io.IOException;
@@ -157,6 +160,11 @@ private static void runProcess(final String cmd, final Runtime run) throws IOExc
     }
   }
 
+  @Override
+  protected JdbcDestinationHandler getDestinationHandler(final String databaseName, final JdbcDatabase database) {
+    return new NoOpJdbcDestinationHandler(databaseName, database);
+  }
+
   public static void main(final String[] args) throws Exception {
     final Destination destination = sshWrappedDestination();
     LOGGER.info("starting destination: {}", OracleDestination.class);

From dbcc23f7e777a9bae52330ffa2f35359f802dcd4 Mon Sep 17 00:00:00 2001
From: Joe Bell <jbfbell@gmail.com>
Date: Tue, 5 Mar 2024 14:03:09 -0800
Subject: [PATCH 85/96] formatting

---
 .../typing_deduping/NoOpJdbcDestinationHandler.kt   | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

diff --git a/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/typing_deduping/NoOpJdbcDestinationHandler.kt b/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/typing_deduping/NoOpJdbcDestinationHandler.kt
index a83b789ab008d..519764ad54252 100644
--- a/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/typing_deduping/NoOpJdbcDestinationHandler.kt
+++ b/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/typing_deduping/NoOpJdbcDestinationHandler.kt
@@ -1,3 +1,7 @@
+/*
+ * Copyright (c) 2024 Airbyte, Inc., all rights reserved.
+ */
+
 package io.airbyte.cdk.integrations.destination.jdbc.typing_deduping
 
 import io.airbyte.cdk.db.jdbc.JdbcDatabase
@@ -7,14 +11,15 @@ import io.airbyte.integrations.base.destination.typing_deduping.DestinationIniti
 import io.airbyte.integrations.base.destination.typing_deduping.Sql
 import io.airbyte.integrations.base.destination.typing_deduping.StreamConfig
 
-class NoOpJdbcDestinationHandler(databaseName: String,
-                                 jdbcDatabase: JdbcDatabase
-): JdbcDestinationHandler(databaseName, jdbcDatabase) {
+class NoOpJdbcDestinationHandler(databaseName: String, jdbcDatabase: JdbcDatabase) :
+    JdbcDestinationHandler(databaseName, jdbcDatabase) {
     override fun execute(sql: Sql?) {
         throw NotImplementedError("This JDBC Destination Handler does not support typing deduping")
     }
 
-    override fun gatherInitialState(streamConfigs: MutableList<StreamConfig>?): MutableList<DestinationInitialState> {
+    override fun gatherInitialState(
+        streamConfigs: MutableList<StreamConfig>?
+    ): MutableList<DestinationInitialState> {
         throw NotImplementedError("This JDBC Destination Handler does not support typing deduping")
     }
 

From 99585f27ad4bea5d66a6f680c492ce624e0f4656 Mon Sep 17 00:00:00 2001
From: Joe Bell <jbfbell@gmail.com>
Date: Wed, 6 Mar 2024 11:52:03 -0800
Subject: [PATCH 86/96] update kotlin file

---
 .../typing_deduping/NoOpJdbcDestinationHandler.kt     | 11 +++++------
 1 file changed, 5 insertions(+), 6 deletions(-)

diff --git a/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/typing_deduping/NoOpJdbcDestinationHandler.kt b/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/typing_deduping/NoOpJdbcDestinationHandler.kt
index 519764ad54252..67c1441e3215c 100644
--- a/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/typing_deduping/NoOpJdbcDestinationHandler.kt
+++ b/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/typing_deduping/NoOpJdbcDestinationHandler.kt
@@ -4,22 +4,21 @@
 
 package io.airbyte.cdk.integrations.destination.jdbc.typing_deduping
 
+import com.fasterxml.jackson.databind.JsonNode
 import io.airbyte.cdk.db.jdbc.JdbcDatabase
 import io.airbyte.cdk.integrations.destination.jdbc.TableDefinition
 import io.airbyte.integrations.base.destination.typing_deduping.AirbyteType
-import io.airbyte.integrations.base.destination.typing_deduping.DestinationInitialState
 import io.airbyte.integrations.base.destination.typing_deduping.Sql
 import io.airbyte.integrations.base.destination.typing_deduping.StreamConfig
+import org.jooq.SQLDialect
 
-class NoOpJdbcDestinationHandler(databaseName: String, jdbcDatabase: JdbcDatabase) :
-    JdbcDestinationHandler(databaseName, jdbcDatabase) {
+class NoOpJdbcDestinationHandler<DestinationState>(databaseName: String, jdbcDatabase: JdbcDatabase, rawTableSchemaName: String, sqlDialect: SQLDialect) :
+    JdbcDestinationHandler<DestinationState>(databaseName, jdbcDatabase, rawTableSchemaName, sqlDialect) {
     override fun execute(sql: Sql?) {
         throw NotImplementedError("This JDBC Destination Handler does not support typing deduping")
     }
 
-    override fun gatherInitialState(
-        streamConfigs: MutableList<StreamConfig>?
-    ): MutableList<DestinationInitialState> {
+    override fun toDestinationState(json: JsonNode?): DestinationState {
         throw NotImplementedError("This JDBC Destination Handler does not support typing deduping")
     }
 

From cfca42166cf491ae2884de1b12a385eb256b92c5 Mon Sep 17 00:00:00 2001
From: Joe Bell <jbfbell@gmail.com>
Date: Wed, 6 Mar 2024 16:28:29 -0800
Subject: [PATCH 87/96] conform to other cdk updates

---
 .../destination/oracle/OracleDestination.java       | 13 ++++++++-----
 1 file changed, 8 insertions(+), 5 deletions(-)

diff --git a/airbyte-integrations/connectors/destination-oracle/src/main/java/io/airbyte/integrations/destination/oracle/OracleDestination.java b/airbyte-integrations/connectors/destination-oracle/src/main/java/io/airbyte/integrations/destination/oracle/OracleDestination.java
index a7daa5b8abbdf..7a65dd426ee48 100644
--- a/airbyte-integrations/connectors/destination-oracle/src/main/java/io/airbyte/integrations/destination/oracle/OracleDestination.java
+++ b/airbyte-integrations/connectors/destination-oracle/src/main/java/io/airbyte/integrations/destination/oracle/OracleDestination.java
@@ -18,6 +18,7 @@
 import io.airbyte.cdk.integrations.destination.jdbc.typing_deduping.NoOpJdbcDestinationHandler;
 import io.airbyte.cdk.integrations.destination.jdbc.typing_deduping.RawOnlySqlGenerator;
 import io.airbyte.commons.json.Jsons;
+import io.airbyte.integrations.base.destination.typing_deduping.migrators.MinimumDestinationState;
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.nio.charset.StandardCharsets;
@@ -25,6 +26,7 @@
 import java.util.Map;
 import java.util.concurrent.TimeUnit;
 import org.apache.commons.lang3.RandomStringUtils;
+import org.jooq.SQLDialect;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -141,6 +143,12 @@ protected JdbcSqlGenerator getSqlGenerator() {
     return new RawOnlySqlGenerator(new OracleNameTransformer());
   }
 
+  @Override
+  protected JdbcDestinationHandler<? extends MinimumDestinationState> getDestinationHandler(final String databaseName, final JdbcDatabase database,
+                                                                                            final String rawTableSchema) {
+    return new NoOpJdbcDestinationHandler<>(databaseName, database, rawTableSchema, SQLDialect.DEFAULT);
+  }
+
   private static void convertAndImportCertificate(final String certificate)
       throws IOException, InterruptedException {
     final Runtime run = Runtime.getRuntime();
@@ -160,11 +168,6 @@ private static void runProcess(final String cmd, final Runtime run) throws IOExc
     }
   }
 
-  @Override
-  protected JdbcDestinationHandler getDestinationHandler(final String databaseName, final JdbcDatabase database) {
-    return new NoOpJdbcDestinationHandler(databaseName, database);
-  }
-
   public static void main(final String[] args) throws Exception {
     final Destination destination = sshWrappedDestination();
     LOGGER.info("starting destination: {}", OracleDestination.class);

From ac6f714e7943f437467dce3f8bce07f8b26b9172 Mon Sep 17 00:00:00 2001
From: Joe Bell <jbfbell@gmail.com>
Date: Wed, 6 Mar 2024 16:32:52 -0800
Subject: [PATCH 88/96] version bump

---
 .../java/airbyte-cdk/core/src/main/resources/version.properties | 2 +-
 .../connectors/destination-oracle-strict-encrypt/build.gradle   | 2 +-
 airbyte-integrations/connectors/destination-oracle/build.gradle | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/airbyte-cdk/java/airbyte-cdk/core/src/main/resources/version.properties b/airbyte-cdk/java/airbyte-cdk/core/src/main/resources/version.properties
index e60bd207859a8..ad61006b14c59 100644
--- a/airbyte-cdk/java/airbyte-cdk/core/src/main/resources/version.properties
+++ b/airbyte-cdk/java/airbyte-cdk/core/src/main/resources/version.properties
@@ -1 +1 @@
-version=0.23.15
+version=0.23.16
diff --git a/airbyte-integrations/connectors/destination-oracle-strict-encrypt/build.gradle b/airbyte-integrations/connectors/destination-oracle-strict-encrypt/build.gradle
index a771127302038..aa2fc8775b434 100644
--- a/airbyte-integrations/connectors/destination-oracle-strict-encrypt/build.gradle
+++ b/airbyte-integrations/connectors/destination-oracle-strict-encrypt/build.gradle
@@ -4,7 +4,7 @@ plugins {
 }
 
 airbyteJavaConnector {
-    cdkVersionRequired = '0.23.7'
+    cdkVersionRequired = '0.23.16'
     features = ['db-destinations', 's3-destinations', 'typing-deduping']
     useLocalCdk = true
 }
diff --git a/airbyte-integrations/connectors/destination-oracle/build.gradle b/airbyte-integrations/connectors/destination-oracle/build.gradle
index f71924a25a59d..ef255fc7b2194 100644
--- a/airbyte-integrations/connectors/destination-oracle/build.gradle
+++ b/airbyte-integrations/connectors/destination-oracle/build.gradle
@@ -4,7 +4,7 @@ plugins {
 }
 
 airbyteJavaConnector {
-    cdkVersionRequired = '0.23.7'
+    cdkVersionRequired = '0.23.16'
     features = ['db-destinations', 's3-destinations', 'typing-deduping']
     useLocalCdk = true
 }

From b686e3dfebf10df922f1c63cb5c49cc6dd66d58a Mon Sep 17 00:00:00 2001
From: Joe Bell <jbfbell@gmail.com>
Date: Wed, 6 Mar 2024 17:34:21 -0800
Subject: [PATCH 89/96] appease gradle

---
 .../src/test/resources/expected_spec.json     | 276 ++++++++++--------
 ...trictEncryptDestinationAcceptanceTest.java |  36 ++-
 .../src/test/resources/expected_spec.json     | 126 ++++++++
 3 files changed, 292 insertions(+), 146 deletions(-)

diff --git a/airbyte-integrations/connectors/destination-clickhouse-strict-encrypt/src/test/resources/expected_spec.json b/airbyte-integrations/connectors/destination-clickhouse-strict-encrypt/src/test/resources/expected_spec.json
index a64b1e0c31a19..0966582bcf4d3 100644
--- a/airbyte-integrations/connectors/destination-clickhouse-strict-encrypt/src/test/resources/expected_spec.json
+++ b/airbyte-integrations/connectors/destination-clickhouse-strict-encrypt/src/test/resources/expected_spec.json
@@ -1,166 +1,188 @@
 {
-  "documentationUrl": "https://docs.airbyte.com/integrations/destinations/clickhouse",
-  "supportsIncremental": true,
-  "supportsNormalization": true,
-  "supportsDBT": false,
-  "supported_destination_sync_modes": ["overwrite", "append", "append_dedup"],
-  "connectionSpecification": {
-    "$schema": "http://json-schema.org/draft-07/schema#",
-    "title": "ClickHouse Destination Spec",
-    "type": "object",
-    "required": ["host", "port", "database", "username"],
-    "additionalProperties": true,
-    "properties": {
-      "host": {
-        "title": "Host",
-        "description": "Hostname of the database.",
-        "type": "string",
-        "order": 0
+  "documentationUrl" : "https://docs.airbyte.com/integrations/destinations/clickhouse",
+  "supportsIncremental" : true,
+  "supportsNormalization" : true,
+  "supportsDBT" : false,
+  "supported_destination_sync_modes" : [
+    "overwrite",
+    "append"
+  ],
+  "connectionSpecification" : {
+    "$schema" : "http://json-schema.org/draft-07/schema#",
+    "title" : "ClickHouse Destination Spec",
+    "type" : "object",
+    "required" : [
+      "host",
+      "port",
+      "database",
+      "username"
+    ],
+    "additionalProperties" : true,
+    "properties" : {
+      "host" : {
+        "title" : "Host",
+        "description" : "Hostname of the database.",
+        "type" : "string",
+        "order" : 0
       },
-      "port": {
-        "title": "Port",
-        "description": "HTTP port of the database.",
-        "type": "integer",
-        "minimum": 0,
-        "maximum": 65536,
-        "default": 8123,
-        "examples": ["8123"],
-        "order": 1
+      "port" : {
+        "title" : "Port",
+        "description" : "HTTP port of the database.",
+        "type" : "integer",
+        "minimum" : 0,
+        "maximum" : 65536,
+        "default" : 8123,
+        "examples" : [
+          "8123"
+        ],
+        "order" : 1
       },
-      "database": {
-        "title": "DB Name",
-        "description": "Name of the database.",
-        "type": "string",
-        "order": 2
+      "database" : {
+        "title" : "DB Name",
+        "description" : "Name of the database.",
+        "type" : "string",
+        "order" : 2
       },
-      "username": {
-        "title": "User",
-        "description": "Username to use to access the database.",
-        "type": "string",
-        "order": 3
+      "username" : {
+        "title" : "User",
+        "description" : "Username to use to access the database.",
+        "type" : "string",
+        "order" : 3
       },
-      "password": {
-        "title": "Password",
-        "description": "Password associated with the username.",
-        "type": "string",
-        "airbyte_secret": true,
-        "order": 4
+      "password" : {
+        "title" : "Password",
+        "description" : "Password associated with the username.",
+        "type" : "string",
+        "airbyte_secret" : true,
+        "order" : 4
       },
-      "jdbc_url_params": {
-        "description": "Additional properties to pass to the JDBC URL string when connecting to the database formatted as 'key=value' pairs separated by the symbol '&'. (example: key1=value1&key2=value2&key3=value3).",
-        "title": "JDBC URL Params",
-        "type": "string",
-        "order": 5
+      "jdbc_url_params" : {
+        "description" : "Additional properties to pass to the JDBC URL string when connecting to the database formatted as 'key=value' pairs separated by the symbol '&'. (example: key1=value1&key2=value2&key3=value3).",
+        "title" : "JDBC URL Params",
+        "type" : "string",
+        "order" : 5
       },
-      "tunnel_method": {
-        "type": "object",
-        "title": "SSH Tunnel Method",
-        "description": "Whether to initiate an SSH tunnel before connecting to the database, and if so, which kind of authentication to use.",
-        "oneOf": [
+      "raw_data_schema" : {
+        "type" : "string",
+        "description" : "The schema to write raw tables into (default: airbyte_internal)",
+        "title" : "Raw Table Schema Name",
+        "order" : 7
+      },
+      "tunnel_method" : {
+        "type" : "object",
+        "title" : "SSH Tunnel Method",
+        "description" : "Whether to initiate an SSH tunnel before connecting to the database, and if so, which kind of authentication to use.",
+        "oneOf" : [
           {
-            "title": "No Tunnel",
-            "required": ["tunnel_method"],
-            "properties": {
-              "tunnel_method": {
-                "description": "No ssh tunnel needed to connect to database",
-                "type": "string",
-                "const": "NO_TUNNEL",
-                "order": 0
+            "title" : "No Tunnel",
+            "required" : [
+              "tunnel_method"
+            ],
+            "properties" : {
+              "tunnel_method" : {
+                "description" : "No ssh tunnel needed to connect to database",
+                "type" : "string",
+                "const" : "NO_TUNNEL",
+                "order" : 0
               }
             }
           },
           {
-            "title": "SSH Key Authentication",
-            "required": [
+            "title" : "SSH Key Authentication",
+            "required" : [
               "tunnel_method",
               "tunnel_host",
               "tunnel_port",
               "tunnel_user",
               "ssh_key"
             ],
-            "properties": {
-              "tunnel_method": {
-                "description": "Connect through a jump server tunnel host using username and ssh key",
-                "type": "string",
-                "const": "SSH_KEY_AUTH",
-                "order": 0
+            "properties" : {
+              "tunnel_method" : {
+                "description" : "Connect through a jump server tunnel host using username and ssh key",
+                "type" : "string",
+                "const" : "SSH_KEY_AUTH",
+                "order" : 0
               },
-              "tunnel_host": {
-                "title": "SSH Tunnel Jump Server Host",
-                "description": "Hostname of the jump server host that allows inbound ssh tunnel.",
-                "type": "string",
-                "order": 1
+              "tunnel_host" : {
+                "title" : "SSH Tunnel Jump Server Host",
+                "description" : "Hostname of the jump server host that allows inbound ssh tunnel.",
+                "type" : "string",
+                "order" : 1
               },
-              "tunnel_port": {
-                "title": "SSH Connection Port",
-                "description": "Port on the proxy/jump server that accepts inbound ssh connections.",
-                "type": "integer",
-                "minimum": 0,
-                "maximum": 65536,
-                "default": 22,
-                "examples": ["22"],
-                "order": 2
+              "tunnel_port" : {
+                "title" : "SSH Connection Port",
+                "description" : "Port on the proxy/jump server that accepts inbound ssh connections.",
+                "type" : "integer",
+                "minimum" : 0,
+                "maximum" : 65536,
+                "default" : 22,
+                "examples" : [
+                  "22"
+                ],
+                "order" : 2
               },
-              "tunnel_user": {
-                "title": "SSH Login Username",
-                "description": "OS-level username for logging into the jump server host.",
-                "type": "string",
-                "order": 3
+              "tunnel_user" : {
+                "title" : "SSH Login Username",
+                "description" : "OS-level username for logging into the jump server host.",
+                "type" : "string",
+                "order" : 3
               },
-              "ssh_key": {
-                "title": "SSH Private Key",
-                "description": "OS-level user account ssh key credentials in RSA PEM format ( created with ssh-keygen -t rsa -m PEM -f myuser_rsa )",
-                "type": "string",
-                "airbyte_secret": true,
-                "multiline": true,
-                "order": 4
+              "ssh_key" : {
+                "title" : "SSH Private Key",
+                "description" : "OS-level user account ssh key credentials in RSA PEM format ( created with ssh-keygen -t rsa -m PEM -f myuser_rsa )",
+                "type" : "string",
+                "airbyte_secret" : true,
+                "multiline" : true,
+                "order" : 4
               }
             }
           },
           {
-            "title": "Password Authentication",
-            "required": [
+            "title" : "Password Authentication",
+            "required" : [
               "tunnel_method",
               "tunnel_host",
               "tunnel_port",
               "tunnel_user",
               "tunnel_user_password"
             ],
-            "properties": {
-              "tunnel_method": {
-                "description": "Connect through a jump server tunnel host using username and password authentication",
-                "type": "string",
-                "const": "SSH_PASSWORD_AUTH",
-                "order": 0
+            "properties" : {
+              "tunnel_method" : {
+                "description" : "Connect through a jump server tunnel host using username and password authentication",
+                "type" : "string",
+                "const" : "SSH_PASSWORD_AUTH",
+                "order" : 0
               },
-              "tunnel_host": {
-                "title": "SSH Tunnel Jump Server Host",
-                "description": "Hostname of the jump server host that allows inbound ssh tunnel.",
-                "type": "string",
-                "order": 1
+              "tunnel_host" : {
+                "title" : "SSH Tunnel Jump Server Host",
+                "description" : "Hostname of the jump server host that allows inbound ssh tunnel.",
+                "type" : "string",
+                "order" : 1
               },
-              "tunnel_port": {
-                "title": "SSH Connection Port",
-                "description": "Port on the proxy/jump server that accepts inbound ssh connections.",
-                "type": "integer",
-                "minimum": 0,
-                "maximum": 65536,
-                "default": 22,
-                "examples": ["22"],
-                "order": 2
+              "tunnel_port" : {
+                "title" : "SSH Connection Port",
+                "description" : "Port on the proxy/jump server that accepts inbound ssh connections.",
+                "type" : "integer",
+                "minimum" : 0,
+                "maximum" : 65536,
+                "default" : 22,
+                "examples" : [
+                  "22"
+                ],
+                "order" : 2
               },
-              "tunnel_user": {
-                "title": "SSH Login Username",
-                "description": "OS-level username for logging into the jump server host",
-                "type": "string",
-                "order": 3
+              "tunnel_user" : {
+                "title" : "SSH Login Username",
+                "description" : "OS-level username for logging into the jump server host",
+                "type" : "string",
+                "order" : 3
               },
-              "tunnel_user_password": {
-                "title": "Password",
-                "description": "OS-level password for logging into the jump server host",
-                "type": "string",
-                "airbyte_secret": true,
-                "order": 4
+              "tunnel_user_password" : {
+                "title" : "Password",
+                "description" : "OS-level password for logging into the jump server host",
+                "type" : "string",
+                "airbyte_secret" : true,
+                "order" : 4
               }
             }
           }
diff --git a/airbyte-integrations/connectors/destination-oracle-strict-encrypt/src/test-integration/java/io/airbyte/integrations/destination/oracle_strict_encrypt/OracleStrictEncryptDestinationAcceptanceTest.java b/airbyte-integrations/connectors/destination-oracle-strict-encrypt/src/test-integration/java/io/airbyte/integrations/destination/oracle_strict_encrypt/OracleStrictEncryptDestinationAcceptanceTest.java
index 2702b71b2ab94..a7cd541500505 100644
--- a/airbyte-integrations/connectors/destination-oracle-strict-encrypt/src/test-integration/java/io/airbyte/integrations/destination/oracle_strict_encrypt/OracleStrictEncryptDestinationAcceptanceTest.java
+++ b/airbyte-integrations/connectors/destination-oracle-strict-encrypt/src/test-integration/java/io/airbyte/integrations/destination/oracle_strict_encrypt/OracleStrictEncryptDestinationAcceptanceTest.java
@@ -24,6 +24,7 @@
 import io.airbyte.commons.string.Strings;
 import io.airbyte.integrations.destination.oracle.OracleNameTransformer;
 import java.sql.SQLException;
+import java.time.Duration;
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
@@ -115,15 +116,13 @@ private List<JsonNode> retrieveRecordsFromTable(final String tableName, final St
       throws SQLException {
     final String query =
         String.format("SELECT * FROM %s.%s ORDER BY %s ASC", schemaName, tableName, JavaBaseConstants.COLUMN_NAME_AB_EXTRACTED_AT.toUpperCase());
-
-    try (final DSLContext dslContext = getDslContext(config)) {
-      final List<org.jooq.Record> result = getDatabase(dslContext).query(ctx -> ctx.fetch(query).stream().toList());
-      return result
-          .stream()
-          .map(r -> r.formatJSON(JSON_FORMAT))
-          .map(Jsons::deserialize)
-          .collect(Collectors.toList());
-    }
+    final DSLContext dslContext = getDslContext(config);
+    final List<org.jooq.Record> result = getDatabase(dslContext).query(ctx -> ctx.fetch(query).stream().toList());
+    return result
+        .stream()
+        .map(r -> r.formatJSON(JSON_FORMAT))
+        .map(Jsons::deserialize)
+        .collect(Collectors.toList());
   }
 
   private static Database getDatabase(final DSLContext dslContext) {
@@ -152,15 +151,13 @@ protected void setup(final TestDestinationEnv testEnv, final HashSet<String> TES
     db.start();
 
     config = getConfig(db);
+    final DSLContext dslContext = getDslContext(config);
+    final Database database = getDatabase(dslContext);
+    database.query(
+        ctx -> ctx.fetch(String.format("CREATE USER %s IDENTIFIED BY %s", schemaName, schemaName)));
+    database.query(ctx -> ctx.fetch(String.format("GRANT ALL PRIVILEGES TO %s", schemaName)));
 
-    try (final DSLContext dslContext = getDslContext(config)) {
-      final Database database = getDatabase(dslContext);
-      database.query(
-          ctx -> ctx.fetch(String.format("CREATE USER %s IDENTIFIED BY %s", schemaName, schemaName)));
-      database.query(ctx -> ctx.fetch(String.format("GRANT ALL PRIVILEGES TO %s", schemaName)));
-
-      ((ObjectNode) config).put(JdbcUtils.SCHEMA_KEY, dbName);
-    }
+    ((ObjectNode) config).put(JdbcUtils.SCHEMA_KEY, dbName);
   }
 
   @Override
@@ -183,7 +180,7 @@ public void testEncryption() throws SQLException {
                 config.get(JdbcUtils.PORT_KEY).asInt(),
                 config.get("sid").asText()),
             JdbcUtils.parseJdbcParameters("oracle.net.encryption_client=REQUIRED;" +
-                "oracle.net.encryption_types_client=( " + algorithm + " )", ";"));
+                "oracle.net.encryption_types_client=( " + algorithm + " )", ";"), Duration.ofMinutes(5));
     final JdbcDatabase database = new DefaultJdbcDatabase(dataSource);
 
     final String networkServiceBanner =
@@ -209,7 +206,8 @@ public void testCheckProtocol() throws SQLException {
                 config.get(JdbcUtils.PORT_KEY).asInt(),
                 config.get("sid").asText()),
             JdbcUtils.parseJdbcParameters("oracle.net.encryption_client=REQUIRED;" +
-                "oracle.net.encryption_types_client=( " + algorithm + " )", ";"));
+                "oracle.net.encryption_types_client=( " + algorithm + " )", ";"),
+        Duration.ofMinutes(5));
     final JdbcDatabase database = new DefaultJdbcDatabase(dataSource);
 
     final String networkServiceBanner = "SELECT sys_context('USERENV', 'NETWORK_PROTOCOL') as network_protocol FROM dual";
diff --git a/airbyte-integrations/connectors/destination-oracle-strict-encrypt/src/test/resources/expected_spec.json b/airbyte-integrations/connectors/destination-oracle-strict-encrypt/src/test/resources/expected_spec.json
index 86b2da9a042e1..26f5b5a7fed61 100644
--- a/airbyte-integrations/connectors/destination-oracle-strict-encrypt/src/test/resources/expected_spec.json
+++ b/airbyte-integrations/connectors/destination-oracle-strict-encrypt/src/test/resources/expected_spec.json
@@ -59,6 +59,132 @@
         "examples": ["airbyte"],
         "default": "airbyte",
         "order": 6
+      },
+      "raw_data_schema": {
+        "type": "string",
+        "description": "The schema to write raw tables into (default: airbyte_internal)",
+        "title": "Raw Table Schema Name",
+        "order": 7
+      },
+      "tunnel_method" : {
+        "type" : "object",
+        "title" : "SSH Tunnel Method",
+        "description" : "Whether to initiate an SSH tunnel before connecting to the database, and if so, which kind of authentication to use.",
+        "oneOf" : [
+          {
+            "title" : "No Tunnel",
+            "required" : [
+              "tunnel_method"
+            ],
+            "properties" : {
+              "tunnel_method" : {
+                "description" : "No ssh tunnel needed to connect to database",
+                "type" : "string",
+                "const" : "NO_TUNNEL",
+                "order" : 0
+              }
+            }
+          },
+          {
+            "title" : "SSH Key Authentication",
+            "required" : [
+              "tunnel_method",
+              "tunnel_host",
+              "tunnel_port",
+              "tunnel_user",
+              "ssh_key"
+            ],
+            "properties" : {
+              "tunnel_method" : {
+                "description" : "Connect through a jump server tunnel host using username and ssh key",
+                "type" : "string",
+                "const" : "SSH_KEY_AUTH",
+                "order" : 0
+              },
+              "tunnel_host" : {
+                "title" : "SSH Tunnel Jump Server Host",
+                "description" : "Hostname of the jump server host that allows inbound ssh tunnel.",
+                "type" : "string",
+                "order" : 1
+              },
+              "tunnel_port" : {
+                "title" : "SSH Connection Port",
+                "description" : "Port on the proxy/jump server that accepts inbound ssh connections.",
+                "type" : "integer",
+                "minimum" : 0,
+                "maximum" : 65536,
+                "default" : 22,
+                "examples" : [
+                  "22"
+                ],
+                "order" : 2
+              },
+              "tunnel_user" : {
+                "title" : "SSH Login Username",
+                "description" : "OS-level username for logging into the jump server host.",
+                "type" : "string",
+                "order" : 3
+              },
+              "ssh_key" : {
+                "title" : "SSH Private Key",
+                "description" : "OS-level user account ssh key credentials in RSA PEM format ( created with ssh-keygen -t rsa -m PEM -f myuser_rsa )",
+                "type" : "string",
+                "airbyte_secret" : true,
+                "multiline" : true,
+                "order" : 4
+              }
+            }
+          },
+          {
+            "title" : "Password Authentication",
+            "required" : [
+              "tunnel_method",
+              "tunnel_host",
+              "tunnel_port",
+              "tunnel_user",
+              "tunnel_user_password"
+            ],
+            "properties" : {
+              "tunnel_method" : {
+                "description" : "Connect through a jump server tunnel host using username and password authentication",
+                "type" : "string",
+                "const" : "SSH_PASSWORD_AUTH",
+                "order" : 0
+              },
+              "tunnel_host" : {
+                "title" : "SSH Tunnel Jump Server Host",
+                "description" : "Hostname of the jump server host that allows inbound ssh tunnel.",
+                "type" : "string",
+                "order" : 1
+              },
+              "tunnel_port" : {
+                "title" : "SSH Connection Port",
+                "description" : "Port on the proxy/jump server that accepts inbound ssh connections.",
+                "type" : "integer",
+                "minimum" : 0,
+                "maximum" : 65536,
+                "default" : 22,
+                "examples" : [
+                  "22"
+                ],
+                "order" : 2
+              },
+              "tunnel_user" : {
+                "title" : "SSH Login Username",
+                "description" : "OS-level username for logging into the jump server host",
+                "type" : "string",
+                "order" : 3
+              },
+              "tunnel_user_password" : {
+                "title" : "Password",
+                "description" : "OS-level password for logging into the jump server host",
+                "type" : "string",
+                "airbyte_secret" : true,
+                "order" : 4
+              }
+            }
+          }
+        ]
       }
     }
   }

From 44738734b5966b7f864b081b0cdba8f450ba6260 Mon Sep 17 00:00:00 2001
From: Joe Bell <jbfbell@gmail.com>
Date: Wed, 6 Mar 2024 17:50:06 -0800
Subject: [PATCH 90/96] formatting

---
 .../NoOpJdbcDestinationHandler.kt             |  14 +-
 .../src/test/resources/expected_spec.json     | 280 +++++++++---------
 ...trictEncryptDestinationAcceptanceTest.java |   5 +-
 .../src/test/resources/expected_spec.json     | 166 +++++------
 .../destination/oracle/OracleDestination.java |   3 +-
 5 files changed, 229 insertions(+), 239 deletions(-)

diff --git a/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/typing_deduping/NoOpJdbcDestinationHandler.kt b/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/typing_deduping/NoOpJdbcDestinationHandler.kt
index 67c1441e3215c..5e5edb140de16 100644
--- a/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/typing_deduping/NoOpJdbcDestinationHandler.kt
+++ b/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/typing_deduping/NoOpJdbcDestinationHandler.kt
@@ -12,8 +12,18 @@ import io.airbyte.integrations.base.destination.typing_deduping.Sql
 import io.airbyte.integrations.base.destination.typing_deduping.StreamConfig
 import org.jooq.SQLDialect
 
-class NoOpJdbcDestinationHandler<DestinationState>(databaseName: String, jdbcDatabase: JdbcDatabase, rawTableSchemaName: String, sqlDialect: SQLDialect) :
-    JdbcDestinationHandler<DestinationState>(databaseName, jdbcDatabase, rawTableSchemaName, sqlDialect) {
+class NoOpJdbcDestinationHandler<DestinationState>(
+    databaseName: String,
+    jdbcDatabase: JdbcDatabase,
+    rawTableSchemaName: String,
+    sqlDialect: SQLDialect
+) :
+    JdbcDestinationHandler<DestinationState>(
+        databaseName,
+        jdbcDatabase,
+        rawTableSchemaName,
+        sqlDialect
+    ) {
     override fun execute(sql: Sql?) {
         throw NotImplementedError("This JDBC Destination Handler does not support typing deduping")
     }
diff --git a/airbyte-integrations/connectors/destination-clickhouse-strict-encrypt/src/test/resources/expected_spec.json b/airbyte-integrations/connectors/destination-clickhouse-strict-encrypt/src/test/resources/expected_spec.json
index 0966582bcf4d3..b2fd27f7028b6 100644
--- a/airbyte-integrations/connectors/destination-clickhouse-strict-encrypt/src/test/resources/expected_spec.json
+++ b/airbyte-integrations/connectors/destination-clickhouse-strict-encrypt/src/test/resources/expected_spec.json
@@ -1,188 +1,172 @@
 {
-  "documentationUrl" : "https://docs.airbyte.com/integrations/destinations/clickhouse",
-  "supportsIncremental" : true,
-  "supportsNormalization" : true,
-  "supportsDBT" : false,
-  "supported_destination_sync_modes" : [
-    "overwrite",
-    "append"
-  ],
-  "connectionSpecification" : {
-    "$schema" : "http://json-schema.org/draft-07/schema#",
-    "title" : "ClickHouse Destination Spec",
-    "type" : "object",
-    "required" : [
-      "host",
-      "port",
-      "database",
-      "username"
-    ],
-    "additionalProperties" : true,
-    "properties" : {
-      "host" : {
-        "title" : "Host",
-        "description" : "Hostname of the database.",
-        "type" : "string",
-        "order" : 0
+  "documentationUrl": "https://docs.airbyte.com/integrations/destinations/clickhouse",
+  "supportsIncremental": true,
+  "supportsNormalization": true,
+  "supportsDBT": false,
+  "supported_destination_sync_modes": ["overwrite", "append"],
+  "connectionSpecification": {
+    "$schema": "http://json-schema.org/draft-07/schema#",
+    "title": "ClickHouse Destination Spec",
+    "type": "object",
+    "required": ["host", "port", "database", "username"],
+    "additionalProperties": true,
+    "properties": {
+      "host": {
+        "title": "Host",
+        "description": "Hostname of the database.",
+        "type": "string",
+        "order": 0
       },
-      "port" : {
-        "title" : "Port",
-        "description" : "HTTP port of the database.",
-        "type" : "integer",
-        "minimum" : 0,
-        "maximum" : 65536,
-        "default" : 8123,
-        "examples" : [
-          "8123"
-        ],
-        "order" : 1
+      "port": {
+        "title": "Port",
+        "description": "HTTP port of the database.",
+        "type": "integer",
+        "minimum": 0,
+        "maximum": 65536,
+        "default": 8123,
+        "examples": ["8123"],
+        "order": 1
       },
-      "database" : {
-        "title" : "DB Name",
-        "description" : "Name of the database.",
-        "type" : "string",
-        "order" : 2
+      "database": {
+        "title": "DB Name",
+        "description": "Name of the database.",
+        "type": "string",
+        "order": 2
       },
-      "username" : {
-        "title" : "User",
-        "description" : "Username to use to access the database.",
-        "type" : "string",
-        "order" : 3
+      "username": {
+        "title": "User",
+        "description": "Username to use to access the database.",
+        "type": "string",
+        "order": 3
       },
-      "password" : {
-        "title" : "Password",
-        "description" : "Password associated with the username.",
-        "type" : "string",
-        "airbyte_secret" : true,
-        "order" : 4
+      "password": {
+        "title": "Password",
+        "description": "Password associated with the username.",
+        "type": "string",
+        "airbyte_secret": true,
+        "order": 4
       },
-      "jdbc_url_params" : {
-        "description" : "Additional properties to pass to the JDBC URL string when connecting to the database formatted as 'key=value' pairs separated by the symbol '&'. (example: key1=value1&key2=value2&key3=value3).",
-        "title" : "JDBC URL Params",
-        "type" : "string",
-        "order" : 5
+      "jdbc_url_params": {
+        "description": "Additional properties to pass to the JDBC URL string when connecting to the database formatted as 'key=value' pairs separated by the symbol '&'. (example: key1=value1&key2=value2&key3=value3).",
+        "title": "JDBC URL Params",
+        "type": "string",
+        "order": 5
       },
-      "raw_data_schema" : {
-        "type" : "string",
-        "description" : "The schema to write raw tables into (default: airbyte_internal)",
-        "title" : "Raw Table Schema Name",
-        "order" : 7
+      "raw_data_schema": {
+        "type": "string",
+        "description": "The schema to write raw tables into (default: airbyte_internal)",
+        "title": "Raw Table Schema Name",
+        "order": 7
       },
-      "tunnel_method" : {
-        "type" : "object",
-        "title" : "SSH Tunnel Method",
-        "description" : "Whether to initiate an SSH tunnel before connecting to the database, and if so, which kind of authentication to use.",
-        "oneOf" : [
+      "tunnel_method": {
+        "type": "object",
+        "title": "SSH Tunnel Method",
+        "description": "Whether to initiate an SSH tunnel before connecting to the database, and if so, which kind of authentication to use.",
+        "oneOf": [
           {
-            "title" : "No Tunnel",
-            "required" : [
-              "tunnel_method"
-            ],
-            "properties" : {
-              "tunnel_method" : {
-                "description" : "No ssh tunnel needed to connect to database",
-                "type" : "string",
-                "const" : "NO_TUNNEL",
-                "order" : 0
+            "title": "No Tunnel",
+            "required": ["tunnel_method"],
+            "properties": {
+              "tunnel_method": {
+                "description": "No ssh tunnel needed to connect to database",
+                "type": "string",
+                "const": "NO_TUNNEL",
+                "order": 0
               }
             }
           },
           {
-            "title" : "SSH Key Authentication",
-            "required" : [
+            "title": "SSH Key Authentication",
+            "required": [
               "tunnel_method",
               "tunnel_host",
               "tunnel_port",
               "tunnel_user",
               "ssh_key"
             ],
-            "properties" : {
-              "tunnel_method" : {
-                "description" : "Connect through a jump server tunnel host using username and ssh key",
-                "type" : "string",
-                "const" : "SSH_KEY_AUTH",
-                "order" : 0
+            "properties": {
+              "tunnel_method": {
+                "description": "Connect through a jump server tunnel host using username and ssh key",
+                "type": "string",
+                "const": "SSH_KEY_AUTH",
+                "order": 0
               },
-              "tunnel_host" : {
-                "title" : "SSH Tunnel Jump Server Host",
-                "description" : "Hostname of the jump server host that allows inbound ssh tunnel.",
-                "type" : "string",
-                "order" : 1
+              "tunnel_host": {
+                "title": "SSH Tunnel Jump Server Host",
+                "description": "Hostname of the jump server host that allows inbound ssh tunnel.",
+                "type": "string",
+                "order": 1
               },
-              "tunnel_port" : {
-                "title" : "SSH Connection Port",
-                "description" : "Port on the proxy/jump server that accepts inbound ssh connections.",
-                "type" : "integer",
-                "minimum" : 0,
-                "maximum" : 65536,
-                "default" : 22,
-                "examples" : [
-                  "22"
-                ],
-                "order" : 2
+              "tunnel_port": {
+                "title": "SSH Connection Port",
+                "description": "Port on the proxy/jump server that accepts inbound ssh connections.",
+                "type": "integer",
+                "minimum": 0,
+                "maximum": 65536,
+                "default": 22,
+                "examples": ["22"],
+                "order": 2
               },
-              "tunnel_user" : {
-                "title" : "SSH Login Username",
-                "description" : "OS-level username for logging into the jump server host.",
-                "type" : "string",
-                "order" : 3
+              "tunnel_user": {
+                "title": "SSH Login Username",
+                "description": "OS-level username for logging into the jump server host.",
+                "type": "string",
+                "order": 3
               },
-              "ssh_key" : {
-                "title" : "SSH Private Key",
-                "description" : "OS-level user account ssh key credentials in RSA PEM format ( created with ssh-keygen -t rsa -m PEM -f myuser_rsa )",
-                "type" : "string",
-                "airbyte_secret" : true,
-                "multiline" : true,
-                "order" : 4
+              "ssh_key": {
+                "title": "SSH Private Key",
+                "description": "OS-level user account ssh key credentials in RSA PEM format ( created with ssh-keygen -t rsa -m PEM -f myuser_rsa )",
+                "type": "string",
+                "airbyte_secret": true,
+                "multiline": true,
+                "order": 4
               }
             }
           },
           {
-            "title" : "Password Authentication",
-            "required" : [
+            "title": "Password Authentication",
+            "required": [
               "tunnel_method",
               "tunnel_host",
               "tunnel_port",
               "tunnel_user",
               "tunnel_user_password"
             ],
-            "properties" : {
-              "tunnel_method" : {
-                "description" : "Connect through a jump server tunnel host using username and password authentication",
-                "type" : "string",
-                "const" : "SSH_PASSWORD_AUTH",
-                "order" : 0
+            "properties": {
+              "tunnel_method": {
+                "description": "Connect through a jump server tunnel host using username and password authentication",
+                "type": "string",
+                "const": "SSH_PASSWORD_AUTH",
+                "order": 0
               },
-              "tunnel_host" : {
-                "title" : "SSH Tunnel Jump Server Host",
-                "description" : "Hostname of the jump server host that allows inbound ssh tunnel.",
-                "type" : "string",
-                "order" : 1
+              "tunnel_host": {
+                "title": "SSH Tunnel Jump Server Host",
+                "description": "Hostname of the jump server host that allows inbound ssh tunnel.",
+                "type": "string",
+                "order": 1
               },
-              "tunnel_port" : {
-                "title" : "SSH Connection Port",
-                "description" : "Port on the proxy/jump server that accepts inbound ssh connections.",
-                "type" : "integer",
-                "minimum" : 0,
-                "maximum" : 65536,
-                "default" : 22,
-                "examples" : [
-                  "22"
-                ],
-                "order" : 2
+              "tunnel_port": {
+                "title": "SSH Connection Port",
+                "description": "Port on the proxy/jump server that accepts inbound ssh connections.",
+                "type": "integer",
+                "minimum": 0,
+                "maximum": 65536,
+                "default": 22,
+                "examples": ["22"],
+                "order": 2
               },
-              "tunnel_user" : {
-                "title" : "SSH Login Username",
-                "description" : "OS-level username for logging into the jump server host",
-                "type" : "string",
-                "order" : 3
+              "tunnel_user": {
+                "title": "SSH Login Username",
+                "description": "OS-level username for logging into the jump server host",
+                "type": "string",
+                "order": 3
               },
-              "tunnel_user_password" : {
-                "title" : "Password",
-                "description" : "OS-level password for logging into the jump server host",
-                "type" : "string",
-                "airbyte_secret" : true,
-                "order" : 4
+              "tunnel_user_password": {
+                "title": "Password",
+                "description": "OS-level password for logging into the jump server host",
+                "type": "string",
+                "airbyte_secret": true,
+                "order": 4
               }
             }
           }
diff --git a/airbyte-integrations/connectors/destination-oracle-strict-encrypt/src/test-integration/java/io/airbyte/integrations/destination/oracle_strict_encrypt/OracleStrictEncryptDestinationAcceptanceTest.java b/airbyte-integrations/connectors/destination-oracle-strict-encrypt/src/test-integration/java/io/airbyte/integrations/destination/oracle_strict_encrypt/OracleStrictEncryptDestinationAcceptanceTest.java
index a7cd541500505..20cb8a31c8d04 100644
--- a/airbyte-integrations/connectors/destination-oracle-strict-encrypt/src/test-integration/java/io/airbyte/integrations/destination/oracle_strict_encrypt/OracleStrictEncryptDestinationAcceptanceTest.java
+++ b/airbyte-integrations/connectors/destination-oracle-strict-encrypt/src/test-integration/java/io/airbyte/integrations/destination/oracle_strict_encrypt/OracleStrictEncryptDestinationAcceptanceTest.java
@@ -180,7 +180,8 @@ public void testEncryption() throws SQLException {
                 config.get(JdbcUtils.PORT_KEY).asInt(),
                 config.get("sid").asText()),
             JdbcUtils.parseJdbcParameters("oracle.net.encryption_client=REQUIRED;" +
-                "oracle.net.encryption_types_client=( " + algorithm + " )", ";"), Duration.ofMinutes(5));
+                "oracle.net.encryption_types_client=( " + algorithm + " )", ";"),
+            Duration.ofMinutes(5));
     final JdbcDatabase database = new DefaultJdbcDatabase(dataSource);
 
     final String networkServiceBanner =
@@ -207,7 +208,7 @@ public void testCheckProtocol() throws SQLException {
                 config.get("sid").asText()),
             JdbcUtils.parseJdbcParameters("oracle.net.encryption_client=REQUIRED;" +
                 "oracle.net.encryption_types_client=( " + algorithm + " )", ";"),
-        Duration.ofMinutes(5));
+            Duration.ofMinutes(5));
     final JdbcDatabase database = new DefaultJdbcDatabase(dataSource);
 
     final String networkServiceBanner = "SELECT sys_context('USERENV', 'NETWORK_PROTOCOL') as network_protocol FROM dual";
diff --git a/airbyte-integrations/connectors/destination-oracle-strict-encrypt/src/test/resources/expected_spec.json b/airbyte-integrations/connectors/destination-oracle-strict-encrypt/src/test/resources/expected_spec.json
index 26f5b5a7fed61..b6badb3b72281 100644
--- a/airbyte-integrations/connectors/destination-oracle-strict-encrypt/src/test/resources/expected_spec.json
+++ b/airbyte-integrations/connectors/destination-oracle-strict-encrypt/src/test/resources/expected_spec.json
@@ -66,121 +66,115 @@
         "title": "Raw Table Schema Name",
         "order": 7
       },
-      "tunnel_method" : {
-        "type" : "object",
-        "title" : "SSH Tunnel Method",
-        "description" : "Whether to initiate an SSH tunnel before connecting to the database, and if so, which kind of authentication to use.",
-        "oneOf" : [
+      "tunnel_method": {
+        "type": "object",
+        "title": "SSH Tunnel Method",
+        "description": "Whether to initiate an SSH tunnel before connecting to the database, and if so, which kind of authentication to use.",
+        "oneOf": [
           {
-            "title" : "No Tunnel",
-            "required" : [
-              "tunnel_method"
-            ],
-            "properties" : {
-              "tunnel_method" : {
-                "description" : "No ssh tunnel needed to connect to database",
-                "type" : "string",
-                "const" : "NO_TUNNEL",
-                "order" : 0
+            "title": "No Tunnel",
+            "required": ["tunnel_method"],
+            "properties": {
+              "tunnel_method": {
+                "description": "No ssh tunnel needed to connect to database",
+                "type": "string",
+                "const": "NO_TUNNEL",
+                "order": 0
               }
             }
           },
           {
-            "title" : "SSH Key Authentication",
-            "required" : [
+            "title": "SSH Key Authentication",
+            "required": [
               "tunnel_method",
               "tunnel_host",
               "tunnel_port",
               "tunnel_user",
               "ssh_key"
             ],
-            "properties" : {
-              "tunnel_method" : {
-                "description" : "Connect through a jump server tunnel host using username and ssh key",
-                "type" : "string",
-                "const" : "SSH_KEY_AUTH",
-                "order" : 0
+            "properties": {
+              "tunnel_method": {
+                "description": "Connect through a jump server tunnel host using username and ssh key",
+                "type": "string",
+                "const": "SSH_KEY_AUTH",
+                "order": 0
               },
-              "tunnel_host" : {
-                "title" : "SSH Tunnel Jump Server Host",
-                "description" : "Hostname of the jump server host that allows inbound ssh tunnel.",
-                "type" : "string",
-                "order" : 1
+              "tunnel_host": {
+                "title": "SSH Tunnel Jump Server Host",
+                "description": "Hostname of the jump server host that allows inbound ssh tunnel.",
+                "type": "string",
+                "order": 1
               },
-              "tunnel_port" : {
-                "title" : "SSH Connection Port",
-                "description" : "Port on the proxy/jump server that accepts inbound ssh connections.",
-                "type" : "integer",
-                "minimum" : 0,
-                "maximum" : 65536,
-                "default" : 22,
-                "examples" : [
-                  "22"
-                ],
-                "order" : 2
+              "tunnel_port": {
+                "title": "SSH Connection Port",
+                "description": "Port on the proxy/jump server that accepts inbound ssh connections.",
+                "type": "integer",
+                "minimum": 0,
+                "maximum": 65536,
+                "default": 22,
+                "examples": ["22"],
+                "order": 2
               },
-              "tunnel_user" : {
-                "title" : "SSH Login Username",
-                "description" : "OS-level username for logging into the jump server host.",
-                "type" : "string",
-                "order" : 3
+              "tunnel_user": {
+                "title": "SSH Login Username",
+                "description": "OS-level username for logging into the jump server host.",
+                "type": "string",
+                "order": 3
               },
-              "ssh_key" : {
-                "title" : "SSH Private Key",
-                "description" : "OS-level user account ssh key credentials in RSA PEM format ( created with ssh-keygen -t rsa -m PEM -f myuser_rsa )",
-                "type" : "string",
-                "airbyte_secret" : true,
-                "multiline" : true,
-                "order" : 4
+              "ssh_key": {
+                "title": "SSH Private Key",
+                "description": "OS-level user account ssh key credentials in RSA PEM format ( created with ssh-keygen -t rsa -m PEM -f myuser_rsa )",
+                "type": "string",
+                "airbyte_secret": true,
+                "multiline": true,
+                "order": 4
               }
             }
           },
           {
-            "title" : "Password Authentication",
-            "required" : [
+            "title": "Password Authentication",
+            "required": [
               "tunnel_method",
               "tunnel_host",
               "tunnel_port",
               "tunnel_user",
               "tunnel_user_password"
             ],
-            "properties" : {
-              "tunnel_method" : {
-                "description" : "Connect through a jump server tunnel host using username and password authentication",
-                "type" : "string",
-                "const" : "SSH_PASSWORD_AUTH",
-                "order" : 0
+            "properties": {
+              "tunnel_method": {
+                "description": "Connect through a jump server tunnel host using username and password authentication",
+                "type": "string",
+                "const": "SSH_PASSWORD_AUTH",
+                "order": 0
               },
-              "tunnel_host" : {
-                "title" : "SSH Tunnel Jump Server Host",
-                "description" : "Hostname of the jump server host that allows inbound ssh tunnel.",
-                "type" : "string",
-                "order" : 1
+              "tunnel_host": {
+                "title": "SSH Tunnel Jump Server Host",
+                "description": "Hostname of the jump server host that allows inbound ssh tunnel.",
+                "type": "string",
+                "order": 1
               },
-              "tunnel_port" : {
-                "title" : "SSH Connection Port",
-                "description" : "Port on the proxy/jump server that accepts inbound ssh connections.",
-                "type" : "integer",
-                "minimum" : 0,
-                "maximum" : 65536,
-                "default" : 22,
-                "examples" : [
-                  "22"
-                ],
-                "order" : 2
+              "tunnel_port": {
+                "title": "SSH Connection Port",
+                "description": "Port on the proxy/jump server that accepts inbound ssh connections.",
+                "type": "integer",
+                "minimum": 0,
+                "maximum": 65536,
+                "default": 22,
+                "examples": ["22"],
+                "order": 2
               },
-              "tunnel_user" : {
-                "title" : "SSH Login Username",
-                "description" : "OS-level username for logging into the jump server host",
-                "type" : "string",
-                "order" : 3
+              "tunnel_user": {
+                "title": "SSH Login Username",
+                "description": "OS-level username for logging into the jump server host",
+                "type": "string",
+                "order": 3
               },
-              "tunnel_user_password" : {
-                "title" : "Password",
-                "description" : "OS-level password for logging into the jump server host",
-                "type" : "string",
-                "airbyte_secret" : true,
-                "order" : 4
+              "tunnel_user_password": {
+                "title": "Password",
+                "description": "OS-level password for logging into the jump server host",
+                "type": "string",
+                "airbyte_secret": true,
+                "order": 4
               }
             }
           }
diff --git a/airbyte-integrations/connectors/destination-oracle/src/main/java/io/airbyte/integrations/destination/oracle/OracleDestination.java b/airbyte-integrations/connectors/destination-oracle/src/main/java/io/airbyte/integrations/destination/oracle/OracleDestination.java
index 7a65dd426ee48..39f9d9c13353f 100644
--- a/airbyte-integrations/connectors/destination-oracle/src/main/java/io/airbyte/integrations/destination/oracle/OracleDestination.java
+++ b/airbyte-integrations/connectors/destination-oracle/src/main/java/io/airbyte/integrations/destination/oracle/OracleDestination.java
@@ -144,7 +144,8 @@ protected JdbcSqlGenerator getSqlGenerator() {
   }
 
   @Override
-  protected JdbcDestinationHandler<? extends MinimumDestinationState> getDestinationHandler(final String databaseName, final JdbcDatabase database,
+  protected JdbcDestinationHandler<? extends MinimumDestinationState> getDestinationHandler(final String databaseName,
+                                                                                            final JdbcDatabase database,
                                                                                             final String rawTableSchema) {
     return new NoOpJdbcDestinationHandler<>(databaseName, database, rawTableSchema, SQLDialect.DEFAULT);
   }

From 056407e5477a0a0d61752e36e6c58336e4829803 Mon Sep 17 00:00:00 2001
From: Joe Bell <jbfbell@gmail.com>
Date: Wed, 6 Mar 2024 20:13:30 -0800
Subject: [PATCH 91/96] add always type and dedupe method

---
 .../destination/jdbc/AbstractJdbcDestination.java | 15 ++++++++++++++-
 .../destination/oracle/OracleDestination.java     |  5 +++++
 2 files changed, 19 insertions(+), 1 deletion(-)

diff --git a/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/AbstractJdbcDestination.java b/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/AbstractJdbcDestination.java
index 86935bbe29378..36d8856bef0b9 100644
--- a/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/AbstractJdbcDestination.java
+++ b/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/AbstractJdbcDestination.java
@@ -77,6 +77,15 @@ protected String getConfigSchemaKey() {
     return "schema";
   }
 
+  /**
+   * If the destination should always disable type dedupe, override this method to return true.
+   * We only type and dedupe if we create final tables.
+   * @return whether the destination should always disable type dedupe
+   */
+  protected boolean shouldAlwaysDisableTypeDedupe() {
+    return false;
+  }
+
   public AbstractJdbcDestination(final String driverClass,
                                  final NamingConventionTransformer namingResolver,
                                  final SqlOperations sqlOperations) {
@@ -323,7 +332,7 @@ private TyperDeduper getV2TyperDeduper(final JsonNode config, final ConfiguredAi
     final NoopV2TableMigrator v2TableMigrator = new NoopV2TableMigrator();
     final DestinationHandler<? extends MinimumDestinationState> destinationHandler =
         getDestinationHandler(databaseName, database, rawNamespaceOverride.orElse(DEFAULT_AIRBYTE_INTERNAL_NAMESPACE));
-    final boolean disableTypeDedupe = config.has(DISABLE_TYPE_DEDUPE) && config.get(DISABLE_TYPE_DEDUPE).asBoolean(false);
+    final boolean disableTypeDedupe = isTypeDedupeDisabled(config);
     final TyperDeduper typerDeduper;
     if (disableTypeDedupe) {
       typerDeduper = new NoOpTyperDeduperWithV1V2Migrations<>(sqlGenerator, destinationHandler, parsedCatalog, migrator, v2TableMigrator, List.of());
@@ -334,4 +343,8 @@ private TyperDeduper getV2TyperDeduper(final JsonNode config, final ConfiguredAi
     return typerDeduper;
   }
 
+  private boolean isTypeDedupeDisabled(final JsonNode config) {
+    return (config.has(DISABLE_TYPE_DEDUPE) && config.get(DISABLE_TYPE_DEDUPE).asBoolean(false)) || shouldAlwaysDisableTypeDedupe();
+  }
+
 }
diff --git a/airbyte-integrations/connectors/destination-oracle/src/main/java/io/airbyte/integrations/destination/oracle/OracleDestination.java b/airbyte-integrations/connectors/destination-oracle/src/main/java/io/airbyte/integrations/destination/oracle/OracleDestination.java
index 39f9d9c13353f..385bb0af74479 100644
--- a/airbyte-integrations/connectors/destination-oracle/src/main/java/io/airbyte/integrations/destination/oracle/OracleDestination.java
+++ b/airbyte-integrations/connectors/destination-oracle/src/main/java/io/airbyte/integrations/destination/oracle/OracleDestination.java
@@ -138,6 +138,11 @@ public boolean isV2Destination() {
     return true;
   }
 
+  @Override
+  protected boolean shouldAlwaysDisableTypeDedupe() {
+    return true;
+  }
+
   @Override
   protected JdbcSqlGenerator getSqlGenerator() {
     return new RawOnlySqlGenerator(new OracleNameTransformer());

From 7f9777bf8c42c4a87801a599e78eb9a2f7b6d664 Mon Sep 17 00:00:00 2001
From: Joe Bell <jbfbell@gmail.com>
Date: Wed, 6 Mar 2024 20:15:51 -0800
Subject: [PATCH 92/96] formatting

---
 .../destination/jdbc/AbstractJdbcDestination.java            | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/AbstractJdbcDestination.java b/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/AbstractJdbcDestination.java
index 36d8856bef0b9..89d1b01ccb30e 100644
--- a/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/AbstractJdbcDestination.java
+++ b/airbyte-cdk/java/airbyte-cdk/db-destinations/src/main/java/io/airbyte/cdk/integrations/destination/jdbc/AbstractJdbcDestination.java
@@ -78,8 +78,9 @@ protected String getConfigSchemaKey() {
   }
 
   /**
-   * If the destination should always disable type dedupe, override this method to return true.
-   * We only type and dedupe if we create final tables.
+   * If the destination should always disable type dedupe, override this method to return true. We
+   * only type and dedupe if we create final tables.
+   *
    * @return whether the destination should always disable type dedupe
    */
   protected boolean shouldAlwaysDisableTypeDedupe() {

From 898cbd94b87cbbbf57d860c6008367b1e473b092 Mon Sep 17 00:00:00 2001
From: Joe Bell <jbfbell@gmail.com>
Date: Thu, 7 Mar 2024 16:44:05 -0800
Subject: [PATCH 93/96] test timeouts

---
 .../destination-oracle-strict-encrypt/gradle.properties          | 1 +
 .../connectors/destination-oracle/gradle.properties              | 1 +
 2 files changed, 2 insertions(+)
 create mode 100644 airbyte-integrations/connectors/destination-oracle-strict-encrypt/gradle.properties
 create mode 100644 airbyte-integrations/connectors/destination-oracle/gradle.properties

diff --git a/airbyte-integrations/connectors/destination-oracle-strict-encrypt/gradle.properties b/airbyte-integrations/connectors/destination-oracle-strict-encrypt/gradle.properties
new file mode 100644
index 0000000000000..6a0ea27448c4f
--- /dev/null
+++ b/airbyte-integrations/connectors/destination-oracle-strict-encrypt/gradle.properties
@@ -0,0 +1 @@
+junitMethodExecutionTimeout = 30 m
diff --git a/airbyte-integrations/connectors/destination-oracle/gradle.properties b/airbyte-integrations/connectors/destination-oracle/gradle.properties
new file mode 100644
index 0000000000000..6a0ea27448c4f
--- /dev/null
+++ b/airbyte-integrations/connectors/destination-oracle/gradle.properties
@@ -0,0 +1 @@
+junitMethodExecutionTimeout = 30 m

From 0664a96265c9c7c7fa2d4930968c08d919427d70 Mon Sep 17 00:00:00 2001
From: Joe Bell <jbfbell@gmail.com>
Date: Mon, 11 Mar 2024 07:32:16 -0700
Subject: [PATCH 94/96] add airbyte meta column to raw table

---
 .../integrations/destination/oracle/OracleOperations.java | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/airbyte-integrations/connectors/destination-oracle/src/main/java/io/airbyte/integrations/destination/oracle/OracleOperations.java b/airbyte-integrations/connectors/destination-oracle/src/main/java/io/airbyte/integrations/destination/oracle/OracleOperations.java
index d213667fdfd70..75979e3888b19 100644
--- a/airbyte-integrations/connectors/destination-oracle/src/main/java/io/airbyte/integrations/destination/oracle/OracleOperations.java
+++ b/airbyte-integrations/connectors/destination-oracle/src/main/java/io/airbyte/integrations/destination/oracle/OracleOperations.java
@@ -66,15 +66,17 @@ public String createTableQuery(final JdbcDatabase database, final String schemaN
           CREATE TABLE %s.%s (
           %s VARCHAR(64) PRIMARY KEY,
           %s NCLOB,
-          %s TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
-          %s TIMESTAMP WITH TIME ZONE DEFAULT NULL
+          %s TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
+          %s TIMESTAMP WITH TIME ZONE DEFAULT NULL,
+          %s NCLOB
           )
         """,
         schemaName, tableName,
         upperQuoted(JavaBaseConstants.COLUMN_NAME_AB_RAW_ID),
         upperQuoted(JavaBaseConstants.COLUMN_NAME_DATA),
         upperQuoted(JavaBaseConstants.COLUMN_NAME_AB_EXTRACTED_AT),
-        upperQuoted(JavaBaseConstants.COLUMN_NAME_AB_LOADED_AT));
+        upperQuoted(JavaBaseConstants.COLUMN_NAME_AB_LOADED_AT),
+        upperQuoted(JavaBaseConstants.COLUMN_NAME_AB_META));
   }
 
   private boolean tableExists(final JdbcDatabase database, final String schemaName, final String tableName) throws Exception {

From 3b3f819e0fd59854f89407b9313ae72d58208e61 Mon Sep 17 00:00:00 2001
From: Joe Bell <jbfbell@gmail.com>
Date: Mon, 11 Mar 2024 08:24:35 -0700
Subject: [PATCH 95/96] add airbyte meta column

---
 .../destination/oracle/OracleOperations.java       | 14 ++++++++------
 1 file changed, 8 insertions(+), 6 deletions(-)

diff --git a/airbyte-integrations/connectors/destination-oracle/src/main/java/io/airbyte/integrations/destination/oracle/OracleOperations.java b/airbyte-integrations/connectors/destination-oracle/src/main/java/io/airbyte/integrations/destination/oracle/OracleOperations.java
index 75979e3888b19..7f673077a58a2 100644
--- a/airbyte-integrations/connectors/destination-oracle/src/main/java/io/airbyte/integrations/destination/oracle/OracleOperations.java
+++ b/airbyte-integrations/connectors/destination-oracle/src/main/java/io/airbyte/integrations/destination/oracle/OracleOperations.java
@@ -12,7 +12,6 @@
 import io.airbyte.cdk.integrations.destination.StandardNameTransformer;
 import io.airbyte.cdk.integrations.destination.jdbc.SqlOperations;
 import io.airbyte.cdk.integrations.destination_async.partial_messages.PartialAirbyteMessage;
-import io.airbyte.commons.json.Jsons;
 import java.sql.PreparedStatement;
 import java.sql.SQLException;
 import java.sql.Timestamp;
@@ -65,10 +64,10 @@ public String createTableQuery(final JdbcDatabase database, final String schemaN
         """
           CREATE TABLE %s.%s (
           %s VARCHAR(64) PRIMARY KEY,
-          %s NCLOB,
+          %s JSON,
           %s TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
           %s TIMESTAMP WITH TIME ZONE DEFAULT NULL,
-          %s NCLOB
+          %s JSON
           )
         """,
         schemaName, tableName,
@@ -110,11 +109,12 @@ public void insertRecords(final JdbcDatabase database,
                             final String tempTableName)
       throws Exception {
     final String tableName = String.format("%s.%s", schemaName, tempTableName);
-    final String columns = String.format("(%s, %s, %s, %s)",
+    final String columns = String.format("(%s, %s, %s, %s, %s)",
         upperQuoted(JavaBaseConstants.COLUMN_NAME_AB_RAW_ID),
         upperQuoted(JavaBaseConstants.COLUMN_NAME_DATA),
         upperQuoted(JavaBaseConstants.COLUMN_NAME_AB_EXTRACTED_AT),
-        upperQuoted(JavaBaseConstants.COLUMN_NAME_AB_LOADED_AT));
+        upperQuoted(JavaBaseConstants.COLUMN_NAME_AB_LOADED_AT),
+        upperQuoted(JavaBaseConstants.COLUMN_NAME_AB_META));
     insertRawRecordsInSingleQuery(tableName, columns, database, records, UUID::randomUUID);
   }
 
@@ -152,9 +152,11 @@ private static void insertRawRecordsInSingleQuery(final String tableName,
           // 1-indexed
           final JsonNode formattedData = StandardNameTransformer.formatJsonPath(message.getRecord().getData());
           statement.setString(i++, uuidSupplier.get().toString());
-          statement.setString(i++, Jsons.serialize(formattedData));
+          statement.setObject(i++, formattedData);
+//          statement.setString(i++, Jsons.serialize(formattedData));
           statement.setTimestamp(i++, Timestamp.from(Instant.ofEpochMilli(message.getRecord().getEmittedAt())));
           statement.setNull(i++, Types.TIMESTAMP);
+          statement.setObject(i++, "");
         }
 
         statement.execute();

From 561c444d77c0dc0ebae1f0bc84562ae927e075d0 Mon Sep 17 00:00:00 2001
From: Joe Bell <jbfbell@gmail.com>
Date: Mon, 11 Mar 2024 08:26:04 -0700
Subject: [PATCH 96/96] formatting

---
 .../integrations/destination/oracle/OracleOperations.java       | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/airbyte-integrations/connectors/destination-oracle/src/main/java/io/airbyte/integrations/destination/oracle/OracleOperations.java b/airbyte-integrations/connectors/destination-oracle/src/main/java/io/airbyte/integrations/destination/oracle/OracleOperations.java
index 7f673077a58a2..60f197dc98018 100644
--- a/airbyte-integrations/connectors/destination-oracle/src/main/java/io/airbyte/integrations/destination/oracle/OracleOperations.java
+++ b/airbyte-integrations/connectors/destination-oracle/src/main/java/io/airbyte/integrations/destination/oracle/OracleOperations.java
@@ -153,7 +153,7 @@ private static void insertRawRecordsInSingleQuery(final String tableName,
           final JsonNode formattedData = StandardNameTransformer.formatJsonPath(message.getRecord().getData());
           statement.setString(i++, uuidSupplier.get().toString());
           statement.setObject(i++, formattedData);
-//          statement.setString(i++, Jsons.serialize(formattedData));
+          // statement.setString(i++, Jsons.serialize(formattedData));
           statement.setTimestamp(i++, Timestamp.from(Instant.ofEpochMilli(message.getRecord().getEmittedAt())));
           statement.setNull(i++, Types.TIMESTAMP);
           statement.setObject(i++, "");